oh-my-opencode 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -466,7 +466,12 @@ Oh My OpenCode는 다음 위치의 훅을 읽고 실행합니다:
466
466
  - **Anthropic Auto Compact**: Claude 모델이 토큰 제한에 도달하면 자동으로 세션을 요약하고 압축합니다. 수동 개입 없이 작업을 계속할 수 있습니다.
467
467
  - **Session Recovery**: 세션 에러(누락된 도구 결과, thinking 블록 문제, 빈 메시지 등)에서 자동 복구합니다. 돌다가 세션이 망가지지 않습니다. 망가져도 복구됩니다.
468
468
  - **Auto Update Checker**: oh-my-opencode의 새 버전이 출시되면 알림을 표시합니다.
469
+ - **Startup Toast**: OhMyOpenCode 로드 시 환영 메시지를 표시합니다. 세션을 제대로 시작하기 위한 작은 "oMoMoMo".
469
470
  - **Background Notification**: 백그라운드 에이전트 작업이 완료되면 알림을 받습니다.
471
+ - **Session Notification**: 에이전트가 대기 상태가 되면 OS 알림을 보냅니다. macOS, Linux, Windows에서 작동—에이전트가 입력을 기다릴 때 놓치지 마세요.
472
+ - **Empty Task Response Detector**: Task 도구가 빈 응답을 반환하면 감지합니다. 이미 빈 응답이 왔는데 무한정 기다리는 상황을 방지합니다.
473
+ - **Grep Output Truncator**: grep은 산더미 같은 텍스트를 반환할 수 있습니다. 남은 컨텍스트 윈도우에 따라 동적으로 출력을 축소합니다—50% 여유 공간 유지, 최대 50k 토큰.
474
+ - **Tool Output Truncator**: 같은 아이디어, 더 넓은 범위. Grep, Glob, LSP 도구, AST-grep의 출력을 축소합니다. 한 번의 장황한 검색이 전체 컨텍스트를 잡아먹는 것을 방지합니다.
470
475
 
471
476
  ## 설정
472
477
 
@@ -516,6 +521,34 @@ Google Gemini 모델을 위한 내장 Antigravity OAuth를 활성화합니다:
516
521
 
517
522
  각 에이전트에서 지원하는 옵션: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
518
523
 
524
+ `OmO` (메인 오케스트레이터)와 `build` (기본 에이전트)도 동일한 옵션으로 설정을 오버라이드할 수 있습니다.
525
+
526
+ #### Permission 옵션
527
+
528
+ 에이전트가 할 수 있는 작업을 세밀하게 제어합니다:
529
+
530
+ ```json
531
+ {
532
+ "agents": {
533
+ "explore": {
534
+ "permission": {
535
+ "edit": "deny",
536
+ "bash": "ask",
537
+ "webfetch": "allow"
538
+ }
539
+ }
540
+ }
541
+ }
542
+ ```
543
+
544
+ | Permission | 설명 | 값 |
545
+ |------------|------|-----|
546
+ | `edit` | 파일 편집 권한 | `ask` / `allow` / `deny` |
547
+ | `bash` | Bash 명령 실행 권한 | `ask` / `allow` / `deny` 또는 명령별: `{ "git": "allow", "rm": "deny" }` |
548
+ | `webfetch` | 웹 요청 권한 | `ask` / `allow` / `deny` |
549
+ | `doom_loop` | 무한 루프 감지 오버라이드 허용 | `ask` / `allow` / `deny` |
550
+ | `external_directory` | 프로젝트 루트 외부 파일 접근 | `ask` / `allow` / `deny` |
551
+
519
552
  또는 ~/.config/opencode/oh-my-opencode.json 혹은 .opencode/oh-my-opencode.json 의 `disabled_agents` 를 사용하여 비활성화할 수 있습니다:
520
553
 
521
554
  ```json
@@ -528,19 +561,42 @@ Google Gemini 모델을 위한 내장 Antigravity OAuth를 활성화합니다:
528
561
 
529
562
  ### OmO Agent
530
563
 
531
- 기본 OmO 에이전트 동작을 설정합니다:
564
+ 활성화 시(기본값), OmO 개의 primary 에이전트를 추가하고 내장 에이전트를 subagent로 강등합니다:
565
+
566
+ - **OmO**: Primary 오케스트레이터 에이전트 (Claude Opus 4.5)
567
+ - **OmO-Plan**: OpenCode plan 에이전트의 모든 설정을 런타임에 상속 (description에 "OhMyOpenCode version" 추가)
568
+ - **build**: subagent로 강등
569
+ - **plan**: subagent로 강등
570
+
571
+ OmO를 비활성화하고 원래 build/plan 에이전트를 복원하려면:
532
572
 
533
573
  ```json
534
574
  {
535
575
  "omo_agent": {
536
- "disable_build": false
576
+ "disabled": true
577
+ }
578
+ }
579
+ ```
580
+
581
+ 다른 에이전트처럼 OmO와 OmO-Plan도 커스터마이징할 수 있습니다:
582
+
583
+ ```json
584
+ {
585
+ "agents": {
586
+ "OmO": {
587
+ "model": "anthropic/claude-sonnet-4",
588
+ "temperature": 0.3
589
+ },
590
+ "OmO-Plan": {
591
+ "model": "openai/gpt-5.2"
592
+ }
537
593
  }
538
594
  }
539
595
  ```
540
596
 
541
597
  | 옵션 | 기본값 | 설명 |
542
598
  |------|--------|------|
543
- | `disable_build` | `false` | `true`로 설정하면 기본 Build 에이전트를 숨깁니다. OmO 유일한 primary 에이전트가 됩니다. |
599
+ | `disabled` | `false` | `true`면 OmO 에이전트를 비활성화하고 원래 build/plan을 primary로 복원합니다. `false`(기본값)면 OmO OmO-Plan이 primary 에이전트가 됩니다. |
544
600
 
545
601
  ### Hooks
546
602
 
package/README.md CHANGED
@@ -467,7 +467,12 @@ When agents thrive, you thrive. But I want to help you directly too.
467
467
  - **Anthropic Auto Compact**: When Claude models hit token limits, automatically summarizes and compacts the session—no manual intervention needed.
468
468
  - **Session Recovery**: Automatically recovers from session errors (missing tool results, thinking block issues, empty messages). Sessions don't crash mid-run. Even if they do, they recover.
469
469
  - **Auto Update Checker**: Notifies you when a new version of oh-my-opencode is available.
470
+ - **Startup Toast**: Shows a welcome message when OhMyOpenCode loads. A little "oMoMoMo" to start your session right.
470
471
  - **Background Notification**: Get notified when background agent tasks complete.
472
+ - **Session Notification**: Sends OS notifications when agents go idle. Works on macOS, Linux, and Windows—never miss when your agent needs input.
473
+ - **Empty Task Response Detector**: Catches when Task tool returns nothing. Warns you about potential agent failures so you don't wait forever for a response that already came back empty.
474
+ - **Grep Output Truncator**: Grep can return mountains of text. This dynamically truncates output based on your remaining context window—keeps 50% headroom, caps at 50k tokens.
475
+ - **Tool Output Truncator**: Same idea, broader scope. Truncates output from Grep, Glob, LSP tools, and AST-grep. Prevents one verbose search from eating your entire context.
471
476
 
472
477
  ## Configuration
473
478
 
@@ -517,6 +522,34 @@ Override built-in agent settings:
517
522
 
518
523
  Each agent supports: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
519
524
 
525
+ You can also override settings for `OmO` (the main orchestrator) and `build` (the default agent) using the same options.
526
+
527
+ #### Permission Options
528
+
529
+ Fine-grained control over what agents can do:
530
+
531
+ ```json
532
+ {
533
+ "agents": {
534
+ "explore": {
535
+ "permission": {
536
+ "edit": "deny",
537
+ "bash": "ask",
538
+ "webfetch": "allow"
539
+ }
540
+ }
541
+ }
542
+ }
543
+ ```
544
+
545
+ | Permission | Description | Values |
546
+ |------------|-------------|--------|
547
+ | `edit` | File editing permission | `ask` / `allow` / `deny` |
548
+ | `bash` | Bash command execution | `ask` / `allow` / `deny` or per-command: `{ "git": "allow", "rm": "deny" }` |
549
+ | `webfetch` | Web request permission | `ask` / `allow` / `deny` |
550
+ | `doom_loop` | Allow infinite loop detection override | `ask` / `allow` / `deny` |
551
+ | `external_directory` | Access files outside project root | `ask` / `allow` / `deny` |
552
+
520
553
  Or disable via `disabled_agents` in `~/.config/opencode/oh-my-opencode.json` or `.opencode/oh-my-opencode.json`:
521
554
 
522
555
  ```json
@@ -529,19 +562,42 @@ Available agents: `oracle`, `librarian`, `explore`, `frontend-ui-ux-engineer`, `
529
562
 
530
563
  ### OmO Agent
531
564
 
532
- Configure the default OmO agent behavior:
565
+ When enabled (default), OmO adds two primary agents and demotes the built-in agents to subagents:
566
+
567
+ - **OmO**: Primary orchestrator agent (Claude Opus 4.5)
568
+ - **OmO-Plan**: Inherits all settings from OpenCode's plan agent at runtime (description appended with "OhMyOpenCode version")
569
+ - **build**: Demoted to subagent
570
+ - **plan**: Demoted to subagent
571
+
572
+ To disable OmO and restore the original build/plan agents:
533
573
 
534
574
  ```json
535
575
  {
536
576
  "omo_agent": {
537
- "disable_build": false
577
+ "disabled": true
578
+ }
579
+ }
580
+ ```
581
+
582
+ You can also customize OmO and OmO-Plan like other agents:
583
+
584
+ ```json
585
+ {
586
+ "agents": {
587
+ "OmO": {
588
+ "model": "anthropic/claude-sonnet-4",
589
+ "temperature": 0.3
590
+ },
591
+ "OmO-Plan": {
592
+ "model": "openai/gpt-5.2"
593
+ }
538
594
  }
539
595
  }
540
596
  ```
541
597
 
542
598
  | Option | Default | Description |
543
599
  |--------|---------|-------------|
544
- | `disable_build` | `false` | When `true`, hides the default Build agent. OmO becomes the only primary agent. |
600
+ | `disabled` | `false` | When `true`, disables OmO agents and restores original build/plan as primary. When `false` (default), OmO and OmO-Plan become primary agents. |
545
601
 
546
602
  ### Hooks
547
603
 
@@ -17,6 +17,8 @@ export declare const OverridableAgentNameSchema: z.ZodEnum<{
17
17
  "document-writer": "document-writer";
18
18
  "multimodal-looker": "multimodal-looker";
19
19
  build: "build";
20
+ plan: "plan";
21
+ "OmO-Plan": "OmO-Plan";
20
22
  }>;
21
23
  export declare const AgentNameSchema: z.ZodEnum<{
22
24
  OmO: "OmO";
@@ -140,6 +142,52 @@ export declare const AgentOverridesSchema: z.ZodObject<{
140
142
  }>>;
141
143
  }, z.core.$strip>>;
142
144
  }, z.core.$strip>>;
145
+ plan: z.ZodOptional<z.ZodObject<{
146
+ model: z.ZodOptional<z.ZodString>;
147
+ temperature: z.ZodOptional<z.ZodNumber>;
148
+ top_p: z.ZodOptional<z.ZodNumber>;
149
+ prompt: z.ZodOptional<z.ZodString>;
150
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
151
+ disable: z.ZodOptional<z.ZodBoolean>;
152
+ description: z.ZodOptional<z.ZodString>;
153
+ mode: z.ZodOptional<z.ZodEnum<{
154
+ subagent: "subagent";
155
+ primary: "primary";
156
+ all: "all";
157
+ }>>;
158
+ color: z.ZodOptional<z.ZodString>;
159
+ permission: z.ZodOptional<z.ZodObject<{
160
+ edit: z.ZodOptional<z.ZodEnum<{
161
+ allow: "allow";
162
+ deny: "deny";
163
+ ask: "ask";
164
+ }>>;
165
+ bash: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
166
+ allow: "allow";
167
+ deny: "deny";
168
+ ask: "ask";
169
+ }>, z.ZodRecord<z.ZodString, z.ZodEnum<{
170
+ allow: "allow";
171
+ deny: "deny";
172
+ ask: "ask";
173
+ }>>]>>;
174
+ webfetch: z.ZodOptional<z.ZodEnum<{
175
+ allow: "allow";
176
+ deny: "deny";
177
+ ask: "ask";
178
+ }>>;
179
+ doom_loop: z.ZodOptional<z.ZodEnum<{
180
+ allow: "allow";
181
+ deny: "deny";
182
+ ask: "ask";
183
+ }>>;
184
+ external_directory: z.ZodOptional<z.ZodEnum<{
185
+ allow: "allow";
186
+ deny: "deny";
187
+ ask: "ask";
188
+ }>>;
189
+ }, z.core.$strip>>;
190
+ }, z.core.$strip>>;
143
191
  OmO: z.ZodOptional<z.ZodObject<{
144
192
  model: z.ZodOptional<z.ZodString>;
145
193
  temperature: z.ZodOptional<z.ZodNumber>;
@@ -186,6 +234,52 @@ export declare const AgentOverridesSchema: z.ZodObject<{
186
234
  }>>;
187
235
  }, z.core.$strip>>;
188
236
  }, z.core.$strip>>;
237
+ "OmO-Plan": z.ZodOptional<z.ZodObject<{
238
+ model: z.ZodOptional<z.ZodString>;
239
+ temperature: z.ZodOptional<z.ZodNumber>;
240
+ top_p: z.ZodOptional<z.ZodNumber>;
241
+ prompt: z.ZodOptional<z.ZodString>;
242
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
243
+ disable: z.ZodOptional<z.ZodBoolean>;
244
+ description: z.ZodOptional<z.ZodString>;
245
+ mode: z.ZodOptional<z.ZodEnum<{
246
+ subagent: "subagent";
247
+ primary: "primary";
248
+ all: "all";
249
+ }>>;
250
+ color: z.ZodOptional<z.ZodString>;
251
+ permission: z.ZodOptional<z.ZodObject<{
252
+ edit: z.ZodOptional<z.ZodEnum<{
253
+ allow: "allow";
254
+ deny: "deny";
255
+ ask: "ask";
256
+ }>>;
257
+ bash: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
258
+ allow: "allow";
259
+ deny: "deny";
260
+ ask: "ask";
261
+ }>, z.ZodRecord<z.ZodString, z.ZodEnum<{
262
+ allow: "allow";
263
+ deny: "deny";
264
+ ask: "ask";
265
+ }>>]>>;
266
+ webfetch: z.ZodOptional<z.ZodEnum<{
267
+ allow: "allow";
268
+ deny: "deny";
269
+ ask: "ask";
270
+ }>>;
271
+ doom_loop: z.ZodOptional<z.ZodEnum<{
272
+ allow: "allow";
273
+ deny: "deny";
274
+ ask: "ask";
275
+ }>>;
276
+ external_directory: z.ZodOptional<z.ZodEnum<{
277
+ allow: "allow";
278
+ deny: "deny";
279
+ ask: "ask";
280
+ }>>;
281
+ }, z.core.$strip>>;
282
+ }, z.core.$strip>>;
189
283
  oracle: z.ZodOptional<z.ZodObject<{
190
284
  model: z.ZodOptional<z.ZodString>;
191
285
  temperature: z.ZodOptional<z.ZodNumber>;
@@ -471,7 +565,7 @@ export declare const ClaudeCodeConfigSchema: z.ZodObject<{
471
565
  hooks: z.ZodOptional<z.ZodBoolean>;
472
566
  }, z.core.$strip>;
473
567
  export declare const OmoAgentConfigSchema: z.ZodObject<{
474
- disable_build: z.ZodOptional<z.ZodBoolean>;
568
+ disabled: z.ZodOptional<z.ZodBoolean>;
475
569
  }, z.core.$strip>;
476
570
  export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
477
571
  $schema: z.ZodOptional<z.ZodString>;
@@ -556,6 +650,52 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
556
650
  }>>;
557
651
  }, z.core.$strip>>;
558
652
  }, z.core.$strip>>;
653
+ plan: z.ZodOptional<z.ZodObject<{
654
+ model: z.ZodOptional<z.ZodString>;
655
+ temperature: z.ZodOptional<z.ZodNumber>;
656
+ top_p: z.ZodOptional<z.ZodNumber>;
657
+ prompt: z.ZodOptional<z.ZodString>;
658
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
659
+ disable: z.ZodOptional<z.ZodBoolean>;
660
+ description: z.ZodOptional<z.ZodString>;
661
+ mode: z.ZodOptional<z.ZodEnum<{
662
+ subagent: "subagent";
663
+ primary: "primary";
664
+ all: "all";
665
+ }>>;
666
+ color: z.ZodOptional<z.ZodString>;
667
+ permission: z.ZodOptional<z.ZodObject<{
668
+ edit: z.ZodOptional<z.ZodEnum<{
669
+ allow: "allow";
670
+ deny: "deny";
671
+ ask: "ask";
672
+ }>>;
673
+ bash: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
674
+ allow: "allow";
675
+ deny: "deny";
676
+ ask: "ask";
677
+ }>, z.ZodRecord<z.ZodString, z.ZodEnum<{
678
+ allow: "allow";
679
+ deny: "deny";
680
+ ask: "ask";
681
+ }>>]>>;
682
+ webfetch: z.ZodOptional<z.ZodEnum<{
683
+ allow: "allow";
684
+ deny: "deny";
685
+ ask: "ask";
686
+ }>>;
687
+ doom_loop: z.ZodOptional<z.ZodEnum<{
688
+ allow: "allow";
689
+ deny: "deny";
690
+ ask: "ask";
691
+ }>>;
692
+ external_directory: z.ZodOptional<z.ZodEnum<{
693
+ allow: "allow";
694
+ deny: "deny";
695
+ ask: "ask";
696
+ }>>;
697
+ }, z.core.$strip>>;
698
+ }, z.core.$strip>>;
559
699
  OmO: z.ZodOptional<z.ZodObject<{
560
700
  model: z.ZodOptional<z.ZodString>;
561
701
  temperature: z.ZodOptional<z.ZodNumber>;
@@ -602,6 +742,52 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
602
742
  }>>;
603
743
  }, z.core.$strip>>;
604
744
  }, z.core.$strip>>;
745
+ "OmO-Plan": z.ZodOptional<z.ZodObject<{
746
+ model: z.ZodOptional<z.ZodString>;
747
+ temperature: z.ZodOptional<z.ZodNumber>;
748
+ top_p: z.ZodOptional<z.ZodNumber>;
749
+ prompt: z.ZodOptional<z.ZodString>;
750
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodBoolean>>;
751
+ disable: z.ZodOptional<z.ZodBoolean>;
752
+ description: z.ZodOptional<z.ZodString>;
753
+ mode: z.ZodOptional<z.ZodEnum<{
754
+ subagent: "subagent";
755
+ primary: "primary";
756
+ all: "all";
757
+ }>>;
758
+ color: z.ZodOptional<z.ZodString>;
759
+ permission: z.ZodOptional<z.ZodObject<{
760
+ edit: z.ZodOptional<z.ZodEnum<{
761
+ allow: "allow";
762
+ deny: "deny";
763
+ ask: "ask";
764
+ }>>;
765
+ bash: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
766
+ allow: "allow";
767
+ deny: "deny";
768
+ ask: "ask";
769
+ }>, z.ZodRecord<z.ZodString, z.ZodEnum<{
770
+ allow: "allow";
771
+ deny: "deny";
772
+ ask: "ask";
773
+ }>>]>>;
774
+ webfetch: z.ZodOptional<z.ZodEnum<{
775
+ allow: "allow";
776
+ deny: "deny";
777
+ ask: "ask";
778
+ }>>;
779
+ doom_loop: z.ZodOptional<z.ZodEnum<{
780
+ allow: "allow";
781
+ deny: "deny";
782
+ ask: "ask";
783
+ }>>;
784
+ external_directory: z.ZodOptional<z.ZodEnum<{
785
+ allow: "allow";
786
+ deny: "deny";
787
+ ask: "ask";
788
+ }>>;
789
+ }, z.core.$strip>>;
790
+ }, z.core.$strip>>;
605
791
  oracle: z.ZodOptional<z.ZodObject<{
606
792
  model: z.ZodOptional<z.ZodString>;
607
793
  temperature: z.ZodOptional<z.ZodNumber>;
@@ -888,7 +1074,7 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
888
1074
  }, z.core.$strip>>;
889
1075
  google_auth: z.ZodOptional<z.ZodBoolean>;
890
1076
  omo_agent: z.ZodOptional<z.ZodObject<{
891
- disable_build: z.ZodOptional<z.ZodBoolean>;
1077
+ disabled: z.ZodOptional<z.ZodBoolean>;
892
1078
  }, z.core.$strip>>;
893
1079
  }, z.core.$strip>;
894
1080
  export type OhMyOpenCodeConfig = z.infer<typeof OhMyOpenCodeConfigSchema>;
package/dist/index.js CHANGED
@@ -1839,41 +1839,6 @@ var omoAgent = {
1839
1839
  budgetTokens: 32000
1840
1840
  },
1841
1841
  maxTokens: 128000,
1842
- tools: {
1843
- read: true,
1844
- write: true,
1845
- edit: true,
1846
- multiedit: true,
1847
- patch: true,
1848
- glob: true,
1849
- grep: true,
1850
- list: true,
1851
- bash: true,
1852
- batch: true,
1853
- webfetch: true,
1854
- websearch: true,
1855
- codesearch: true,
1856
- todowrite: true,
1857
- todoread: true,
1858
- task: true,
1859
- lsp_hover: true,
1860
- lsp_goto_definition: true,
1861
- lsp_find_references: true,
1862
- lsp_document_symbols: true,
1863
- lsp_workspace_symbols: true,
1864
- lsp_diagnostics: true,
1865
- lsp_rename: true,
1866
- lsp_prepare_rename: true,
1867
- lsp_code_actions: true,
1868
- lsp_code_action_resolve: true,
1869
- lsp_servers: true,
1870
- ast_grep_search: true,
1871
- ast_grep_replace: true,
1872
- skill: true,
1873
- call_omo_agent: true,
1874
- background_task: true,
1875
- background_output: true
1876
- },
1877
1842
  prompt: OMO_SYSTEM_PROMPT,
1878
1843
  color: "#00CED1"
1879
1844
  };
@@ -3601,7 +3566,7 @@ async function sendNotification(ctx, p, title, message) {
3601
3566
  await ctx.$`osascript -e ${'display notification "' + escapedMessage + '" with title "' + escapedTitle + '"'}`;
3602
3567
  break;
3603
3568
  case "linux":
3604
- await ctx.$`notify-send ${escapedTitle} ${escapedMessage}`;
3569
+ await ctx.$`notify-send ${escapedTitle} ${escapedMessage}`.catch(() => {});
3605
3570
  break;
3606
3571
  case "win32":
3607
3572
  await ctx.$`powershell -Command ${"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('" + escapedMessage + "', '" + escapedTitle + "')"}`;
@@ -7455,7 +7420,7 @@ TELL THE USER WHAT AGENTS YOU WILL LEVERAGE NOW TO SATISFY USER'S REQUEST.
7455
7420
  ## WORKFLOW
7456
7421
  1. Analyze the request and identify required capabilities
7457
7422
  2. Spawn exploration/librarian agents via background_task in PARALLEL (10+ if needed)
7458
- 3. Use planning agents to create detailed work breakdown
7423
+ 3. Always Use Plan agent with gathered context to create detailed work breakdown
7459
7424
  4. Execute with continuous verification against original requirements
7460
7425
 
7461
7426
  </ultrawork-mode>
@@ -25606,7 +25571,9 @@ var BuiltinAgentNameSchema = exports_external.enum([
25606
25571
  ]);
25607
25572
  var OverridableAgentNameSchema = exports_external.enum([
25608
25573
  "build",
25574
+ "plan",
25609
25575
  "OmO",
25576
+ "OmO-Plan",
25610
25577
  "oracle",
25611
25578
  "librarian",
25612
25579
  "explore",
@@ -25648,7 +25615,9 @@ var AgentOverrideConfigSchema = exports_external.object({
25648
25615
  });
25649
25616
  var AgentOverridesSchema = exports_external.object({
25650
25617
  build: AgentOverrideConfigSchema.optional(),
25618
+ plan: AgentOverrideConfigSchema.optional(),
25651
25619
  OmO: AgentOverrideConfigSchema.optional(),
25620
+ "OmO-Plan": AgentOverrideConfigSchema.optional(),
25652
25621
  oracle: AgentOverrideConfigSchema.optional(),
25653
25622
  librarian: AgentOverrideConfigSchema.optional(),
25654
25623
  explore: AgentOverrideConfigSchema.optional(),
@@ -25664,7 +25633,7 @@ var ClaudeCodeConfigSchema = exports_external.object({
25664
25633
  hooks: exports_external.boolean().optional()
25665
25634
  });
25666
25635
  var OmoAgentConfigSchema = exports_external.object({
25667
- disable_build: exports_external.boolean().optional()
25636
+ disabled: exports_external.boolean().optional()
25668
25637
  });
25669
25638
  var OhMyOpenCodeConfigSchema = exports_external.object({
25670
25639
  $schema: exports_external.string().optional(),
@@ -25686,11 +25655,32 @@ function getUserConfigDir2() {
25686
25655
  }
25687
25656
  return process.env.XDG_CONFIG_HOME || path6.join(os4.homedir(), ".config");
25688
25657
  }
25658
+ var AGENT_NAME_MAP = {
25659
+ omo: "OmO",
25660
+ build: "build",
25661
+ oracle: "oracle",
25662
+ librarian: "librarian",
25663
+ explore: "explore",
25664
+ "frontend-ui-ux-engineer": "frontend-ui-ux-engineer",
25665
+ "document-writer": "document-writer",
25666
+ "multimodal-looker": "multimodal-looker"
25667
+ };
25668
+ function normalizeAgentNames(agents) {
25669
+ const normalized = {};
25670
+ for (const [key, value] of Object.entries(agents)) {
25671
+ const normalizedKey = AGENT_NAME_MAP[key.toLowerCase()] ?? key;
25672
+ normalized[normalizedKey] = value;
25673
+ }
25674
+ return normalized;
25675
+ }
25689
25676
  function loadConfigFromPath2(configPath) {
25690
25677
  try {
25691
25678
  if (fs6.existsSync(configPath)) {
25692
25679
  const content = fs6.readFileSync(configPath, "utf-8");
25693
25680
  const rawConfig = JSON.parse(content);
25681
+ if (rawConfig.agents && typeof rawConfig.agents === "object") {
25682
+ rawConfig.agents = normalizeAgentNames(rawConfig.agents);
25683
+ }
25694
25684
  const result = OhMyOpenCodeConfigSchema.safeParse(rawConfig);
25695
25685
  if (!result.success) {
25696
25686
  log(`Config validation error in ${configPath}:`, result.error.issues);
@@ -25798,14 +25788,35 @@ var OhMyOpenCodePlugin = async (ctx) => {
25798
25788
  const builtinAgents = createBuiltinAgents(pluginConfig.disabled_agents, pluginConfig.agents);
25799
25789
  const userAgents = pluginConfig.claude_code?.agents ?? true ? loadUserAgents() : {};
25800
25790
  const projectAgents = pluginConfig.claude_code?.agents ?? true ? loadProjectAgents() : {};
25801
- const shouldHideBuild = pluginConfig.omo_agent?.disable_build !== false;
25802
- config3.agent = {
25803
- ...builtinAgents,
25804
- ...userAgents,
25805
- ...projectAgents,
25806
- ...config3.agent,
25807
- ...shouldHideBuild ? { build: { mode: "subagent" } } : {}
25808
- };
25791
+ const isOmoEnabled = pluginConfig.omo_agent?.disabled !== true;
25792
+ if (isOmoEnabled && builtinAgents.OmO) {
25793
+ const { name: _planName, ...planConfigWithoutName } = config3.agent?.plan ?? {};
25794
+ const omoPlanOverride = pluginConfig.agents?.["OmO-Plan"];
25795
+ const omoPlanBase = {
25796
+ ...builtinAgents.OmO,
25797
+ ...planConfigWithoutName,
25798
+ description: `${config3.agent?.plan?.description ?? "Plan agent"} (OhMyOpenCode version)`,
25799
+ color: config3.agent?.plan?.color ?? "#6495ED"
25800
+ };
25801
+ const omoPlanConfig = omoPlanOverride ? deepMerge(omoPlanBase, omoPlanOverride) : omoPlanBase;
25802
+ config3.agent = {
25803
+ OmO: builtinAgents.OmO,
25804
+ "OmO-Plan": omoPlanConfig,
25805
+ ...Object.fromEntries(Object.entries(builtinAgents).filter(([k]) => k !== "OmO")),
25806
+ ...userAgents,
25807
+ ...projectAgents,
25808
+ ...config3.agent,
25809
+ build: { ...config3.agent?.build, mode: "subagent" },
25810
+ plan: { ...config3.agent?.plan, mode: "subagent" }
25811
+ };
25812
+ } else {
25813
+ config3.agent = {
25814
+ ...builtinAgents,
25815
+ ...userAgents,
25816
+ ...projectAgents,
25817
+ ...config3.agent
25818
+ };
25819
+ }
25809
25820
  config3.tools = {
25810
25821
  ...config3.tools
25811
25822
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "OpenCode plugin - custom agents (oracle, librarian) and enhanced features",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",