opencode-ultra 0.7.5 → 0.7.7

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.
Files changed (3) hide show
  1. package/README.md +70 -228
  2. package/dist/index.js +14 -0
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,11 +1,10 @@
1
1
  # opencode-ultra
2
2
 
3
- [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) をベースに、micode / opencode-skillful の良い部分を取り込んだ OpenCode 1.2.x プラグイン。
4
- マルチエージェントオーケストレーション・キーワード駆動モード切替・ルール注入・セッション継続・AST検索・自己改善 (evolve) を軽量な単一プラグインで実現する。
3
+ OpenCode 1.2.x プラグイン。マルチエージェントオーケストレーション・キーワード駆動モード切替・ルール注入・セッション継続・AST検索・自己改善 (evolve) を軽量な単一プラグインで実現する。
5
4
 
6
5
  ## 機能一覧
7
6
 
8
- ### ツール (8)
7
+ ### ツール (9)
9
8
 
10
9
  | ツール | 説明 |
11
10
  |--------|------|
@@ -17,6 +16,7 @@
17
16
  | `ledger_load` | Continuity Ledger の読み込み (名前指定 or 最新) |
18
17
  | `ast_search` | AST-aware コード検索 (ast-grep/sg バイナリ使用、未インストール時は自動スキップ) |
19
18
  | `evolve_apply` | プラグイン推薦の信頼度スコア評価 + OpenCode 設定への自動適用 (dry-run/backup 対応) |
19
+ | `evolve_score` | 改善提案のスコアリング・ランキング (Priority x Effort 重み付け) |
20
20
 
21
21
  ### フック (9)
22
22
 
@@ -37,200 +37,59 @@
37
37
  | 機能 | 説明 |
38
38
  |------|------|
39
39
  | **Prompt Injection Sanitizer** | エージェント出力から注入パターンを検知・無害化 (17パターン, 6カテゴリ) |
40
- | **Spawn Limit** | 同時実行セッション上限 (default: 15) — エージェント爆発防止 |
41
- | **Agent Timeout** | per-agent タイムアウト (default: 180s) — ハング防止 |
40
+ | **Spawn Limit** | 同時実行セッション上限 (default: 15) |
41
+ | **Agent Timeout** | per-agent タイムアウト (default: 180s) |
42
42
  | **Trust Score** | npm パッケージの信頼度スコア (0-100) — evolve 推薦の品質ゲート |
43
-
44
- ### Evolve (自己改善)
45
-
46
- | キーワード | 効果 |
47
- |-----------|------|
48
- | `evolve` / `self-improve` / `自己改善` / `進化` | evolve モード起動 |
49
-
50
- evolve モードでは:
51
- 1. **scout** エージェントが npm/GitHub を検索し、プラグインのメタデータを収集
52
- 2. **explore** エージェントが opencode-ultra 自身の機能をカタログ化
53
- 3. 発見されたプラグインに **Trust Score** (0-100) を自動計算
54
- 4. ギャップ分析と改善提案を生成
55
- 5. ユーザー承認後、`evolve_apply` で設定に自動適用 (バックアップ付き)
56
-
57
- Trust Score 評価基準:
58
-
59
- | カテゴリ | 配点 | チェック項目 |
60
- |----------|------|-------------|
61
- | Recency | 25 | 最終 publish からの日数 |
62
- | Popularity | 25 | 週間 DL 数 + GitHub stars |
63
- | Quality | 20 | ライセンス, README, メンテナ数, description |
64
- | Repository | 15 | GitHub/GitLab リポジトリの存在 |
65
- | Safety | 15 | typosquat 検知, 依存数, 既知スコープ |
66
-
67
- | スコア | レベル | 自動インストール |
68
- |--------|--------|----------------|
69
- | 90-100 | HIGH | 可 |
70
- | 70-89 | MEDIUM | レビュー推奨 |
71
- | 40-69 | LOW | 要注意 |
72
- | 0-39 | RISKY | ブロック |
73
-
74
- ### その他
75
-
76
- | 機能 | 説明 |
77
- |------|------|
78
- | **Built-in Agent Demotion** | OpenCode 標準エージェント (build/plan/triage/docs) を subagent に降格 |
79
- | **MCP 自動登録** | Context7 を自動登録 (API キー任意) |
80
- | **Plan-First Protocol** | spawn_agent 前に Phase 形式のプランを提示、ユーザー承認を待つ |
81
- | **Categories** | spawn_agent の category パラメータでモデル/バリアントを一括切替 |
82
43
  | **Concurrency Pool** | Semaphore ベースの global/provider/model 三層並列制御 |
83
44
 
84
- ## アーキテクチャ
85
-
86
- ```
87
- User
88
-
89
- │ "ultrawork" / "ulw" / "evolve" / "think hard" キーワード
90
-
91
-
92
- ┌──────────────────────────────────────────────┐
93
- │ opencode-ultra plugin │
94
- │ │
95
- │ chat.message hook │
96
- │ ├─ keyword-detector │
97
- │ │ └─ ultrawork/search/analyze/think/evolve │
98
- │ └─ ultrawork → variant: "max" │
99
- │ │
100
- │ system.transform hook │
101
- │ ├─ keyword message injection │
102
- │ ├─ rules-injector (.opencode/rules.md) │
103
- │ ├─ context-injector (ARCHITECTURE/CODE_STYLE)│
104
- │ ├─ fragment-injector (per-agent fragments) │
105
- │ └─ prompt-renderer (markdown/xml/json) │
106
- │ │
107
- │ tool.execute.after hook │
108
- │ ├─ comment-checker (Write/Edit 後に検査) │
109
- │ └─ token-truncation (30000文字超を圧縮) │
110
- │ │
111
- │ session.compacting hook │
112
- │ └─ session-compaction (structured summary) │
113
- │ │
114
- │ event hook │
115
- │ ├─ session cleanup │
116
- │ └─ todo-enforcer (session.idle 時に検査) │
117
- │ │
118
- │ config hook │
119
- │ ├─ register agents to OpenCode │
120
- │ └─ demote built-in agents to subagent │
121
- │ │
122
- │ tools │
123
- │ ├─ spawn_agent (並列実行 + 安全制御) │
124
- │ │ ├─ ConcurrencyPool │
125
- │ │ ├─ Spawn limit (max 15) │
126
- │ │ ├─ Agent timeout (180s) │
127
- │ │ └─ Prompt injection sanitizer │
128
- │ ├─ ralph_loop / cancel_ralph │
129
- │ ├─ batch_read (複数ファイル並列読み込み) │
130
- │ ├─ ledger_save / ledger_load (文脈継続) │
131
- │ ├─ ast_search (構文木検索, optional) │
132
- │ └─ evolve_apply (信頼度スコア + 設定適用) │
133
- │ │
134
- │ safety │
135
- │ ├─ sanitizer (17 injection patterns) │
136
- │ └─ trust-score (5-factor, 0-100) │
137
- │ │
138
- │ MCP registration │
139
- │ └─ context7 (自動登録) │
140
- └──────────────┬───────────────────────────────┘
141
-
142
- │ spawn_agent({ agents: [...] })
143
-
144
- ┌─────────┼─────────┐
145
- ▼ ▼ ▼
146
- Session Session Session (ephemeral)
147
- Agent A Agent B Agent C
148
- │ │ │
149
- ▲ ▲ ▲
150
- └── ConcurrencyPool ┘
151
- (Semaphore制御)
152
- ```
153
-
154
- ## エージェント構成
155
-
156
- Sisyphus (オーケストレーター) が直接コードを読み、実装はサブエージェントに委任する。
157
-
158
- ### ビルトインデフォルト
45
+ ### Evolve (自己改善)
159
46
 
160
- | Agent | 役割 | デフォルトモデル | モード |
161
- |-------|------|-----------------|--------|
162
- | **sisyphus** | オーケストレーター — 読み込み+分析+計画+委任 | openai-codex/gpt-5.3-codex | primary |
163
- | **oracle** | 設計・デバッグ・アーキテクチャ判断 | openai/gpt-5.2 | subagent |
164
- | **explore** | 高速コードベース偵察 | anthropic/claude-haiku-4-5 | subagent |
165
- | **librarian** | ドキュメント・ベストプラクティス調査 | anthropic/claude-sonnet-4-5 | subagent |
166
- | **metis** | タスク分解・並列実行計画 | anthropic/claude-sonnet-4-5 | subagent |
167
- | **hephaestus** | 自律型実装ワーカー | openai/gpt-5.2 | subagent |
168
- | **momus** | コードレビュー・品質チェック | anthropic/claude-sonnet-4-5 | subagent |
169
- | **atlas** | タスク管理・進捗追跡 | anthropic/claude-sonnet-4-5 | subagent |
170
- | **multimodal-looker** | 画像・スクリーンショット解析 | anthropic/claude-sonnet-4-5 | subagent |
171
- | **scout** | プラグインエコシステム調査・信頼度メタデータ収集 | anthropic/claude-sonnet-4-5 | subagent |
47
+ `evolve` / `self-improve` / `自己改善` / `進化` キーワードで起動する5フェーズの自己改善サイクル。
172
48
 
173
- 全てのモデルは `oh-my-opencode.json` でオーバーライド可能。
49
+ | Phase | 内容 |
50
+ |-------|------|
51
+ | 1. RESEARCH | npm/GitHub でプラグインエコシステムをスキャン |
52
+ | 2. COMPARE | 機能マトリクスで opencode-ultra との差分を可視化 |
53
+ | 3. PROPOSE | 実装レベルの構造化提案 (対象ファイル/関数、問題点、変更内容、効果) + JSONL 出力 |
54
+ | 4. SCORE | `evolve_score` で全提案をスコアリング (Priority x Effort 重み付け) |
55
+ | 5. SAVE | `ledger_save` で結果を永続化 |
174
56
 
175
- ### Sisyphus のツール権限
57
+ 提案は `.opencode/evolve-proposals.jsonl` に JSONL 形式で出力される:
176
58
 
59
+ ```json
60
+ {"title":"機能名","priority":"P0","effort":"Medium","inspiration":"参考プラグイン","current_state":"現状","why":"メリット","how":"対象ファイル:関数名 — 変更内容"}
177
61
  ```
178
- Grep: true, Glob: true, Read: true ← 直接読み込み可能
179
- Write: false, Edit: false, Bash: false ← サブエージェントに委任
180
- ```
181
-
182
- ## Continuity Ledger
183
-
184
- セッション間の文脈を引き継ぐマークダウンドキュメント。`.opencode/ledgers/` に保存される。
185
-
186
- ```typescript
187
- // 保存
188
- ledger_save({ name: "auth-refactor", content: "## Context\n..." })
189
- // → Saved to .opencode/ledgers/auth-refactor.md
190
62
 
191
- // 読み込み (名前指定)
192
- ledger_load({ name: "auth-refactor" })
63
+ `evolve_score` のスコア計算: `priority_weight x effort_weight`
193
64
 
194
- // 読み込み (最新)
195
- ledger_load({})
196
- ```
65
+ | Priority | Weight | Effort | Weight |
66
+ |----------|--------|--------|--------|
67
+ | P0 | 10 | Low | 3 |
68
+ | P1 | 5 | Medium | 2 |
69
+ | P2 | 1 | High | 1 |
197
70
 
198
- ## Fragment Injection
71
+ P0+Low=30 (最優先) / P2+High=1 (最低)
199
72
 
200
- エージェント毎にカスタムプロンプト断片を注入する。
73
+ evolve は**提案のみ**。適用は人間が判断する。
201
74
 
202
- ```jsonc
203
- {
204
- "fragments": {
205
- "hephaestus": [".opencode/fragments/strict-coding.md"],
206
- "sisyphus": [".opencode/fragments/planning-rules.md"]
207
- }
208
- }
209
- ```
210
-
211
- 指定ファイルの内容が該当エージェントの system prompt に追加される。
212
-
213
- ## Per-model Prompt Renderer
75
+ ## エージェント構成
214
76
 
215
- モデルに応じて system prompt のフォーマットを最適化する。
77
+ Sisyphus (オーケストレーター) が読み込み・分析・計画を行い、実装はサブエージェントに委任する。
216
78
 
217
- ```jsonc
218
- {
219
- "prompt_renderer": {
220
- "default": "markdown",
221
- "model_overrides": {
222
- "anthropic/claude-sonnet-4-5": "xml",
223
- "openai/gpt-5.2": "json"
224
- }
225
- }
226
- }
227
- ```
79
+ | Agent | 役割 | モード |
80
+ |-------|------|--------|
81
+ | **sisyphus** | オーケストレーター — 読み込み+分析+計画+委任 | primary |
82
+ | **oracle** | 設計・デバッグ・アーキテクチャ判断 | subagent |
83
+ | **explore** | 高速コードベース偵察 | subagent |
84
+ | **librarian** | ドキュメント・ベストプラクティス調査 | subagent |
85
+ | **metis** | タスク分解・並列実行計画 | subagent |
86
+ | **hephaestus** | 自律型実装ワーカー | subagent |
87
+ | **momus** | コードレビュー・品質チェック | subagent |
88
+ | **atlas** | タスク管理・進捗追跡 | subagent |
89
+ | **multimodal-looker** | 画像・スクリーンショット解析 | subagent |
90
+ | **scout** | プラグインエコシステム調査・信頼度メタデータ収集 | subagent |
228
91
 
229
- | フォーマット | 出力例 |
230
- |-------------|--------|
231
- | `markdown` | そのまま (デフォルト) |
232
- | `xml` | `<section name="Rules">...</section>` |
233
- | `json` | `{"section":"Rules","content":"..."}` |
92
+ 全てのエージェントのモデルは `opencode-ultra.json` でオーバーライド可能。
234
93
 
235
94
  ## キーワード検知
236
95
 
@@ -246,10 +105,12 @@ ledger_load({})
246
105
 
247
106
  ## 設定
248
107
 
249
- 2段階の設定マージ:
108
+ `opencode-ultra.json` (または `.jsonc`) による2段階マージ:
250
109
 
251
- 1. **ユーザー設定**: `~/.config/opencode/oh-my-opencode.json[c]`
252
- 2. **プロジェクト設定**: `<project>/.opencode/oh-my-opencode.json[c]`
110
+ 1. **ユーザー設定**: `~/.config/opencode/opencode-ultra.json[c]`
111
+ 2. **プロジェクト設定**: `<project>/.opencode/opencode-ultra.json[c]`
112
+
113
+ プロジェクト設定がユーザー設定をオーバーライドする。
253
114
 
254
115
  ### 設定スキーマ
255
116
 
@@ -257,24 +118,27 @@ ledger_load({})
257
118
  {
258
119
  // エージェントオーバーライド
259
120
  "agents": {
260
- "sisyphus": { "model": "openai/gpt-5.2" },
121
+ "sisyphus": { "model": "openai/gpt-5.3-codex" },
261
122
  "oracle": { "model": "zai-coding-plan/glm-5" }
262
123
  },
263
124
 
264
- // カテゴリ
125
+ // カテゴリ (spawn_agent の category パラメータでモデル一括切替)
265
126
  "categories": {
266
- "quick": { "model": "openai/gpt-4o-mini" }
127
+ "quick": { "model": "zai-coding-plan/glm-4.7-flash" },
128
+ "deep": { "model": "openai/gpt-5.3-codex", "variant": "medium" }
267
129
  },
268
130
 
269
- // Fragment Injection
131
+ // Fragment Injection (エージェント毎のプロンプト断片)
270
132
  "fragments": {
271
133
  "hephaestus": [".opencode/fragments/strict.md"]
272
134
  },
273
135
 
274
- // Per-model Renderer
136
+ // Per-model Prompt Renderer
275
137
  "prompt_renderer": {
276
138
  "default": "markdown",
277
- "model_overrides": {}
139
+ "model_overrides": {
140
+ "anthropic/claude-sonnet-4-5": "xml"
141
+ }
278
142
  },
279
143
 
280
144
  // 無効化
@@ -283,7 +147,7 @@ ledger_load({})
283
147
  // fragment-injector, prompt-renderer, comment-checker,
284
148
  // token-truncation, todo-enforcer, session-compaction
285
149
  "disabled_tools": [], // spawn_agent, ralph_loop, cancel_ralph, batch_read,
286
- // ledger_save, ledger_load, ast_search, evolve_apply
150
+ // ledger_save, ledger_load, ast_search, evolve_apply, evolve_score
287
151
  "disabled_mcps": [], // context7
288
152
 
289
153
  // Built-in Agent Demotion (default: true)
@@ -293,13 +157,13 @@ ledger_load({})
293
157
  "background_task": {
294
158
  "defaultConcurrency": 3,
295
159
  "providerConcurrency": { "openai": 8 },
296
- "modelConcurrency": { "openai/gpt-5.2": 2 }
160
+ "modelConcurrency": { "openai/gpt-5.3-codex": 2 }
297
161
  },
298
162
 
299
163
  // Safety
300
164
  "safety": {
301
- "maxTotalSpawned": 15, // 同時実行セッション上限
302
- "agentTimeoutMs": 180000 // per-agent タイムアウト (ms)
165
+ "maxTotalSpawned": 15,
166
+ "agentTimeoutMs": 180000
303
167
  },
304
168
 
305
169
  // Token Truncation
@@ -316,41 +180,19 @@ ledger_load({})
316
180
  }
317
181
  ```
318
182
 
319
- ## プロジェクト構成
183
+ ## Continuity Ledger
184
+
185
+ セッション間の文脈を引き継ぐマークダウンドキュメント。`.opencode/ledgers/` に保存される。
320
186
 
321
- ```
322
- opencode-ultra/
323
- ├── src/
324
- │ ├── index.ts # プラグインエントリポイント
325
- │ ├── config.ts # 設定ロード・マージ・バリデーション
326
- │ ├── agents/
327
- │ │ ├── types.ts # AgentDef 型定義
328
- │ │ └── index.ts # ビルトインエージェント + 動的プロンプト生成
329
- │ ├── hooks/
330
- │ │ ├── keyword-detector.ts # ultrawork/search/analyze/think/evolve 検知
331
- │ │ ├── rules-injector.ts # rules.md + ARCHITECTURE.md + CODE_STYLE.md 注入
332
- │ │ ├── fragment-injector.ts # エージェント毎の断片注入
333
- │ │ ├── prompt-renderer.ts # モデル別フォーマット変換
334
- │ │ ├── comment-checker.ts # AI スロップコメント検知
335
- │ │ ├── token-truncation.ts # ツール出力の賢い圧縮
336
- │ │ ├── todo-enforcer.ts # 未完了 TODO 強制継続
337
- │ │ └── session-compaction.ts # セッション圧縮サマリ生成
338
- │ ├── tools/
339
- │ │ ├── spawn-agent.ts # 並列エージェント実行 + 安全制御
340
- │ │ ├── ralph-loop.ts # 自律ループ実行
341
- │ │ ├── batch-read.ts # 複数ファイル並列読み込み
342
- │ │ ├── continuity-ledger.ts # セッション間文脈継続
343
- │ │ ├── ast-search.ts # AST-aware コード検索
344
- │ │ └── evolve-apply.ts # 信頼度スコア評価 + 設定適用
345
- │ ├── concurrency/ # Semaphore + ConcurrencyPool
346
- │ ├── categories/ # ビルトインカテゴリ
347
- │ ├── safety/ # sanitizer + trust-score
348
- │ ├── mcp/ # MCP サーバー登録
349
- │ └── shared/ # ユーティリティ
350
- ├── __test__/ # Bun テスト
351
- ├── package.json
352
- ├── tsconfig.json
353
- └── .gitignore
187
+ ```typescript
188
+ // 保存
189
+ ledger_save({ name: "auth-refactor", content: "## Context\n..." })
190
+
191
+ // 読み込み (名前指定)
192
+ ledger_load({ name: "auth-refactor" })
193
+
194
+ // 読み込み (最新)
195
+ ledger_load({})
354
196
  ```
355
197
 
356
198
  ## ビルド・テスト
package/dist/index.js CHANGED
@@ -29355,6 +29355,20 @@ var OpenCodeUltra = async (ctx) => {
29355
29355
  })?.catch?.((err) => log("Toast failed", { error: err }));
29356
29356
  }
29357
29357
  pendingKeywords.set(input.sessionID, detected);
29358
+ const hasEvolve = detected.some((k) => k.type === "evolve");
29359
+ if (hasEvolve) {
29360
+ const anchor = `
29361
+
29362
+ [EVOLVE MODE ACTIVATED \u2014 MANDATORY TOOL USAGE]
29363
+ You MUST follow the 5-phase evolve workflow injected in the system prompt.
29364
+ Phase 1: RESEARCH \u2014 Use Glob to scan node_modules for OpenCode plugins, or spawn_agent with scout/librarian.
29365
+ Phase 2: COMPARE \u2014 Build a feature matrix (opencode-ultra column = Yes/No/Partial from inventory).
29366
+ Phase 3: PROPOSE \u2014 Write EACH proposal as JSONL to .opencode/evolve-proposals.jsonl using the Write tool.
29367
+ Phase 4: SCORE \u2014 Call evolve_score({ markdown: "## Improvement: ...\\n**Priority**: ...\\n**Effort**: ..." }) for EVERY proposal.
29368
+ Phase 5: SAVE \u2014 Call ledger_save({ name: "evolve-scan-YYYY-MM-DD", content: "..." }).
29369
+ DO NOT skip tools. Text-only output is FORBIDDEN. Every phase requires tool calls.`;
29370
+ output.parts.push({ type: "text", text: anchor });
29371
+ }
29358
29372
  if (hasUltrawork) {
29359
29373
  for (const part of output.parts) {
29360
29374
  if (part.type === "text" && part.text) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-ultra",
3
- "version": "0.7.5",
3
+ "version": "0.7.7",
4
4
  "description": "Lightweight OpenCode 1.2.x plugin — ultrawork mode, multi-agent orchestration, rules injection",
5
5
  "keywords": [
6
6
  "opencode",