opencode-resolve 0.1.12 → 0.1.16

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
@@ -1,345 +1,106 @@
1
- # opencode-resolve — OpenCode용 가벼운 해결사(resolver) 플러그인
1
+ # opencode-resolve — OpenCode용 가벼운 해결사 플러그인
2
2
 
3
- **[English](./README.md) | [한국어](./README.ko.md)**
3
+ **[English](./README.md) | [한국어](./README.ko.md) | [문서 사이트](https://jshsakura.github.io/opencode-resolve/)**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/opencode-resolve.svg)](https://www.npmjs.com/package/opencode-resolve)
6
6
  [![CI](https://github.com/jshsakura/opencode-resolve/actions/workflows/publish.yml/badge.svg)](https://github.com/jshsakura/opencode-resolve/actions/workflows/publish.yml)
7
+ [![GitHub Pages](https://img.shields.io/badge/docs-live-blue?logo=github)](https://jshsakura.github.io/opencode-resolve/)
7
8
  [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
8
9
 
9
- > **opencode-resolve**는 **[OpenCode](https://opencode.ai) 가벼운 해결사(resolver) 플러그인**입니다. OpenCode 세션 _내부_ 에서 동작하며, 하나의 지시를 완성되고 검증된 변경으로 만듭니다 — 이것이 여기서 말하는 _해결(resolve)_ 의 의미입니다.
10
- >
11
- > 독립 실행형 애플리케이션이 아니며, 모델 프로바이더도, 매일 실행하는 별도 CLI도, `opencode.json` 설정을 대체하는 것도 아닙니다. OpenCode 플러그인이며 그 이상도 이하도 아닙니다.
10
+ `opencode-resolve`는 [OpenCode](https://opencode.ai) 작은 고정 역할 해결 루프를 추가하는 플러그인입니다.
12
11
 
13
- **고정 역할(fixed-role) 검증 해결 루프**를 제공합니다 — **resolver**(컨텍스트 효율적 플래너/판정자)와 **coder**(집중된 구현자)가 편집, 검증, 안전한 셸 명령에 대해 저마찰 권한으로 실행됩니다. Resolver는 관련 파일만 검사하고, 가장 작은 패치를 계획하고, 정확한 지시와 함께 coder를 디스패치하며, 검증된 체크포인트를 통해 반복합니다. 반복 실패 시 debugger/architect 회복 가이드를 쓰고, 연속 실패가 누적되면 완료한 척하지 않고 차단 사항을 보고해야 합니다. 내부 전문가 서브에이전트(**explorer**, **reviewer**, **deep-reviewer**)는 OpenCode 네이티브 서브에이전트로 기본 주입됩니다 — resolver가 필요하다고 판단할 때 디스패치되지만, 핵심 경로의 일부가 아니며 사용자 대면 기본 역할이 아닙니다. 역할을 정의할 뿐 모델 프로바이더를 정의하지 않습니다: 에이전트는 사용자가 지정하지 않는 한 OpenCode 기본 모델을 상속합니다.
12
+ - `resolver`는 계획, 디스패치, 검증, 반복을 담당합니다.
13
+ - `coder`는 작은 구현 패치와 대상 검증을 담당합니다.
14
+ - `explorer`, `reviewer`, `deep-reviewer`, `planner`는 필요할 때 resolver가 부르는 내부 서브에이전트입니다.
14
15
 
15
- ```
16
- # AI 코딩 어시스턴트에 붙여넣기만 하면 전체 설정이 자동으로 완료됩니다
17
- Install and configure opencode-resolve by following the instructions here:
18
- https://github.com/jshsakura/opencode-resolve#drop-in-setup-give-to-an-llm
19
- ```
20
-
21
- ---
22
-
23
- ## 이것은 무엇이고, 무엇이 아닌가
24
-
25
- | ✅ 이것은 | ❌ 이것은 아닙니다 |
26
- |---|---|
27
- | `opencode plugin opencode-resolve`로 설치하는 **OpenCode용 가벼운 해결사(resolver) 플러그인** | 독립 실행형 앱 또는 별도 CLI |
28
- | OpenCode에 주입되는 고정 역할(fixed-role) 검증 루프(resolver + coder) | 모델 프로바이더 또는 API 키 관리자 |
29
- | Context7 MCP 자동 등록 훅 | `opencode.json` 설정을 대체하는 것 |
30
- | OpenCode 설정과 함께 위치하는 설정 파일(`resolve.json`) | 코딩할 때마다 직접 실행해야 하는 것 |
31
- | 한 번 설치 후 OpenCode 내부에서 자동으로 실행 | OpenCode 자체를 대체하는 것 |
16
+ 독립 실행형 앱, 모델 프로바이더, API 키 관리자, `opencode.json` 대체물이 아닙니다.
32
17
 
33
- OpenCode가 설치되어 있지 않거나 실행 중이 아니면 opencode-resolve는 아무것도 하지 않습니다.
34
-
35
- ---
18
+ ```sh
19
+ npm install -g opencode-resolve
20
+ opencode plugin opencode-resolve --global --force
21
+ ```
36
22
 
37
23
  ## 목차
38
24
 
39
- - [기능](#기능)
40
- - [AI 기반 설정](#ai-기반-설정)
41
- - [사전 요구 사항](#사전-요구-사항)
42
- - [빠른 시작](#빠른-시작)
43
- - [드롭인 설정 (LLM에 전달)](#드롭인-설정-llm에-전달)
44
- - [기본 동작](#기본-동작)
45
- - [프로젝트 컨텍스트 소스](#프로젝트-컨텍스트-소스)
25
+ - [무엇을 추가하나](#무엇을-추가하나)
26
+ - [설치](#설치)
27
+ - [추천 스킬](#추천-스킬)
46
28
  - [설정](#설정)
47
- - [설정 참조](#설정-참조)
48
- - [자동 승인](#자동-승인)
49
- - [병렬 서브에이전트 제한](#병렬-서브에이전트-제한)
50
- - [업그레이드 및 마이그레이션](#업그레이드-및-마이그레이션)
51
29
  - [모델 설정](#모델-설정)
52
- - [에이전트 참조](#에이전트-참조)
53
- - [선택적 명령어](#선택적-명령어)
54
- - [Context7 통합](#context7-통합)
55
- - [최신 상태 유지](#최신-상태-유지)
56
- - [로컬 개발](#로컬-개발)
57
- - [검증](#검증)
30
+ - [에이전트](#에이전트)
31
+ - [권한](#권한)
32
+ - [Context7](#context7)
33
+ - [프로젝트 컨텍스트](#프로젝트-컨텍스트)
34
+ - [업그레이드](#업그레이드)
35
+ - [개발](#개발)
58
36
  - [릴리스](#릴리스)
59
- - [설계 규칙](#설계-규칙)
60
- - [라이선스](#라이선스)
61
-
62
- ---
63
-
64
- ## 기능
65
-
66
- - **고정 역할(fixed-role) 검증 해결 루프** — `resolver`(컨텍스트 효율적 플래너/판정자) + `coder`(집중된 구현자)
67
- - **기본적으로 컨텍스트 효율적** — 최소 파일 읽기, 가장 작은 패치, 대상 검증, 체크포인트 실행, 반복 수정 실패 시 명시적 차단 사항 보고
68
- - **커밋된 팀 컨텍스트 감지** — `HARNESS.md`, `AGENTS.md`, `.opencode/context`, `.claude/context`, `context/`, Agentic 스타일 `thoughts/`를 감지하고 패턴 문서 목록을 노출해 전체 repo를 프롬프트에 밀어 넣지 않고도 필요한 컨텍스트만 로드
69
- - **OpenCode 네이티브 내부 전문가 서브에이전트** — `reviewer`(검증 갭 감사), `explorer`(코드베이스 스카우트), `deep-reviewer`(위험/보안 리뷰) — 서브에이전트로 기본 주입되지만 핵심 경로가 아님; resolver가 필요할 때만 디스패치
70
- - **저마찰 권한** — 쓰기 에이전트의 edit/webfetch는 허용, bash는 분류기 라우팅으로 안전 명령은 허용하고 위험 명령은 거부하며 알 수 없는 명령은 계속 ask 유지
71
- - **Context7 MCP** — `context7: true` 시 [Context7](https://context7.com) 문서 조회를 자동 등록
72
- - **모델 핀닝** — 이점을 측정한 경우 역할별로 다른 모델 지정 가능; 기본적으로 모든 역할이 OpenCode 기본 모델을 상속
73
- - **소프트 병렬 상한** — `maxParallelSubagents`가 resolver의 coder 동시 실행 수를 제어
74
- - **엄격한 검증** — 알 수 없는 키, 오타, 잘못된 모드, 잘못된 타입은 로드 시 즉시 실패
75
- - **추가적 마이그레이션** — 업그레이드 시 기존 설정을 덮어쓰지 않음
76
- - **`@opencode-ai/plugin` 외의 종속성 없음** — 추가로 설치할 것이 없음
77
-
78
- ---
79
-
80
- ## AI 기반 설정
81
-
82
- > **한 줄. 어떤 AI 코딩 어시스턴트든. 모든 것이 자동으로 구성됩니다.**
83
-
84
- Claude Code, Cursor, Codex, OpenCode, Windsurf, VS Code Copilot, 또는 Gemini CLI에 붙여넣으세요:
85
-
86
- ```
87
- Install and configure opencode-resolve by following the instructions here:
88
- https://github.com/jshsakura/opencode-resolve#drop-in-setup-give-to-an-llm
89
- ```
90
37
 
91
- AI가 자동으로:
38
+ ## 무엇을 추가하나
92
39
 
93
- 1. `opencode plugin opencode-resolve --global --force`로 플러그인을 설치
94
- 2. `opencode-resolve`를 `opencode.json` 플러그인 배열에 병합
95
- 3. 동작하는 설정으로 `resolve.json` 생성
96
- 4. OpenCode 재시작 안내
40
+ - 작은 패치와 검증 증거를 중시하는 `resolver -> coder` 루프
41
+ - 코드베이스 탐색과 리뷰 갭 점검을 위한 읽기 전용 서브에이전트
42
+ - 선택적 명령어: `/resolve`, `/resolve-code`, `/resolve-review`
43
+ - 선택적 Context7 MCP 자동 등록
44
+ - 엄격한 설정 검증: 알 수 없는 키, 잘못된 모드, 잘못된 에이전트 이름, 잘못된 타입은 즉시 실패
45
+ - 보수적 마이그레이션: 기존 값은 동의 없이 덮어쓰지 않음
97
46
 
98
- 수동 설정 편집이 필요 없습니다. macOS, Linux, Windows에서 작동합니다.
99
-
100
- > 수동 설정은 아래 [사전 요구 사항](#사전-요구-사항)과 [빠른 시작](#빠른-시작)을 참조하세요.
101
-
102
- ---
103
-
104
- ## 사전 요구 사항
105
-
106
- ### 1. OpenCode
107
-
108
- opencode-resolve는 **OpenCode 플러그인**입니다. [OpenCode](https://opencode.ai)가 설치되어 실행 중이어야 합니다.
109
-
110
- 확인:
111
-
112
- ```sh
113
- opencode --version
114
- ```
115
-
116
- ### 2. Node.js ≥ 20
117
-
118
- 플러그인과 OpenCode 자체는 Node.js 20 이상이 필요합니다.
119
-
120
- 확인:
121
-
122
- ```sh
123
- node --version # v20.x 이상이어야 함
124
- ```
125
-
126
- ### 3. 설정된 모델 프로바이더
127
-
128
- OpenCode는 `~/.config/opencode/opencode.json`에 유효한 API 키와 함께 최소 하나의 모델 프로바이더가 설정되어야 합니다. opencode-resolve 에이전트는 핀닝하지 않는 한 기본 모델을 상속합니다.
129
-
130
- 최소 프로바이더 설정 예:
47
+ 기본 활성 에이전트:
131
48
 
132
49
  ```json
133
- {
134
- "model": "openai/gpt-4o",
135
- "provider": {
136
- "openai": {
137
- "name": "OpenAI"
138
- }
139
- }
140
- }
50
+ ["coder", "resolver", "explorer", "reviewer", "deep-reviewer", "planner"]
141
51
  ```
142
52
 
143
- > 플러그인 자체에는 추가 API 키가 필요 없습니다. Context7은 플러그인이 자동으로 등록합니다. GLM/ZAI 사용자의 경우 postinstall이 로컬 ZAI MCP 서버 부트스트랩을 추가할 수 있지만, API 키를 `opencode.json`에 복사하지 않습니다. 해당 MCP 서버가 키를 요구하면 셸에서 `Z_AI_API_KEY`를 export 하세요.
53
+ ## 설치
144
54
 
145
- ---
55
+ ### 요구 사항
146
56
 
147
- ## 빠른 시작
57
+ - OpenCode 실행 가능: `opencode --version`
58
+ - Node.js 20 이상: `node --version`
59
+ - `~/.config/opencode/opencode.json`에 최소 하나의 OpenCode 모델 프로바이더 설정
148
60
 
149
- ### npm에서 설치
61
+ ### 설치
150
62
 
151
63
  ```sh
152
64
  npm install -g opencode-resolve
153
- ```
154
-
155
- `postinstall` 스크립트가 자동으로:
156
-
157
- 1. `opencode-resolve`를 `~/.config/opencode/opencode.json`의 `plugin` 배열에 추가 (이미 없는 경우).
158
- 2. 파일이 존재하지 않는 경우, 현재 모델 프로바이더에 맞게 적응된 `~/.config/opencode/resolve.json`을 생성:
159
- - **인터랙티브 터미널** → 항상 `mix` / `gpt` / `glm`을 묻고, `bronze` / `silver` / `gold` 3티어 모델을 고르게 합니다. `mix`에서는 전용 `gpt`, `glm` primary 에이전트를 켤지도 묻습니다.
160
- - **비대화형 설치** → opencode.json에서 프로바이더를 자동 감지하여 모델 적응 프리셋을 작성합니다. `resolver`, `gpt`, `glm` primary 경로를 활성화합니다.
161
- - **GLM/ZAI 모델 감지** → 비밀값 없는 로컬 ZAI MCP 부트스트랩은 계속 추가합니다.
162
-
163
- 기존 `resolve.json` 파일은 **동의 없이 덮어쓰지 않습니다**. 재설치 시 인터랙티브 환경이면 기존 파일을 업데이트할지, 백업 후 fresh setup을 다시 돌릴지 묻습니다. 비대화형 자동화에서는 `OPENCODE_RESOLVE_REINSTALL=fresh` 또는 `OPENCODE_RESOLVE_REINSTALL=update`를 설정하세요.
164
-
165
- 자동 등록을 건너뛰려면:
166
-
167
- ```sh
168
- OPENCODE_RESOLVE_SKIP_POSTINSTALL=1 npm install -g opencode-resolve
169
- ```
170
-
171
- ### 플러그인 캐시 새로고침
172
-
173
- > **중요 — OpenCode가 플러그인을 자체적으로 캐시합니다.** OpenCode는 전역 설치된 npm 패키지를 직접 사용하지 않습니다. `~/.cache/opencode/packages/`에 자체 캐시를 유지합니다. 최초 설치 후 (또는 향후 업그레이드 시) 캐시를 새로고침하세요:
174
-
175
- ```sh
176
65
  opencode plugin opencode-resolve --global --force
177
- ```
178
-
179
- 그래도 OpenCode가 계속 예전 패키지를 로드하면, OpenCode 플러그인 캐시 항목만 지우고 다시 설치하세요. 이 절차는 `~/.config/opencode/resolve.json`을 삭제하지 않습니다.
180
-
181
- Linux/macOS:
182
-
183
- ```sh
184
- export OPENCODE_CACHE_ROOT="${XDG_CACHE_HOME:-$HOME/.cache}/opencode"
185
- rm -rf "$OPENCODE_CACHE_ROOT/packages/opencode-resolve@latest"
186
- opencode plugin opencode-resolve@latest --global --force
187
- node -e "console.log(require(process.env.OPENCODE_CACHE_ROOT + '/packages/opencode-resolve@latest/node_modules/opencode-resolve/package.json').version)"
188
- ```
189
-
190
- Windows PowerShell:
191
-
192
- ```powershell
193
- $OpenCodeCacheRoot = if ($env:XDG_CACHE_HOME) { Join-Path $env:XDG_CACHE_HOME "opencode" } else { Join-Path $env:LOCALAPPDATA "opencode" }
194
- $PluginCache = Join-Path $OpenCodeCacheRoot "packages\opencode-resolve@latest"
195
- Remove-Item -Recurse -Force $PluginCache -ErrorAction SilentlyContinue
196
- opencode plugin opencode-resolve@latest --global --force
197
- $Pkg = Join-Path $PluginCache "node_modules\opencode-resolve\package.json"
198
- node -e "console.log(require(process.argv[1]).version)" $Pkg
199
- ```
200
-
201
- 캐시 새로고침 후 OpenCode를 재시작하세요.
202
-
203
- ### 수동 대안
204
-
205
- `postinstall`이 플러그인을 등록하지 않았다면, `~/.config/opencode/opencode.json`에 직접 추가:
206
-
207
- ```json
208
- {
209
- "plugin": ["opencode-resolve"]
210
- }
211
- ```
212
-
213
- ### OpenCode 재시작
214
-
215
- ```sh
216
66
  opencode
217
67
  ```
218
68
 
219
- 사용자 대면 resolve 에이전트인 `resolver`가 사용 가능한지 확인합니다. `coder`는 resolver가 디스패치하는 서브에이전트로 활성화되므로 primary picker에는 보이지 않을 수 있습니다.
69
+ npm `postinstall`이 `~/.config/opencode/opencode.json`에 플러그인을 등록하고, 없을 때만 `~/.config/opencode/resolve.json`을 만들고, 기존 모델 핀을 보존하며 (`--reset-config`로 명시 초기화), `~/.cache/opencode/packages/` OpenCode 플러그인 캐시를 새로고침합니다.
220
70
 
221
- ---
71
+ ### 다시 셋업하기
222
72
 
223
- ## 드롭인 설정 (LLM에 전달)
73
+ 설치 이후 언제든 `opencode-resolve setup` CLI로 다시 실행할 수 있습니다.
224
74
 
225
- 아래 블록을 능력 있는 LLM(Claude Code, Cursor, Codex 등)에 _"이 머신에 opencode-resolve를 설정해줘"_ 지시와 함께 전달하세요. LLM은 **인터랙티브하게** 설치를 진행해야 합니다 — 이미 설정된 provider와 model을 발견한 다음, 어느 것을 역할에 핀닝할지 사용자에게 직접 물어봅니다. 추측 금지, 임의 모델 ID 금지.
75
+ | 명령 | 언제 사용 |
76
+ | --- | --- |
77
+ | `opencode-resolve setup --fresh` | `resolve.json` 재생성, 기존 모델 핀 유지 |
78
+ | `opencode-resolve setup --reset-config` | `resolve.json` 재생성 + 모델 핀 초기화 |
79
+ | `opencode-resolve setup --models` | 모델 핀만 다시 감지 |
80
+ | `opencode-resolve setup --force-cache` | OpenCode 플러그인 캐시만 새로고침 |
226
81
 
227
- > **LLM에게:** 아래 "사용자에게 질문" 단계는 모두 실제 질문입니다 — 사용자의 답변을 기다린 뒤에만 진행하세요. 응답 없이 기본값으로 넘어가지 마세요. 사용자의 `opencode.json`(또는 선언된 `provider.*` 레지스트리)에 없는 모델 ID는 절대 만들지 마세요.
228
-
229
- ### 1단계 — 설치 및 캐시 준비
82
+ 자동 설정을 건너뛰려면:
230
83
 
231
84
  ```sh
232
- opencode plugin opencode-resolve --global --force
85
+ OPENCODE_RESOLVE_SKIP_POSTINSTALL=1 npm install -g opencode-resolve
233
86
  ```
234
87
 
235
- 플러그인을 다운로드하고, OpenCode 패키지 캐시(`~/.cache/opencode/packages/`)에 설치하며, 사용 가능하게 만듭니다.
88
+ ### 선택적 companion 플러그인
89
+
90
+ - `@tarquinen/opencode-dcp@latest` — 긴 루프에서 오래된 tool output을 줄여 토큰 비용을 낮춥니다.
91
+ - `@slkiser/opencode-quota@latest` — 컨텍스트를 오염시키지 않고 토큰/quota 사용량을 보여줍니다.
236
92
 
237
- ### 2단계 — `~/.config/opencode/opencode.json`에 플러그인 등록
93
+ ### 수동 설정
238
94
 
239
- `plugin` 배열에 문자열 `"opencode-resolve"`를 추가합니다. **여기서는 인라인 튜플 형태를 쓰지 마세요** — 항목을 단순 문자열로 두어 모든 역할/모델 설정이 `resolve.json`(3단계)에서 관리되도록 합니다. 설정 이원화로 인한 디버깅 부담을 막습니다.
95
+ `~/.config/opencode/opencode.json`에 플러그인을 추가합니다.
240
96
 
241
97
  ```json
242
98
  {
243
- "$schema": "https://opencode.ai/config.json",
244
- "model": "<사용자-기본-모델-id>",
245
99
  "plugin": ["opencode-resolve"]
246
100
  }
247
101
  ```
248
102
 
249
- > 이미 다른 플러그인이 있다면, 기존 배열에 `"opencode-resolve"`를 **추가**하세요. 기존 설정을 **덮어쓰지 마세요**.
250
-
251
- #### 2b. 권장 companion 플러그인 제안 (2개)
252
-
253
- 모델 선택으로 넘어가기 전에, **독립적인** 두 companion 플러그인을 각각 한 번씩 물어봅니다 — 둘 다 권장 기본값. 별개의 OpenCode 플러그인이라 필수는 아니지만 opencode-resolve와 궁합이 좋습니다.
254
-
255
- **Companion 1 — `@tarquinen/opencode-dcp` (Dynamic Context Pruning)**
256
-
257
- > _opencode-resolve는 **`@tarquinen/opencode-dcp`** 와 궁합이 좋아요 — obsolete tool output을 가지치기해서 긴 resolver 루프의 토큰 비용을 줄입니다. 설치할까요? (권장)_
258
-
259
- **Companion 2 — `@slkiser/opencode-quota` (사용량/quota 추적)**
260
-
261
- > _그리고 **`@slkiser/opencode-quota`** — 컨텍스트 윈도우를 오염시키지 않고 실시간 토큰/quota 사용량을 보여줍니다. GLM coding-plan, OpenAI Plus/Pro, Qwen 등 지원. 내 사용량/잔여 quota 확인용으로 유용. 설치할까요? (권장)_
262
-
263
- 사용자가 **예** (각 질문마다):
264
-
265
- 1. `opencode plugin <package>@latest --global --force` 실행 (캐시 priming).
266
- 2. `~/.config/opencode/opencode.json`의 `plugin` 배열에 `"<package>@latest"` 추가 — 이미 있으면 스킵.
267
-
268
- `<package>`는 `@tarquinen/opencode-dcp` 또는 `@slkiser/opencode-quota`.
269
-
270
- 각 **아니오**: 그 항목 스킵 — `opencode.json`을 그것 때문에 수정하지 마세요. 어느 쪽이든 3단계로 진행.
271
-
272
- > `context7` MCP는 `resolve.json`에서 `context7: true`(기본값)이면 opencode-resolve가 런타임에 자동 등록합니다. 별도 질문 불필요.
273
-
274
- ### 3단계 — 모델을 인터랙티브하게 고른 뒤 `~/.config/opencode/resolve.json` 작성
275
-
276
- 여기서 LLM이 **짧은 Q&A를 주도**합니다. 목표: 사용자가 자신의 설정에서 직접 고른 모델 ID로 `resolve.json`을 마무리하는 것.
277
-
278
- #### 3a. 사용자의 설치된 provider와 model 발견
279
-
280
- `~/.config/opencode/opencode.json`을 읽고 후보 맵을 만듭니다:
281
-
282
- | 출처 | 수집할 내용 |
283
- |---|---|
284
- | `provider.*` 키 | 설정된 각 provider (예: `zai`, `openai`, `anthropic`). |
285
- | `provider.<key>.models.*` 키 | 사용자가 해당 provider 아래 선언한 모델 키들. |
286
- | 최상위 `model` | `/` 앞 prefix가 `provider.*`에 없다면, 묵시적 후보로 추가 (예: `zai-coding-plan/glm-5.1`에서 `zai-coding-plan`). |
287
- | `agent.*.model` | 에이전트별 override — 그 provider/model 쌍도 후보에 추가. |
288
-
289
- provider가 **하나도 설정되지 않은 경우** 진행을 멈추고, `opencode.json`에 유효한 API 키를 가진 provider를 먼저 추가하라고 사용자에게 안내하세요 — opencode-resolve는 존재하지 않는 모델을 선택할 수 없습니다.
290
-
291
- #### 3b. 사용자에게 질문: 어떤 provider?
292
-
293
- 후보 리스트를 출력하고 묻습니다. 예시 멘트:
294
-
295
- > _OpenCode 설정에서 다음 provider들을 찾았어요. opencode-resolve 역할에 어느 걸 쓸까요?_
296
- >
297
- > 1. `zai-coding-plan` — 모델: `glm-5.1`, `glm-4.7-flash`
298
- > 2. `openai` — 모델: `gpt-4o`, `gpt-4o-mini`, `o1`, `o1-mini`, `o3-mini`, `gpt-5.5`
299
- > 3. _기타 (명시적인 `provider/model` ID 직접 입력)_
300
-
301
- 후보 provider가 정확히 하나면 질문을 건너뛰고 사용합니다.
302
-
303
- #### 3c. 사용자에게 질문: 단일 / 2단계 / 3단계?
304
-
305
- 기본 권장은 **C (3단계, 브론즈/실버/골드)**. opencode-resolve는 질적으로 다른 세 가지 작업(read-only 스카웃 → write/patch → reason/judge)을 가지며, 이를 3단계로 매핑하는 게 2단계보다 역할별 비용을 더 정확히 반영합니다. 사용자가 모델 두 개만 있으면 B로 fallback, 하나뿐이면 A.
306
-
307
- > _권장: **3단계** — `explorer`에 가벼운 스카웃, `coder`에 중간 구현 모델, `resolver`/`reviewer`/`deep-reviewer`/`planner`에 강한 reasoner. 선택:_
308
- >
309
- > **C. 3단계 — 브론즈(스카웃) + 실버(코더) + 골드(추론) — 권장**
310
- > B. 2단계 — fast + strong (모델 두 개만 있을 때)
311
- > A. 모든 역할에 단일 모델 (모델 하나뿐이거나 최대한 단순한 게 필요한 경우만)
312
-
313
- 사용자가 그냥 엔터를 누르거나 "권장"이라고 답하면 C로. 모델 부족 시에만 fallback. **same-provider 분할도 완전 유효** — 예: `openai/gpt-4o-mini` / `openai/gpt-5.3-codex` / `openai/o4-mini`, 또는 `zai/glm-4.7-flash` / `zai-coding-plan/glm-5.1` / `zai/glm-5`.
314
-
315
- #### 3d. 사용자에게 질문: 어떤 모델?
316
-
317
- 3b에서 고른 provider의 모델만 보여주세요.
318
-
319
- - **단일 (A)** 의 경우 한 번만 질문:
320
- > _모든 역할이 사용할 모델은 무엇인가요?_ → 선택한 provider의 모델 목록 제시.
321
- - **분할 (B)** 의 경우 순서대로 두 번 질문:
322
- > _`coder`와 `explorer`용 **fast** 모델을 고르세요:_ → 모델 목록.
323
- >
324
- > _`resolver`, `reviewer`, `deep-reviewer`용 **strong** 모델을 고르세요:_ → 모델 목록.
325
-
326
- 파일을 쓰기 전에 각 선택을 사용자에게 다시 확인시키세요. 예:
327
-
328
- > _`coder`와 `explorer`를 `zai-coding-plan/glm-5.1`로, `resolver`/`reviewer`/`deep-reviewer`를 `openai/gpt-5.5`로 핀닝합니다. 진행할까요?_
329
-
330
- #### 3d-bis. 사용자가 명시적으로 hard cap 원할 때만 `maxParallelSubagents` 설정
331
-
332
- 기본 흐름은 `maxParallelSubagents`를 `resolve.json`에 **쓰지 않습니다**. resolver prompt에 soft 가이드라인이 들어있어요 — 진짜 독립적인 작업이면 coder fan out, rate-limit 에러 보이면 backoff, explorer 무제한, reviewer/deep-reviewer/planner는 본질적으로 singleton. oh-my-openagent (per-model semaphore, 사실상 default 무제한) 와 OpenCode core (built-in concurrency 룰 없음) 의 처리와 동일한 결, rate limit을 이미 인지한 모델을 과제약하지 않음.
333
-
334
- `maxParallelSubagents`는 사용자가 hard cap을 명시적으로 원할 때만 물어보세요. 흔한 케이스: GLM coding-plan 사용자가 "burst 절대 안 됨" 보장 원할 때. 권장 멘트:
335
-
336
- > _(optional, 관련된 경우만)_ _`coder` 모델이 GLM이네요 — coding-plan은 burst 시 throttle 걸립니다. 엄격한 직렬 coder 디스패치를 위해 `maxParallelSubagents: 1`로 핀닝할까요?_
337
-
338
- 그 외엔 필드 자체를 생략.
339
-
340
- #### 3e. `~/.config/opencode/resolve.json` 작성
341
-
342
- **3단계 (C, 권장)** — `bronze`/`silver`/`gold` alias 사용:
103
+ `~/.config/opencode/resolve.json`을 만듭니다.
343
104
 
344
105
  ```json
345
106
  {
@@ -347,679 +108,284 @@ provider가 **하나도 설정되지 않은 경우** 진행을 멈추고, `openc
347
108
  "preserveNative": true,
348
109
  "context7": true,
349
110
  "commands": false,
350
- "models": {
351
- "bronze": "<provider>/<스카웃-모델>",
352
- "silver": "<provider>/<코더-모델>",
353
- "gold": "<provider>/<추론-모델>",
354
- "explorer": "bronze",
355
- "coder": "silver",
356
- "resolver": "gold",
357
- "reviewer": "gold",
358
- "deep-reviewer": "gold",
359
- "planner": "gold"
360
- },
111
+ "models": {},
361
112
  "agents": {
362
- "coder": { "enabled": true, "mode": "subagent" },
363
- "resolver": { "enabled": true },
364
- "explorer": { "enabled": true, "mode": "subagent" },
365
- "reviewer": { "enabled": true, "mode": "subagent" },
366
- "deep-reviewer": { "enabled": true, "mode": "subagent" },
367
- "planner": { "enabled": true, "mode": "subagent" },
368
- "architect": { "enabled": false },
369
- "gpt-coder": { "enabled": false },
370
- "debugger": { "enabled": false },
371
- "researcher": { "enabled": false }
372
- },
373
- "autoApprove": true,
374
- "autoUpdate": true
113
+ "coder": { "enabled": true, "mode": "subagent" },
114
+ "resolver": { "enabled": true },
115
+ "explorer": { "enabled": true, "mode": "subagent" },
116
+ "reviewer": { "enabled": true, "mode": "subagent" },
117
+ "deep-reviewer": { "enabled": true, "mode": "subagent" },
118
+ "planner": { "enabled": true, "mode": "subagent" }
119
+ }
375
120
  }
376
121
  ```
377
122
 
378
- **2단계 (B)** 모델이 두 개뿐이면 bronze와 silver 통합:
123
+ 캐시를 새로고침하고 OpenCode를 재시작합니다.
379
124
 
380
- ```json
381
- "models": {
382
- "silver": "<provider>/<코더-모델>",
383
- "gold": "<provider>/<추론-모델>",
384
- "explorer": "silver",
385
- "coder": "silver",
386
- "resolver": "gold",
387
- "reviewer": "gold",
388
- "deep-reviewer": "gold",
389
- "planner": "gold"
390
- }
125
+ ```sh
126
+ opencode plugin opencode-resolve --global --force
127
+ opencode
391
128
  ```
392
129
 
393
- **단일 (A)** 모든 역할이 단일 모델:
130
+ OpenCode가 계속 오래된 플러그인을 로드하면:
394
131
 
395
- ```json
396
- "models": {
397
- "gold": "<provider>/<단일-모델>",
398
- "explorer": "gold",
399
- "coder": "gold",
400
- "resolver": "gold",
401
- "reviewer": "gold",
402
- "deep-reviewer": "gold",
403
- "planner": "gold"
404
- }
132
+ ```sh
133
+ export OPENCODE_CACHE_ROOT="${XDG_CACHE_HOME:-$HOME/.cache}/opencode"
134
+ rm -rf "$OPENCODE_CACHE_ROOT/packages/opencode-resolve@latest"
135
+ opencode plugin opencode-resolve@latest --global --force
405
136
  ```
406
137
 
407
- `<provider>/<모델>` 플레이스홀더는 모두 사용자가 고른 **정확한** ID로 교체. **`maxParallelSubagents`는 사용자가 명시적으로 hard cap 요청한 경우에만 추가** (3d-bis 참고).
408
-
409
- `<provider>/<모델>` 플레이스홀더는 모두 사용자가 3b/3d에서 고른 **정확한** ID 문자열로 교체 — 임의 생성 금지, 자동완성 금지, 버전 드리프트 금지. 고른 모델을 `provider/model` 문자열로 매핑할 수 없으면 추측하지 말고 사용자에게 다시 물어보세요.
410
-
411
- > 활성 에이전트마다 명시적인 `enabled: true`를 두어 파일이 자체 문서화됩니다. `enabled` 배열이 여전히 권위 있으며, 에이전트별 플래그는 사람이 파일을 읽을 때의 모호함만 제거합니다.
138
+ ## 추천 스킬
412
139
 
413
- > `resolve.json`이 이미 존재하면 **조용히 덮어쓰지 마세요**. 기존 내용을 먼저 사용자에게 보여주고, 무엇이 바뀔지 요약한 다음, 덮어쓸지 / 병합할지 / 중단할지 물어보세요.
140
+ 넓은 OpenCode 환경을 원하면 [awesome-opencode-skills](https://github.com/jshsakura/awesome-opencode-skills)를 같이 사용해 보세요. 개발, 인프라, 보안, 데이터, 문서화 특화 작업용 OpenCode Skills 컬렉션을 설치합니다.
414
141
 
415
- ### 4단계 — OpenCode 재시작 및 검증
416
-
417
- OpenCode를 닫았다가 다시 연 후, 설치가 잘 됐는지 확인하세요:
142
+ macOS / Linux:
418
143
 
419
144
  ```sh
420
- opencode run "list available agents"
145
+ curl -sL https://raw.githubusercontent.com/jshsakura/awesome-opencode-skills/main/install.sh | bash
421
146
  ```
422
147
 
423
- 출력에 `resolver`와 `coder`가(활성화 시 `reviewer`도) **반드시** 포함되어야 합니다. 명시적으로 점검할 실패 모드 두 가지:
424
-
425
- | 증상 | 원인 | 조치 |
426
- |---|---|---|
427
- | OpenCode 내장 `explore` / `general`만 나옴 | 플러그인이 로드되지 않음 | `opencode plugin opencode-resolve --global --force` 재실행; `opencode.json`의 `plugin` 배열에 `"opencode-resolve"`가 문자열로 들어있는지 확인. |
428
- | 에이전트는 보이는데 호출 시 "model not found" | `models`에 핀닝된 ID가 실제로 없음 | `resolve.json`을 다시 열어, 해당 ID를 사용자가 실제 보유한 ID로 교체 후 재시작. |
429
- | 분할(B)을 골랐는데 한 단계만 작동 | `models` 블록에 `fast` 또는 `strong` 누락 | 3단계의 3d부터 다시 실행. |
430
-
431
- 내부 전문가 서브에이전트(`coder`, `explorer`, `reviewer`, `deep-reviewer`, `planner`)는 서브에이전트 전용이므로 기본 picker에는 나타나지 않습니다 — `resolver`가 기본 사용자 대면 resolve 에이전트입니다.
432
-
433
- ### 이 템플릿을 사용하는 이유
434
-
435
- | 설정 | 이유 |
436
- |---|---|
437
- | `enabled: ["coder", "resolver", "explorer", "reviewer", "deep-reviewer", "planner"]` | 고정 핵심 경로(resolver→coder) + OpenCode 네이티브 내부 전문가 서브에이전트 기본 주입 |
438
- | `autoApprove: true` | 하위 호환/가독성 플래그. 실제 저마찰 동작은 기본 권한과 `permission.ask` bash 분류기가 담당 |
439
- | 기본적으로 `maxParallelSubagents` 미설정 | resolver는 soft fan-out 가이드를 유지; GLM profile은 토큰 효율 프롬프트를 쓰지만 사용자가 설정하지 않는 한 hard concurrency cap을 걸지 않음 |
440
- | `agents.coder.mode = "subagent"` | Coder는 사용자 대면 기본 역할이 아니라 고정 resolver→coder 경로에 머무름 |
441
- | `agents.{explorer,reviewer,deep-reviewer}.mode = "subagent"` | 내부 전문가는 서브에이전트 전용 — 사용자 대면 기본 역할이 아님 |
442
- | `context7: true` | 플러그인이 Context7 MCP를 자동 등록 — 수동 MCP 설정 불필요 |
443
- | `models` 별칭 | 기본적으로 비어있음 — 모든 역할이 OpenCode 기본 모델을 상속. 이점을 측정한 경우에만 역할별 모델 핀닝 |
444
- | 다른 에이전트 비활성화 | `architect`, `gpt-coder`, `debugger`, `researcher`는 기본 꺼짐. 필요 시 활성화 |
445
-
446
- ### resolver를 호출하면 어떤 일이 일어나는가
447
-
448
- 1. **분류** — Resolver가 작업을 quick, normal, deep, risky로 분류합니다.
449
- 2. **검사** — 로컬 도구로 관련 파일만 읽습니다. 광범위한 탐색 없음.
450
- 3. **사소한 작업** — Resolver가 직접 작은 편집을 적용합니다. 서브에이전트 불필요.
451
- 4. **구현** — 정확한 파일 경로와 집중된 지시와 함께 `coder`를 디스패치합니다.
452
- 5. **검증** — 가장 저렴한 의미 있는 검증을 먼저 실행합니다 (대상 테스트, 타입 체크, 린트).
453
- 6. **회복** — 문제가 남아있으면, 근본 원인을 진단하도록 `debugger`를 쓰거나 집중적인 수정과 함께 `coder`를 다시 디스패치합니다. 연속 실패가 누적되면 완료를 주장하지 않고 차단 사항을 보고합니다.
454
- 7. **보고** — 변경 사항, 검증 결과, 남은 차단 사항의 간결한 증거 요약을 반환합니다.
455
- 8. **내부 전문가** — 필요 시: `explorer`(범위가 불명확할 때), `reviewer`(비사소한 변경에 검증 갭), `deep-reviewer`(위험/보안/고영향도만). 서브에이전트로 기본 사용 가능하지만 핵심 경로가 아님.
456
-
457
- ---
458
-
459
- ## 기본 동작
460
-
461
- | 항목 | 기본값 |
462
- |---|---|
463
- | 활성화된 에이전트 | `coder`, `resolver`, `explorer`, `reviewer`, `deep-reviewer`, `planner` |
464
- | 핵심 경로 | `resolver` → `coder` (고정 역할 검증 루프) |
465
- | 내부 서브에이전트 | `explorer`, `reviewer`, `deep-reviewer` (서브에이전트 전용, 필요 시 디스패치) |
466
- | 새 작업의 기본 에이전트 | `resolver` (`mode: "all"`) |
467
- | 에이전트 모델 | 최상위 OpenCode `model` 상속 |
468
- | 네이티브 `plan` / `build` | 그대로 보존 |
469
- | 프로젝트 컨텍스트 소스 | `HARNESS.md`, `AGENTS.md`, `CLAUDE.md`, `CONVENTIONS.md`, `.opencode/context`, `.claude/context`, `context/`, `thoughts/` |
470
- | Context7 MCP 프리셋 | `context7: true` 시 자동 추가 |
471
- | 선택적 명령어 | 비활성화 |
472
- | `autoApprove` | `true` (하위 호환/가독성 플래그; bash 라우팅은 permission hook이 처리) |
473
- | 반복 실패 동작 | 진단, 다른 수정으로 재시도, 실패가 많으면 architect로 전략 전환, 그래도 막히면 완료 주장 대신 차단 사항 보고 |
474
-
475
- ---
476
-
477
- ## 프로젝트 컨텍스트 소스
478
-
479
- opencode-resolve는 전체 저장소를 프롬프트에 밀어 넣지 않고도 커밋된 프로젝트 지식을 발견할 수 있습니다. Resolver는 사용 가능한 소스 목록을 보고, 현재 작업과 관련된 문서만 읽어야 합니다.
480
-
481
- 감지하는 최상위 지식 파일:
482
-
483
- | 소스 | 용도 |
484
- |---|---|
485
- | `HARNESS.md` | 빌드, 검증, 인프라, 배포, 프로젝트 함정 |
486
- | `AGENTS.md` | 에이전트 동작, 디스패치 규칙, 리뷰 기대치, 로컬 워크플로우 |
487
- | `CLAUDE.md` | 다른 AI 코딩 도구에서 쓰던 기존 가이드 |
488
- | `CONVENTIONS.md` | 코드 스타일, 네이밍, 아키텍처, 저장소 규칙 |
489
-
490
- 감지하는 컨텍스트 디렉터리:
491
-
492
- | 소스 | 동작 |
493
- |---|---|
494
- | `.opencode/context/` | OpenCode/OAC 스타일 팀 패턴 문서 |
495
- | `.claude/context/` | Claude 스타일 공유 컨텍스트 문서 |
496
- | `context/` | 일반 프로젝트 컨텍스트 문서 |
497
- | `thoughts/` | Agentic 스타일 영속 지식: architecture, tickets, research, plans, reviews |
498
-
499
- 컨텍스트 디렉터리에서는 `.md`, `.mdx`, `.txt`, `.json`, `.jsonc`, `.yaml`, `.yml` 파일을 제한된 깊이와 개수 안에서 목록화합니다. `thoughts/archive/`는 의도적으로 제외합니다. 보관 문서는 오래됐거나 오해를 만들 수 있기 때문입니다.
500
-
501
- 로컬 런타임 상태는 git에서 제외합니다:
148
+ Windows PowerShell:
502
149
 
503
- ```text
504
- .opencode/resolve-state.json
505
- .opencode/*.local.json
150
+ ```powershell
151
+ irm https://raw.githubusercontent.com/jshsakura/awesome-opencode-skills/main/install.ps1 | iex
506
152
  ```
507
153
 
508
- 반대로 `.opencode/context/`와 `thoughts/` 같은 커밋된 컨텍스트는 ignore하지 않습니다.
509
-
510
- ---
511
-
512
154
  ## 설정
513
155
 
514
- 플러그인은 찾은번째 설정 파일을 읽습니다:
515
-
516
- | 우선순위 | 경로 |
517
- |---:|---|
518
- | 1 | `.opencode/resolve.json` (프로젝트) |
519
- | 2 | `opencode-resolve.json` (프로젝트) |
520
- | 3 | `~/.config/opencode/resolve.json` |
521
- | 4 | `~/.config/opencode/opencode-resolve.json` |
522
-
523
- `opencode.json`의 인라인 플러그인 옵션이 파일 설정을 재정의합니다.
524
-
525
- 설정 우선순위:
526
-
527
- ```text
528
- 기본 제공 기본값 → 찾은 첫 번째 설정 파일 → 인라인 플러그인 옵션
529
- ```
530
-
531
- 최소 설정 (기본값과 동일):
156
+ 플러그인은 아래 파일 중 번째로 발견한 설정을 읽습니다.
532
157
 
533
- ```json
534
- {
535
- "enabled": ["coder", "resolver", "explorer", "reviewer", "deep-reviewer", "planner"],
536
- "autoApprove": true,
537
- "context7": true,
538
- "commands": false
539
- }
540
- ```
158
+ 1. `.opencode/resolve.json`
159
+ 2. `opencode-resolve.json`
160
+ 3. `~/.config/opencode/resolve.json`
161
+ 4. `~/.config/opencode/opencode-resolve.json`
541
162
 
542
- `opencode.json` 내의 인라인 형식:
163
+ `opencode.json`의 인라인 플러그인 옵션은 파일 설정보다 우선합니다. 사용자 지정 경로도 가능합니다.
543
164
 
544
165
  ```json
545
166
  {
546
167
  "plugin": [
547
168
  [
548
169
  "opencode-resolve",
549
- {
550
- "enabled": ["coder", "resolver", "explorer", "reviewer", "deep-reviewer", "planner"],
551
- "autoApprove": true,
552
- "context7": true,
553
- "commands": false
554
- }
170
+ { "config": ".opencode/resolve.json" }
555
171
  ]
556
172
  ]
557
173
  }
558
174
  ```
559
175
 
560
- 엄격한 검증은 알 수 없는 에이전트 이름, 잘못된 키, 잘못된 모드, 잘못된 권한 값, 잘못된 값 타입을 거부합니다 — 오타는 즉시 실패합니다.
561
-
562
- ---
563
-
564
- ## 설정 참조
565
-
566
- 모든 허용되는 최상위 옵션:
567
-
568
- | 키 | 타입 | 기본값 | 용도 |
569
- |---|---|---|---|
570
- | `profile` | `"mix" \| "gpt" \| "glm"` | `"mix"` | 최상위 동작 프로필. `mix`가 명시적 기본값이며, `gpt`와 `glm`은 프로바이더별 프롬프트, 활성 에이전트 기본값, chat 파라미터를 적용. |
571
- | `tier` | `"bronze" \| "silver" \| "gold"` | _없음_ | 선택적 활성 에이전트 프리셋. `bronze`는 최소 구성, `silver`는 표준, `gold`는 전체 전문가 세트를 활성화. |
572
- | `enabled` | `string[]` | `["coder", "resolver", "explorer", "reviewer", "deep-reviewer", "planner"]` | 주입할 resolve 에이전트. 핵심 경로: resolver→coder. 내부 전문가(coder, explorer, reviewer, deep-reviewer, planner)는 서브에이전트 전용. 에이전트별 `agents.<name>.enabled`가 이것을 재정의. |
573
- | `preserveNative` | `boolean` | `true` | 네이티브 `plan`/`build`는 항상 보존됨. 가독성을 위해 허용됨. |
574
- | `context7` | `boolean` | `true` | true인 경우, 이미 구성되지 않았으면 Context7 MCP 서버를 등록. |
575
- | `commands` | `boolean` | `false` | true인 경우, `resolve`, `resolve-code`, `resolve-review` 명령어 추가. |
576
- | `autoApprove` | `boolean` | `true` | 하위 호환/가독성 플래그. 현재 동작은 내장 기본 권한과 `permission.ask` bash 분류기가 제어하며, 이 플래그가 권한을 재작성하지 않음. |
577
- | `autoUpdate` | `boolean` | `true` | npm 버전 확인과 OpenCode 플러그인 캐시 갱신 알림을 best-effort로 수행. 비활성화하려면 false. |
578
- | `maxParallelSubagents` | `positive integer` | _미설정_ | 동시 coder 수에 대한 선택적 프롬프트 수준 상한. 미설정 시 resolver는 soft fan-out 가이드를 사용하고 rate-limit 에러에 backoff. GLM profile도 사용자가 설정하지 않는 한 hard cap을 걸지 않음. |
579
- | `models` | `object` | `{}` | 별칭 맵. 키는 에이전트 이름 또는 `bronze`/`silver`/`gold`, `gpt-*`, `glm-*`, `fast`, `strong`, `mini`, `codex`, `quick`, `deep`, `glm`, `gpt` 같은 별칭. 값은 모델 id 또는 다른 별칭. |
580
- | `agents` | `object` | `{}` | 에이전트별 재정의 (아래 참조). |
581
- | `config` | `string` | _없음_ | 설정 파일의 사용자 정의 경로 (프로젝트 상대경로 또는 절대경로). |
582
-
583
- `agents.<name>` 내의 에이전트별 옵션:
584
-
585
- | 키 | 타입 | 참고 |
586
- |---|---|---|
587
- | `enabled` | `boolean` | 최상위 `enabled`와 관계없이 이 에이전트를 강제 활성화/비활성화. |
588
- | `model` | `string` | 모델 id 또는 별칭. 최상위 `models` 맵에 대해 해석됨. |
589
- | `mode` | `"subagent" \| "primary" \| "all"` | OpenCode 에이전트 모드. |
590
- | `description` | `string` | 다른 에이전트에게 표시되는 기본 설명을 재정의. |
591
- | `prompt` | `string` | 기본 시스템 프롬프트를 재정의. (`resolver`의 경우 템플릿된 병렬 규칙 프롬프트도 비활성화.) |
592
- | `color` | `string` | UI 색상. |
593
- | `maxSteps` | `positive integer` | 호출당 단계 예산. |
594
- | `tools` | `Record<string, boolean>` | 개별 OpenCode 도구 토글. |
595
- | `permission` | `object` | 권한 재정의 — 아래 참조. |
596
-
597
- 권한 키 (각각 `"ask"`, `"allow"`, 또는 `"deny"`):
598
-
599
- `edit`, `bash`, `webfetch`, `doom_loop`, `external_directory`.
600
-
601
- `permission.bash`는 명령별 맵일 수도 있습니다:
602
-
603
- ```json
604
- {
605
- "permission": {
606
- "bash": { "npm test": "allow", "rm -rf": "deny" }
607
- }
608
- }
609
- ```
610
-
611
- 완전히 주석이 달린 참조 설정이 [`opencode-resolve.reference.jsonc`](./opencode-resolve.reference.jsonc)로 패키지에 포함되어 있습니다 — 필요한 키를 `resolve.json`에 복사하세요 (주석 제외).
176
+ 우선순위:
612
177
 
613
- ---
614
-
615
- ## 자동 승인
616
-
617
- `autoApprove` (기본값 `true`)는 이제 하위 호환/가독성 플래그입니다. 기존 `resolve.json`이 계속 로드되도록 설정에서 허용하지만, 현재 하네스는 이 값으로 권한을 `"ask"`에서 `"allow"`로 재작성하지 않습니다.
618
-
619
- 저마찰 자율 동작은 두 가지 명시적 기본값에서 옵니다:
620
-
621
- | 권한 | 현재 기본 동작 |
622
- |---|---|
623
- | 쓰기 에이전트 `edit` / `webfetch` | `allow` |
624
- | 쓰기 에이전트 `bash` | `ask`, 플러그인의 `permission.ask` 분류기로 라우팅 |
625
- | 안전한 bash 명령 | 분류기가 자동 허용 |
626
- | 위험한 bash 명령 | 분류기가 자동 거부 |
627
- | 알 수 없는 bash 명령 | OpenCode/사용자 처리를 위해 `ask` 유지 |
628
- | 읽기 전용 에이전트 `edit` / `bash` | `deny`; write-capable 플러그인 도구도 read-only 에이전트를 차단 |
629
-
630
- 의도를 나타내기 위해 config에 그대로 둘 수 있습니다:
631
-
632
- ```json
633
- {
634
- "autoApprove": false
635
- }
636
- ```
637
-
638
- > **신뢰 참고:** 저마찰 쓰기 에이전트 권한은 작업공간과 구성된 모델을 신뢰한다고 가정합니다. 신뢰할 수 없는 코드의 경우 샌드박스나 VM을 사용하세요. Bash는 무조건 허용이 아니라 분류기 라우팅을 유지합니다.
639
-
640
- ---
641
-
642
- ## 병렬 서브에이전트 제한
643
-
644
- `maxParallelSubagents`는 선택 사항입니다. 생략하면 **resolver**는 soft fan-out 가이드를 사용합니다: 진짜 독립적인 작업에는 coder를 분산하고, rate-limit 에러가 보이면 backoff합니다. resolver 프롬프트에 명시적인 역할별 동시 실행 상한을 넣고 싶을 때만 설정하세요. GLM profile도 기본적으로 hard cap은 없습니다.
645
-
646
- | 값 | 동작 |
647
- |---|---|
648
- | `1` | 한 번에 하나의 coder만. |
649
- | `2` | 최대 2개의 coder 동시 실행. 독립 작업 분산에 유용. |
650
- | `N > 2` | 최대 N개의 coder 동시 실행. 컨텍스트 낭비를 피하기 위해 신중하게 사용. |
651
-
652
- 프로젝트별 또는 사용자별 재정의:
653
-
654
- ```json
655
- { "maxParallelSubagents": 1 }
656
- { "maxParallelSubagents": 2 }
657
- { "maxParallelSubagents": 4 }
178
+ ```text
179
+ 내장 기본값 -> 처음 발견한 설정 파일 -> 인라인 플러그인 옵션
658
180
  ```
659
181
 
660
- > **중요 소프트 제한, 하드 캡이 아님.** 제한은 resolver의 시스템 프롬프트에만 반영됩니다. 초과 디스패치를 차단하는 런타임 인터셉터는 없습니다. 지시를 잘 따르는 코딩 모델은 일반적으로 이 규칙을 준수하지만, 모델이 오동작하면 제한을 초과하는 디스패치가 통과합니다. 더 엄격한 상한을 원하면 `maxSteps`와 함께 사용하세요.
661
-
662
- 제한은 설정 로드 시 프롬프트에 템플릿되므로, 새 값을 적용하려면 OpenCode를 재시작하세요. 사용자 정의 `agents.resolver.prompt`를 제공하면 템플릿된 규칙이 건너뛰어지고 프롬프트가 전적으로 적용됩니다.
182
+ 전체 주석 설정 예시: [opencode-resolve.reference.jsonc](./opencode-resolve.reference.jsonc)
663
183
 
664
- ---
184
+ ### 최상위 옵션
665
185
 
666
- ## 업그레이드 마이그레이션
667
-
668
- `opencode-resolve`의 버전으로 업그레이드하면, `postinstall` 스크립트가 기존 `~/.config/opencode/resolve.json`에 **추가적 마이그레이션**을 실행합니다:
669
-
670
- - 최상위 키(현재 `autoApprove`)를 기본값과 함께 추가 (없는 경우).
671
- - 이미 설정한 키는 **절대** 수정하지 않음.
672
- - `enabled` 목록, `models` 맵, 또는 `agents` 재정의를 **절대** 다시 쓰지 않음.
673
- - `enabled`가 설정되어 있고 `"resolver"`를 포함하지 않으면, 추가를 제안하는 팁을 출력. 파일은 그대로 유지.
674
- - 인터랙티브 재설치에서는 기존 파일을 업데이트할지, 백업 fresh setup을 다시 돌릴지 물음. 비대화형 자동화에서는 fresh 재설치에 `OPENCODE_RESOLVE_REINSTALL=fresh`, 보존 마이그레이션에 `OPENCODE_RESOLVE_REINSTALL=update` 사용.
675
-
676
- ### 적응형 최초 설치 프리셋
677
-
678
- `resolve.json`이 **존재하지 않을** 때, postinstall은 OpenCode 모델 설정을 검사하고 프로바이더에 맞는 `models` 블록을 작성합니다:
679
-
680
- | 감지된 프로바이더 | 프리셋 |
681
- |---|---|
682
- | 인터랙티브 터미널 | 항상 `mix` / `gpt` / `glm`을 묻고 3티어 모델을 고르게 하며, `mix`에서는 `gpt`와 `glm` primary 에이전트 활성화도 묻습니다 |
683
- | 비대화형 설치 | opencode.json에서 프로바이더를 자동 감지하여 모델 적응 프리셋 작성. `resolver`, `gpt`, `glm` primary 경로 활성화 |
684
- | 레거시 opt-in | `OPENCODE_RESOLVE_AUTO_PRESET=1`을 설정하면 비대화형 provider-adapted 프리셋 허용 |
685
- | GLM/ZAI 감지 | API 키를 복사하지 않고 ZAI MCP 부트스트랩 추가 |
686
-
687
- 언제든지 프리셋을 변경하려면 `resolve.json`의 `models`를 직접 편집하거나, `OPENCODE_RESOLVE_REINSTALL=fresh`로 재설치하세요.
688
-
689
- 마이그레이션을 완전히 건너뛰려면:
690
-
691
- ```sh
692
- OPENCODE_RESOLVE_SKIP_POSTINSTALL=1 npm install -g opencode-resolve
693
- ```
694
-
695
- ---
186
+ | | 타입 | 기본값 | 용도 |
187
+ | --- | --- | --- | --- |
188
+ | `profile` | `mix` / `glm` / `gpt` | `mix` | 프롬프트/profile preset. |
189
+ | `tier` | `bronze` / `silver` / `gold` | 미설정 | 설정된 tier preset 활성화. |
190
+ | `enabled` | 에이전트 이름 배열 | 기본 에이전트 | 주입할 resolve 에이전트. |
191
+ | `models` | object | `{}` | 모델 별칭과 역할별 모델 핀. |
192
+ | `agents` | object | `{}` | 에이전트별 override. |
193
+ | `preserveNative` | boolean | `true` | 명시 override가 없으면 OpenCode 기본 에이전트 보존. |
194
+ | `context7` | boolean | `true` | 없을 Context7 MCP 등록. |
195
+ | `commands` | boolean | `false` | `/resolve`, `/resolve-code`, `/resolve-review` 추가. |
196
+ | `autoApprove` | boolean | `true` | 하위 호환용 플래그. 현재 권한은 명시 설정과 분류기가 제어. |
197
+ | `autoUpdate` | boolean | `true` | 설치/업데이트 시 추가적 설정 마이그레이션 허용. |
198
+ | `language` | `auto` / `en` / `ko` | `auto` | 프롬프트 언어 선호. |
199
+ | `maxParallelSubagents` | positive integer | 미설정 | 동시 coder 디스패치에 대한 선택적 프롬프트 수준 soft limit. |
200
+
201
+ ### 에이전트 override
202
+
203
+ `agents.<name>` 항목은 다음 키를 받을 있습니다.
204
+
205
+ | | |
206
+ | --- | --- |
207
+ | `enabled` | boolean |
208
+ | `model` | 모델 id 또는 별칭 |
209
+ | `mode` | `subagent`, `primary`, `all` |
210
+ | `description` | string |
211
+ | `prompt` | string |
212
+ | `color` | string |
213
+ | `maxSteps` | positive integer |
214
+ | `tools` | tool boolean object |
215
+ | `permission` | `edit`, `bash`, `webfetch`, `doom_loop`, `external_directory` |
216
+
217
+ 권한 값은 `ask`, `allow`, `deny`입니다. `permission.bash`는 명령 패턴별 맵도 받을 수 있습니다.
696
218
 
697
219
  ## 모델 설정
698
220
 
699
- `opencode-resolve`는 기본적으로 어떤 프로바이더별 모델도 핀닝하지 않습니다. 모든 resolve 에이전트는 최상위 OpenCode `model`을 상속합니다 토큰당 결과 효율이 가장 좋은 하나의 효율적인 모델을 사용하세요. 이점을 측정한 경우에만 역할별 모델을 핀닝하세요.
221
+ 기본적으로 `models`는 비어 있고 resolve 에이전트는 OpenCode 최상위 `model`을 상속합니다. 비용, 속도, reasoning depth를 나눌 필요가 있을 때만 역할별 모델을 핀닝하세요.
700
222
 
701
- resolve 에이전트에 대한 모델 해석 순서:
223
+ 에이전트의 모델 해석 순서:
702
224
 
703
225
  1. `agents.<name>.model`
704
- 2. `models.<name>` 별칭 매핑
705
- 3. 최상위 OpenCode `model`
706
- 4. 모델이 구성되지 않은 경우 OpenCode 자체의 폴백
707
-
708
- ### 모든 것에 기본 모델 사용 (권장)
709
-
710
- ```json
711
- {
712
- "enabled": ["coder", "resolver", "explorer", "reviewer", "deep-reviewer"],
713
- "models": {}
714
- }
715
- ```
226
+ 2. `models.<name>`
227
+ 3. OpenCode 최상위 `model`
228
+ 4. OpenCode 자체 fallback
716
229
 
717
- ### 역할별 별칭 (이점을 측정한 경우)
230
+ 3-tier 예시:
718
231
 
719
232
  ```json
720
233
  {
721
- "enabled": ["coder", "resolver", "explorer", "reviewer", "deep-reviewer"],
722
234
  "models": {
723
- "fast": "openai/gpt-5-mini",
724
- "strong": "openai/gpt-5.3-codex",
725
- "coder": "fast",
726
- "resolver": "strong"
727
- }
728
- }
729
- ```
730
-
731
- ### 하나의 역할을 직접 핀닝
732
-
733
- ```json
734
- {
735
- "agents": {
736
- "resolver": {
737
- "model": "openai/gpt-5.3-codex"
738
- }
235
+ "bronze": "zai-coding-plan/glm-4.5",
236
+ "silver": "zai-coding-plan/glm-5.1",
237
+ "gold": "openai/gpt-5.5",
238
+ "explorer": "bronze",
239
+ "coder": "silver",
240
+ "resolver": "gold",
241
+ "reviewer": "gold",
242
+ "deep-reviewer": "gold",
243
+ "planner": "gold"
739
244
  }
740
245
  }
741
246
  ```
742
247
 
743
- ### 혼합 설정 (OpenCode 설정 + resolve 모델)
248
+ 지원 모델 별칭:
744
249
 
745
- `plan` 및 `build`와 같은 네이티브 OpenCode 에이전트는 `opencode-resolve`가 아닌 최상위 OpenCode `agent`를 통해 구성됩니다.
746
-
747
- ```json
748
- {
749
- "model": "openai/gpt-5-mini",
750
- "agent": {
751
- "plan": {
752
- "model": "openai/gpt-5.3-codex"
753
- }
754
- },
755
- "plugin": [
756
- [
757
- "opencode-resolve",
758
- {
759
- "enabled": ["coder", "resolver", "explorer", "reviewer", "deep-reviewer"]
760
- }
761
- ]
762
- ]
763
- }
250
+ ```text
251
+ fast, strong, mini, codex, quick, deep, glm, gpt,
252
+ bronze, silver, gold,
253
+ gpt-bronze, gpt-silver, gpt-gold,
254
+ glm-bronze, glm-silver, glm-gold,
255
+ 모든 지원 에이전트 이름
764
256
  ```
765
257
 
766
- 설정에서 `plan`은 `openai/gpt-5.3-codex`를 사용; 네이티브 `build`, resolve `coder`, resolve `resolver`는 모두 `openai/gpt-5-mini`를 사용합니다.
767
-
768
- ### 지원되는 모델 별칭 키
769
-
770
- | 별칭 | 용도 |
771
- |---|---|
772
- | `fast` | 빠른/저렴한 모델의 프로바이더 중립적 별칭 |
773
- | `strong` | 강력한/비싼 모델의 프로바이더 중립적 별칭 |
774
- | `mini` | 미니/효율적 모델의 프로바이더 중립적 별칭 |
775
- | `codex` | 코덱스 스타일 코딩 모델의 프로바이더 중립적 별칭 (레거시) |
776
- | `bronze` / `silver` / `gold` | scout / coder / reasoner 3티어 별칭 |
777
- | `gpt-bronze` / `gpt-silver` / `gpt-gold` | mixed 설정의 GPT/Codex 전용 3티어 별칭 |
778
- | `glm-bronze` / `glm-silver` / `glm-gold` | mixed 설정의 GLM 전용 3티어 별칭 |
779
- | `quick` | 레거시 별칭 (`fast`와 동등) |
780
- | `deep` | 레거시 별칭 (`strong`과 동등) |
781
- | `glm` | 레거시 별칭 (하위 호환성) |
782
- | `gpt` | 레거시 별칭 (하위 호환성) |
783
-
784
- 별칭은 `models`에 정의된 경우에만 해석됩니다. 에이전트 이름(`coder`, `resolver` 등)도 유효한 별칭 키입니다.
785
-
786
- ---
787
-
788
- ## 에이전트 참조
789
-
790
- | 에이전트 | 기본 | 모드 | Edit | Bash | WebFetch | 용도 |
791
- |---|:---:|---|---|---|---|---|
792
- | `resolver` | 예 (핵심) | `all` | allow | ask (분류기 라우팅) | allow | 컨텍스트 효율적 오케스트레이터. 작업을 검증된 체크포인트로 분해, coder 디스패치, 각각 검증, 반복 회복 실패 시 차단 사항 보고. |
793
- | `codex` | 아니오 | `all` | allow | ask (분류기 라우팅) | allow | `resolver`와 같은 검증 resolve-loop 스타일의 Codex 최적화 primary. 레거시 — 새 GPT 설정에서는 `gpt` 권장. |
794
- | `gpt` | 아니오 | `all` | allow | ask (분류기 라우팅) | allow | `resolver`와 같은 검증 resolve-loop 스타일의 GPT 최적화 primary. 최초 설치 GPT/mix 프리셋 또는 명시 설정으로 활성화. |
795
- | `glm` | 아니오 | `all` | allow | ask (분류기 라우팅) | allow | `resolver`와 같은 검증 resolve-loop 스타일의 GLM 최적화 primary. 최초 설치 GLM/mix 프리셋 또는 명시 설정으로 활성화. |
796
- | `coder` | 예 (핵심) | `subagent` | allow | ask (분류기 라우팅) | allow | 집중된 구현자. 가장 작은 올바른 패치. 필요한 파일만 읽음. |
797
- | `explorer` | 예 (서브에이전트) | `subagent` | **deny** | **deny** | allow | 내부 빠른 코드베이스 스카우트. Resolver가 범위가 불명확할 때만 디스패치; 좁은 범위는 로컬 read/grep/glob 선호. |
798
- | `reviewer` | 예 (서브에이전트) | `subagent` | **deny** | **deny** | allow | 내부 검증 갭 감사자. 비사소한 변경에 검증 갭이 있을 때 디스패치. |
799
- | `deep-reviewer` | 예 (서브에이전트) | `subagent` | **deny** | **deny** | allow | 내부 위험/보안/아키텍처 변경에 대한 철저한 리뷰. 고영향도 작업에만 디스패치. |
800
- | `planner` | 예 (서브에이전트) | `subagent` | **deny** | **deny** | allow | 명시적 계획 전문가. 사용자가 계획/분해/전략을 요청할 때만 디스패치. |
801
- | `architect` | 아니오 | `subagent` | **deny** | **deny** | allow | 설계 및 작업 분해. |
802
- | `gpt-coder` | 아니오 | `subagent` | allow | ask (분류기 라우팅) | allow | 더 강력한 추론 구현 폴백. |
803
- | `debugger` | 아니오 | `subagent` | allow | ask (분류기 라우팅) | allow | 재현 및 근본 원인 분석. |
804
- | `researcher` | 아니오 | `subagent` | **deny** | **deny** | allow | 코드베이스 및 문서 연구. |
805
-
806
- 쓰기 에이전트의 `bash: ask`는 의도된 값입니다. 플러그인의 `permission.ask` 훅이 알려진 안전 명령은 자동 허용, 위험 명령은 자동 거부, 알 수 없는 명령은 OpenCode/사용자 처리를 위해 남깁니다.
807
-
808
- 지원되는 모드:
809
-
810
- | 모드 | 의미 |
811
- |---|---|
812
- | `subagent` | 서브에이전트로만 사용 가능 |
813
- | `primary` | 기본 에이전트로 사용 가능 |
814
- | `all` | 기본 및 서브에이전트 모두로 사용 가능 |
258
+ ## 에이전트
815
259
 
816
- 지원되는 권한 값: `ask`, `allow`, `deny`.
260
+ | 에이전트 | 기본 | 모드 | Edit | Bash | Web | 역할 |
261
+ | --- | --- | --- | --- | --- | --- | --- |
262
+ | `resolver` | yes | `all` | allow | ask | allow | 기본 오케스트레이터. |
263
+ | `coder` | yes | `subagent` | allow | ask | allow | 집중 구현과 검증. |
264
+ | `explorer` | yes | `subagent` | deny | deny | allow | 빠른 읽기 전용 코드베이스 탐색. |
265
+ | `reviewer` | yes | `subagent` | deny | deny | allow | 읽기 전용 검증 갭 리뷰. |
266
+ | `deep-reviewer` | yes | `subagent` | deny | deny | allow | 위험/고영향 변경 리뷰. |
267
+ | `planner` | yes | `subagent` | deny | deny | allow | 필요할 때만 읽기 전용 계획. |
268
+ | `gpt` | no | `all` | allow | ask | allow | GPT 최적화 primary resolver. |
269
+ | `glm` | no | `all` | allow | ask | allow | GLM/ZAI 최적화 primary resolver. |
270
+ | `codex` | no | `all` | allow | ask | allow | 레거시 Codex 최적화 primary resolver. |
271
+ | `architect` | no | `subagent` | deny | deny | allow | 설계/분해 보조. |
272
+ | `gpt-coder` | no | `subagent` | allow | ask | allow | 더 강한 구현 보조. |
273
+ | `debugger` | no | `subagent` | allow | ask | allow | 재현/root-cause 보조. |
274
+ | `researcher` | no | `subagent` | deny | deny | allow | 코드베이스/문서 리서치 보조. |
817
275
 
818
- 지원되는 모델 별칭 키: `fast`, `strong`, `mini`, `codex`, `quick`, `deep`, `glm`, `gpt`, `bronze`, `silver`, `gold`, `gpt-bronze`, `gpt-silver`, `gpt-gold`, `glm-bronze`, `glm-silver`, `glm-gold`, 그리고 지원되는 모든 에이전트 이름. 별칭은 `models`에 정의된 경우에만 해석됩니다.
276
+ ## 권한
819
277
 
820
- `preserveNative`은 가독성을 위해 허용되지만, 네이티브 `plan`과 `build`는 항상 보존됩니다. 플러그인은 빌트인 OpenCode 에이전트를 절대 다시 쓰지 않습니다.
278
+ resolve 에이전트의 bash는 기본적으로 `ask`입니다. 플러그인의 권한 훅은 흔한 읽기/테스트 명령은 자동 허용하고, force push, shell eval injection, remote script pipe 같은 위험 패턴은 거부합니다. 알 수 없는 명령은 계속 `ask`로 남습니다.
821
279
 
822
- ### Resolver 오케스트레이션 규칙
280
+ `autoApprove`는 오래된 설정과의 호환을 위해 허용되지만, 현재 동작은 명시적 에이전트 권한과 명령 분류기가 제어합니다.
823
281
 
824
- Resolver는 컨텍스트 효율적 접근, 체크포인트 실행, 반복 실패 회복을 사용합니다:
282
+ 신뢰할 없는 저장소에서는 샌드박스나 VM을 사용하세요.
825
283
 
826
- - 계획 전에 작업을 **quick**, **normal**, **deep**, **risky**로 **분류**.
827
- - **관련 파일만 검사** — 로컬 도구 사용, 광범위한 탐색 지양.
828
- - 사소한 작업은 직접 편집 적용 — 서브에이전트 불필요.
829
- - 집중된 파일/동작 지시와 함께 **coder** 디스패치.
830
- - **가장 저렴한 의미 있는 검증**을 먼저 실행.
831
- - 문제가 남아있으면 검증 로그에서 재시도; 검증 실패 시 근본 원인을 진단한 뒤 다른 수정 지시로 coder를 다시 디스패치.
832
- - 연속 실패가 누적되면 완료를 주장하지 않고 차단 사항을 보고; 전체 실패가 많아지면 `architect`로 전략을 전환.
833
- - 범위가 불명확하고 로컬 read/grep/glob이 불충분할 때만 **explorer** 사용 (내부 서브에이전트, 핵심 경로 아님).
834
- - 비사소한 변경에 검증 갭이 있을 때만 **reviewer** 사용 (내부 서브에이전트, 핵심 경로 아님).
835
- - 위험, 보안, 아키텍처, 고영향도 변경에만 **deep-reviewer** 사용 (내부 서브에이전트, 핵심 경로 아님).
836
- - 해결되거나 차단되면 간결한 증거 요약 반환.
837
- - `maxParallelSubagents` 역할별 제한을 컨텍스트 효율을 위해 준수.
284
+ ## 병렬 서브에이전트
838
285
 
839
- ---
286
+ `maxParallelSubagents`는 선택 사항입니다. 생략하면 resolver는 soft guidance를 사용합니다. 진짜 독립적인 작업에만 coder를 분산하고, rate limit이 보이면 backoff합니다.
840
287
 
841
- ## 선택적 명령어
288
+ 값을 설정하면 resolver 프롬프트에 삽입됩니다. 런타임 semaphore는 아닙니다. 변경 후 OpenCode를 재시작하세요. `agents.resolver.prompt`를 직접 지정하면 템플릿된 규칙은 대체됩니다.
842
289
 
843
- `commands: true`로 설정하면 도우미 서브태스크 명령어가 추가됩니다:
290
+ ## Context7
844
291
 
845
- | 명령어 | 설명 |
846
- |---|---|
847
- | `resolve` | 현재 작업에 대해 `resolver` 에이전트를 엔드투엔드로 실행 |
848
- | `resolve-code` | 집중된 구현을 위해 `coder` 에이전트를 실행 |
849
- | `resolve-review` | 읽기 전용 감사를 위해 `reviewer` 에이전트를 실행 |
850
-
851
- ---
852
-
853
- ## Context7 통합
854
-
855
- `context7: true` (기본값)인 경우, 플러그인이 시작 시 [Context7](https://context7.com) MCP 서버를 자동으로 등록합니다:
292
+ `context7: true`이면 `mcp.context7`이 없을 때 Context7 MCP를 등록합니다.
856
293
 
857
294
  ```json
858
295
  {
859
- "type": "remote",
860
- "url": "https://mcp.context7.com/mcp"
296
+ "mcp": {
297
+ "context7": {
298
+ "type": "remote",
299
+ "url": "https://mcp.context7.com/mcp"
300
+ }
301
+ }
861
302
  }
862
303
  ```
863
304
 
864
- 이를 통해 resolve 에이전트가 OpenCode의 MCP 통합을 통해 Context7 문서 도구에 접근할 수 있습니다 — 수동 MCP 설정이 필요 없습니다.
865
-
866
- Context7 등록을 비활성화하려면 (예: 이미 구성되어 있거나 원하지 않는 경우):
305
+ 끄려면:
867
306
 
868
307
  ```json
869
- {
870
- "context7": false
871
- }
308
+ { "context7": false }
872
309
  ```
873
310
 
874
- OpenCode 설정에 `mcp.context7`이 이미 있는 경우, 플러그인은 덮어쓰지 않습니다.
311
+ ## 프로젝트 컨텍스트
875
312
 
876
- ---
313
+ 플러그인은 repo 전체를 프롬프트에 밀어 넣지 않고, 커밋된 프로젝트 컨텍스트 위치만 노출합니다. 감지 대상:
877
314
 
878
- ## 최신 상태 유지
315
+ - `HARNESS.md`
316
+ - `AGENTS.md`
317
+ - `.opencode/context`
318
+ - `.claude/context`
319
+ - `context/`
320
+ - `thoughts/`
321
+ - package manager와 흔한 검증 명령
322
+ - TypeScript 프로젝트 여부
879
323
 
880
- > **OpenCode마지막으로 다운로드한 버전을 캐시합니다.** 릴리스를 받으려면 명시적으로 새로고침해야 합니다.
324
+ resolver관련 있는 컨텍스트 문서만 읽도록 지시받습니다.
881
325
 
882
- ```sh
883
- # npm을 통한 업그레이드
884
- npm install -g opencode-resolve@latest
885
-
886
- # OpenCode 캐시 새로고침
887
- opencode plugin opencode-resolve --global --force
888
-
889
- # OpenCode 재시작
890
- ```
891
-
892
- 그래도 버전이 바뀌지 않으면 OpenCode가 패키지 캐시를 재사용하는 상태입니다. 해당 플러그인 캐시 항목만 hard refresh 하세요:
893
-
894
- Linux/macOS:
326
+ ## 업그레이드
895
327
 
896
328
  ```sh
897
- export OPENCODE_CACHE_ROOT="${XDG_CACHE_HOME:-$HOME/.cache}/opencode"
898
- rm -rf "$OPENCODE_CACHE_ROOT/packages/opencode-resolve@latest"
329
+ npm install -g opencode-resolve@latest
899
330
  opencode plugin opencode-resolve@latest --global --force
900
- node -e "console.log(require(process.env.OPENCODE_CACHE_ROOT + '/packages/opencode-resolve@latest/node_modules/opencode-resolve/package.json').version)"
901
331
  ```
902
332
 
903
- Windows PowerShell:
333
+ 특정 버전을 `opencode.json`에서 고정하고 해당 버전 캐시를 새로고침합니다.
904
334
 
905
- ```powershell
906
- $OpenCodeCacheRoot = if ($env:XDG_CACHE_HOME) { Join-Path $env:XDG_CACHE_HOME "opencode" } else { Join-Path $env:LOCALAPPDATA "opencode" }
907
- $PluginCache = Join-Path $OpenCodeCacheRoot "packages\opencode-resolve@latest"
908
- Remove-Item -Recurse -Force $PluginCache -ErrorAction SilentlyContinue
909
- opencode plugin opencode-resolve@latest --global --force
910
- $Pkg = Join-Path $PluginCache "node_modules\opencode-resolve\package.json"
911
- node -e "console.log(require(process.argv[1]).version)" $Pkg
335
+ ```json
336
+ { "plugin": ["opencode-resolve@<version>"] }
912
337
  ```
913
338
 
914
- 업그레이드 후 `postinstall`이 `resolve.json`에 추가적 마이그레이션을 실행합니다 — 새 키가 추가되고, 기존 키는 절대 수정되지 않습니다.
915
-
916
- ### 특정 버전 고정
917
-
918
339
  ```sh
919
- npm install -g opencode-resolve@0.1.3
920
- opencode plugin opencode-resolve --global --force
340
+ opencode plugin opencode-resolve@<version> --global --force
921
341
  ```
922
342
 
923
- ---
924
-
925
- ## 로컬 개발
926
-
927
- 이 저장소에서:
343
+ ## 개발
928
344
 
929
345
  ```sh
930
346
  npm install
931
- npm run hooks:install
932
- npm test
933
- npm run install:local
934
- ```
935
-
936
- `install:local`은 플러그인을 빌드하고, OpenCode 전역 플러그인 디렉토리에 링크하며, `~/.config/opencode/resolve.json`이 없으면 생성합니다.
937
-
938
- `hooks:install`은 이 checkout의 `core.hooksPath`를 `.githooks`로 설정합니다. 추적되는 훅은 의도적으로 빡세게 동작합니다:
939
-
940
- | 훅 | 게이트 |
941
- |---|---|
942
- | `pre-commit` | `npm run typecheck`, `npm test`, `npm run coverage` |
943
- | `pre-push` | 전체 `pre-commit` 게이트와 `npm pack --dry-run`을 통과해야 원격에 반영 |
944
-
945
- 수동 로컬 설치:
946
-
947
- ```sh
948
347
  npm run build
949
- mkdir -p ~/.config/opencode/plugins
950
- ln -sf "$PWD/dist/index.js" ~/.config/opencode/plugins/opencode-resolve.js
348
+ npm test
349
+ npm run coverage
951
350
  ```
952
351
 
953
- 로컬 플러그인 파일은 OpenCode가 자동으로 로드합니다.
954
-
955
- ---
956
-
957
- ## 검증
958
-
959
- 일반 검사 실행:
352
+ checkout을 로컬 설치:
960
353
 
961
354
  ```sh
962
- npm run typecheck
963
- npm test
964
- npm run coverage
965
- npm run build
355
+ npm run install:local
966
356
  ```
967
357
 
968
- 테스트 스위트는 빌드된 플러그인을 실행하고 기본 에이전트 주입, `autoApprove` 동작, 모델 별칭, 파일 설정, 플러그인 옵션 재정의, 선택적 명령어, Context7 보존, 네이티브 `plan`/`build` 보존을 검증합니다.
969
-
970
- 게시 전:
358
+ Git hook:
971
359
 
972
360
  ```sh
973
- npm run typecheck
974
- npm test
975
- npm run coverage
976
- npm audit --audit-level=moderate
977
- npm publish --dry-run
361
+ npm run hooks:install
978
362
  ```
979
363
 
980
- `npm pack`과 `npm publish`는 `prepack` 스크립트를 통해 먼저 `npm test`를 실행합니다.
981
-
982
- ---
364
+ 테스트는 에이전트 주입, 설정 로딩, 모델 별칭, 권한, 선택적 명령어, Context7 보존, 네이티브 에이전트 보존, postinstall 동작을 검증합니다.
983
365
 
984
366
  ## 릴리스
985
367
 
986
- 릴리스는 버전 태그가 푸시될 때 GitHub Actions에 의해 게시됩니다.
987
-
988
- 필요한 저장소 시크릿:
989
-
990
- | 시크릿 | 설명 |
991
- |---|---|
992
- | `NPM_TOKEN` | 게시 권한이 있는 npm 자동화 토큰 |
993
-
994
- 태그 릴리스 흐름:
368
+ 1. `package.json` 버전을 올립니다.
369
+ 2. `npm run prepush`를 실행합니다.
370
+ 3. 커밋하고 태그를 푸시합니다.
995
371
 
996
372
  ```sh
997
- npm version patch
998
- git push origin main --follow-tags
373
+ git add package.json package-lock.json README.md README.ko.md
374
+ git commit -m "release: vX.Y.Z"
375
+ git tag vX.Y.Z
376
+ git push origin main --tags
999
377
  ```
1000
378
 
1001
- GitHub Actions에서 `Publish to npm` 워크플로우를 수동으로 실행하고 `patch`, `minor`, `major` 또는 특정 버전을 선택할 수도 있습니다.
1002
-
1003
- 릴리스 워크플로우는 `npm ci`, `npm run typecheck`, `npm test`, `npm publish --access public --provenance`를 실행합니다.
1004
-
1005
- ---
379
+ publish workflow가 테스트 npm 배포합니다.
1006
380
 
1007
381
  ## 설계 규칙
1008
382
 
1009
- - 네이티브 `plan` 또는 `build` 에이전트를 덮어쓰지 않음.
1010
- - 핵심 경로는 고정: `resolver`(컨텍스트 효율적 플래너/판정자) → `coder`(구현자).
1011
- - 내부 전문가 서브에이전트(`explorer`, `reviewer`, `deep-reviewer`)는 OpenCode 네이티브 서브에이전트로 기본 주입 — OpenCode의 컴포지션 철학을 계승 — 하지만 기본 실행 경로가 아니며 사용자 대면 기본 역할이 아님.
1012
- - Resolver는 좁은 범위에 로컬 read/grep/glob을 선호; 범위가 불명확할 때만 `explorer` 디스패치.
1013
- - Resolver는 비사소한 변경에 검증 갭이 있을 때만 `reviewer` 디스패치.
1014
- - Resolver는 위험, 보안, 아키텍처, 고영향도 변경에만 `deep-reviewer` 디스패치.
1015
- - Reviewer와 deep-reviewer는 읽기 전용 — 수정은 항상 `coder` 또는 `resolver`를 거침.
1016
- - 반복 검증 실패는 진단, 다른 수정 전략, 차단 사항 보고로 이어져야 함. 대규모 작업은 검증된 체크포인트로 분해됨.
1017
- - Resolver는 컨텍스트 효율을 위해 `maxParallelSubagents`를 준수.
1018
- - 편집 전에 검색하고 검사. 가장 작은 올바른 변경. 실용적인 경우 검증.
1019
- - 필요한 파일만 읽음. 광범위한 탐색 지양. 대상 검증, 전체 스위트 아님.
1020
-
1021
- ---
383
+ - OpenCode 네이티브 에이전트를 기본적으로 대체하지 않습니다.
384
+ - 기본 설정은 작게 유지합니다.
385
+ - bash 권한은 보수적으로 유지합니다.
386
+ - 마이그레이션은 추가적으로만 수행합니다.
387
+ - 명확한 이점이 없으면 런타임 의존성을 늘리지 않습니다.
1022
388
 
1023
389
  ## 라이선스
1024
390
 
1025
- [MIT](./LICENSE)
391
+ MIT