Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
60b6e95
i18n: add missing translation keys to en.json and zh-CN.json
zswll2 May 10, 2026
fe1a931
Merge tag 'v2.4.4' into feat-i18n-omo
zswll2 Aug 1, 2026
245690a
feat(config-providers): detect omo.jsonc and [opencode] block for OMO…
zswll2 Aug 2, 2026
38117ca
fix(config-providers): scope omo detection to caller roots when provided
zswll2 Aug 2, 2026
4a9ef4d
test(config-providers): cover omo.jsonc detection and block read
zswll2 Aug 2, 2026
1317005
feat(config-providers): jsonc-preserving block writes and profiles CRUD
zswll2 Aug 2, 2026
6c3b43b
feat(server): prioritize ~/.omo/omo.jsonc in path resolution
zswll2 Aug 2, 2026
02f3756
test(config-providers): jsonc preservation and profiles CRUD
zswll2 Aug 2, 2026
054c071
refactor(profile-manager): replace symlink switching with omo.jsonc p…
zswll2 Aug 2, 2026
3c71749
test(profile-manager): cover omo profiles block semantics
zswll2 Aug 2, 2026
e6e028e
feat(server): adapt provider APIs to omo block semantics
zswll2 Aug 2, 2026
d140ef6
feat(client): adapt profiles UI to omo block names
zswll2 Aug 2, 2026
8bedfa2
fix(client): bake-semantics copy in provider detail
zswll2 Aug 2, 2026
270acad
docs: document omo.jsonc config path semantics
zswll2 Aug 2, 2026
8b8c97d
fix(profile-manager): surface legacy profile dirs read-only in UI
zswll2 Aug 2, 2026
c9e884e
feat(profile-manager): activate legacy profiles by importing to omo b…
zswll2 Aug 2, 2026
4d5ba37
feat(i18n): localize profiles page legacy/activate labels
zswll2 Aug 3, 2026
87cf731
fix(config-providers): preserve Unicode omo profile keys, keep filesy…
zswll2 Aug 3, 2026
f974f56
test(server): export helpers + HTTP smoke harness
zswll2 Aug 3, 2026
c5a98e8
fix(server): include symlink skill dirs, guard read-only on symlink s…
zswll2 Aug 3, 2026
6eceea4
fix(server): read opencode 'plugin' key, guard npm plugins display-only
zswll2 Aug 3, 2026
b8a6045
fix(server): exclude server cwd from config-provider detection roots
zswll2 Aug 3, 2026
1145169
feat(server,client): persist active omo profile marker + active legac…
zswll2 Aug 3, 2026
665e2d4
chore: ignore omo workspace and dev docs from git
zswll2 Aug 3, 2026
f2ecb87
feat(server): bind to configurable HOST, default 127.0.0.1
zswll2 Aug 3, 2026
9c8152d
feat(client): expose next dev server on 0.0.0.0
zswll2 Aug 3, 2026
174cbc3
chore: add npm lockfiles
zswll2 Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,11 @@ Thumbs.db
# Sisyphus working files
.sisyphus/

# OMO workspace / planning artifacts (dev docs — never committed)
.omo/
PROGRESS.md
.playwright-mcp/
f3-*.png

# Changeset (version management - optional)
.changeset/
8 changes: 7 additions & 1 deletion README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,12 @@ opencode-studio/
- OpenCode 配置: `~/.config/opencode/`
- Studio 数据: `~/.config/opencode-studio/`
- 配置环境: `~/.config/opencode-profiles/`
- OMO 配置: `~/.omo/omo.jsonc`(缺省时依次回退 `~/.omo/omo.json`、旧版 `oh-my-openagent.json` / `oh-my-opencode.json`)

OMO 配置说明:
- 当前生效的 OMO 配置保存在 `~/.omo/omo.jsonc` 的 `[opencode]` 块中;已保存的配置文件以 `profiles.<名字>.[opencode]` 块存放在同一文件内。
- 切换 profile 会把选中配置**合并(bake)进当前 `[opencode]` 块并移除该 profile 块**——不做符号链接或文件复制。
- `~/.omo/omo.jsonc` 不属于 `getPaths()` 的 OpenCode 配置候选列表:服务器不会把它当作普通 OpenCode 配置整文件覆盖写入,对其写入一律采用 jsonc 保留式修改(`//` 注释、`$schema`、`_migrations` 等其余内容原样保留)。

---

Expand All @@ -200,7 +206,7 @@ opencode-studio/
| "Launch Backend" 不工作 | 先运行 `npm install -g opencode-studio-server` |
| 协议处理未注册 | 以管理员运行 `opencode-studio-server --register` |
| GitHub 同步不工作 | 先运行 `gh auth login` |
| Agents 不显示 (OMO) | 确保 `oh-my-openagent.json` 存在且包含 `agents` 字段 |
| Agents 不显示 (OMO) | 确保 `~/.omo/omo.jsonc` 存在且 `[opencode]` 块包含 `agents` 字段 |

---

Expand Down
2 changes: 1 addition & 1 deletion client-next/dev-with-port.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ findAvailablePort(DEFAULT_PORT).then(port => {
process.env.PORT = port.toString();
console.log(`Starting Next.js on port ${port}`);

const dev = spawn('npx', ['next', 'dev'], {
const dev = spawn('npx', ['next', 'dev', '--hostname', '0.0.0.0'], {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not expose the development server by default.

--hostname 0.0.0.0 accepts connections on every routable interface. This exposes the Next.js development server to other hosts on the local network.

Keep 127.0.0.1 as the default. Require an explicit environment option for external binding.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client-next/dev-with-port.js` at line 22, Update the dev server spawn
configuration in dev so it binds to 127.0.0.1 by default instead of 0.0.0.0, and
only use an externally accessible hostname when an explicit environment option
requests it.

stdio: 'inherit',
shell: true
});
Expand Down
20 changes: 17 additions & 3 deletions client-next/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,9 @@
"noMatch": "No skills match \"{search}\"",
"unknownError": "Unknown error",
"delete": "Delete",
"cancel": "Cancel"
"cancel": "Cancel",
"deleted": "Skill {name} deleted",
"deleteFailed": "Failed to delete skill: {error}"
},
"plugins": {
"incompatibleWarning": "Incompatible with Antigravity. Use openskills instead.",
Expand All @@ -498,7 +500,9 @@
"noMatch": "No plugins match \"{search}\"",
"unknownError": "Unknown error",
"delete": "Delete",
"cancel": "Cancel"
"cancel": "Cancel",
"deleted": "Plugin {name} deleted",
"deleteFailed": "Failed to delete plugin: {error}"
},
"commands": {
"loadFailed": "Failed to load commands",
Expand Down Expand Up @@ -612,6 +616,9 @@
"active": "Active",
"current": "Current",
"switch": "Switch",
"legacyEnv": "Legacy environment",
"importAndActivate": "Import & activate",
"activeConsumed": "Already active",
"deleteTitle": "Delete Profile?",
"deleteDescription": "This will permanently delete the profile \"{name}\" and all its configuration and history.",
"cancelBtn": "Cancel",
Expand Down Expand Up @@ -698,7 +705,14 @@
"modelInterface": "Model Interface",
"input": "Input",
"output": "Output",
"cost": "Cost"
"cost": "Cost",
"range24h": "Last 24 hours",
"range7d": "Last 7 days",
"range30d": "Last 30 days",
"range3m": "Last 3 months",
"range6m": "Last 6 months",
"range1y": "Last year",
"rangeCustom": "Custom range"
Comment on lines +708 to +715

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Duplicate usage range keys in two locale files. A new block of range labels was appended to the usage object without removing the existing block, so each of range24h, range7d, range30d, range3m, range6m, range1y, and rangeCustom is defined twice in the same object. JSON.parse keeps the last occurrence; duplicate-key linters and some i18n extraction tools report an error.

  • client-next/messages/en.json#L708-L715: delete the earlier definitions at Lines 661-667 and keep this block.
  • client-next/messages/zh-CN.json#L709-L715: delete the earlier definitions at Lines 661-667 and keep this block.
📍 Affects 2 files
  • client-next/messages/en.json#L708-L715 (this comment)
  • client-next/messages/zh-CN.json#L709-L715
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client-next/messages/en.json` around lines 708 - 715, Remove the earlier
duplicate usage range labels from client-next/messages/en.json lines 661-667 and
client-next/messages/zh-CN.json lines 661-667, while retaining the later blocks
at client-next/messages/en.json lines 708-715 and
client-next/messages/zh-CN.json lines 709-715. Ensure each usage object defines
range24h, range7d, range30d, range3m, range6m, range1y, and rangeCustom exactly
once.

},
"config": {
"invalidJson": "Invalid JSON: {error}",
Expand Down
3 changes: 3 additions & 0 deletions client-next/messages/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,9 @@
"active": "활성",
"current": "현재",
"switch": "전환",
"legacyEnv": "레거시 환경",
"importAndActivate": "가져와서 활성화",
"activeConsumed": "이미 활성화됨",
"deleteTitle": "프로필을 삭제할까요?",
"deleteDescription": "프로필 \"{name}\"과(와) 관련된 모든 설정 및 기록이 영구적으로 삭제됩니다.",
"cancelBtn": "취소",
Expand Down
12 changes: 11 additions & 1 deletion client-next/messages/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,9 @@
"active": "\u6d3b\u8dc3",
"current": "\u5f53\u524d",
"switch": "\u5207\u6362",
"legacyEnv": "\u9057\u7559\u73af\u5883",
"importAndActivate": "\u5bfc\u5165\u5e76\u6fc0\u6d3b",
"activeConsumed": "\u5df2\u6fc0\u6d3b",
"deleteTitle": "\u5220\u9664\u914d\u7f6e\uff1f",
"deleteDescription": "\u5c06\u6c38\u4e45\u5220\u9664\u914d\u7f6e \"{name}\" \u53ca\u5176\u6240\u6709\u914d\u7f6e\u548c\u5386\u53f2\u8bb0\u5f55\u3002",
"cancelBtn": "\u53d6\u6d88",
Expand Down Expand Up @@ -702,7 +705,14 @@
"modelInterface": "\u6a21\u578b\u63a5\u53e3",
"input": "\u8f93\u5165",
"output": "\u8f93\u51fa",
"cost": "\u8d39\u7528"
"cost": "\u8d39\u7528",
"range24h": "\u8fc7\u53bb 24 \u5c0f\u65f6",
"range7d": "\u8fc7\u53bb 7 \u5929",
"range30d": "\u8fc7\u53bb 30 \u5929",
"range3m": "\u8fc7\u53bb 3 \u4e2a\u6708",
"range6m": "\u8fc7\u53bb 6 \u4e2a\u6708",
"range1y": "\u8fc7\u53bb\u4e00\u5e74",
"rangeCustom": "\u81ea\u5b9a\u4e49\u8303\u56f4"
},
"config": {
"invalidJson": "\u65e0\u6548\u7684 JSON: {error}",
Expand Down
Loading