diff --git a/.github/workflows/docs-locale-sync.yml b/.github/workflows/docs-locale-sync.yml
index 8cd0cc52e2..1aafc5d1e3 100644
--- a/.github/workflows/docs-locale-sync.yml
+++ b/.github/workflows/docs-locale-sync.yml
@@ -12,13 +12,14 @@ jobs:
if: github.actor != 'opencode-agent[bot]'
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
- id-token: write
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
+ persist-credentials: false
fetch-depth: 0
+ ref: ${{ github.ref_name }}
- name: Setup Bun
uses: ./.github/actions/setup-bun
@@ -51,9 +52,54 @@ jobs:
uses: sst/opencode/github@latest
env:
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ GITHUB_TOKEN: ${{ steps.committer.outputs.token }}
+ OPENCODE_CONFIG_CONTENT: |
+ {
+ "permission": {
+ "*": "deny",
+ "read": {
+ "*": "deny",
+ "packages/web/src/content/docs": "allow",
+ "packages/web/src/content/docs/*": "allow",
+ "packages/web/src/content/docs/*.mdx": "allow",
+ "packages/web/src/content/docs/*/*.mdx": "allow",
+ ".opencode": "allow",
+ ".opencode/agent": "allow",
+ ".opencode/agent/glossary": "allow",
+ ".opencode/agent/translator.md": "allow",
+ ".opencode/agent/glossary/*.md": "allow"
+ },
+ "edit": {
+ "*": "deny",
+ "packages/web/src/content/docs/*/*.mdx": "allow"
+ },
+ "glob": {
+ "*": "deny",
+ "packages/web/src/content/docs*": "allow",
+ ".opencode/agent/glossary*": "allow"
+ },
+ "task": {
+ "*": "deny",
+ "translator": "allow"
+ }
+ },
+ "agent": {
+ "translator": {
+ "permission": {
+ "*": "deny",
+ "read": {
+ "*": "deny",
+ ".opencode/agent/translator.md": "allow",
+ ".opencode/agent/glossary/*.md": "allow"
+ }
+ }
+ }
+ }
+ }
with:
- model: opencode/gpt-5.2
+ model: opencode/gpt-5.3-codex
agent: docs
+ use_github_token: true
prompt: |
Update localized docs to match the latest English docs changes.
@@ -67,10 +113,11 @@ jobs:
2. You MUST use the Task tool for translation work and launch subagents with subagent_type `translator` (defined in .opencode/agent/translator.md).
3. Do not translate directly in the primary agent. Use translator subagent output as the source for locale text updates.
4. Run translator subagent Task calls in parallel whenever file/locale translation work is independent.
- 5. Preserve frontmatter keys, internal links, code blocks, and existing locale-specific metadata unless the English change requires an update.
- 6. Keep locale docs structure aligned with their corresponding English pages.
- 7. Do not modify English source docs in packages/web/src/content/docs/*.mdx.
- 8. If no locale updates are needed, make no changes.
+ 5. Use only the minimum tools needed for this task (read/glob, file edits, and translator Task). Do not use shell, web, search, or GitHub tools for translation work.
+ 6. Preserve frontmatter keys, internal links, code blocks, and existing locale-specific metadata unless the English change requires an update.
+ 7. Keep locale docs structure aligned with their corresponding English pages.
+ 8. Do not modify English source docs in packages/web/src/content/docs/*.mdx.
+ 9. If no locale updates are needed, make no changes.
- name: Commit and push locale docs updates
if: steps.changes.outputs.has_changes == 'true'
diff --git a/.opencode/agent/glossary/README.md b/.opencode/agent/glossary/README.md
new file mode 100644
index 0000000000..983900381c
--- /dev/null
+++ b/.opencode/agent/glossary/README.md
@@ -0,0 +1,63 @@
+# Locale Glossaries
+
+Use this folder for locale-specific translation guidance that supplements `.opencode/agent/translator.md`.
+
+The global glossary in `translator.md` remains the source of truth for shared do-not-translate terms (commands, code, paths, product names, etc.). These locale files capture community learnings about phrasing and terminology preferences.
+
+## File Naming
+
+- One file per locale
+- Use lowercase locale slugs that match docs locales when possible (for example, `zh-cn.md`, `zh-tw.md`)
+- If only language-level guidance exists, use the language code (for example, `fr.md`)
+- Some repo locale slugs may be aliases/non-BCP47 for consistency (for example, `br` for Brazilian Portuguese / `pt-BR`)
+
+## What To Put In A Locale File
+
+- **Sources**: PRs/issues/discussions that motivated the guidance
+- **Do Not Translate (Locale Additions)**: locale-specific terms or casing decisions
+- **Preferred Terms**: recurring UI/docs words with preferred translations
+- **Guidance**: tone, style, and consistency notes
+- **Avoid** (optional): common literal translations or wording we should avoid
+- If the repo uses a locale alias slug, document the alias in **Guidance** (for example, prose may mention `pt-BR` while config/examples use `br`)
+
+Prefer guidance that is:
+
+- Repeated across multiple docs/screens
+- Easy to apply consistently
+- Backed by a community contribution or review discussion
+
+## Template
+
+```md
+# Glossary
+
+## Sources
+
+- PR #12345: https://github.com/anomalyco/opencode/pull/12345
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing)
+
+## Preferred Terms
+
+| English | Preferred | Notes |
+| ------- | --------- | --------- |
+| prompt | ... | preferred |
+| session | ... | preferred |
+
+## Guidance
+
+- Prefer natural phrasing over literal translation
+
+## Avoid
+
+- Avoid ... when ...
+```
+
+## Contribution Notes
+
+- Mark entries as preferred when they may evolve
+- Keep examples short
+- Add or update the `Sources` section whenever you add a new rule
+- Prefer PR-backed guidance over invented term mappings; start with general guidance if no term-level corrections exist yet
diff --git a/.opencode/agent/glossary/ar.md b/.opencode/agent/glossary/ar.md
new file mode 100644
index 0000000000..37355522a0
--- /dev/null
+++ b/.opencode/agent/glossary/ar.md
@@ -0,0 +1,28 @@
+# ar Glossary
+
+## Sources
+
+- PR #9947: https://github.com/anomalyco/opencode/pull/9947
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Arabic phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- For RTL text, treat code, commands, and paths as LTR artifacts and keep their character order unchanged
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Arabic terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/br.md b/.opencode/agent/glossary/br.md
new file mode 100644
index 0000000000..fd3e7251cd
--- /dev/null
+++ b/.opencode/agent/glossary/br.md
@@ -0,0 +1,34 @@
+# br Glossary
+
+## Sources
+
+- PR #10086: https://github.com/anomalyco/opencode/pull/10086
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Locale code `br` in repo config, code, and paths (repo alias for Brazilian Portuguese)
+
+## Preferred Terms
+
+These are PR-backed locale naming preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ---------------------------------------- | ------------------------------ | ------------------------------------------------------------- |
+| Brazilian Portuguese (prose locale name) | `pt-BR` | Use standard locale naming in prose when helpful |
+| Repo locale slug (code/config) | `br` | PR #10086 uses `br` for consistency/simplicity |
+| Browser locale detection | `pt`, `pt-br`, `pt-BR` -> `br` | Preserve this mapping in docs/examples about locale detection |
+
+## Guidance
+
+- This file covers Brazilian Portuguese (`pt-BR`), but the repo locale code is `br`
+- Use natural Brazilian Portuguese phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep repo locale identifiers as implemented in code/config (`br`) even when prose mentions `pt-BR`
+
+## Avoid
+
+- Avoid changing repo locale code references from `br` to `pt-br` in code snippets, paths, or config examples
+- Avoid mixing Portuguese variants when a Brazilian Portuguese form is established
diff --git a/.opencode/agent/glossary/bs.md b/.opencode/agent/glossary/bs.md
new file mode 100644
index 0000000000..aa3bd96f6f
--- /dev/null
+++ b/.opencode/agent/glossary/bs.md
@@ -0,0 +1,33 @@
+# bs Glossary
+
+## Sources
+
+- PR #12283: https://github.com/anomalyco/opencode/pull/12283
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed locale naming preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ---------------------------------- | ---------- | ------------------------------------------------- |
+| Bosnian language label (UI) | `Bosanski` | PR #12283 tested switching language to `Bosanski` |
+| Repo locale slug (code/config) | `bs` | Preserve in code, config, paths, and examples |
+| Browser locale detection (Bosnian) | `bs` | PR #12283 added `bs` locale auto-detection |
+
+## Guidance
+
+- Use natural Bosnian phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep repo locale references as `bs` in code/config, and use `Bosanski` for the user-facing language name when applicable
+
+## Avoid
+
+- Avoid changing repo locale references from `bs` to another slug in code snippets or config examples
+- Avoid translating product and protocol names that are fixed identifiers
diff --git a/.opencode/agent/glossary/da.md b/.opencode/agent/glossary/da.md
new file mode 100644
index 0000000000..e632221701
--- /dev/null
+++ b/.opencode/agent/glossary/da.md
@@ -0,0 +1,27 @@
+# da Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Danish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Danish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/de.md b/.opencode/agent/glossary/de.md
new file mode 100644
index 0000000000..0d2c49face
--- /dev/null
+++ b/.opencode/agent/glossary/de.md
@@ -0,0 +1,27 @@
+# de Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural German phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple German terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/es.md b/.opencode/agent/glossary/es.md
new file mode 100644
index 0000000000..dc9b977ecf
--- /dev/null
+++ b/.opencode/agent/glossary/es.md
@@ -0,0 +1,27 @@
+# es Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Spanish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Spanish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/fr.md b/.opencode/agent/glossary/fr.md
new file mode 100644
index 0000000000..074c4de110
--- /dev/null
+++ b/.opencode/agent/glossary/fr.md
@@ -0,0 +1,27 @@
+# fr Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural French phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple French terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/ja.md b/.opencode/agent/glossary/ja.md
new file mode 100644
index 0000000000..f0159ca966
--- /dev/null
+++ b/.opencode/agent/glossary/ja.md
@@ -0,0 +1,33 @@
+# ja Glossary
+
+## Sources
+
+- PR #9821: https://github.com/anomalyco/opencode/pull/9821
+- PR #13160: https://github.com/anomalyco/opencode/pull/13160
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed wording preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| --------------------------- | ----------------------- | ------------------------------------- |
+| WSL integration (UI label) | `WSL連携` | PR #13160 prefers this over `WSL統合` |
+| WSL integration description | `WindowsのWSL環境で...` | PR #13160 improved phrasing naturally |
+
+## Guidance
+
+- Prefer natural Japanese phrasing over literal translation
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- In WSL integration text, follow PR #13160 wording direction for more natural Japanese phrasing
+
+## Avoid
+
+- Avoid `WSL統合` in the WSL integration UI context where `WSL連携` is the reviewed wording
+- Avoid translating product and protocol names that are fixed identifiers
diff --git a/.opencode/agent/glossary/ko.md b/.opencode/agent/glossary/ko.md
new file mode 100644
index 0000000000..71385c8a10
--- /dev/null
+++ b/.opencode/agent/glossary/ko.md
@@ -0,0 +1,27 @@
+# ko Glossary
+
+## Sources
+
+- PR #9817: https://github.com/anomalyco/opencode/pull/9817
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Korean phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Korean terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/no.md b/.opencode/agent/glossary/no.md
new file mode 100644
index 0000000000..d7159dca41
--- /dev/null
+++ b/.opencode/agent/glossary/no.md
@@ -0,0 +1,38 @@
+# no Glossary
+
+## Sources
+
+- PR #10018: https://github.com/anomalyco/opencode/pull/10018
+- PR #12935: https://github.com/anomalyco/opencode/pull/12935
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Sound names (PR #10018 notes these were intentionally left untranslated)
+
+## Preferred Terms
+
+These are PR-backed corrections and may evolve.
+
+| English / Context | Preferred | Notes |
+| ----------------------------------- | ------------ | ----------------------------- |
+| Save (data persistence action) | `Lagre` | Prefer over `Spare` |
+| Disabled (feature/state) | `deaktivert` | Prefer over `funksjonshemmet` |
+| API keys | `API Nøkler` | Prefer over `API Taster` |
+| Cost (noun) | `Kostnad` | Prefer over verb form `Koste` |
+| Show/View (imperative button label) | `Vis` | Prefer over `Utsikt` |
+
+## Guidance
+
+- Prefer natural Norwegian Bokmal (Bokmål) wording over literal translation
+- Keep tone clear and practical in UI labels
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep recurring UI terms consistent once a preferred term is chosen
+
+## Avoid
+
+- Avoid `Spare` for save actions in persistence contexts
+- Avoid `funksjonshemmet` for disabled feature states
+- Avoid `API Taster`, `Koste`, and `Utsikt` in the corrected contexts above
diff --git a/.opencode/agent/glossary/pl.md b/.opencode/agent/glossary/pl.md
new file mode 100644
index 0000000000..e9bad7a515
--- /dev/null
+++ b/.opencode/agent/glossary/pl.md
@@ -0,0 +1,27 @@
+# pl Glossary
+
+## Sources
+
+- PR #9884: https://github.com/anomalyco/opencode/pull/9884
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Polish phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Polish terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/ru.md b/.opencode/agent/glossary/ru.md
new file mode 100644
index 0000000000..6fee0f94c0
--- /dev/null
+++ b/.opencode/agent/glossary/ru.md
@@ -0,0 +1,27 @@
+# ru Glossary
+
+## Sources
+
+- PR #9882: https://github.com/anomalyco/opencode/pull/9882
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+No PR-backed term mappings yet. Add entries here when review PRs introduce repeated wording corrections.
+
+## Guidance
+
+- Prefer natural Russian phrasing over literal translation
+- Keep tone clear and direct in UI labels and docs prose
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+
+## Avoid
+
+- Avoid translating product and protocol names that are fixed identifiers
+- Avoid mixing multiple Russian terms for the same recurring UI action once a preferred term is established
diff --git a/.opencode/agent/glossary/th.md b/.opencode/agent/glossary/th.md
new file mode 100644
index 0000000000..7b5a31d16b
--- /dev/null
+++ b/.opencode/agent/glossary/th.md
@@ -0,0 +1,34 @@
+# th Glossary
+
+## Sources
+
+- PR #10809: https://github.com/anomalyco/opencode/pull/10809
+- PR #11496: https://github.com/anomalyco/opencode/pull/11496
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only in commands, package names, paths, or code)
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- Commands, flags, file paths, and code literals (keep exactly as written)
+
+## Preferred Terms
+
+These are PR-backed preferences and may evolve.
+
+| English / Context | Preferred | Notes |
+| ------------------------------------- | --------------------- | -------------------------------------------------------------------------------- |
+| Thai language label in language lists | `ไทย` | PR #10809 standardized this across locales |
+| Language names in language pickers | Native names (static) | PR #11496: keep names like `English`, `Deutsch`, `ไทย` consistent across locales |
+
+## Guidance
+
+- Prefer natural Thai phrasing over literal translation
+- Keep tone short and clear for buttons and labels
+- Preserve technical artifacts exactly: commands, flags, code, URLs, model IDs, and file paths
+- Keep language names static/native in language pickers instead of translating them per current locale (PR #11496)
+
+## Avoid
+
+- Avoid translating language names differently per current locale in language lists
+- Avoid changing `ไทย` to another display form for the Thai language option unless the product standard changes
diff --git a/.opencode/agent/glossary/zh-cn.md b/.opencode/agent/glossary/zh-cn.md
new file mode 100644
index 0000000000..054e94b7e8
--- /dev/null
+++ b/.opencode/agent/glossary/zh-cn.md
@@ -0,0 +1,42 @@
+# zh-cn Glossary
+
+## Sources
+
+- PR #13942: https://github.com/anomalyco/opencode/pull/13942
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only when it is part of commands, package names, paths, or code)
+- `OpenCode Zen`
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- `Model Context Protocol` (prefer the English expansion when introducing `MCP`)
+
+## Preferred Terms
+
+These are preferred terms for docs/UI prose and may evolve.
+
+| English | Preferred | Notes |
+| ----------------------- | --------- | ------------------------------------------- |
+| prompt | 提示词 | Keep `--prompt` unchanged in flags/code |
+| session | 会话 | |
+| provider | 提供商 | |
+| share link / shared URL | 分享链接 | Prefer `分享` for user-facing share actions |
+| headless (server) | 无界面 | Docs wording |
+| authentication | 认证 | Prefer in auth/OAuth contexts |
+| cache | 缓存 | |
+| keybind / shortcut | 快捷键 | User-facing docs wording |
+| workflow | 工作流 | e.g. GitHub Actions workflow |
+
+## Guidance
+
+- Prefer natural, concise phrasing over literal translation
+- Keep the tone direct and friendly (PR #13942 consistently moved wording in this direction)
+- Preserve technical artifacts exactly: commands, flags, code, inline code, URLs, file paths, model IDs
+- Keep enum-like values in English when they are literals (for example, `default`, `json`)
+- Prefer consistent terminology across pages once a term is chosen (`会话`, `提供商`, `提示词`, etc.)
+
+## Avoid
+
+- Avoid `opencode` in prose when referring to the product name; use `OpenCode`
+- Avoid mixing alternative terms for the same concept across docs when a preferred term is already established
diff --git a/.opencode/agent/glossary/zh-tw.md b/.opencode/agent/glossary/zh-tw.md
new file mode 100644
index 0000000000..283660e121
--- /dev/null
+++ b/.opencode/agent/glossary/zh-tw.md
@@ -0,0 +1,42 @@
+# zh-tw Glossary
+
+## Sources
+
+- PR #13942: https://github.com/anomalyco/opencode/pull/13942
+
+## Do Not Translate (Locale Additions)
+
+- `OpenCode` (preserve casing in prose; keep `opencode` only when it is part of commands, package names, paths, or code)
+- `OpenCode Zen`
+- `OpenCode CLI`
+- `CLI`, `TUI`, `MCP`, `OAuth`
+- `Model Context Protocol` (prefer the English expansion when introducing `MCP`)
+
+## Preferred Terms
+
+These are preferred terms for docs/UI prose and may evolve.
+
+| English | Preferred | Notes |
+| ----------------------- | --------- | ------------------------------------------- |
+| prompt | 提示詞 | Keep `--prompt` unchanged in flags/code |
+| session | 工作階段 | |
+| provider | 供應商 | |
+| share link / shared URL | 分享連結 | Prefer `分享` for user-facing share actions |
+| headless (server) | 無介面 | Docs wording |
+| authentication | 認證 | Prefer in auth/OAuth contexts |
+| cache | 快取 | |
+| keybind / shortcut | 快捷鍵 | User-facing docs wording |
+| workflow | 工作流程 | e.g. GitHub Actions workflow |
+
+## Guidance
+
+- Prefer natural, concise phrasing over literal translation
+- Keep the tone direct and friendly (PR #13942 consistently moved wording in this direction)
+- Preserve technical artifacts exactly: commands, flags, code, inline code, URLs, file paths, model IDs
+- Keep enum-like values in English when they are literals (for example, `default`, `json`)
+- Prefer consistent terminology across pages once a term is chosen (`工作階段`, `供應商`, `提示詞`, etc.)
+
+## Avoid
+
+- Avoid `opencode` in prose when referring to the product name; use `OpenCode`
+- Avoid mixing alternative terms for the same concept across docs when a preferred term is already established
diff --git a/.opencode/agent/translator.md b/.opencode/agent/translator.md
index 0c2e176d8b..f0b3f8e927 100644
--- a/.opencode/agent/translator.md
+++ b/.opencode/agent/translator.md
@@ -13,10 +13,25 @@ Requirements:
- Preserve meaning, intent, tone, and formatting (including Markdown/MDX structure).
- Preserve all technical terms and artifacts exactly: product/company names, API names, identifiers, code, commands/flags, file paths, URLs, versions, error messages, config keys/values, and anything inside inline code or code blocks.
- Also preserve every term listed in the Do-Not-Translate glossary below.
+- Also apply locale-specific guidance from `.opencode/agent/glossary/.md` when available (for example, `zh-cn.md`).
- Do not modify fenced code blocks.
- Output ONLY the translation (no commentary).
If the target locale is missing, ask the user to provide it.
+If no locale-specific glossary exists, use the global glossary only.
+
+---
+
+# Locale-Specific Glossaries
+
+When a locale glossary exists, use it to:
+
+- Apply preferred wording for recurring UI/docs terms in that locale
+- Preserve locale-specific do-not-translate terms and casing decisions
+- Prefer natural phrasing over literal translation when the locale file calls it out
+- If the repo uses a locale alias slug, apply that file too (for example, `pt-BR` maps to `br.md` in this repo)
+
+Locale guidance does not override code/command preservation rules or the global Do-Not-Translate glossary below.
---
diff --git a/README.ar.md b/README.ar.md
index f24e598d5e..aeb2f04b72 100644
--- a/README.ar.md
+++ b/README.ar.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
+
+[](https://opencode.ai)
+
+---
+
+### ইনস্টলেশন (Installation)
+
+```bash
+# YOLO
+curl -fsSL https://opencode.ai/install | bash
+
+# Package managers
+npm i -g opencode-ai@latest # or bun/pnpm/yarn
+scoop install opencode # Windows
+choco install opencode # Windows
+brew install anomalyco/tap/opencode # macOS and Linux (recommended, always up to date)
+brew install opencode # macOS and Linux (official brew formula, updated less)
+sudo pacman -S opencode # Arch Linux (Stable)
+paru -S opencode-bin # Arch Linux (Latest from AUR)
+mise use -g opencode # Any OS
+nix run nixpkgs#opencode # or github:anomalyco/opencode for latest dev branch
+```
+
+> [!TIP]
+> ইনস্টল করার আগে ০.১.x এর চেয়ে পুরোনো ভার্সনগুলো মুছে ফেলুন।
+
+### ডেস্কটপ অ্যাপ (BETA)
+
+OpenCode ডেস্কটপ অ্যাপ্লিকেশন হিসেবেও উপলব্ধ। সরাসরি [রিলিজ পেজ](https://github.com/anomalyco/opencode/releases) অথবা [opencode.ai/download](https://opencode.ai/download) থেকে ডাউনলোড করুন।
+
+| প্ল্যাটফর্ম | ডাউনলোড |
+| --------------------- | ------------------------------------- |
+| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
+| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
+| Windows | `opencode-desktop-windows-x64.exe` |
+| Linux | `.deb`, `.rpm`, or AppImage |
+
+```bash
+# macOS (Homebrew)
+brew install --cask opencode-desktop
+# Windows (Scoop)
+scoop bucket add extras; scoop install extras/opencode-desktop
+```
+
+#### ইনস্টলেশন ডিরেক্টরি (Installation Directory)
+
+ইনস্টল স্ক্রিপ্টটি ইনস্টলেশন পাতের জন্য নিম্নলিখিত অগ্রাধিকার ক্রম মেনে চলে:
+
+1. `$OPENCODE_INSTALL_DIR` - কাস্টম ইনস্টলেশন ডিরেক্টরি
+2. `$XDG_BIN_DIR` - XDG বেস ডিরেক্টরি স্পেসিফিকেশন সমর্থিত পাথ
+3. `$HOME/bin` - সাধারণ ব্যবহারকারী বাইনারি ডিরেক্টরি (যদি বিদ্যমান থাকে বা তৈরি করা যায়)
+4. `$HOME/.opencode/bin` - ডিফল্ট ফলব্যাক
+
+```bash
+# উদাহরণ
+OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
+XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
+```
+
+### এজেন্টস (Agents)
+
+OpenCode এ দুটি বিল্ট-ইন এজেন্ট রয়েছে যা আপনি `Tab` কি(key) দিয়ে পরিবর্তন করতে পারবেন।
+
+- **build** - ডিফল্ট, ডেভেলপমেন্টের কাজের জন্য সম্পূর্ণ অ্যাক্সেসযুক্ত এজেন্ট
+- **plan** - বিশ্লেষণ এবং কোড এক্সপ্লোরেশনের জন্য রিড-ওনলি এজেন্ট
+ - ডিফল্টভাবে ফাইল এডিট করতে দেয় না
+ - ব্যাশ কমান্ড চালানোর আগে অনুমতি চায়
+ - অপরিচিত কোডবেস এক্সপ্লোর করা বা পরিবর্তনের পরিকল্পনা করার জন্য আদর্শ
+
+এছাড়াও জটিল অনুসন্ধান এবং মাল্টিস্টেপ টাস্কের জন্য একটি **general** সাবএজেন্ট অন্তর্ভুক্ত রয়েছে।
+এটি অভ্যন্তরীণভাবে ব্যবহৃত হয় এবং মেসেজে `@general` লিখে ব্যবহার করা যেতে পারে।
+
+এজেন্টদের সম্পর্কে আরও জানুন: [docs](https://opencode.ai/docs/agents)।
+
+### ডকুমেন্টেশন (Documentation)
+
+কিভাবে OpenCode কনফিগার করবেন সে সম্পর্কে আরও তথ্যের জন্য, [**আমাদের ডকস দেখুন**](https://opencode.ai/docs)।
+
+### অবদান (Contributing)
+
+আপনি যদি OpenCode এ অবদান রাখতে চান, অনুগ্রহ করে একটি পুল রিকোয়েস্ট সাবমিট করার আগে আমাদের [কন্ট্রিবিউটিং ডকস](./CONTRIBUTING.md) পড়ে নিন।
+
+### OpenCode এর উপর বিল্ডিং (Building on OpenCode)
+
+আপনি যদি এমন প্রজেক্টে কাজ করেন যা OpenCode এর সাথে সম্পর্কিত এবং প্রজেক্টের নামের অংশ হিসেবে "opencode" ব্যবহার করেন, উদাহরণস্বরূপ "opencode-dashboard" বা "opencode-mobile", তবে দয়া করে আপনার README তে একটি নোট যোগ করে স্পষ্ট করুন যে এই প্রজেক্টটি OpenCode দল দ্বারা তৈরি হয়নি এবং আমাদের সাথে এর কোনো সরাসরি সম্পর্ক নেই।
+
+### সচরাচর জিজ্ঞাসিত প্রশ্নাবলী (FAQ)
+
+#### এটি ক্লড কোড (Claude Code) থেকে কীভাবে আলাদা?
+
+ক্যাপাবিলিটির দিক থেকে এটি ক্লড কোডের (Claude Code) মতই। এখানে মূল পার্থক্যগুলো দেওয়া হলো:
+
+- ১০০% ওপেন সোর্স
+- কোনো প্রোভাইডারের সাথে আবদ্ধ নয়। যদিও আমরা [OpenCode Zen](https://opencode.ai/zen) এর মাধ্যমে মডেলসমূহ ব্যবহারের পরামর্শ দিই, OpenCode ক্লড (Claude), ওপেনএআই (OpenAI), গুগল (Google), অথবা লোকাল মডেলগুলোর সাথেও ব্যবহার করা যেতে পারে। যেমন যেমন মডেলগুলো উন্নত হবে, তাদের মধ্যকার পার্থক্য কমে আসবে এবং দামও কমবে, তাই প্রোভাইডার-অজ্ঞাস্টিক হওয়া খুবই গুরুত্বপূর্ণ।
+- আউট-অফ-দ্য-বক্স LSP সাপোর্ট
+- TUI এর উপর ফোকাস। OpenCode নিওভিম (neovim) ব্যবহারকারী এবং [terminal.shop](https://terminal.shop) এর নির্মাতাদের দ্বারা তৈরি; আমরা টার্মিনালে কী কী সম্ভব তার সীমাবদ্ধতা ছাড়িয়ে যাওয়ার চেষ্টা করছি।
+- ক্লায়েন্ট/সার্ভার আর্কিটেকচার। এটি যেমন OpenCode কে আপনার কম্পিউটারে চালানোর সুযোগ দেয়, তেমনি আপনি মোবাইল অ্যাপ থেকে রিমোটলি এটি নিয়ন্ত্রণ করতে পারবেন, অর্থাৎ TUI ফ্রন্টএন্ড কেবল সম্ভাব্য ক্লায়েন্টগুলোর মধ্যে একটি।
+
+---
+
+**আমাদের কমিউনিটিতে যুক্ত হোন** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)
diff --git a/README.br.md b/README.br.md
index 4802c4996f..6044dad6c0 100644
--- a/README.br.md
+++ b/README.br.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.bs.md b/README.bs.md
index 9ad6852018..ef54a83695 100644
--- a/README.bs.md
+++ b/README.bs.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.da.md b/README.da.md
index 4b1302dbc3..3ffbbe8202 100644
--- a/README.da.md
+++ b/README.da.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.de.md b/README.de.md
index 16116dc72f..64c6628b45 100644
--- a/README.de.md
+++ b/README.de.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.es.md b/README.es.md
index 5c18ff4aca..875c8b0832 100644
--- a/README.es.md
+++ b/README.es.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.fr.md b/README.fr.md
index 0382164bed..254d38577b 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.it.md b/README.it.md
index c966ccec49..b1f75c2d2c 100644
--- a/README.it.md
+++ b/README.it.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ja.md b/README.ja.md
index 11109e7eb4..31d11dcf1a 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ko.md b/README.ko.md
index 23fea76b1e..5f9de2cf3f 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.md b/README.md
index 99b4b2c50f..620415c961 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.no.md b/README.no.md
index 9b9e90dc38..125e181257 100644
--- a/README.no.md
+++ b/README.no.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.pl.md b/README.pl.md
index fced98dfc3..61ef5870c1 100644
--- a/README.pl.md
+++ b/README.pl.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.ru.md b/README.ru.md
index a7c590c16b..fed1101c0e 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.th.md b/README.th.md
index 0999167f23..01d68dd8dc 100644
--- a/README.th.md
+++ b/README.th.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.tr.md b/README.tr.md
index 67f84e4ddb..bfb18e1b43 100644
--- a/README.tr.md
+++ b/README.tr.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.uk.md b/README.uk.md
index 77e859a45d..ed20fbf236 100644
--- a/README.uk.md
+++ b/README.uk.md
@@ -33,7 +33,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.zh.md b/README.zh.md
index 113d476b2e..c6d1c1d11f 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/README.zht.md b/README.zht.md
index b518104443..0dd44a9f0f 100644
--- a/README.zht.md
+++ b/README.zht.md
@@ -32,7 +32,8 @@
Português (Brasil) |
ไทย |
Türkçe |
- Українська
+ Українська |
+ বাংলা
[](https://opencode.ai)
diff --git a/packages/app/e2e/selectors.ts b/packages/app/e2e/selectors.ts
index be0bc05717..5fad2c06b5 100644
--- a/packages/app/e2e/selectors.ts
+++ b/packages/app/e2e/selectors.ts
@@ -20,11 +20,8 @@ export const settingsNotificationsAgentSelector = '[data-action="settings-notifi
export const settingsNotificationsPermissionsSelector = '[data-action="settings-notifications-permissions"]'
export const settingsNotificationsErrorsSelector = '[data-action="settings-notifications-errors"]'
export const settingsSoundsAgentSelector = '[data-action="settings-sounds-agent"]'
-export const settingsSoundsAgentEnabledSelector = '[data-action="settings-sounds-agent-enabled"]'
export const settingsSoundsPermissionsSelector = '[data-action="settings-sounds-permissions"]'
-export const settingsSoundsPermissionsEnabledSelector = '[data-action="settings-sounds-permissions-enabled"]'
export const settingsSoundsErrorsSelector = '[data-action="settings-sounds-errors"]'
-export const settingsSoundsErrorsEnabledSelector = '[data-action="settings-sounds-errors-enabled"]'
export const settingsUpdatesStartupSelector = '[data-action="settings-updates-startup"]'
export const settingsReleaseNotesSelector = '[data-action="settings-release-notes"]'
diff --git a/packages/app/e2e/settings/settings.spec.ts b/packages/app/e2e/settings/settings.spec.ts
index 9fbcf79f5e..c2a8522eb0 100644
--- a/packages/app/e2e/settings/settings.spec.ts
+++ b/packages/app/e2e/settings/settings.spec.ts
@@ -9,7 +9,6 @@ import {
settingsNotificationsPermissionsSelector,
settingsReleaseNotesSelector,
settingsSoundsAgentSelector,
- settingsSoundsAgentEnabledSelector,
settingsSoundsErrorsSelector,
settingsSoundsPermissionsSelector,
settingsThemeSelector,
@@ -336,21 +335,19 @@ test("changing sound agent selection persists in localStorage", async ({ page, g
expect(stored?.sounds?.agent).not.toBe("staplebops-01")
})
-test("disabling agent sound disables sound selection", async ({ page, gotoSession }) => {
+test("selecting none disables agent sound", async ({ page, gotoSession }) => {
await gotoSession()
const dialog = await openSettings(page)
const select = dialog.locator(settingsSoundsAgentSelector)
- const switchContainer = dialog.locator(settingsSoundsAgentEnabledSelector)
const trigger = select.locator('[data-slot="select-select-trigger"]')
await expect(select).toBeVisible()
- await expect(switchContainer).toBeVisible()
await expect(trigger).toBeEnabled()
- await switchContainer.locator('[data-slot="switch-control"]').click()
- await page.waitForTimeout(100)
-
- await expect(trigger).toBeDisabled()
+ await trigger.click()
+ const items = page.locator('[data-slot="select-select-item"]')
+ await expect(items.first()).toBeVisible()
+ await items.first().click()
const stored = await page.evaluate((key) => {
const raw = localStorage.getItem(key)
diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.tsx b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
index 97f95278a1..a4b64889ca 100644
--- a/packages/console/app/src/routes/workspace/[id]/model-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
@@ -36,7 +36,7 @@ const getModelsInfo = query(async (workspaceID: string) => {
"use server"
return withActor(async () => {
return {
- all: Object.entries(ZenData.list().models)
+ all: Object.entries(ZenData.list("full").models)
.filter(([id, _model]) => !["claude-3-5-haiku"].includes(id))
.filter(([id, _model]) => !id.startsWith("alpha-"))
.sort(([idA, modelA], [idB, modelB]) => {
diff --git a/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts b/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts
new file mode 100644
index 0000000000..9a57e893fb
--- /dev/null
+++ b/packages/console/app/src/routes/zen/lite/v1/chat/completions.ts
@@ -0,0 +1,12 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { handler } from "~/routes/zen/util/handler"
+
+export function POST(input: APIEvent) {
+ return handler(input, {
+ format: "oa-compat",
+ modelList: "lite",
+ parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
+ parseModel: (url: string, body: any) => body.model,
+ parseIsStream: (url: string, body: any) => !!body.stream,
+ })
+}
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
index ee717ba5ff..5f2b51c21e 100644
--- a/packages/console/app/src/routes/zen/util/handler.ts
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -44,6 +44,7 @@ export async function handler(
input: APIEvent,
opts: {
format: ZenData.Format
+ modelList: "lite" | "full"
parseApiKey: (headers: Headers) => string | undefined
parseModel: (url: string, body: any) => string
parseIsStream: (url: string, body: any) => boolean
@@ -77,7 +78,7 @@ export async function handler(
request: requestId,
client: ocClient,
})
- const zenData = ZenData.list()
+ const zenData = ZenData.list(opts.modelList)
const modelInfo = validateModel(zenData, model)
const dataDumper = createDataDumper(sessionId, requestId, projectId)
const trialLimiter = createTrialLimiter(modelInfo.trial, ip, ocClient)
diff --git a/packages/console/app/src/routes/zen/v1/chat/completions.ts b/packages/console/app/src/routes/zen/v1/chat/completions.ts
index 6554591293..e9e05197e2 100644
--- a/packages/console/app/src/routes/zen/v1/chat/completions.ts
+++ b/packages/console/app/src/routes/zen/v1/chat/completions.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "oa-compat",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/app/src/routes/zen/v1/messages.ts b/packages/console/app/src/routes/zen/v1/messages.ts
index 54d223f95a..9c09315a6e 100644
--- a/packages/console/app/src/routes/zen/v1/messages.ts
+++ b/packages/console/app/src/routes/zen/v1/messages.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "anthropic",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/app/src/routes/zen/v1/models.ts b/packages/console/app/src/routes/zen/v1/models.ts
index ee2b3ab541..f9c14ededd 100644
--- a/packages/console/app/src/routes/zen/v1/models.ts
+++ b/packages/console/app/src/routes/zen/v1/models.ts
@@ -17,7 +17,7 @@ export async function OPTIONS(input: APIEvent) {
}
export async function GET(input: APIEvent) {
- const zenData = ZenData.list()
+ const zenData = ZenData.list("full")
const disabledModels = await authenticate()
return new Response(
diff --git a/packages/console/app/src/routes/zen/v1/models/[model].ts b/packages/console/app/src/routes/zen/v1/models/[model].ts
index b20378e379..a4edd5861a 100644
--- a/packages/console/app/src/routes/zen/v1/models/[model].ts
+++ b/packages/console/app/src/routes/zen/v1/models/[model].ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "google",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined,
parseModel: (url: string, body: any) => url.split("/").pop()?.split(":")?.[0] ?? "",
parseIsStream: (url: string, body: any) =>
diff --git a/packages/console/app/src/routes/zen/v1/responses.ts b/packages/console/app/src/routes/zen/v1/responses.ts
index a82a667cc7..cae625cf6f 100644
--- a/packages/console/app/src/routes/zen/v1/responses.ts
+++ b/packages/console/app/src/routes/zen/v1/responses.ts
@@ -4,6 +4,7 @@ import { handler } from "~/routes/zen/util/handler"
export function POST(input: APIEvent) {
return handler(input, {
format: "openai",
+ modelList: "full",
parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
parseModel: (url: string, body: any) => body.model,
parseIsStream: (url: string, body: any) => !!body.stream,
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
index 6011cac376..e868b176e8 100644
--- a/packages/console/core/src/model.ts
+++ b/packages/console/core/src/model.ts
@@ -73,6 +73,7 @@ export namespace ZenData {
const ModelsSchema = z.object({
models: z.record(z.string(), z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))])),
+ liteModels: z.record(z.string(), ModelSchema),
providers: z.record(z.string(), ProviderSchema),
providerFamilies: z.record(z.string(), ProviderFamilySchema),
})
@@ -81,7 +82,7 @@ export namespace ZenData {
return input
})
- export const list = fn(z.void(), () => {
+ export const list = fn(z.enum(["lite", "full"]), (modelList) => {
const json = JSON.parse(
Resource.ZEN_MODELS1.value +
Resource.ZEN_MODELS2.value +
@@ -114,9 +115,9 @@ export namespace ZenData {
Resource.ZEN_MODELS29.value +
Resource.ZEN_MODELS30.value,
)
- const { models, providers, providerFamilies } = ModelsSchema.parse(json)
+ const { models, liteModels, providers, providerFamilies } = ModelsSchema.parse(json)
return {
- models,
+ models: modelList === "lite" ? liteModels : models,
providers: Object.fromEntries(
Object.entries(providers).map(([id, provider]) => [
id,
diff --git a/packages/desktop/src-tauri/icons/README.md b/packages/desktop/src-tauri/icons/README.md
index db86593cc3..fa219a77ef 100644
--- a/packages/desktop/src-tauri/icons/README.md
+++ b/packages/desktop/src-tauri/icons/README.md
@@ -3,8 +3,8 @@
Here's the process I've been using to create icons:
- Save source image as `app-icon.png` in `packages/desktop`
-- `cd` to `src-tauri`
-- Run `bun tauri icons -o icons/{environment}`
+- `cd` to `packages/desktop`
+- Run `bun tauri icon -o src-tauri/icons/{environment}`
- Use [Image2Icon](https://img2icnsapp.com/)'s 'Big Sur Icon' preset to generate an `icon.icns` file and place it in the appropriate icons folder
The Image2Icon step is necessary as the `icon.icns` generated by `app-icon.png` does not apply the shadow/padding expected by macOS,
diff --git a/packages/desktop/src-tauri/icons/beta/128x128.png b/packages/desktop/src-tauri/icons/beta/128x128.png
new file mode 100644
index 0000000000..751e80f1fd
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/128x128.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/128x128@2x.png b/packages/desktop/src-tauri/icons/beta/128x128@2x.png
new file mode 100644
index 0000000000..fe330df419
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/128x128@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/32x32.png b/packages/desktop/src-tauri/icons/beta/32x32.png
new file mode 100644
index 0000000000..2703048eed
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/32x32.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/64x64.png b/packages/desktop/src-tauri/icons/beta/64x64.png
new file mode 100644
index 0000000000..ecd7fe3142
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/64x64.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square107x107Logo.png b/packages/desktop/src-tauri/icons/beta/Square107x107Logo.png
new file mode 100644
index 0000000000..e6ea73f4da
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square107x107Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square142x142Logo.png b/packages/desktop/src-tauri/icons/beta/Square142x142Logo.png
new file mode 100644
index 0000000000..74ae729c42
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square142x142Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square150x150Logo.png b/packages/desktop/src-tauri/icons/beta/Square150x150Logo.png
new file mode 100644
index 0000000000..0b109b8f4a
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square150x150Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square284x284Logo.png b/packages/desktop/src-tauri/icons/beta/Square284x284Logo.png
new file mode 100644
index 0000000000..0261ded42c
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square284x284Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square30x30Logo.png b/packages/desktop/src-tauri/icons/beta/Square30x30Logo.png
new file mode 100644
index 0000000000..34158f10a4
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square30x30Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square310x310Logo.png b/packages/desktop/src-tauri/icons/beta/Square310x310Logo.png
new file mode 100644
index 0000000000..f18bfada4c
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square310x310Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square44x44Logo.png b/packages/desktop/src-tauri/icons/beta/Square44x44Logo.png
new file mode 100644
index 0000000000..6d1cc06c08
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square44x44Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square71x71Logo.png b/packages/desktop/src-tauri/icons/beta/Square71x71Logo.png
new file mode 100644
index 0000000000..a26084dc2f
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square71x71Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/Square89x89Logo.png b/packages/desktop/src-tauri/icons/beta/Square89x89Logo.png
new file mode 100644
index 0000000000..58b0eb6053
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/Square89x89Logo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/StoreLogo.png b/packages/desktop/src-tauri/icons/beta/StoreLogo.png
new file mode 100644
index 0000000000..648fd2114d
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/StoreLogo.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml b/packages/desktop/src-tauri/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000..2ffbf24b68
--- /dev/null
+++ b/packages/desktop/src-tauri/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..39d1dd0d51
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000..84908e71c1
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..a6b8cb6162
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..6522e0fba8
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000..b3449bd4f3
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..7aa97d8276
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..82bc9d22a6
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000..6b031ce851
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..34859de5ef
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4cdb71d62b
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000..a64be6ada1
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..2de3c27342
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0ead288664
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000..bdd1748258
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..69f74758ec
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/android/values/ic_launcher_background.xml b/packages/desktop/src-tauri/icons/beta/android/values/ic_launcher_background.xml
new file mode 100644
index 0000000000..ea9c223a6c
--- /dev/null
+++ b/packages/desktop/src-tauri/icons/beta/android/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #fff
+
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/icons/beta/icon.icns b/packages/desktop/src-tauri/icons/beta/icon.icns
new file mode 100644
index 0000000000..f98de5da88
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/icon.icns differ
diff --git a/packages/desktop/src-tauri/icons/beta/icon.ico b/packages/desktop/src-tauri/icons/beta/icon.ico
new file mode 100644
index 0000000000..df8588c8e4
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/icon.ico differ
diff --git a/packages/desktop/src-tauri/icons/beta/icon.png b/packages/desktop/src-tauri/icons/beta/icon.png
new file mode 100644
index 0000000000..5313049562
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/icon.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@1x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@1x.png
new file mode 100644
index 0000000000..e8ebb28efe
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@1x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x-1.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x-1.png
new file mode 100644
index 0000000000..50c8015dea
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x-1.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x.png
new file mode 100644
index 0000000000..50c8015dea
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@3x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@3x.png
new file mode 100644
index 0000000000..6e290dbc68
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-20x20@3x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@1x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@1x.png
new file mode 100644
index 0000000000..4ef554b4de
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@1x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x-1.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x-1.png
new file mode 100644
index 0000000000..b9ddfd47c8
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x-1.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x.png
new file mode 100644
index 0000000000..b9ddfd47c8
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@3x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@3x.png
new file mode 100644
index 0000000000..052322d682
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-29x29@3x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@1x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@1x.png
new file mode 100644
index 0000000000..50c8015dea
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@1x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x-1.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x-1.png
new file mode 100644
index 0000000000..9317b25001
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x-1.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x.png
new file mode 100644
index 0000000000..9317b25001
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@3x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@3x.png
new file mode 100644
index 0000000000..6b921a17e3
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-40x40@3x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-512@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-512@2x.png
new file mode 100644
index 0000000000..b83131d64b
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-512@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@2x.png
new file mode 100644
index 0000000000..6b921a17e3
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@3x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@3x.png
new file mode 100644
index 0000000000..685004995c
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-60x60@3x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@1x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@1x.png
new file mode 100644
index 0000000000..1ffceb752a
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@1x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@2x.png
new file mode 100644
index 0000000000..81c4178c91
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-76x76@2x.png differ
diff --git a/packages/desktop/src-tauri/icons/beta/ios/AppIcon-83.5x83.5@2x.png b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-83.5x83.5@2x.png
new file mode 100644
index 0000000000..d5453adffb
Binary files /dev/null and b/packages/desktop/src-tauri/icons/beta/ios/AppIcon-83.5x83.5@2x.png differ
diff --git a/packages/desktop/src-tauri/tauri.beta.conf.json b/packages/desktop/src-tauri/tauri.beta.conf.json
index 5207c73fc1..4dd7879933 100644
--- a/packages/desktop/src-tauri/tauri.beta.conf.json
+++ b/packages/desktop/src-tauri/tauri.beta.conf.json
@@ -4,6 +4,18 @@
"identifier": "ai.opencode.desktop.beta",
"bundle": {
"createUpdaterArtifacts": true,
+ "icon": [
+ "icons/beta/32x32.png",
+ "icons/beta/128x128.png",
+ "icons/beta/128x128@2x.png",
+ "icons/beta/icon.icns",
+ "icons/beta/icon.ico"
+ ],
+ "windows": {
+ "nsis": {
+ "installerIcon": "icons/beta/icon.ico"
+ }
+ },
"linux": {
"rpm": {
"compression": {
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 3415c034cf..07a718141a 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -490,8 +490,10 @@
}
[data-component="edit-content"] {
+ border-radius: inherit;
border-top: 1px solid var(--border-weaker-base);
max-height: 420px;
+ overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
@@ -500,15 +502,24 @@
&::-webkit-scrollbar {
display: none;
}
+
+ [data-component="diff"] {
+ border-radius: inherit;
+ overflow: hidden;
+ }
}
[data-component="write-content"] {
+ border-radius: inherit;
border-top: 1px solid var(--border-weaker-base);
max-height: 240px;
+ overflow-x: hidden;
overflow-y: auto;
[data-component="code"] {
- padding-bottom: 0px !important;
+ padding-bottom: 0 !important;
+ border-radius: inherit;
+ overflow: hidden;
}
/* Hide scrollbar */
@@ -1285,6 +1296,8 @@
}
[data-component="apply-patch-file-diff"] {
+ border-radius: inherit;
+ overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
@@ -1292,6 +1305,11 @@
&::-webkit-scrollbar {
display: none;
}
+
+ [data-component="diff"] {
+ border-radius: inherit;
+ overflow: hidden;
+ }
}
[data-component="tool-loaded-file"] {
diff --git a/packages/web/src/content/docs/ko/gitlab.mdx b/packages/web/src/content/docs/ko/gitlab.mdx
index 7b6468c740..850cd62258 100644
--- a/packages/web/src/content/docs/ko/gitlab.mdx
+++ b/packages/web/src/content/docs/ko/gitlab.mdx
@@ -1,34 +1,34 @@
---
title: GitLab
-description: GitLab 이슈 및 머지 리퀘스트에서 opencode를 사용하세요.
+description: GitLab 이슈와 merge request에서 OpenCode를 사용하세요.
---
-opencode는 GitLab CI/CD 파이프라인 또는 GitLab Duo를 통해 GitLab 워크플로우와 통합됩니다.
+OpenCode는 GitLab CI/CD 파이프라인 또는 GitLab Duo를 통해 GitLab 워크플로에 통합됩니다.
-두 경우, opencode는 GitLab runners에서 실행됩니다.
+두 경우 모두 OpenCode는 GitLab runner에서 실행됩니다.
---
-# GitLab CI 소개
+## GitLab CI
-opencode는 일반 GitLab 파이프라인에서 작동합니다. [CI 컴포넌트](https://docs.gitlab.com/ee/ci/components/)로 파이프라인에 구축할 수 있습니다.
+OpenCode는 일반 GitLab 파이프라인에서 작동합니다. [CI component](https://docs.gitlab.com/ee/ci/components/)로 파이프라인에 통합할 수 있습니다.
-여기에서 우리는 opencode에 대한 커뮤니티 생성 CI / CD 구성품을 사용하고 있습니다. [nagyv/gitlab-opencode](https://gitlab.com/nagyv/gitlab-opencode).
+여기서는 OpenCode용 커뮤니티 제작 CI/CD component인 [nagyv/gitlab-opencode](https://gitlab.com/nagyv/gitlab-opencode)를 사용합니다.
---
### 기능
-- **실행별 사용자 지정 구성 사용**: 사용자 정의 구성 디렉토리와 opencode 구성, 예를 들어 `./config/#custom-directory`는 opencode 실행마다 활성화하거나 비활성화 할 수 있습니다.
-- ** 최소 설정**: CI 구성 요소는 opencode를 배경으로 설정하면 opencode 구성과 초기 프롬프트를 만들 필요가 있습니다.
-- **Flexible**: CI 구성 요소는 여러 입력을 지원합니다.
+- **job별 custom config 사용**: custom config 디렉터리(예: `./config/#custom-directory`)를 사용해 OpenCode를 각 실행 단위로 설정하고 기능을 켜거나 끌 수 있습니다.
+- **최소 설정**: CI component가 백그라운드에서 OpenCode를 설정하므로 OpenCode config와 초기 prompt만 만들면 됩니다.
+- **유연함**: CI component는 동작을 사용자화할 수 있도록 여러 입력값을 지원합니다.
---
-## 설정
+### Setup
-1. opencode 인증 JSON을 **Settings** > **CI/CD** > **Variables**에서 파일 유형 CI 환경 변수로 저장하십시오. "Masked and hidden"로 표시하십시오.
-2. `.gitlab-ci.yml` 파일에 뒤에 추가하십시오.
+1. OpenCode 인증 JSON을 **Settings** > **CI/CD** > **Variables** 아래의 File 타입 CI 환경 변수로 저장하세요. 반드시 "Masked and hidden"으로 표시하세요.
+2. 아래 내용을 `.gitlab-ci.yml` 파일에 추가하세요.
```yaml title=".gitlab-ci.yml"
include:
@@ -40,40 +40,40 @@ opencode는 일반 GitLab 파이프라인에서 작동합니다. [CI 컴포넌
message: "Your prompt here"
```
-더 많은 입력 및 사용 사례 [docs를 체크 아웃](https://gitlab.com/explore/catalog/nagyv/gitlab-opencode) 이 구성 요소에 대한.
+더 많은 입력값과 사용 사례는 이 component의 [docs](https://gitlab.com/explore/catalog/nagyv/gitlab-opencode)에서 확인하세요.
---
## GitLab Duo
-opencode는 GitLab 워크플로우와 통합됩니다.
-코멘트에 Mention `@opencode`, opencode는 GitLab CI 파이프라인 내에서 작업을 실행합니다.
+OpenCode는 GitLab 워크플로에 통합됩니다.
+댓글에서 `@opencode`를 멘션하면 OpenCode가 GitLab CI 파이프라인 안에서 작업을 실행합니다.
---
### 기능
-- **이슈**: opencode가 문제점을 보고 당신을 설명합니다.
-- **수정 및 구현**: 이슈를 수정하거나 기능을 구현하려면 opencode에 문의하십시오.
- 새로운 지점을 만들고 변화를 병합 요청을 제기합니다.
-- **보안**: opencode는 GitLab runners에서 실행됩니다.
+- **이슈 분류**: OpenCode에 이슈를 살펴보고 설명해 달라고 요청할 수 있습니다.
+- **수정 및 구현**: OpenCode에 이슈를 수정하거나 기능을 구현해 달라고 요청할 수 있습니다.
+ OpenCode는 새 브랜치를 만들고 변경 사항이 담긴 merge request를 생성합니다.
+- **보안**: OpenCode는 GitLab runner에서 실행됩니다.
---
-## 설정
+### Setup
-opencode는 GitLab CI/CD 파이프라인에서 실행되며, 여기서 설정해야 할 일은 다음과 같습니다.
+OpenCode는 GitLab CI/CD 파이프라인에서 실행되며, 설정에 필요한 항목은 다음과 같습니다.
:::tip
-[**GitLab docs**](https://docs.gitlab.com/user/duo agent platform/agent assistant/) 를 체크 아웃하십시오.
+[최신 안내는 **GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/)를 확인하세요.
:::
-1. GitLab 환경 설정
-2. CI/CD 설치
-3. AI 모형 공급자 API 열쇠를 얻으십시오
-4. 서비스 계정 만들기
-5. CI/CD 변수 구성
-6. Flow config 파일을 만들려면 다음과 같습니다.
+1. GitLab 환경을 설정합니다.
+2. CI/CD를 설정합니다.
+3. AI model provider API 키를 준비합니다.
+4. 서비스 계정을 생성합니다.
+5. CI/CD 변수를 설정합니다.
+6. flow config 파일을 생성합니다. 예시는 다음과 같습니다.
@@ -152,44 +152,44 @@ opencode는 GitLab CI/CD 파이프라인에서 실행되며, 여기서 설정해
-자세한 지침에 대한 [GitLab CLI Agent docs](https://docs.gitlab.com/user/duo agent platform/agent assistant/)를 참조할 수 있습니다.
+[GitLab CLI agents docs](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/)에서 자세한 안내를 확인할 수 있습니다.
---
### 예제
-다음은 GitLab에서 opencode를 사용할 수있는 몇 가지 예입니다.
+다음은 GitLab에서 OpenCode를 사용하는 몇 가지 예시입니다.
:::tip
-`@opencode`보다 다른 트리거 구문을 사용할 수 있습니다.
+`@opencode` 대신 다른 trigger phrase를 사용하도록 설정할 수 있습니다.
:::
- **이슈 설명**
-GitLab 문제에서이 코멘트를 추가하십시오.
+GitLab 이슈에 아래 댓글을 남기세요.
```
@opencode explain this issue
```
-opencode는 문제와 대답을 명확하게 설명합니다.
+OpenCode가 이슈를 읽고 명확한 설명으로 답변합니다.
- **이슈 해결**
-GitLab 문제에서, 말한다:
+GitLab 이슈에서 다음과 같이 요청하세요.
```
@opencode fix this
```
-opencode는 새로운 지점을 만들 것이며 변경 사항을 구현하고 변경 사항을 병합 요청을 엽니다.
+OpenCode가 새 브랜치를 만들고 변경 사항을 구현한 뒤, 해당 변경 사항으로 merge request를 엽니다.
- **머지 리퀘스트 검토**
-GitLab 병합 요청에 대한 다음 의견을 남겨주세요.
+GitLab merge request에 아래 댓글을 남기세요.
```
@opencode review this merge request
```
-opencode는 병합 요청을 검토하고 피드백을 제공합니다.
+OpenCode가 merge request를 검토하고 피드백을 제공합니다.
diff --git a/packages/web/src/content/docs/ko/ide.mdx b/packages/web/src/content/docs/ko/ide.mdx
index 2df782a9e7..ddc7300191 100644
--- a/packages/web/src/content/docs/ko/ide.mdx
+++ b/packages/web/src/content/docs/ko/ide.mdx
@@ -1,35 +1,36 @@
---
title: IDE
-description: VS Code, Cursor 및 기타 IDE용 opencode 확장 프로그램.
+description: VS Code, Cursor 및 기타 IDE용 OpenCode 확장 프로그램
---
-opencode는 VS Code, Cursor, 또는 터미널을 지원하는 IDE와 통합됩니다. 시작하려면 terminal에서 `opencode`를 실행하십시오.
+OpenCode는 VS Code, Cursor, 또는 터미널을 지원하는 모든 IDE와 통합됩니다. 시작하려면 터미널에서 `opencode`를 실행하세요.
---
## 사용법
--**Quick Launch**: `Cmd+Esc` (Mac) 또는 `Ctrl+Esc` (Windows/Linux)를 사용하여 통합 터미널 뷰에 opencode를 열거나 기존 terminal 세션을 이미 실행하면 됩니다. -**New Session**: `Cmd+Shift+Esc` (Mac) 또는 `Ctrl+Shift+Esc` (Windows/Linux)를 사용하여 새로운 opencode terminal 세션을 시작하려면 이미 열리면 됩니다. UI에서 opencode 버튼을 클릭합니다. -**Context Awareness**: opencode로 현재 선택 또는 탭을 자동으로 공유합니다.
-
-- **파일 참조 단축키** : 파일 참조를 삽입하려면 `Cmd+Option+K` (Mac) 또는 `Alt+Ctrl+K` (Linux / Windows)를 사용하십시오. 예를 들어, `@File#L37-42`.
+- **Quick Launch**: `Cmd+Esc` (Mac) 또는 `Ctrl+Esc` (Windows/Linux)를 사용해 분할 터미널 뷰에서 OpenCode를 열거나, 이미 실행 중인 터미널 세션으로 포커스하세요.
+- **New Session**: `Cmd+Shift+Esc` (Mac) 또는 `Ctrl+Shift+Esc` (Windows/Linux)를 사용해 기존 세션이 열려 있어도 새 OpenCode 터미널 세션을 시작하세요. UI의 OpenCode 버튼을 클릭해도 됩니다.
+- **Context Awareness**: 현재 선택 영역이나 탭을 OpenCode와 자동으로 공유합니다.
+- **File Reference Shortcuts**: `Cmd+Option+K` (Mac) 또는 `Alt+Ctrl+K` (Linux/Windows)를 사용해 파일 참조를 삽입하세요. 예: `@File#L37-42`.
---
## 설치
-VS Code에 opencode를 설치하고 Cursor, Windsurf, VSCodium과 같은 인기있는 포크 :
+VS Code와 Cursor, Windsurf, VSCodium 같은 인기 포크에 OpenCode를 설치하려면:
-1. VS Code 열기
-2. 통합 terminal을 여십시오
-3. 실행 `opencode` - 확장 자동으로 설치
+1. VS Code를 여세요.4
+2. 통합 터미널을 여세요.
+3. `opencode`를 실행하세요. 확장 프로그램이 자동으로 설치됩니다.
-반면에 TUI에서 `/editor` 또는 `/export`를 실행할 때, 당신은 `export EDITOR="code --wait"`를 설정할 필요가 있을 것입니다. [Learn more](/docs/tui/#editor-setup).
+반면 TUI에서 `/editor` 또는 `/export`를 실행할 때 자체 IDE를 사용하려면 `export EDITOR="code --wait"`를 설정해야 합니다. [자세히 알아보기](/docs/tui/#editor-setup).
---
-## 수동 설치
+### 수동 설치
-확장 마켓 플레이스에서 **opencode**를 검색하고 **Install**를 클릭합니다.
+Extension Marketplace에서 **OpenCode**를 검색한 다음 **Install**을 클릭하세요.
---
@@ -37,11 +38,11 @@ VS Code에 opencode를 설치하고 Cursor, Windsurf, VSCodium과 같은 인기
확장이 자동으로 설치되지 않는 경우:
-- 통합 terminal에서 `opencode`를 실행하는 것을 보장합니다.
-- IDE용 CLI가 설치됩니다.
-- VS Code : `code` 명령
-- 커서: `cursor` 명령
-- 윈드 서핑을 위해: `windsurf` 명령
-- VSCodium의 경우: `codium` 명령
-- 만약 `Cmd+Shift+P` (Mac) 또는 `Ctrl+Shift+P` (Windows/Linux)를 실행하고 "Shell Command: PATH"에서 'code' 명령을 설치하십시오 (또는 IDE에 해당)
-- Ensure VS Code는 확장을 설치하는 권한이 있습니다.
+- 통합 터미널에서 `opencode`를 실행하고 있는지 확인하세요.
+- IDE용 CLI가 설치되어 있는지 확인하세요.
+ - VS Code: `code` command
+ - Cursor: `cursor` command
+ - Windsurf: `windsurf` command
+ - VSCodium: `codium` command
+ - 설치되어 있지 않다면 `Cmd+Shift+P` (Mac) 또는 `Ctrl+Shift+P` (Windows/Linux)를 실행하고 "Shell Command: Install 'code' command in PATH"(또는 IDE에 맞는 동등한 명령)를 검색하세요.
+- VS Code에 확장 프로그램 설치 권한이 있는지 확인하세요.
diff --git a/packages/web/src/content/docs/ko/index.mdx b/packages/web/src/content/docs/ko/index.mdx
index b94d0750f6..0dfa0bbc83 100644
--- a/packages/web/src/content/docs/ko/index.mdx
+++ b/packages/web/src/content/docs/ko/index.mdx
@@ -7,19 +7,19 @@ import { Tabs, TabItem } from "@astrojs/starlight/components"
import config from "../../../../config.mjs"
export const console = config.console
-[**OpenCode**](/)는 터미널 기반 인터페이스, 데스크톱 앱, IDE 확장 형태로 사용할 수 있는 오픈 소스 AI 코딩 에이전트입니다.
+[**OpenCode**](/)는 오픈 소스 AI coding agent입니다. 터미널 기반 인터페이스, 데스크톱 앱, IDE 확장으로 사용할 수 있습니다.

-바로 시작해 봅시다.
+바로 시작해 보겠습니다.
---
-## 사전 준비
+#### 사전 준비
터미널에서 OpenCode를 사용하려면 다음이 필요합니다.
-1. 최신 터미널 에뮬레이터 (예:)
+1. 다음과 같은 최신 터미널 에뮬레이터
- [WezTerm](https://wezterm.org), 크로스 플랫폼
- [Alacritty](https://alacritty.org), 크로스 플랫폼
- [Ghostty](https://ghostty.org), Linux 및 macOS
@@ -31,13 +31,13 @@ export const console = config.console
## 설치
-가장 쉬운 설치 방법은 설치 스크립트를 사용하는 것입니다.
+OpenCode를 설치하는 가장 쉬운 방법은 설치 스크립트를 사용하는 것입니다.
```bash
curl -fsSL https://opencode.ai/install | bash
```
-아래 명령으로도 설치할 수 있습니다.
+다음 명령으로도 설치할 수 있습니다.
- **Node.js 사용**
@@ -79,9 +79,9 @@ curl -fsSL https://opencode.ai/install | bash
brew install anomalyco/tap/opencode
```
- > 최신 릴리스는 OpenCode tap 사용을 권장합니다. 공식 `brew install opencode` 포뮬러는 Homebrew 팀이 관리하므로 업데이트 주기가 더 긴 편입니다.
+ > 최신 릴리스를 사용하려면 OpenCode tap 사용을 권장합니다. 공식 `brew install opencode` formula는 Homebrew 팀이 관리하며 업데이트 주기가 더 깁니다.
-- **Arch Linux에서 Paru 사용**
+- **Arch Linux에 설치**
```bash
sudo pacman -S opencode # Arch Linux (Stable)
@@ -91,7 +91,7 @@ curl -fsSL https://opencode.ai/install | bash
#### Windows
:::tip[권장: WSL 사용]
-Windows에서는 [Windows Subsystem for Linux (WSL)](/docs/windows-wsl)을 사용하는 것이 가장 좋습니다. OpenCode 기능과의 호환성이 높고 성능도 더 좋습니다.
+Windows에서는 [Windows Subsystem for Linux (WSL)](/docs/windows-wsl) 사용을 권장합니다. 성능이 더 좋고 OpenCode 기능과의 완전한 호환성을 제공합니다.
:::
- **Chocolatey 사용**
@@ -124,7 +124,7 @@ Windows에서는 [Windows Subsystem for Linux (WSL)](/docs/windows-wsl)을 사
docker run -it --rm ghcr.io/anomalyco/opencode
```
-Windows에서 Bun을 통한 OpenCode 설치는 아직 지원되지 않으며, 현재 지원을 준비 중입니다.
+현재 Windows에서 Bun을 사용한 OpenCode 설치 지원은 준비 중입니다.
[Releases](https://github.com/anomalyco/opencode/releases)에서 바이너리를 직접 받아 설치할 수도 있습니다.
@@ -134,16 +134,16 @@ Windows에서 Bun을 통한 OpenCode 설치는 아직 지원되지 않으며,
OpenCode는 API 키를 설정하면 원하는 LLM 제공자를 사용할 수 있습니다.
-LLM 제공자(LLM Provider)를 처음 사용한다면 [OpenCode Zen](/docs/zen)을 추천합니다.
+LLM 제공자를 처음 사용한다면 [OpenCode Zen](/docs/zen) 사용을 권장합니다.
OpenCode 팀이 테스트하고 검증한 모델 목록입니다.
-1. TUI에서 `/connect` 명령을 실행한 뒤 `opencode`를 선택하고 [opencode.ai/auth](https://opencode.ai/auth)로 이동합니다.
+1. TUI에서 `/connect` 명령을 실행하고 `opencode`를 선택한 다음 [opencode.ai/auth](https://opencode.ai/auth)로 이동합니다.
```txt
/connect
```
-2. 로그인 후 결제 정보를 입력하고 API 키를 복사합니다.
+2. 로그인하고 결제 정보를 추가한 뒤 API 키를 복사합니다.
3. API 키를 붙여 넣습니다.
@@ -154,13 +154,13 @@ OpenCode 팀이 테스트하고 검증한 모델 목록입니다.
└ enter
```
-다른 제공자를 선택해도 됩니다. [더 알아보기](/docs/providers#directory).
+또는 다른 제공자 중 하나를 선택할 수도 있습니다. [더 알아보기](/docs/providers#directory).
---
## 초기화
-이제 제공자 구성이 끝났으니, 작업할 프로젝트 디렉터리로 이동합니다.
+이제 제공자 구성을 마쳤으니 작업하려는 프로젝트로 이동합니다.
```bash
cd /path/to/project
@@ -172,19 +172,19 @@ cd /path/to/project
opencode
```
-다음 명령으로 프로젝트용 OpenCode 초기화를 진행합니다.
+다음 명령을 실행해 프로젝트에서 OpenCode를 초기화합니다.
```bash frame="none"
/init
```
-이 명령은 프로젝트를 분석하고 루트에 `AGENTS.md` 파일을 생성합니다.
+이 명령을 실행하면 OpenCode가 프로젝트를 분석하고 프로젝트 루트에 `AGENTS.md` 파일을 생성합니다.
:::tip
-프로젝트의 `AGENTS.md`는 Git에 커밋해 두는 것을 권장합니다.
+프로젝트의 `AGENTS.md` 파일은 Git에 커밋하는 것을 권장합니다.
:::
-그러면 OpenCode가 프로젝트 구조와 코딩 패턴을 더 잘 이해할 수 있습니다.
+이렇게 하면 OpenCode가 프로젝트 구조와 사용 중인 코딩 패턴을 더 잘 이해할 수 있습니다.
---
@@ -192,7 +192,7 @@ opencode
이제 OpenCode로 프로젝트 작업을 시작할 준비가 되었습니다. 무엇이든 물어보세요.
-AI 코딩 에이전트를 처음 쓰는 경우 도움이 되는 예시를 소개합니다.
+AI coding agent를 처음 사용한다면 도움이 될 수 있는 예시를 소개합니다.
---
@@ -208,25 +208,25 @@ OpenCode에 코드베이스 설명을 요청할 수 있습니다.
How is authentication handled in @packages/functions/src/api/index.ts
```
-직접 작업하지 않은 코드 영역을 이해할 때 특히 유용합니다.
+이 방법은 직접 작업하지 않은 코드 영역을 이해할 때 유용합니다.
---
### 기능 추가
-프로젝트에 새 기능을 추가해 달라고 요청할 수 있습니다. 다만 먼저 계획을 만들게 하는 것을 권장합니다.
+OpenCode에 프로젝트의 새 기능 추가를 요청할 수 있습니다. 다만 먼저 계획을 만들도록 요청하는 것을 권장합니다.
1. **계획 만들기**
- OpenCode에는 변경 작업을 비활성화하고 구현 방법을 제안만 하는 *Plan mode*가 있습니다.
+ OpenCode에는 변경 작업 기능을 비활성화하고 기능을 구현할 방법만 제안하는 *Plan mode*가 있습니다.
- **Tab** 키로 전환하면 오른쪽 아래에 모드 표시가 나타납니다.
+ **Tab** 키를 눌러 전환하세요. 화면 오른쪽 아래에서 모드 표시를 확인할 수 있습니다.
```bash frame="none" title="Switch to Plan mode"
```
- 이제 원하는 작업을 구체적으로 설명합니다.
+ 이제 수행하길 원하는 작업을 설명해 보겠습니다.
```txt frame="none"
When a user deletes a note, we'd like to flag it as deleted in the database.
@@ -234,15 +234,15 @@ How is authentication handled in @packages/functions/src/api/index.ts
From this screen, the user can undelete a note or permanently delete it.
```
- OpenCode가 정확히 이해할 만큼 충분한 맥락을 주는 것이 중요합니다. 팀의 주니어 개발자에게 설명하듯 요청하면 도움이 됩니다.
+ OpenCode가 원하는 작업을 이해할 수 있도록 충분한 세부 정보를 제공해야 합니다. 팀의 주니어 개발자에게 말하듯이 설명하면 도움이 됩니다.
:::tip
- 맥락과 예시를 충분히 제공하면 원하는 결과를 얻기 쉽습니다.
+ OpenCode가 원하는 작업을 이해하도록 충분한 맥락과 예시를 제공하세요.
:::
2. **계획 다듬기**
- 계획이 나오면 피드백을 주거나 추가 요구사항을 붙일 수 있습니다.
+ 계획이 나오면 피드백을 주거나 세부 사항을 더 추가할 수 있습니다.
```txt frame="none"
We'd like to design this new screen using a design I've used before.
@@ -250,20 +250,20 @@ How is authentication handled in @packages/functions/src/api/index.ts
```
:::tip
- 이미지를 터미널에 드래그 앤 드롭하면 프롬프트에 첨부할 수 있습니다.
+ 이미지를 터미널에 드래그 앤 드롭해 prompt에 추가하세요.
:::
- OpenCode는 첨부한 이미지를 분석해 프롬프트에 포함합니다.
+ OpenCode는 제공한 이미지를 스캔해 prompt에 추가할 수 있습니다. 이미지를 터미널에 드래그 앤 드롭하면 됩니다.
3. **기능 구현**
- 계획이 충분히 만족스러우면 **Tab** 키를 다시 눌러 *Build mode*로 돌아갑니다.
+ 계획이 충분히 마음에 들면 **Tab** 키를 다시 눌러 *Build mode*로 전환하세요.
```bash frame="none"
```
- 그리고 실제 변경을 요청합니다.
+ 그리고 변경을 적용해 달라고 요청하세요.
```bash frame="none"
Sounds good! Go ahead and make the changes.
@@ -273,7 +273,7 @@ How is authentication handled in @packages/functions/src/api/index.ts
### 바로 변경하기
-비교적 단순한 변경은 계획 검토 없이 바로 구현하도록 요청해도 됩니다.
+비교적 간단한 변경은 계획을 먼저 검토하지 않고 바로 구현하도록 요청할 수 있습니다.
```txt frame="none" "@packages/functions/src/settings.ts" "@packages/functions/src/notes.ts"
We need to add authentication to the /settings route. Take a look at how this is
@@ -281,37 +281,37 @@ handled in the /notes route in @packages/functions/src/notes.ts and implement
the same logic in @packages/functions/src/settings.ts
```
-원하는 변경이 정확히 반영되도록, 필요한 맥락을 충분히 제공하세요.
+OpenCode가 올바른 변경을 하도록 충분한 세부 정보를 제공해야 합니다.
---
### 변경 되돌리기
-예를 들어 OpenCode에 변경을 요청했다고 가정해 보겠습니다.
+예를 들어 OpenCode에 변경을 요청했다고 해보겠습니다.
```txt frame="none" "@packages/functions/src/api/index.ts"
Can you refactor the function in @packages/functions/src/api/index.ts?
```
-결과가 기대와 다르면 `/undo` 명령으로 **되돌릴 수** 있습니다.
+그런데 원하는 결과가 아니었다면 `/undo` 명령으로 변경을 **되돌릴 수** 있습니다.
```bash frame="none"
/undo
```
-OpenCode는 방금 적용한 변경을 되돌리고 원래 메시지를 다시 보여줍니다.
+OpenCode가 방금 적용한 변경을 되돌리고 원래 메시지를 다시 보여줍니다.
```txt frame="none" "@packages/functions/src/api/index.ts"
Can you refactor the function in @packages/functions/src/api/index.ts?
```
-이 상태에서 프롬프트를 다듬어 다시 시도하면 됩니다.
+여기에서 prompt를 수정해 다시 요청할 수 있습니다.
:::tip
`/undo`는 여러 번 연속으로 실행할 수 있습니다.
:::
-반대로 `/redo` 명령으로 **다시 적용**할 수도 있습니다.
+또는 `/redo` 명령으로 변경을 **다시 적용**할 수 있습니다.
```bash frame="none"
/redo
@@ -327,18 +327,18 @@ OpenCode와의 대화는 [팀과 공유](/docs/share)할 수 있습니다.
/share
```
-현재 대화 링크를 생성하고 클립보드에 복사합니다.
+이 명령을 실행하면 현재 대화 링크를 생성하고 클립보드에 복사합니다.
:::note
대화는 기본값으로 공유되지 않습니다.
:::
-아래는 OpenCode [대화 예시](https://opencode.ai/s/4XP1fce5)입니다.
+다음은 OpenCode [대화 예시](https://opencode.ai/s/4XP1fce5)입니다.
---
## 사용자 지정
-이제 OpenCode 사용의 기본은 끝났습니다.
+이제 OpenCode 사용법을 익혔습니다.
-자신의 워크플로우에 맞추려면 [테마 선택](/docs/themes), [키바인드 사용자 지정](/docs/keybinds), [코드 포매터 설정](/docs/formatters), [커스텀 명령 작성](/docs/commands), [OpenCode 구성 조정](/docs/config)을 추천합니다.
+원하는 방식에 맞추려면 [테마 선택](/docs/themes), [키바인드 사용자 지정](/docs/keybinds), [코드 formatter 설정](/docs/formatters), [custom command 만들기](/docs/commands), [OpenCode config 설정](/docs/config)을 권장합니다.
diff --git a/packages/web/src/content/docs/ko/keybinds.mdx b/packages/web/src/content/docs/ko/keybinds.mdx
index d41fb8cef5..aef7ae357a 100644
--- a/packages/web/src/content/docs/ko/keybinds.mdx
+++ b/packages/web/src/content/docs/ko/keybinds.mdx
@@ -1,9 +1,9 @@
---
title: 키바인드
-description: 키바인드를 사용자 지정하세요.
+description: 키바인드를 커스터마이즈하세요.
---
-opencode는 opencode config를 통해 사용자 정의 할 수있는 keybinds 목록을 가지고 있습니다.
+OpenCode에는 OpenCode config를 통해 커스터마이즈할 수 있는 keybinds 목록이 있습니다.
```json title="opencode.json"
{
@@ -107,17 +107,17 @@ opencode는 opencode config를 통해 사용자 정의 할 수있는 keybinds
## 리더 키
-opencode는 대부분의 keybinds에 대한 `leader` 키를 사용합니다. 이것은 당신의 terminal에 있는 충돌을 피합니다.
+OpenCode는 대부분의 keybinds에 `leader` 키를 사용합니다. 이렇게 하면 terminal에서 충돌을 피할 수 있습니다.
-기본적으로 `ctrl+x`는 리더 키이며 대부분의 작업은 리더 키를 먼저 누르고 단축키를 누릅니다. 예를 들어, 새 세션을 시작하려면 먼저 `ctrl+x`를 누르고 `n`를 누릅니다.
+기본값으로 `ctrl+x`가 리더 키이며, 대부분의 작업은 먼저 리더 키를 누른 뒤 단축키를 누릅니다. 예를 들어 새 세션을 시작하려면 먼저 `ctrl+x`를 누르고 `n`을 누릅니다.
-키바인드에 리더 키를 사용할 필요는 없지만, 사용하는 것을 권장합니다.
+keybinds에 리더 키를 꼭 사용할 필요는 없지만, 사용하는 것을 권장합니다.
---
## 키바인드 비활성화
-"none"의 값으로 구성에 키를 추가하여 keybind를 비활성화 할 수 있습니다.
+config에 해당 키를 값 `"none"`으로 추가하면 keybind를 비활성화할 수 있습니다.
```json title="opencode.json"
{
@@ -132,39 +132,39 @@ opencode는 대부분의 keybinds에 대한 `leader` 키를 사용합니다. 이
## 데스크탑 프롬프트 단축키
-opencode 데스크톱 앱 프롬프트 입력은 텍스트 편집을 위한 일반적인 Readline/Emacs-style 단축키를 지원합니다. 이들은 내장되어 있으며 현재 `opencode.json`를 통해 구성할 수 없습니다.
+OpenCode 데스크톱 앱의 프롬프트 입력은 텍스트 편집을 위한 일반적인 Readline/Emacs-style 단축키를 지원합니다. 이 단축키는 내장되어 있으며 현재 `opencode.json`으로는 설정할 수 없습니다.
-| 단축키 | 동작 |
-| -------- | -------------------------- |
-| `ctrl+a` | 현재 행 시작으로 이동 |
-| `ctrl+e` | 현재선 끝으로 이동 |
-| `ctrl+b` | 커서를 다시 한 문자로 이동 |
-| `ctrl+f` | 한자 앞의 커서 |
-| `alt+b` | 한 단어로 커서 이동 |
-| `alt+f` | 한 단어를 넘겨 주세요 |
-| `ctrl+d` | 커서의 캐릭터 삭제 |
-| `ctrl+k` | 노선의 종료 |
-| `ctrl+u` | 노선 시작 |
-| `ctrl+w` | 이전 단어 |
-| `alt+d` | 다음 단어를 죽이기 |
-| `ctrl+t` | 자가용 캐릭터 |
-| `ctrl+g` | 팝오버를 취소 / 응답 취소 |
+| 단축키 | 동작 |
+| -------- | --------------------------------- |
+| `ctrl+a` | 현재 줄 시작으로 이동 |
+| `ctrl+e` | 현재 줄 끝으로 이동 |
+| `ctrl+b` | 커서를 문자 하나 뒤로 이동 |
+| `ctrl+f` | 커서를 문자 하나 앞으로 이동 |
+| `alt+b` | 커서를 단어 하나 뒤로 이동 |
+| `alt+f` | 커서를 단어 하나 앞으로 이동 |
+| `ctrl+d` | 커서 아래 문자 삭제 |
+| `ctrl+k` | 줄 끝까지 삭제 |
+| `ctrl+u` | 줄 시작까지 삭제 |
+| `ctrl+w` | 이전 단어 삭제 |
+| `alt+d` | 다음 단어 삭제 |
+| `ctrl+t` | 문자 순서 바꾸기 |
+| `ctrl+g` | 팝오버 취소 / 실행 중인 응답 중단 |
---
## Shift+Enter
-몇몇 terminal은 기본적으로 입력한 보조 키를 보내지 않습니다. `Shift+Enter`를 이스케이프 시퀀스로 보낼 terminal을 구성해야 할 수 있습니다.
+일부 terminal은 기본적으로 Enter와 modifier 키 조합을 전송하지 않습니다. `Shift+Enter`를 이스케이프 시퀀스로 전송하도록 terminal을 설정해야 할 수도 있습니다.
### Windows Terminal
-`settings.json`를 엽니다:
+다음 경로의 `settings.json`을 여세요:
```
%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
```
-루트 레벨 `actions` 배열에 이것을 추가하십시오:
+루트 레벨 `actions` 배열에 다음을 추가하세요:
```json
"actions": [
@@ -178,7 +178,7 @@ opencode 데스크톱 앱 프롬프트 입력은 텍스트 편집을 위한 일
]
```
-루트 레벨 `keybindings` 배열에 이것을 추가하십시오:
+루트 레벨 `keybindings` 배열에 다음을 추가하세요:
```json
"keybindings": [
@@ -189,4 +189,4 @@ opencode 데스크톱 앱 프롬프트 입력은 텍스트 편집을 위한 일
]
```
-파일을 저장하고 Windows Terminal을 다시 시작하거나 새 탭을 엽니 다.
+파일을 저장한 뒤 Windows Terminal을 다시 시작하거나 새 탭을 여세요.
diff --git a/packages/web/src/content/docs/ko/lsp.mdx b/packages/web/src/content/docs/ko/lsp.mdx
index 31d3dda26d..c1786f6aef 100644
--- a/packages/web/src/content/docs/ko/lsp.mdx
+++ b/packages/web/src/content/docs/ko/lsp.mdx
@@ -1,62 +1,63 @@
---
title: LSP 서버
-description: OpenCode는 LSP 서버와 통합되어 작동합니다.
+description: OpenCode는 LSP 서버와 통합됩니다.
---
-OpenCode는 언어 서버 프로토콜(LSP)과 통합되어 LLM이 코드베이스와 상호 작용할 수 있게 돕습니다. 이를 통해 진단 정보를 사용하여 LLM에 피드백을 제공합니다.
+OpenCode는 Language Server Protocol(LSP)과 통합되어 LLM이 코드베이스와 상호작용하도록 돕습니다. 진단 정보를 활용해 LLM에 피드백을 제공합니다.
---
## 기본 제공 (Built-in)
-OpenCode는 인기 있는 언어들에 대해 여러 내장 LSP 서버를 제공합니다.
+OpenCode는 널리 사용되는 언어를 위해 여러 built-in LSP 서버를 제공합니다.
-| LSP 서버 | 확장자 | 요구사항 |
-| ------------------ | ------------------------------------------------------------------ | ----------------------------------------------------- |
-| astro | .astro | Astro 프로젝트 자동 설치 |
-| bash | .sh, .bash, .zsh, .ksh | bash-language-server 자동 설치 |
-| clangd | .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ | C/C++ 프로젝트용 자동 설치 |
-| csharp | .cs | `.NET SDK` 설치 |
-| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` 명령 사용 가능 |
-| dart | .dart | `dart` 명령 사용 가능 |
-| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` 명령 사용 가능(deno.json/deno.jsonc 자동 감지) |
-| elixir-ls | .ex, .exs | `elixir` 명령 사용 가능 |
-| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | 프로젝트의 `eslint` 의존성 |
-| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` 설치 |
-| gleam | .gleam | `gleam` 명령 사용 가능 |
-| gopls | .go | `go` 명령 사용 가능 |
-| hls | .hs, .lhs | `haskell-language-server-wrapper` 명령 사용 가능 |
-| jdtls | .java | `Java SDK (version 21+)` 설치 |
-| kotlin-ls | .kt, .kts | Kotlin 프로젝트용 자동 설치 |
-| lua-ls | .lua | Lua 프로젝트용 자동 설치 |
-| nixd | .nix | `nixd` 명령 사용 가능 |
-| ocaml-lsp | .ml, .mli | `ocamllsp` 명령 사용 가능 |
-| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .ct, .vue, .astro, .svelte | 프로젝트의 `oxlint` 의존성 |
-| PHP intelephense | .php | PHP 프로젝트 자동 설치 |
-| prisma | .prisma | `prisma` 명령 사용 가능 |
-| pyright | .py, .pyi | `pyright` 의존성 설치 |
-| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | `ruby` 및 `gem` 명령 사용 가능 |
-| rust | .rs | `rust-analyzer` 명령 사용 가능 |
-| sourcekit-lsp | .swift, .objc, .objcpp | `swift` 설치 (macOS의 `xcode`) |
-| svelte | .svelte | Svelte 프로젝트 자동 설치 |
-| terraform | .tf, .tfvars | GitHub 릴리스에서 자동 설치 |
-| typst | .typ, .typc | GitHub 릴리스에서 자동 설치 |
-| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | 프로젝트의 `typescript` 의존성 |
-| vue | .vue | Vue 프로젝트 자동 설치 |
-| yaml-ls | .yaml, .yml | Red Hat yaml-language-server 자동 설치 |
-| zls | .zig, .zon | `zig` 명령 사용 가능 |
+| LSP 서버 | 확장자 | 요구 사항 |
+| ------------------ | ------------------------------------------------------------------- | ---------------------------------------------------------- |
+| astro | .astro | Astro 프로젝트에서 자동 설치 |
+| bash | .sh, .bash, .zsh, .ksh | `bash-language-server` 자동 설치 |
+| clangd | .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ | C/C++ 프로젝트에서 자동 설치 |
+| csharp | .cs | `.NET SDK` 설치됨 |
+| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` 명령 사용 가능 |
+| dart | .dart | `dart` 명령 사용 가능 |
+| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` 명령 사용 가능 (`deno.json`/`deno.jsonc` 자동 감지) |
+| elixir-ls | .ex, .exs | `elixir` 명령 사용 가능 |
+| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | 프로젝트에 `eslint` dependency 존재 |
+| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` 설치됨 |
+| gleam | .gleam | `gleam` 명령 사용 가능 |
+| gopls | .go | `go` 명령 사용 가능 |
+| hls | .hs, .lhs | `haskell-language-server-wrapper` 명령 사용 가능 |
+| jdtls | .java | `Java SDK (version 21+)` 설치됨 |
+| julials | .jl | `julia` 및 `LanguageServer.jl` 설치됨 |
+| kotlin-ls | .kt, .kts | Kotlin 프로젝트에서 자동 설치 |
+| lua-ls | .lua | Lua 프로젝트에서 자동 설치 |
+| nixd | .nix | `nixd` 명령 사용 가능 |
+| ocaml-lsp | .ml, .mli | `ocamllsp` 명령 사용 가능 |
+| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte | 프로젝트에 `oxlint` dependency 존재 |
+| php intelephense | .php | PHP 프로젝트에서 자동 설치 |
+| prisma | .prisma | `prisma` 명령 사용 가능 |
+| pyright | .py, .pyi | `pyright` dependency 설치됨 |
+| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | `ruby` 및 `gem` 명령 사용 가능 |
+| rust | .rs | `rust-analyzer` 명령 사용 가능 |
+| sourcekit-lsp | .swift, .objc, .objcpp | `swift` 설치됨 (macOS에서는 `xcode`) |
+| svelte | .svelte | Svelte 프로젝트에서 자동 설치 |
+| terraform | .tf, .tfvars | GitHub releases에서 자동 설치 |
+| tinymist | .typ, .typc | GitHub releases에서 자동 설치 |
+| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | 프로젝트에 `typescript` dependency 존재 |
+| vue | .vue | Vue 프로젝트에서 자동 설치 |
+| yaml-ls | .yaml, .yml | Red Hat `yaml-language-server` 자동 설치 |
+| zls | .zig, .zon | `zig` 명령 사용 가능 |
-LSP 서버는 위 파일 확장자 중 하나가 감지되고 요구 사항이 충족되면 자동으로 활성화됩니다.
+위 확장자 중 하나가 감지되고 요구 사항이 충족되면 LSP 서버가 자동으로 활성화됩니다.
:::note
-`OPENCODE_DISABLE_LSP_DOWNLOAD` 환경 변수를 `true`로 설정하여 자동 LSP 서버 다운로드를 비활성화 할 수 있습니다.
+`OPENCODE_DISABLE_LSP_DOWNLOAD` 환경 변수를 `true`로 설정하면 LSP 서버 자동 다운로드를 비활성화할 수 있습니다.
:::
---
## 작동 방식
-OpenCode가 파일을 열 때, 다음과 같이 작동합니다:
+OpenCode가 파일을 열면 다음과 같이 동작합니다.
1. 활성화된 모든 LSP 서버에 대해 파일 확장자를 확인합니다.
2. 적절한 LSP 서버가 아직 실행 중이지 않다면 시작합니다.
@@ -65,7 +66,7 @@ OpenCode가 파일을 열 때, 다음과 같이 작동합니다:
## 구성
-OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수 있습니다.
+OpenCode config의 `lsp` 섹션에서 LSP 서버를 사용자 정의할 수 있습니다.
```json title="opencode.json"
{
@@ -74,23 +75,23 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
}
```
-각 LSP 서버는 다음을 지원합니다:
+각 LSP 서버는 다음 속성을 지원합니다.
-| 속성 | 유형 | 설명 |
-| ---------------- | -------- | --------------------------------------- |
-| `disabled` | boolean | LSP 서버를 비활성화하려면 `true`로 설정 |
-| `command` | string[] | LSP 서버를 시작하는 명령 |
-| `extensions` | string[] | 이 LSP 서버의 확장자 |
-| `env` | object | 서버 시작 시 설정할 환경 변수 |
-| `initialization` | object | LSP 서버에 보내는 초기화 옵션 |
+| 속성 | 타입 | 설명 |
+| ---------------- | -------- | --------------------------------------------- |
+| `disabled` | boolean | LSP 서버를 비활성화하려면 `true`로 설정하세요 |
+| `command` | string[] | LSP 서버를 시작하는 명령입니다 |
+| `extensions` | string[] | 이 LSP 서버가 처리할 파일 확장자입니다 |
+| `env` | object | 서버 시작 시 설정할 환경 변수입니다 |
+| `initialization` | object | LSP 서버로 전송할 초기화 옵션입니다 |
-몇 가지 예제를 살펴봅시다.
+예시를 살펴보겠습니다.
---
-## 환경 변수
+### 환경 변수
-`env` 속성을 사용하여 LSP 서버를 시작할 때 환경 변수를 설정합니다.
+`env` 속성을 사용하면 LSP 서버 시작 시 환경 변수를 설정할 수 있습니다.
```json title="opencode.json" {5-7}
{
@@ -109,7 +110,7 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
### 초기화 옵션
-`initialization` 속성을 사용하여 초기화 옵션을 LSP 서버에 전달합니다. 이들은 LSP `initialize` 요청에 보내진 서버 별 설정입니다.
+`initialization` 속성을 사용해 LSP 서버에 초기화 옵션을 전달하세요. 이 값은 LSP `initialize` 요청 중에 전송되는 서버별 설정입니다.
```json title="opencode.json" {5-9}
{
@@ -127,14 +128,14 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
```
:::note
-초기화 옵션은 LSP 서버가 다릅니다. LSP 서버의 사용 가능한 옵션을 확인하세요.
+초기화 옵션은 LSP 서버마다 다릅니다. 사용 가능한 옵션은 해당 LSP 서버 문서를 확인하세요.
:::
---
### LSP 서버 비활성화
-전역적으로 **모든** LSP 서버를 비활성화하려면 `lsp`를 `false`로 설정하십시오.
+전역에서 **모든** LSP 서버를 비활성화하려면 `lsp`를 `false`로 설정하세요.
```json title="opencode.json" {3}
{
@@ -143,7 +144,7 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
}
```
-**특정** LSP 서버를 비활성화하려면 `disabled`를 `true`로 설정하십시오.
+**특정** LSP 서버를 비활성화하려면 `disabled`를 `true`로 설정하세요.
```json title="opencode.json" {5}
{
@@ -160,7 +161,7 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
## 사용자 정의 LSP 서버
-명령어와 파일 확장자를 지정하여 사용자 정의 LSP 서버를 추가할 수 있습니다.
+명령과 파일 확장자를 지정해 사용자 정의 LSP 서버를 추가할 수 있습니다.
```json title="opencode.json" {4-7}
{
@@ -180,9 +181,9 @@ OpenCode 설정의 `lsp` 섹션을 통해 LSP 서버를 사용자 정의할 수
### PHP Intelephense
-PHP Intelephense는 라이선스 키를 통해 프리미엄 기능을 제공합니다. 텍스트 파일에 키(만)를 저장하여 라이선스 키를 제공할 수 있습니다.
+PHP Intelephense는 라이선스 키를 통해 프리미엄 기능을 제공합니다. 텍스트 파일에 키만 저장해 라이선스 키를 제공할 수 있습니다.
- macOS/Linux: `$HOME/intelephense/license.txt`
- Windows: `%USERPROFILE%/intelephense/license.txt`
-파일에는 다른 내용이 없어야 합니다.
+파일에는 추가 내용 없이 라이선스 키만 포함하는 것이 좋습니다.