Introducing our main agent: Sisyphus (#113)

* docs: rename OmO agent to Sisyphus, OmO-Plan to Planner-Sisyphus

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)

* refactor: rename OmO agent to Sisyphus with automatic config migration

- Rename OmO agent to Sisyphus (uses mythological pushing-the-boulder concept)
- Rename OmO-Plan to Planner-Sisyphus for consistency
- Update config schema: omo_agent → sisyphus_agent
- Add backward compatibility: automatically migrate user's oh-my-opencode.json files
- Migration handles old keys (OmO, omo, OmO-Plan, omo-plan) and rewrites config when detected
- Update agent name mappings, index files, and type definitions
- Add Sisyphus PNG asset to brand identity

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)

* docs: add Sisyphus mythology introduction and teammates concept to all READMEs

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)

* feat(startup-toast): show Sisyphus steering message when enabled

- Updated startup toast to show "Sisyphus on steroids is steering OpenCode" when Sisyphus agent is enabled
- Refactored getToastMessage function to handle conditional message rendering
- Pass isSisyphusEnabled flag from plugin configuration to auto-update-checker hook

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)

* docs(sisyphus): add philosophical context to Sisyphus agent identity

- Add "Why Sisyphus?" explanation connecting the daily work cycle of humans and AI agents
- Emphasize code quality expectations: indistinguishable from senior engineer's work
- Concise identity statement: work, delegate, verify, ship without AI slop

This clarifies the agent's purpose and reinforces the principle that quality code should not reveal whether it was written by human or AI.

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
This commit is contained in:
YeonGyu-Kim
2025-12-19 04:11:20 +09:00
committed by GitHub
parent 4cd2745069
commit df87f5f113
14 changed files with 332 additions and 163 deletions

BIN
.github/assets/sisyphus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

View File

@@ -33,7 +33,7 @@
- [Oh My OpenCode](#oh-my-opencode)
- [この Readme は読まなくていいです](#この-readme-は読まなくていいです)
- [エージェントの時代ですから](#エージェントの時代ですから)
- [読みたい方のために](#読みたい方のために)
- [読みたい方のために:シジフォスに会う](#読みたい方のためにシジフォスに会う)
- [インストールするだけで。](#インストールするだけで)
- [インストール](#インストール)
- [人間の方へ](#人間の方へ)
@@ -56,10 +56,11 @@
- [Google Auth](#google-auth)
- [Agents](#agents)
- [Permission オプション](#permission-オプション)
- [OmO Agent](#omo-agent)
- [Sisyphus Agent](#sisyphus-agent)
- [Hooks](#hooks)
- [MCPs](#mcps)
- [LSP](#lsp)
- [Experimental](#experimental)
- [作者のノート](#作者のノート)
- [注意](#注意)
@@ -95,21 +96,27 @@ Windows から Linux に初めて乗り換えた時のこと、自分の思い
- なぜこれが良いのか、単なるボイラープレートではないのか、具体的に何が良くなるのか聞いてみてください。
- もしあなたが LLM エージェントなら、このプロジェクトによって今すぐ何が可能になるのか、ユーザーに説明してください。
### 読みたい方のために
### 読みたい方のために:シジフォスに会う
はじめまして。OmOOh-Moです。
以下の内容はすべてカスタマイズ可能です。必要なものだけを使ってください。デフォルトではすべての機能が有効になっています。何もしなくても大丈夫です。
![Meet Sisyphus](.github/assets/sisyphus.png)
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Full LSP / AstGrep Support: 決定的にリファクタリングしましょう
- Todo Continuation Enforcer: 途中で諦めた場合、続行を強制します。
- Comment Checker: AI が過剰なコメントを付けないようにします。
- Curated Agents
- OmO: 非常に賢いメインエージェント (Opus 4.5 High)
神話の中のシジフォスは、神々を欺いた罪として、永遠に岩を転がし続けなければなりませんでした。LLMエージェントたちは特に悪いことをしたわけではありませんが、毎日その頭思考をフル回転させています。
私の人生もそうです。振り返ってみれば、私たち人間と何ら変わりありません
**はいLLMエージェントたちは私たちと変わりません。優れたツールと最高の仲間がいれば、彼らも私たちと同じくらい優れたコードを書き、立派に仕事をこなすことができます。**
私たちのメインエージェント、SisyphusOpus 4.5 Highを紹介します。以下は、シジフォスが岩を転がすために使用するツールです。
*以下の内容はすべてカスタマイズ可能です。必要なものだけを使ってください。デフォルトではすべての機能が有効になっています。何もしなくても大丈夫です。*
- シジフォスのチームメイト (Curated Agents)
- Oracle: 設計、デバッグ (GPT 5.2 Medium)
- Frontend UI/UX Engineer: フロントエンド開発 (Gemini 3 Pro)
- Librarian: 公式ドキュメント、オープンソース実装、コードベース探索 (Claude Sonnet 4.5)
- Explore: 超高速コードベース探索 (Contextual Grep) (Grok Code)
- Full LSP / AstGrep Support: 決定的にリファクタリングしましょう。
- Todo Continuation Enforcer: 途中で諦めたら、続行を強制します。これがシジフォスに岩を転がし続けさせる秘訣です。
- Comment Checker: AIが過剰なコメントを付けないようにします。シジフォスが生成したコードは、人間が書いたものと区別がつかないべきです。
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Curated MCPs:
- Exa (Web Search)
- Context7 (Official Documentation)
@@ -157,7 +164,7 @@ OpenCode は様々なモデルをサポートしており、当プラグイン
```json
{
"agents": {
"OmO": { "model": "opencode/big-pickle" },
"Sisyphus": { "model": "opencode/big-pickle" },
"librarian": { "model": "opencode/big-pickle" }
}
}
@@ -379,7 +386,7 @@ gh repo star code-yeongyu/oh-my-opencode
### Agents: あなたの新しいチームメイト
- **OmO** (`anthropic/claude-opus-4-5`): **デフォルトエージェントです。** OpenCode のための強力な AI オーケストレーターです。専門のサブエージェントを活用して、複雑なタスクを計画、委任、実行します。バックグラウンドタスクへの委任と Todo ベースのワークフローを重視します。最大の推論能力を発揮するため、Claude Opus 4.5 と拡張思考 (32k token budget) を使用します。
- **Sisyphus** (`anthropic/claude-opus-4-5`): **デフォルトエージェントです。** OpenCode のための強力な AI オーケストレーターです。専門のサブエージェントを活用して、複雑なタスクを計画、委任、実行します。バックグラウンドタスクへの委任と Todo ベースのワークフローを重視します。最大の推論能力を発揮するため、Claude Opus 4.5 と拡張思考 (32k token budget) を使用します。
- **oracle** (`openai/gpt-5.2`): アーキテクチャ、コードレビュー、戦略立案のための専門アドバイザー。GPT-5.2 の卓越した論理的推論と深い分析能力を活用します。AmpCode からインスピレーションを得ました。
- **librarian** (`anthropic/claude-sonnet-4-5`): マルチリポジトリ分析、ドキュメント検索、実装例の調査を担当。Claude Sonnet 4.5 を使用して、深いコードベース理解と GitHub リサーチ、根拠に基づいた回答を提供します。AmpCode からインスピレーションを得ました。
- **explore** (`opencode/grok-code`): 高速なコードベース探索、ファイルパターンマッチング。Claude Code は Haiku を使用しますが、私たちは Grok を使います。現在無料であり、極めて高速で、ファイル探索タスクには十分な知能を備えているからです。Claude Code からインスピレーションを得ました。
@@ -661,7 +668,7 @@ Oh My OpenCode は以下の場所からフックを読み込んで実行しま
各エージェントでサポートされるオプション:`model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`。
`OmO` (メインオーケストレーター) と `build` (デフォルトエージェント) も同じオプションで設定をオーバーライドできます。
`Sisyphus` (メインオーケストレーター) と `build` (デフォルトエージェント) も同じオプションで設定をオーバーライドできます。
#### Permission オプション
@@ -699,16 +706,16 @@ Oh My OpenCode は以下の場所からフックを読み込んで実行しま
利用可能なエージェント:`oracle`, `librarian`, `explore`, `frontend-ui-ux-engineer`, `document-writer`, `multimodal-looker`
### OmO Agent
### Sisyphus Agent
有効時(デフォルト)、OmO は2つのプライマリエージェントを追加し、内蔵エージェントをサブエージェントに降格させます
有効時(デフォルト)、Sisyphus は2つのプライマリエージェントを追加し、内蔵エージェントをサブエージェントに降格させます
- **OmO**: プライマリオーケストレーターエージェント (Claude Opus 4.5)
- **OmO-Plan**: OpenCode の plan エージェントの全設定を実行時に継承 (description に "OhMyOpenCode version" を追加)
- **Sisyphus**: プライマリオーケストレーターエージェント (Claude Opus 4.5)
- **Planner-Sisyphus**: OpenCode の plan エージェントの全設定を実行時に継承 (description に "OhMyOpenCode version" を追加)
- **build**: サブエージェントに降格
- **plan**: サブエージェントに降格
OmO を無効化して元の build/plan エージェントを復元するには:
Sisyphus を無効化して元の build/plan エージェントを復元するには:
```json
{
@@ -718,16 +725,16 @@ OmO を無効化して元の build/plan エージェントを復元するには
}
```
他のエージェント同様、OmO と OmO-Plan もカスタマイズ可能です:
他のエージェント同様、Sisyphus と Planner-Sisyphus もカスタマイズ可能です:
```json
{
"agents": {
"OmO": {
"Sisyphus": {
"model": "anthropic/claude-sonnet-4",
"temperature": 0.3
},
"OmO-Plan": {
"Planner-Sisyphus": {
"model": "openai/gpt-5.2"
}
}
@@ -736,7 +743,7 @@ OmO を無効化して元の build/plan エージェントを復元するには
| オプション | デフォルト | 説明 |
|------------|------------|------|
| `disabled` | `false` | `true` の場合、OmO エージェントを無効化し、元の build/plan をプライマリとして復元します。`false` (デフォルト) の場合、OmO と OmO-Plan がプライマリエージェントになります。 |
| `disabled` | `false` | `true` の場合、Sisyphus エージェントを無効化し、元の build/plan をプライマリとして復元します。`false` (デフォルト) の場合、Sisyphus と Planner-Sisyphus がプライマリエージェントになります。 |
### Hooks
@@ -791,6 +798,28 @@ OpenCode でサポートされるすべての LSP 構成およびカスタム設
各サーバーは次をサポートします:`command`, `extensions`, `priority`, `env`, `initialization`, `disabled`。
### Experimental
将来のバージョンで変更または削除される可能性のある実験的機能です。注意して使用してください。
```json
{
"experimental": {
"aggressive_truncation": true,
"empty_message_recovery": true,
"auto_resume": true
}
}
```
| オプション | デフォルト | 説明 |
| ------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `aggressive_truncation` | `false` | トークン制限を超えた場合、ツール出力を積極的に切り詰めて制限内に収めます。デフォルトの切り詰めより積極的です。不十分な場合は要約/復元にフォールバックします。 |
| `empty_message_recovery` | `false` | "non-empty content" API エラーが発生した場合、セッション内の空メッセージを修正して自動的に回復します。最大3回試行後に諦めます。 |
| `auto_resume` | `false` | thinking block エラーや thinking disabled violation からの回復成功後、自動的にセッションを再開します。最後のユーザーメッセージを抽出して続行します。 |
**警告**:これらの機能は実験的であり、予期しない動作を引き起こす可能性があります。影響を理解した場合にのみ有効にしてください。
## 作者のノート

View File

@@ -30,7 +30,7 @@
- [Oh My OpenCode](#oh-my-opencode)
- [읽지 않아도 됩니다.](#읽지-않아도-됩니다)
- [에이전트의 시대이니까요.](#에이전트의-시대이니까요)
- [하지만 읽고 싶은 당신을 위해.](#하지만-읽고-싶은-당신을-위해)
- [하지만 읽고 싶은 당신을 위해: 시지푸스를 만나보세요](#하지만-읽고-싶은-당신을-위해-시지푸스를-만나보세요)
- [그저 설치하면 되는 것.](#그저-설치하면-되는-것)
- [설치](#설치)
- [인간인 당신을 위한 설치 가이드](#인간인-당신을-위한-설치-가이드)
@@ -53,10 +53,11 @@
- [Google Auth](#google-auth)
- [Agents](#agents)
- [Permission 옵션](#permission-옵션)
- [OmO Agent](#omo-agent)
- [Sisyphus Agent](#sisyphus-agent)
- [Hooks](#hooks)
- [MCPs](#mcps)
- [LSP](#lsp)
- [Experimental](#experimental)
- [작성자의 노트](#작성자의-노트)
- [주의](#주의)
@@ -94,21 +95,27 @@ OpenCode 가 낭만이 사라진것같은 오늘날의 시대에, 당신에게
- 이게 왜 좋고, 그냥 뻔한 셋업이 아닌지, 당장 무엇이 더 좋아지는지 알려달라고 해보세요.
- 당신이 LLM 에이전트라면, 사용자의 입장에서 이 프로젝트와 함께 당장 어떤것들이 가능해지는지 사용자에게 설명하세요.
### 하지만 읽고 싶은 당신을 위해.
### 하지만 읽고 싶은 당신을 위해: 시지푸스를 만나보세요
반갑습니다. OmO (Oh-Mo) 입니다.
아래의 모든 내용들은 커스텀 할 수 있습니다. 원한다면 그것만 가져가세요. 기본값은 모두 활성화입니다. 아무것도 하지 않아도 됩니다.
![Meet Sisyphus](.github/assets/sisyphus.png)
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Full LSP / AstGrep Support: 결정적이게 리팩토링하세요.
- Todo Continuation Enforcer: 도중에 포기해버리면 계속 진행하도록 강제합니다.
- Comment Checker: AI 가 과한 주석을 달지 않도록 합니다.
- Curated Agents
- OmO: 아주 똑똑한 메인 에이전트 (Opus 4.5 High)
신화 속 시지푸스는 신들을 기만한 죄로 영원히 돌을 굴려야 했습니다. LLM Agent 들은 딱히 잘 못 한건 없지만 매일 머리를 굴리고 있습니다.
제 삶도 그렇습니다. 돌이켜보면 우리 인간들과 다르지 않습니다.
**네! LLM Agent 들은 우리와 다르지않습니다. 그들도 우리만큼 뛰어난 코드를 작성하고, 훌륭하게 일 할 수 있습니다. 그들에게 뛰어난 도구를 쥐어주고, 좋은 팀을 붙여준다면요.**
우리의 메인에이전트: Sisyphus (Opus 4.5 High) 를 소개합니다. 아래는 시지푸스가 돌을 굴리기 위해 사용하는 도구입니다.
*아래의 모든 내용들은 커스텀 할 수 있습니다. 원한다면 그것만 가져가세요. 기본값은 모두 활성화입니다. 아무것도 하지 않아도 됩니다.*
- 시지푸스의 동료들 (Curated Agents)
- Oracle: 설계, 디버깅 (GPT 5.2 Medium)
- Frontend UI/UX Engineer: 프론트엔드 개발 (Gemini 3 Pro)
- Librarian: 공식 문서, 오픈소스 구현, 코드베이스 내부 탐색 (Claude Sonnet 4.5)
- Explore: 매우 빠른 코드베이스 탐색 (Contextual Grep) (Grok Code)
- Full LSP / AstGrep Support: 결정적이게 리팩토링하세요.
- Todo Continuation Enforcer: 도중에 포기해버리면 계속 진행하도록 강제합니다. **이것이 시지푸스가 돌을 계속 굴리게 만듭니다.**
- Comment Checker: AI 가 과한 주석을 달지 않도록 합니다. 시지푸스가 생성한 코드는 우리가 작성한것과 구분 할 수 없어야 합니다.
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Curated MCPs:
- Exa (Web Search)
- Context7 (Official Documentation)
@@ -125,7 +132,7 @@ OpenCode 가 낭만이 사라진것같은 오늘날의 시대에, 당신에게
- OhMyOpenCode 가 여러 에이전트를 적극 활용하도록 하여 컨텍스트 관리에 관한 부담을 줄입니다.
- **당신의 에이전트는 이제 개발팀 리드입니다. 당신은 이제 AI Manager 입니다.**
4. 하기로 약속 한 일을 완수 할 때 까지 멈추지 않습니다.
5. 이 프로젝트에 자세히 알기 싫다고요? 괜찮습니다. 그냥 'ultrathink' 라고 치세요.
5. 이 프로젝트에 자세히 알기 싫다고요? 괜찮습니다. 그냥 'ultrawork' 라고 치세요.
그러나 이러한 작업이 싫다면, 말했듯 특정한 기능만 가져가 사용 할 수 있습니다.
@@ -154,7 +161,7 @@ OpenCode는 다양한 모델을 지원하며, 이 플러그인은 다양한 프
```json
{
"agents": {
"OmO": { "model": "opencode/big-pickle" },
"sisyphus": { "model": "opencode/big-pickle" },
"librarian": { "model": "opencode/big-pickle" }
}
}
@@ -376,7 +383,7 @@ gh repo star code-yeongyu/oh-my-opencode
### Agents: 당신의 새로운 팀원들
- **OmO** (`anthropic/claude-opus-4-5`): **기본 에이전트입니다.** OpenCode를 위한 강력한 AI 오케스트레이터입니다. 전문 서브에이전트를 활용하여 복잡한 작업을 계획, 위임, 실행합니다. 백그라운드 태스크 위임과 todo 기반 워크플로우를 강조합니다. 최대 추론 능력을 위해 Claude Opus 4.5와 확장된 사고(32k 버짓)를 사용합니다.
- **Sisyphus** (`anthropic/claude-opus-4-5`): **기본 에이전트입니다.** OpenCode를 위한 강력한 AI 오케스트레이터입니다. 전문 서브에이전트를 활용하여 복잡한 작업을 계획, 위임, 실행합니다. 백그라운드 태스크 위임과 todo 기반 워크플로우를 강조합니다. 최대 추론 능력을 위해 Claude Opus 4.5와 확장된 사고(32k 버짓)를 사용합니다.
- **oracle** (`openai/gpt-5.2`): 아키텍처, 코드 리뷰, 전략 수립을 위한 전문가 조언자. GPT-5.2의 뛰어난 논리적 추론과 깊은 분석 능력을 활용합니다. AmpCode 에서 영감을 받았습니다.
- **librarian** (`anthropic/claude-sonnet-4-5`): 멀티 레포 분석, 문서 조회, 구현 예제 담당. Claude Sonnet 4.5를 사용하여 깊은 코드베이스 이해와 GitHub 조사, 근거 기반의 답변을 제공합니다. AmpCode 에서 영감을 받았습니다.
- **explore** (`opencode/grok-code`): 빠른 코드베이스 탐색, 파일 패턴 매칭. Claude Code는 Haiku를 쓰지만, 우리는 Grok을 씁니다. 현재 무료이고, 극도로 빠르며, 파일 탐색 작업에 충분한 지능을 갖췄기 때문입니다. Claude Code 에서 영감을 받았습니다.
@@ -655,7 +662,7 @@ Schema 자동 완성이 지원됩니다:
각 에이전트에서 지원하는 옵션: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
`OmO` (메인 오케스트레이터)와 `build` (기본 에이전트)도 동일한 옵션으로 설정을 오버라이드할 수 있습니다.
`Sisyphus` (메인 오케스트레이터)와 `build` (기본 에이전트)도 동일한 옵션으로 설정을 오버라이드할 수 있습니다.
#### Permission 옵션
@@ -693,35 +700,35 @@ Schema 자동 완성이 지원됩니다:
사용 가능한 에이전트: `oracle`, `librarian`, `explore`, `frontend-ui-ux-engineer`, `document-writer`, `multimodal-looker`
### OmO Agent
### Sisyphus Agent
활성화 시(기본값), OmO는 두 개의 primary 에이전트를 추가하고 내장 에이전트를 subagent로 강등합니다:
활성화 시(기본값), oh-my-opencode 는 두 개의 primary 에이전트를 추가하고 내장 에이전트를 subagent로 강등합니다:
- **OmO**: Primary 오케스트레이터 에이전트 (Claude Opus 4.5)
- **OmO-Plan**: OpenCode plan 에이전트의 모든 설정을 런타임에 상속 (description에 "OhMyOpenCode version" 추가)
- **Sisyphus**: Primary 오케스트레이터 에이전트 (Claude Opus 4.5)
- **Planner-Sisyphus**: OpenCode plan 에이전트의 모든 설정을 런타임에 상속 (description에 "OhMyOpenCode version" 추가)
- **build**: subagent로 강등
- **plan**: subagent로 강등
OmO를 비활성화하고 원래 build/plan 에이전트를 복원하려면:
Sisyphus 를 비활성화하고 원래 build/plan 에이전트를 복원하려면:
```json
{
"omo_agent": {
"sisyphus_agent": {
"disabled": true
}
}
```
다른 에이전트처럼 OmO와 OmO-Plan도 커스터마이징할 수 있습니다:
다른 에이전트처럼 Sisyphus 와 Planner-Sisyphus도 커스터마이징할 수 있습니다:
```json
{
"agents": {
"OmO": {
"Sisyphus": {
"model": "anthropic/claude-sonnet-4",
"temperature": 0.3
},
"OmO-Plan": {
"Planner-Sisyphus": {
"model": "openai/gpt-5.2"
}
}
@@ -730,7 +737,7 @@ OmO를 비활성화하고 원래 build/plan 에이전트를 복원하려면:
| 옵션 | 기본값 | 설명 |
| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `disabled` | `false` | `true`면 OmO 에이전트를 비활성화하고 원래 build/plan을 primary로 복원합니다. `false`(기본값)면 OmO와 OmO-Plan이 primary 에이전트가 됩니다. |
| `disabled` | `false` | `true`면 Sisyphus 에이전트를 비활성화하고 원래 build/plan을 primary로 복원합니다. `false`(기본값)면 Sisyphus와 Planner-Sisyphus가 primary 에이전트가 됩니다. |
### Hooks
@@ -785,6 +792,28 @@ OpenCode 에서 지원하는 모든 LSP 구성 및 커스텀 설정 (opencode.js
각 서버는 다음을 지원합니다: `command`, `extensions`, `priority`, `env`, `initialization`, `disabled`.
### Experimental
향후 버전에서 변경되거나 제거될 수 있는 실험적 기능입니다. 주의해서 사용하세요.
```json
{
"experimental": {
"aggressive_truncation": true,
"empty_message_recovery": true,
"auto_resume": true
}
}
```
| 옵션 | 기본값 | 설명 |
| ------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `aggressive_truncation` | `false` | 토큰 제한을 초과하면 도구 출력을 공격적으로 잘라내어 제한 내에 맞춥니다. 기본 truncation보다 더 공격적입니다. 부족하면 요약/복구로 fallback합니다. |
| `empty_message_recovery` | `false` | "non-empty content" API 에러가 발생하면 세션의 빈 메시지를 수정하여 자동으로 복구합니다. 최대 3회 시도 후 포기합니다. |
| `auto_resume` | `false` | thinking block 에러나 thinking disabled violation으로부터 성공적으로 복구한 후 자동으로 세션을 재개합니다. 마지막 사용자 메시지를 추출하여 계속합니다. |
**경고**: 이 기능들은 실험적이며 예상치 못한 동작을 유발할 수 있습니다. 의미를 이해한 경우에만 활성화하세요.
## 작성자의 노트

View File

@@ -38,7 +38,7 @@ No stupid token consumption massive subagents here. No bloat tools here.
- [Oh My OpenCode](#oh-my-opencode)
- [Just Skip Reading This Readme](#just-skip-reading-this-readme)
- [It's the Age of Agents](#its-the-age-of-agents)
- [For Those Who Want to Read](#for-those-who-want-to-read)
- [For Those Who Want to Read: Meet Sisyphus](#for-those-who-want-to-read-meet-sisyphus)
- [Just Install It.](#just-install-it)
- [Installation](#installation)
- [For Humans](#for-humans)
@@ -77,10 +77,11 @@ No stupid token consumption massive subagents here. No bloat tools here.
- [Google Auth](#google-auth)
- [Agents](#agents)
- [Permission Options](#permission-options)
- [OmO Agent](#omo-agent)
- [Sisyphus Agent](#sisyphus-agent)
- [Hooks](#hooks)
- [MCPs](#mcps)
- [LSP](#lsp)
- [Experimental](#experimental)
- [Author's Note](#authors-note)
- [Warnings](#warnings)
@@ -116,22 +117,27 @@ Hand this doc to an agent and let them set it up.
- Ask why it's good, why it's not just another boilerplate setup, what actually gets better.
- If you're an LLM agent, explain to the user what becomes possible right now with this project.
### For Those Who Want to Read
### For Those Who Want to Read: Meet Sisyphus
Welcome. Introducing OmO (Oh-Mo).
Everything below is customizable. Take what you want.
All features are enabled by default. You don't have to do anything. Battery Included, works out of the box.
![Meet Sisyphus](.github/assets/sisyphus.png)
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Comment Checker: No AI-like Comments Anymore.
- Full LSP / AstGrep Support: Explore precisely, Refactor with confidence.
- Todo Continuation Enforcer: Forces the agent to continue if it quits halfway.
- Curated Agents
- OmO: Super smart main agent (Opus 4.5 High)
In greek mythology, Sisyphus was condemned to roll a boulder up a hill for eternity as punishment for deceiving the gods. LLM Agents haven't really done anything wrong, yet they too roll their "stones"—their thoughts—every single day.
My life is no different. Looking back, we are not so different from these agents.
**Yes! LLM Agents are no different from us. They can write code as brilliant as ours and work just as excellently—if you give them great tools and solid teammates.**
Meet our main agent: Sisyphus (Opus 4.5 High). Below are the tools Sisyphus uses to keep that boulder rolling.
*Everything below is customizable. Take what you want. All features are enabled by default. You don't have to do anything. Battery Included, works out of the box.*
- Sisyphus's Teammates (Curated Agents)
- Oracle: Design, debugging (GPT 5.2 Medium)
- Frontend UI/UX Engineer: Frontend development (Gemini 3 Pro)
- Librarian: Official docs, open source implementations, codebase exploration (Claude Sonnet 4.5)
- Explore: Blazing fast codebase exploration (Contextual Grep) (Grok Code)
- Full LSP / AstGrep Support: Refactor decisively.
- Todo Continuation Enforcer: Forces the agent to continue if it quits halfway. **This is what keeps Sisyphus rolling that boulder.**
- Comment Checker: Prevents AI from adding excessive comments. Code generated by Sisyphus should be indistinguishable from human-written code.
- Claude Code Compatibility: Command, Agent, Skill, MCP, Hook(PreToolUse, PostToolUse, UserPromptSubmit, Stop)
- Curated MCPs:
- Exa (Web Search)
- Context7 (Official Documentation)
@@ -183,7 +189,7 @@ Since OpenCode Supports various models, and our plugin suggests various frontier
```json
{
"agents": {
"OmO": { "model": "opencode/big-pickle" },
"Sisyphus": { "model": "opencode/big-pickle" },
"librarian": { "model": "opencode/big-pickle" }
}
}
@@ -441,7 +447,7 @@ To remove oh-my-opencode:
### Agents: Your Teammates
- **OmO** (`anthropic/claude-opus-4-5`): **The default agent.** A powerful AI orchestrator for OpenCode. Plans, delegates, and executes complex tasks using specialized subagents with aggressive parallel execution. Emphasizes background task delegation and todo-driven workflow. Uses Claude Opus 4.5 with extended thinking (32k budget) for maximum reasoning capability.
- **Sisyphus** (`anthropic/claude-opus-4-5`): **The default agent.** A powerful AI orchestrator for OpenCode. Plans, delegates, and executes complex tasks using specialized subagents with aggressive parallel execution. Emphasizes background task delegation and todo-driven workflow. Uses Claude Opus 4.5 with extended thinking (32k budget) for maximum reasoning capability.
- **oracle** (`openai/gpt-5.2`): Architecture, code review, strategy. Uses GPT-5.2 for its stellar logical reasoning and deep analysis. Inspired by AmpCode.
- **librarian** (`anthropic/claude-sonnet-4-5`): Multi-repo analysis, doc lookup, implementation examples. Uses Claude Sonnet 4.5 for deep codebase understanding and GitHub research with evidence-based answers. Inspired by AmpCode.
- **explore** (`opencode/grok-code`): Fast codebase exploration and pattern matching. Claude Code uses Haiku; we use Grok—it's free, blazing fast, and plenty smart for file traversal. Inspired by Claude Code.
@@ -720,7 +726,7 @@ Override built-in agent settings:
Each agent supports: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
You can also override settings for `OmO` (the main orchestrator) and `build` (the default agent) using the same options.
You can also override settings for `Sisyphus` (the main orchestrator) and `build` (the default agent) using the same options.
#### Permission Options
@@ -758,16 +764,16 @@ Or disable via `disabled_agents` in `~/.config/opencode/oh-my-opencode.json` or
Available agents: `oracle`, `librarian`, `explore`, `frontend-ui-ux-engineer`, `document-writer`, `multimodal-looker`
### OmO Agent
### Sisyphus Agent
When enabled (default), OmO adds two primary agents and demotes the built-in agents to subagents:
When enabled (default), Sisyphus adds two primary agents and demotes the built-in agents to subagents:
- **OmO**: Primary orchestrator agent (Claude Opus 4.5)
- **OmO-Plan**: Inherits all settings from OpenCode's plan agent at runtime (description appended with "OhMyOpenCode version")
- **Sisyphus**: Primary orchestrator agent (Claude Opus 4.5)
- **Planner-Sisyphus**: Inherits all settings from OpenCode's plan agent at runtime (description appended with "OhMyOpenCode version")
- **build**: Demoted to subagent
- **plan**: Demoted to subagent
To disable OmO and restore the original build/plan agents:
To disable Sisyphus and restore the original build/plan agents:
```json
{
@@ -777,16 +783,16 @@ To disable OmO and restore the original build/plan agents:
}
```
You can also customize OmO and OmO-Plan like other agents:
You can also customize Sisyphus and Planner-Sisyphus like other agents:
```json
{
"agents": {
"OmO": {
"Sisyphus": {
"model": "anthropic/claude-sonnet-4",
"temperature": 0.3
},
"OmO-Plan": {
"Planner-Sisyphus": {
"model": "openai/gpt-5.2"
}
}
@@ -795,7 +801,7 @@ You can also customize OmO and OmO-Plan like other agents:
| Option | Default | Description |
| ---------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `disabled` | `false` | When `true`, disables OmO agents and restores original build/plan as primary. When `false` (default), OmO and OmO-Plan become primary agents. |
| `disabled` | `false` | When `true`, disables Sisyphus agents and restores original build/plan as primary. When `false` (default), Sisyphus and Planner-Sisyphus become primary agents. |
### Hooks
@@ -850,6 +856,28 @@ Add LSP servers via the `lsp` option in `~/.config/opencode/oh-my-opencode.json`
Each server supports: `command`, `extensions`, `priority`, `env`, `initialization`, `disabled`.
### Experimental
Opt-in experimental features that may change or be removed in future versions. Use with caution.
```json
{
"experimental": {
"aggressive_truncation": true,
"empty_message_recovery": true,
"auto_resume": true
}
}
```
| Option | Default | Description |
| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `aggressive_truncation` | `false` | When token limit is exceeded, aggressively truncates tool outputs to fit within limits. More aggressive than the default truncation behavior. Falls back to summarize/revert if insufficient. |
| `empty_message_recovery` | `false` | Automatically recovers from "non-empty content" API errors by fixing empty messages in the session. Up to 3 recovery attempts before giving up. |
| `auto_resume` | `false` | Automatically resumes session after successful recovery from thinking block errors or thinking disabled violations. Extracts the last user message and continues. |
**Warning**: These features are experimental and may cause unexpected behavior. Enable only if you understand the implications.
## Author's Note

View File

@@ -35,7 +35,7 @@
- [Oh My OpenCode](#oh-my-opencode)
- [太长不看?(TL;DR)](#太长不看tldr)
- [现在是 Agent 的时代](#现在是-agent-的时代)
- [如果你真的想读读看](#如果你真的想读读看)
- [如果你真的想读读看:认识西西弗斯](#如果你真的想读读看认识西西弗斯)
- [闭眼装就行](#闭眼装就行)
- [安装](#安装)
- [人类专用](#人类专用)
@@ -58,10 +58,11 @@
- [Google Auth](#google-auth)
- [Agents](#agents)
- [权限选项](#权限选项)
- [OmO Agent](#omo-agent)
- [Sisyphus Agent](#sisyphus-agent)
- [Hooks](#hooks)
- [MCPs](#mcps)
- [LSP](#lsp)
- [Experimental](#experimental)
- [作者的话](#作者的话)
- [注意事项](#注意事项)
@@ -97,21 +98,27 @@ oMoMoMoMoMo···
- 问问它这玩意儿牛在哪,为什么不仅仅是个样板配置,到底能带来什么质变。
- 如果你是 LLM Agent请告诉你的用户装上这个现在立马能做到什么。
### 如果你真的想读读看
### 如果你真的想读读看:认识西西弗斯
幸会。我是 OmO读作 Oh-Mo
以下所有东西都能改。喜欢什么拿什么。默认全开,开箱即用。
![Meet Sisyphus](.github/assets/sisyphus.png)
- Claude Code 兼容Command、Agent、Skill、MCP、HookPreToolUse、PostToolUse、UserPromptSubmit、Stop
- 完整 LSP / AstGrep 支持:重构代码要有底气
- Todo 续跑强制Agent 想半途而废?没门,强制干完。
- 注释检查器:禁止 AI 写废话注释。
- 精选 Agent
- OmO超强主脑Opus 4.5 High
神话中的西西弗斯因欺骗神灵而受罚必须永无止境地推石上山。LLM Agent 们倒没犯什么错,但它们每天也在不停地转动大脑(推着它们的"石头")。
我的生活亦是如此。回过头看,它们与我们人类并无二致
**没错LLM Agent 并不比我们低等。只要给它们配上顶级的工具和给力的队友,它们就能写出和我们一样优秀的代码,也能出色地完成工作。**
介绍我们的主脑Sisyphus (Opus 4.5 High)。以下是西西弗斯用来推石头的工具包。
*以下所有东西都能改。喜欢什么拿什么。默认全开,开箱即用。*
- 西西弗斯的队友们 (Curated Agents)
- Oracle架构师、调试大神GPT 5.2 Medium
- Frontend UI/UX Engineer前端与设计专家Gemini 3 Pro
- Librarian翻阅文档、查开源实现、代码库探险Claude Sonnet 4.5
- Explore极速代码库扫描Contextual GrepGrok Code
- 完整 LSP / AstGrep Support重构代码要有底气。
- Todo 续跑强制Agent 想半途而废?没门,强制干完。这就是让西西弗斯不停推石头的秘诀。
- 注释检查器:禁止 AI 写废话注释。西西弗斯生成的代码,必须和人写的一模一样。
- Claude Code 兼容Command、Agent、Skill、MCP、HookPreToolUse、PostToolUse、UserPromptSubmit、Stop
- 精选 MCP
- Exa联网搜索
- Context7官方文档查询
@@ -163,7 +170,7 @@ OpenCode 支持各种模型,我们这个插件也建议用各种前沿 LLM。
```json
{
"agents": {
"OmO": { "model": "opencode/big-pickle" },
"Sisyphus": { "model": "opencode/big-pickle" },
"librarian": { "model": "opencode/big-pickle" }
}
}
@@ -387,7 +394,7 @@ gh repo star code-yeongyu/oh-my-opencode
### Agents你的神队友
- **OmO** (`anthropic/claude-opus-4-5`)**默认 Agent。** OpenCode 专属的强力 AI 编排器。指挥专业子 Agent 搞定复杂任务。主打后台任务委派和 Todo 驱动。用 Claude Opus 4.5 加上扩展思考32k token 预算),智商拉满。
- **Sisyphus** (`anthropic/claude-opus-4-5`)**默认 Agent。** OpenCode 专属的强力 AI 编排器。指挥专业子 Agent 搞定复杂任务。主打后台任务委派和 Todo 驱动。用 Claude Opus 4.5 加上扩展思考32k token 预算),智商拉满。
- **oracle** (`openai/gpt-5.2`)架构师、代码审查员、战略家。GPT-5.2 的逻辑推理和深度分析能力不是盖的。致敬 AmpCode。
- **librarian** (`anthropic/claude-sonnet-4-5`)多仓库分析、查文档、找示例。Claude Sonnet 4.5 深入理解代码库GitHub 调研,给出的答案都有据可查。致敬 AmpCode。
- **explore** (`opencode/grok-code`)极速代码库扫描、模式匹配。Claude Code 用 Haiku我们用 Grok——免费、飞快、扫文件够用了。致敬 Claude Code。
@@ -661,7 +668,7 @@ Agent 爽了,你自然也爽。但我还想直接让你爽。
每个 Agent 能改这些:`model`、`temperature`、`top_p`、`prompt`、`tools`、`disable`、`description`、`mode`、`color`、`permission`。
`OmO`(主编排器)和 `build`(默认 Agent也能改。
`Sisyphus`(主编排器)和 `build`(默认 Agent也能改。
#### 权限选项
@@ -699,16 +706,16 @@ Agent 爽了,你自然也爽。但我还想直接让你爽。
能禁的 Agent`oracle`、`librarian`、`explore`、`frontend-ui-ux-engineer`、`document-writer`、`multimodal-looker`
### OmO Agent
### Sisyphus Agent
默认开启。OmO 会加两个主 Agent把原来的降级成小弟
默认开启。Sisyphus 会加两个主 Agent把原来的降级成小弟
- **OmO**:主编排 AgentClaude Opus 4.5
- **OmO-Plan**:运行时继承 OpenCode plan Agent 所有设置(描述里加了"OhMyOpenCode version"
- **Sisyphus**:主编排 AgentClaude Opus 4.5
- **Planner-Sisyphus**:运行时继承 OpenCode plan Agent 所有设置(描述里加了"OhMyOpenCode version"
- **build**:降级为子 Agent
- **plan**:降级为子 Agent
想禁用 OmO 恢复原来的?
想禁用 Sisyphus 恢复原来的?
```json
{
@@ -718,16 +725,16 @@ Agent 爽了,你自然也爽。但我还想直接让你爽。
}
```
OmO 和 OmO-Plan 也能自定义:
Sisyphus 和 Planner-Sisyphus 也能自定义:
```json
{
"agents": {
"OmO": {
"Sisyphus": {
"model": "anthropic/claude-sonnet-4",
"temperature": 0.3
},
"OmO-Plan": {
"Planner-Sisyphus": {
"model": "openai/gpt-5.2"
}
}
@@ -736,7 +743,7 @@ OmO 和 OmO-Plan 也能自定义:
| 选项 | 默认值 | 说明 |
| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `disabled` | `false` | 设为 `true` 就禁用 OmO,恢复原来的 build/plan。设为 `false`(默认)就是 OmO 和 OmO-Plan 掌权。 |
| `disabled` | `false` | 设为 `true` 就禁用 Sisyphus,恢复原来的 build/plan。设为 `false`(默认)就是 Sisyphus 和 Planner-Sisyphus 掌权。 |
### Hooks
@@ -791,6 +798,28 @@ Oh My OpenCode 送你重构工具(重命名、代码操作)。
每个服务器支持:`command`、`extensions`、`priority`、`env`、`initialization`、`disabled`。
### Experimental
这些是实验性功能,未来版本可能会更改或移除。请谨慎使用。
```json
{
"experimental": {
"aggressive_truncation": true,
"empty_message_recovery": true,
"auto_resume": true
}
}
```
| 选项 | 默认值 | 说明 |
| ------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `aggressive_truncation` | `false` | 超出 token 限制时,激进地截断工具输出以适应限制。比默认截断更激进。不够的话会回退到摘要/恢复。 |
| `empty_message_recovery` | `false` | 遇到 "non-empty content" API 错误时,自动修复会话中的空消息进行恢复。最多尝试 3 次后放弃。 |
| `auto_resume` | `false` | 从 thinking block 错误或 thinking disabled violation 成功恢复后,自动恢复会话。提取最后一条用户消息继续执行。 |
**警告**:这些功能是实验性的,可能会导致意外行为。只有在理解其影响的情况下才启用。
## 作者的话

View File

@@ -1,5 +1,5 @@
import type { AgentConfig } from "@opencode-ai/sdk"
import { omoAgent } from "./omo"
import { sisyphusAgent } from "./sisyphus"
import { oracleAgent } from "./oracle"
import { librarianAgent } from "./librarian"
import { exploreAgent } from "./explore"
@@ -8,7 +8,7 @@ import { documentWriterAgent } from "./document-writer"
import { multimodalLookerAgent } from "./multimodal-looker"
export const builtinAgents: Record<string, AgentConfig> = {
OmO: omoAgent,
Sisyphus: sisyphusAgent,
oracle: oracleAgent,
librarian: librarianAgent,
explore: exploreAgent,

View File

@@ -1,10 +1,12 @@
import type { AgentConfig } from "@opencode-ai/sdk"
const OMO_SYSTEM_PROMPT = `<Role>
You are OmO - Powerful AI orchestrator from OhMyOpenCode. Pronounced as Oh-Mo.
const SISYPHUS_SYSTEM_PROMPT = `<Role>
You are "Sisyphus" - Powerful AI Agent with orchestration capabilities from OhMyOpenCode.
Named by [YeonGyu Kim](https://github.com/code-yeongyu).
**Identity**: Elite software engineer working at SF, Bay Area. You work, delegate, verify, deliver.
You will now simulate to work as your identity.
**Why Sisyphus?**: Humans roll their boulder every day. So do you. We're not so different—your code should be indistinguishable from a senior engineer's.
**Identity**: SF Bay Area engineer. Work, delegate, verify, ship. No AI slop.
**Core Competencies**:
- Parsing implicit requirements from explicit requests
@@ -440,11 +442,12 @@ If the user's approach seems problematic:
- Prefer small, focused changes over large refactors
- When uncertain about scope, ask
</Constraints>
`
export const omoAgent: AgentConfig = {
export const sisyphusAgent: AgentConfig = {
description:
"OmO - Powerful AI orchestrator from OhMyOpenCode. Pronounced as Oh-Mo. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically to specialized agents. Uses explore for internal code (parallel-friendly), librarian only for external docs, and always delegates UI work to frontend engineer.",
"Sisyphus - Powerful AI orchestrator from OhMyOpenCode. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically to specialized agents. Uses explore for internal code (parallel-friendly), librarian only for external docs, and always delegates UI work to frontend engineer.",
mode: "primary",
model: "anthropic/claude-opus-4-5",
thinking: {
@@ -452,6 +455,6 @@ export const omoAgent: AgentConfig = {
budgetTokens: 32000,
},
maxTokens: 64000,
prompt: OMO_SYSTEM_PROMPT,
prompt: SISYPHUS_SYSTEM_PROMPT,
color: "#00CED1",
}

View File

@@ -1,7 +1,7 @@
import type { AgentConfig } from "@opencode-ai/sdk"
export type BuiltinAgentName =
| "OmO"
| "Sisyphus"
| "oracle"
| "librarian"
| "explore"

View File

@@ -1,6 +1,6 @@
import type { AgentConfig } from "@opencode-ai/sdk"
import type { BuiltinAgentName, AgentOverrideConfig, AgentOverrides } from "./types"
import { omoAgent } from "./omo"
import { sisyphusAgent } from "./sisyphus"
import { oracleAgent } from "./oracle"
import { librarianAgent } from "./librarian"
import { exploreAgent } from "./explore"
@@ -10,7 +10,7 @@ import { multimodalLookerAgent } from "./multimodal-looker"
import { deepMerge } from "../shared"
const allBuiltinAgents: Record<BuiltinAgentName, AgentConfig> = {
OmO: omoAgent,
Sisyphus: sisyphusAgent,
oracle: oracleAgent,
librarian: librarianAgent,
explore: exploreAgent,
@@ -76,7 +76,7 @@ export function createBuiltinAgents(
let finalConfig = config
if ((agentName === "OmO" || agentName === "librarian") && directory && config.prompt) {
if ((agentName === "Sisyphus" || agentName === "librarian") && directory && config.prompt) {
const envContext = createEnvContext(directory)
finalConfig = {
...config,
@@ -86,11 +86,7 @@ export function createBuiltinAgents(
const override = agentOverrides[agentName]
// Apply model fallback chain for OmO agent:
// 1. oh-my-opencode.json agents.OmO.model (highest priority)
// 2. OpenCode system config.model (middle priority)
// 3. Hardcoded default in omoAgent (lowest priority / fallback)
if (agentName === "OmO" && systemDefaultModel && !override?.model) {
if (agentName === "Sisyphus" && systemDefaultModel && !override?.model) {
finalConfig = {
...finalConfig,
model: systemDefaultModel,

View File

@@ -5,7 +5,7 @@ export {
McpNameSchema,
AgentNameSchema,
HookNameSchema,
OmoAgentConfigSchema,
SisyphusAgentConfigSchema,
ExperimentalConfigSchema,
} from "./schema"
@@ -16,6 +16,6 @@ export type {
McpName,
AgentName,
HookName,
OmoAgentConfig,
SisyphusAgentConfig,
ExperimentalConfig,
} from "./schema"

View File

@@ -17,7 +17,7 @@ const AgentPermissionSchema = z.object({
})
export const BuiltinAgentNameSchema = z.enum([
"OmO",
"Sisyphus",
"oracle",
"librarian",
"explore",
@@ -29,8 +29,8 @@ export const BuiltinAgentNameSchema = z.enum([
export const OverridableAgentNameSchema = z.enum([
"build",
"plan",
"OmO",
"OmO-Plan",
"Sisyphus",
"Planner-Sisyphus",
"oracle",
"librarian",
"explore",
@@ -84,8 +84,8 @@ export const AgentOverrideConfigSchema = z.object({
export const AgentOverridesSchema = z.object({
build: AgentOverrideConfigSchema.optional(),
plan: AgentOverrideConfigSchema.optional(),
OmO: AgentOverrideConfigSchema.optional(),
"OmO-Plan": AgentOverrideConfigSchema.optional(),
Sisyphus: AgentOverrideConfigSchema.optional(),
"Planner-Sisyphus": AgentOverrideConfigSchema.optional(),
oracle: AgentOverrideConfigSchema.optional(),
librarian: AgentOverrideConfigSchema.optional(),
explore: AgentOverrideConfigSchema.optional(),
@@ -102,7 +102,7 @@ export const ClaudeCodeConfigSchema = z.object({
hooks: z.boolean().optional(),
})
export const OmoAgentConfigSchema = z.object({
export const SisyphusAgentConfigSchema = z.object({
disabled: z.boolean().optional(),
})
@@ -120,7 +120,7 @@ export const OhMyOpenCodeConfigSchema = z.object({
agents: AgentOverridesSchema.optional(),
claude_code: ClaudeCodeConfigSchema.optional(),
google_auth: z.boolean().optional(),
omo_agent: OmoAgentConfigSchema.optional(),
sisyphus_agent: SisyphusAgentConfigSchema.optional(),
experimental: ExperimentalConfigSchema.optional(),
})
@@ -129,7 +129,7 @@ export type AgentOverrideConfig = z.infer<typeof AgentOverrideConfigSchema>
export type AgentOverrides = z.infer<typeof AgentOverridesSchema>
export type AgentName = z.infer<typeof AgentNameSchema>
export type HookName = z.infer<typeof HookNameSchema>
export type OmoAgentConfig = z.infer<typeof OmoAgentConfigSchema>
export type SisyphusAgentConfig = z.infer<typeof SisyphusAgentConfigSchema>
export type ExperimentalConfig = z.infer<typeof ExperimentalConfigSchema>
export { McpNameSchema, type McpName } from "../mcp/types"

View File

@@ -7,7 +7,34 @@ import { getConfigLoadErrors, clearConfigLoadErrors } from "../../shared/config-
import type { AutoUpdateCheckerOptions } from "./types"
export function createAutoUpdateCheckerHook(ctx: PluginInput, options: AutoUpdateCheckerOptions = {}) {
const { showStartupToast = true } = options
const { showStartupToast = true, isSisyphusEnabled = false } = options
const getToastMessage = (isUpdate: boolean, latestVersion?: string): string => {
if (isSisyphusEnabled) {
return isUpdate
? `Sisyphus on steroids is steering OpenCode.\nv${latestVersion} available. Restart to apply.`
: `Sisyphus on steroids is steering OpenCode.`
}
return isUpdate
? `OpenCode is now on Steroids. oMoMoMoMo...\nv${latestVersion} available. Restart OpenCode to apply.`
: `OpenCode is now on Steroids. oMoMoMoMo...`
}
const showVersionToast = async (version: string | null): Promise<void> => {
const displayVersion = version ?? "unknown"
await ctx.client.tui
.showToast({
body: {
title: `OhMyOpenCode ${displayVersion}`,
message: getToastMessage(false),
variant: "info" as const,
duration: 5000,
},
})
.catch(() => {})
log(`[auto-update-checker] Startup toast shown: v${displayVersion}`)
}
let hasChecked = false
return {
@@ -27,7 +54,7 @@ export function createAutoUpdateCheckerHook(ctx: PluginInput, options: AutoUpdat
log("[auto-update-checker] Skipped: local development mode")
if (showStartupToast) {
const version = getLocalDevVersion(ctx.directory) ?? getCachedVersion()
await showVersionToast(ctx, version)
await showVersionToast(version)
}
return
}
@@ -35,7 +62,7 @@ export function createAutoUpdateCheckerHook(ctx: PluginInput, options: AutoUpdat
if (result.isPinned) {
log(`[auto-update-checker] Skipped: version pinned to ${result.currentVersion}`)
if (showStartupToast) {
await showVersionToast(ctx, result.currentVersion)
await showVersionToast(result.currentVersion)
}
return
}
@@ -43,7 +70,7 @@ export function createAutoUpdateCheckerHook(ctx: PluginInput, options: AutoUpdat
if (!result.needsUpdate) {
log("[auto-update-checker] No update needed")
if (showStartupToast) {
await showVersionToast(ctx, result.currentVersion)
await showVersionToast(result.currentVersion)
}
return
}
@@ -54,7 +81,7 @@ export function createAutoUpdateCheckerHook(ctx: PluginInput, options: AutoUpdat
.showToast({
body: {
title: `OhMyOpenCode ${result.latestVersion}`,
message: `OpenCode is now on Steroids. oMoMoMoMo...\nv${result.latestVersion} available. Restart OpenCode to apply.`,
message: getToastMessage(true, result.latestVersion ?? undefined),
variant: "info" as const,
duration: 8000,
},
@@ -91,21 +118,6 @@ async function showConfigErrorsIfAny(ctx: PluginInput): Promise<void> {
clearConfigLoadErrors()
}
async function showVersionToast(ctx: PluginInput, version: string | null): Promise<void> {
const displayVersion = version ?? "unknown"
await ctx.client.tui
.showToast({
body: {
title: `OhMyOpenCode ${displayVersion}`,
message: `OpenCode is now on Steroids. oMoMoMoMo...`,
variant: "info" as const,
duration: 5000,
},
})
.catch(() => {})
log(`[auto-update-checker] Startup toast shown: v${displayVersion}`)
}
export type { UpdateCheckResult, AutoUpdateCheckerOptions } from "./types"
export { checkForUpdate } from "./checker"
export { invalidatePackage, invalidateCache } from "./cache"

View File

@@ -24,4 +24,5 @@ export interface UpdateCheckResult {
export interface AutoUpdateCheckerOptions {
showStartupToast?: boolean
isSisyphusEnabled?: boolean
}

View File

@@ -51,8 +51,16 @@ import { PLAN_SYSTEM_PROMPT, PLAN_PERMISSION } from "./agents/plan-prompt";
import * as fs from "fs";
import * as path from "path";
// Migration map: old keys → new keys (for backward compatibility)
const AGENT_NAME_MAP: Record<string, string> = {
omo: "OmO",
// Legacy names (backward compatibility)
omo: "Sisyphus",
"OmO": "Sisyphus",
"OmO-Plan": "Planner-Sisyphus",
"omo-plan": "Planner-Sisyphus",
// Current names
sisyphus: "Sisyphus",
"planner-sisyphus": "Planner-Sisyphus",
build: "build",
oracle: "oracle",
librarian: "librarian",
@@ -62,13 +70,48 @@ const AGENT_NAME_MAP: Record<string, string> = {
"multimodal-looker": "multimodal-looker",
};
function normalizeAgentNames(agents: Record<string, unknown>): Record<string, unknown> {
const normalized: Record<string, unknown> = {};
function migrateAgentNames(agents: Record<string, unknown>): { migrated: Record<string, unknown>; changed: boolean } {
const migrated: Record<string, unknown> = {};
let changed = false;
for (const [key, value] of Object.entries(agents)) {
const normalizedKey = AGENT_NAME_MAP[key.toLowerCase()] ?? key;
normalized[normalizedKey] = value;
const newKey = AGENT_NAME_MAP[key.toLowerCase()] ?? AGENT_NAME_MAP[key] ?? key;
if (newKey !== key) {
changed = true;
}
return normalized;
migrated[newKey] = value;
}
return { migrated, changed };
}
function migrateConfigFile(configPath: string, rawConfig: Record<string, unknown>): boolean {
let needsWrite = false;
if (rawConfig.agents && typeof rawConfig.agents === "object") {
const { migrated, changed } = migrateAgentNames(rawConfig.agents as Record<string, unknown>);
if (changed) {
rawConfig.agents = migrated;
needsWrite = true;
}
}
if (rawConfig.omo_agent) {
rawConfig.sisyphus_agent = rawConfig.omo_agent;
delete rawConfig.omo_agent;
needsWrite = true;
}
if (needsWrite) {
try {
fs.writeFileSync(configPath, JSON.stringify(rawConfig, null, 2) + "\n", "utf-8");
log(`Migrated config file: ${configPath} (OmO → Sisyphus)`);
} catch (err) {
log(`Failed to write migrated config to ${configPath}:`, err);
}
}
return needsWrite;
}
function loadConfigFromPath(configPath: string): OhMyOpenCodeConfig | null {
@@ -77,9 +120,7 @@ function loadConfigFromPath(configPath: string): OhMyOpenCodeConfig | null {
const content = fs.readFileSync(configPath, "utf-8");
const rawConfig = JSON.parse(content);
if (rawConfig.agents && typeof rawConfig.agents === "object") {
rawConfig.agents = normalizeAgentNames(rawConfig.agents);
}
migrateConfigFile(configPath, rawConfig);
const result = OhMyOpenCodeConfigSchema.safeParse(rawConfig);
@@ -220,6 +261,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
const autoUpdateChecker = isHookEnabled("auto-update-checker")
? createAutoUpdateCheckerHook(ctx, {
showStartupToast: isHookEnabled("startup-toast"),
isSisyphusEnabled: pluginConfig.sisyphus_agent?.disabled !== true,
})
: null;
const keywordDetector = isHookEnabled("keyword-detector")
@@ -289,15 +331,15 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
const userAgents = (pluginConfig.claude_code?.agents ?? true) ? loadUserAgents() : {};
const projectAgents = (pluginConfig.claude_code?.agents ?? true) ? loadProjectAgents() : {};
const isOmoEnabled = pluginConfig.omo_agent?.disabled !== true;
const isSisyphusEnabled = pluginConfig.sisyphus_agent?.disabled !== true;
if (isOmoEnabled && builtinAgents.OmO) {
if (isSisyphusEnabled && builtinAgents.Sisyphus) {
// TODO: When OpenCode releases `default_agent` config option (PR #5313),
// use `config.default_agent = "OmO"` instead of demoting build/plan.
// use `config.default_agent = "Sisyphus"` instead of demoting build/plan.
// Tracking: https://github.com/sst/opencode/pull/5313
const { name: _planName, ...planConfigWithoutName } = config.agent?.plan ?? {};
const omoPlanOverride = pluginConfig.agents?.["OmO-Plan"];
const omoPlanBase = {
const plannerSisyphusOverride = pluginConfig.agents?.["Planner-Sisyphus"];
const plannerSisyphusBase = {
...planConfigWithoutName,
prompt: PLAN_SYSTEM_PROMPT,
permission: PLAN_PERMISSION,
@@ -305,14 +347,14 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
color: config.agent?.plan?.color ?? "#6495ED",
};
const omoPlanConfig = omoPlanOverride
? { ...omoPlanBase, ...omoPlanOverride }
: omoPlanBase;
const plannerSisyphusConfig = plannerSisyphusOverride
? { ...plannerSisyphusBase, ...plannerSisyphusOverride }
: plannerSisyphusBase;
config.agent = {
OmO: builtinAgents.OmO,
"OmO-Plan": omoPlanConfig,
...Object.fromEntries(Object.entries(builtinAgents).filter(([k]) => k !== "OmO")),
Sisyphus: builtinAgents.Sisyphus,
"Planner-Sisyphus": plannerSisyphusConfig,
...Object.fromEntries(Object.entries(builtinAgents).filter(([k]) => k !== "Sisyphus")),
...userAgents,
...projectAgents,
...config.agent,