@bogyie/opencode-kiro-plugin 0.1.0

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 (47) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/dist/acp-client.d.ts +57 -0
  5. package/dist/acp-client.js +171 -0
  6. package/dist/acp-transport.d.ts +33 -0
  7. package/dist/acp-transport.js +358 -0
  8. package/dist/auth.d.ts +25 -0
  9. package/dist/auth.js +77 -0
  10. package/dist/cli-transport.d.ts +17 -0
  11. package/dist/cli-transport.js +52 -0
  12. package/dist/config.d.ts +27 -0
  13. package/dist/config.js +76 -0
  14. package/dist/errors.d.ts +10 -0
  15. package/dist/errors.js +63 -0
  16. package/dist/fetch-adapter.d.ts +13 -0
  17. package/dist/fetch-adapter.js +35 -0
  18. package/dist/index.d.ts +24 -0
  19. package/dist/index.js +20 -0
  20. package/dist/kiro-cli.d.ts +8 -0
  21. package/dist/kiro-cli.js +16 -0
  22. package/dist/kiro-transport.d.ts +33 -0
  23. package/dist/kiro-transport.js +250 -0
  24. package/dist/model-cache.d.ts +19 -0
  25. package/dist/model-cache.js +33 -0
  26. package/dist/model-discovery.d.ts +5 -0
  27. package/dist/model-discovery.js +76 -0
  28. package/dist/model-resolver.d.ts +29 -0
  29. package/dist/model-resolver.js +79 -0
  30. package/dist/models.d.ts +14 -0
  31. package/dist/models.js +70 -0
  32. package/dist/plugin.d.ts +8 -0
  33. package/dist/plugin.js +188 -0
  34. package/dist/request-adapter.d.ts +93 -0
  35. package/dist/request-adapter.js +221 -0
  36. package/dist/response-adapter.d.ts +25 -0
  37. package/dist/response-adapter.js +108 -0
  38. package/docs/community-implementations.md +59 -0
  39. package/docs/e2e-validation.md +196 -0
  40. package/docs/implementation-plan.md +309 -0
  41. package/docs/implementation-strategy.md +241 -0
  42. package/docs/kiro-integration-notes.md +129 -0
  43. package/docs/opencode-provider-notes.md +87 -0
  44. package/docs/references.md +50 -0
  45. package/docs/research-summary.md +69 -0
  46. package/examples/opencode.jsonc +47 -0
  47. package/package.json +67 -0
@@ -0,0 +1,241 @@
1
+ # Implementation Strategy
2
+
3
+ ## Goal
4
+
5
+ OpenCode에 Kiro provider를 plugin 형태로 추가합니다. 단, Kiro의 공식 직접 LLM API가 확인되지 않았으므로 초기 목표는 Kiro CLI/ACP를 안정적으로 감싸는 adapter입니다.
6
+
7
+ ## Architecture Options
8
+
9
+ ### Option A: Config-only OpenAI-compatible Provider
10
+
11
+ 조건:
12
+
13
+ - Kiro가 OpenAI-compatible `/v1/chat/completions` endpoint를 제공해야 합니다.
14
+
15
+ 장점:
16
+
17
+ - 구현이 가장 작습니다.
18
+ - OpenCode의 기존 provider config만으로 동작합니다.
19
+ - `@ai-sdk/openai-compatible`를 그대로 사용할 수 있습니다.
20
+
21
+ 단점:
22
+
23
+ - 현재 공식 근거가 없습니다.
24
+ - auth, stream, tool call, usage metadata가 Kiro와 맞지 않을 수 있습니다.
25
+
26
+ 판정: future path로 보관합니다.
27
+
28
+ ### Option B: `kiro-cli chat --no-interactive` Adapter
29
+
30
+ 조건:
31
+
32
+ - 사용자의 machine에 `kiro-cli`가 설치되어 있어야 합니다.
33
+ - `KIRO_API_KEY` 또는 login session이 있어야 합니다.
34
+
35
+ 장점:
36
+
37
+ - 공식 CLI 표면을 사용합니다.
38
+ - MVP 구현이 빠릅니다.
39
+ - CI/headless 시나리오와 잘 맞습니다.
40
+
41
+ 단점:
42
+
43
+ - streaming UX가 제한될 수 있습니다.
44
+ - OpenCode의 LLM tool-call protocol과 1:1 매핑이 어렵습니다.
45
+ - prompt 단위 호출에 가까워 session 재사용이 제한될 수 있습니다.
46
+
47
+ 판정: MVP 후보입니다.
48
+
49
+ ### Option C: `kiro-cli acp` Adapter
50
+
51
+ 조건:
52
+
53
+ - OpenCode plugin 또는 별도 adapter process가 ACP JSON-RPC를 처리해야 합니다.
54
+
55
+ 장점:
56
+
57
+ - Kiro가 공식 문서화한 agent integration path입니다.
58
+ - streaming chunk, tool call, session control을 받을 수 있습니다.
59
+ - 장기적으로 provider-like UX에 가장 가깝습니다.
60
+
61
+ 단점:
62
+
63
+ - ACP event를 OpenCode provider stream으로 변환해야 합니다.
64
+ - OpenCode plugin hook만으로 충분한지 검증이 필요합니다.
65
+ - adapter state/session lifecycle 설계가 필요합니다.
66
+
67
+ 판정: 권장 구현 방향입니다.
68
+
69
+ ### Option D: Unofficial HTTP Adapter
70
+
71
+ 조건:
72
+
73
+ - Kiro 내부 endpoint, auth, request/response schema를 reverse engineer해야 합니다.
74
+
75
+ 장점:
76
+
77
+ - 성공하면 가장 provider답게 동작할 수 있습니다.
78
+
79
+ 단점:
80
+
81
+ - 공식 지원이 없습니다.
82
+ - 약관 및 계정 리스크가 큽니다.
83
+ - Kiro 변경에 쉽게 깨집니다.
84
+
85
+ 판정: 기본 구현에서 제외합니다.
86
+
87
+ ### Option E: OpenCode Plugin with Custom Fetch
88
+
89
+ 조건:
90
+
91
+ - OpenCode provider는 `@ai-sdk/openai-compatible`로 등록합니다.
92
+ - plugin `auth.loader`가 `baseURL`과 custom `fetch`를 반환합니다.
93
+ - custom `fetch`에서 OpenAI-compatible request를 Kiro/CodeWhisperer request로 변환합니다.
94
+
95
+ 참고 구현:
96
+
97
+ - `tickernelz/opencode-kiro-auth`
98
+
99
+ 장점:
100
+
101
+ - 사용자는 OpenCode에서 일반 provider처럼 사용할 수 있습니다.
102
+ - OpenCode의 model selection, variants, auth flow와 잘 맞습니다.
103
+ - 별도 server 없이 plugin 하나로 배포할 수 있습니다.
104
+
105
+ 단점:
106
+
107
+ - Kiro/CodeWhisperer request 변환을 직접 유지보수해야 합니다.
108
+ - Kiro 내부 API 또는 AWS SDK 동작 변경에 민감합니다.
109
+ - 모델 목록이 정적으로 굳으면 빠르게 깨질 수 있습니다.
110
+
111
+ 판정: OpenCode plugin UX를 목표로 할 때 가장 직접적인 구현 후보입니다.
112
+
113
+ ## Model List Strategy
114
+
115
+ 모델 목록은 Kiro 쪽 변경이 잦을 수 있으므로 하드코딩 whitelist에 의존하지 않습니다.
116
+
117
+ 권장 resolver pipeline:
118
+
119
+ 1. Alias
120
+ - 사용자가 원하는 별칭을 실제 모델 ID로 매핑합니다.
121
+ - 예: `kiro-auto` -> `auto`, `sonnet` -> `claude-sonnet-4.6`
122
+
123
+ 2. Normalize
124
+ - client마다 다른 이름 형식을 Kiro 형식으로 정규화합니다.
125
+ - 예: `claude-sonnet-4-6` -> `claude-sonnet-4.6`
126
+ - 예: `claude-sonnet-4-6-20260101` -> `claude-sonnet-4.6`
127
+ - 예: `claude-4.6-sonnet-high` -> `claude-sonnet-4.6`
128
+
129
+ 3. Dynamic cache
130
+ - Kiro model list API 또는 CLI discovery 결과를 TTL cache에 저장합니다.
131
+ - cache가 비어 있거나 stale이면 refresh를 시도합니다.
132
+ - refresh 실패 시 fallback preset을 사용하되 경고를 남깁니다.
133
+
134
+ 4. Hidden/manual models
135
+ - 공식 list에는 없지만 동작하는 모델을 user config로 추가할 수 있게 합니다.
136
+ - display ID와 internal ID를 분리합니다.
137
+
138
+ 5. Optimistic pass-through
139
+ - cache에 없는 모델도 즉시 거절하지 않습니다.
140
+ - 정규화한 ID를 Kiro에 보내고 Kiro API/CLI가 최종 판정하게 합니다.
141
+ - 실패 시 같은 family의 사용 가능한 모델을 suggestion으로 제공합니다.
142
+
143
+ 필수 config knobs:
144
+
145
+ ```json
146
+ {
147
+ "kiro": {
148
+ "modelCacheTtlSeconds": 21600,
149
+ "modelDiscovery": "auto",
150
+ "modelAliases": {
151
+ "kiro-auto": "auto"
152
+ },
153
+ "hiddenModels": {
154
+ "claude-3.7-sonnet": "CLAUDE_3_7_SONNET_20250219_V1_0"
155
+ },
156
+ "disableModelPassThrough": false
157
+ }
158
+ }
159
+ ```
160
+
161
+ 설계 원칙:
162
+
163
+ - fallback preset은 마지막 안전망이지 truth source가 아닙니다.
164
+ - `SUPPORTED_MODELS` 같은 상수는 UI 표시와 tests용으로만 사용하고 runtime validation에는 쓰지 않습니다.
165
+ - 새 모델 출시는 config 업데이트 없이 pass-through로 먼저 사용할 수 있어야 합니다.
166
+ - `/models` 또는 OpenCode provider model list는 cache + hidden + alias를 합친 view를 반환합니다.
167
+
168
+ ## Proposed Scaffold
169
+
170
+ ```txt
171
+ src/
172
+ index.ts # OpenCode plugin export
173
+ config.ts # options, env, validation
174
+ kiro-cli.ts # kiro-cli discovery, version, whoami
175
+ acp-client.ts # JSON-RPC over stdio client
176
+ chat-adapter.ts # no-interactive fallback
177
+ models.ts # fallback presets and metadata defaults
178
+ model-resolver.ts # alias, normalization, dynamic cache, hidden models, pass-through
179
+ model-cache.ts # TTL cache and refresh coordination
180
+ errors.ts # error normalization
181
+ test/
182
+ config.test.ts
183
+ kiro-cli.test.ts
184
+ acp-client.test.ts
185
+ chat-adapter.test.ts
186
+ model-resolver.test.ts
187
+ model-cache.test.ts
188
+ fixtures/
189
+ acp-initialize.json
190
+ acp-agent-message-chunk.json
191
+ acp-tool-call.json
192
+ list-models.json
193
+ ```
194
+
195
+ ## MVP Scope
196
+
197
+ 1. Plugin initialization
198
+ - verify `kiro-cli` exists
199
+ - expose clear diagnostic errors
200
+ - do not read Kiro private token files
201
+
202
+ 2. Auth handling
203
+ - prefer `KIRO_API_KEY`
204
+ - fallback to `kiro-cli whoami`
205
+ - show login guidance if missing
206
+
207
+ 3. Kiro call path
208
+ - implement `chat --no-interactive` adapter first if ACP mapping is too large
209
+ - record ACP handshake and add ACP adapter behind feature flag
210
+
211
+ 4. OpenCode integration
212
+ - provide config injection or documented config snippet
213
+ - add model resolver with fallback presets
214
+ - expose a custom tool or command for diagnostics
215
+
216
+ 5. Tests
217
+ - subprocess command construction
218
+ - env handling
219
+ - model normalization and pass-through
220
+ - model cache stale/refresh behavior
221
+ - ACP JSON-RPC parsing with fixtures
222
+
223
+ ## Open Questions
224
+
225
+ - Can OpenCode plugin hooks currently replace the actual LLM transport with an ACP-backed adapter without modifying OpenCode core?
226
+ - If not, should this plugin start as a custom tool/command plus config helper, then later move toward provider support?
227
+ - Does current `kiro-cli acp` support non-interactive API key auth reliably under `KIRO_API_KEY`?
228
+ - What is the exact command/flag for listing Kiro models in the installed CLI version?
229
+ - How should OpenCode tool-call requests be represented when Kiro itself wants to use tools?
230
+
231
+ ## Recommended First Milestone
232
+
233
+ Build a diagnostic-only plugin first:
234
+
235
+ - `opencode.json` loads `@bogyie/opencode-kiro-plugin`
236
+ - plugin checks `kiro-cli --version`
237
+ - plugin checks auth with `kiro-cli whoami`
238
+ - plugin exposes a `kiro_status` custom tool
239
+ - plugin documents the Kiro model presets and next adapter path
240
+
241
+ This validates plugin packaging and user environment before committing to the harder ACP/provider transport layer.
@@ -0,0 +1,129 @@
1
+ # Kiro Integration Notes
2
+
3
+ 조사일: 2026-07-07
4
+
5
+ ## What Kiro Exposes Publicly
6
+
7
+ Kiro의 공식 공개 표면은 다음입니다.
8
+
9
+ - Kiro IDE
10
+ - Kiro CLI
11
+ - Kiro Web
12
+ - Kiro ACP agent mode
13
+ - Kiro headless CLI mode
14
+
15
+ 현재 공식 문서에서 확인되는 직접 호출 방식:
16
+
17
+ ```bash
18
+ kiro-cli
19
+ kiro-cli login
20
+ kiro-cli whoami
21
+ kiro-cli chat --no-interactive "prompt"
22
+ kiro-cli chat --no-interactive --trust-all-tools "prompt"
23
+ kiro-cli acp
24
+ ```
25
+
26
+ Headless mode는 `KIRO_API_KEY` 환경 변수를 사용합니다.
27
+
28
+ ```bash
29
+ export KIRO_API_KEY=ksk_xxxxxxxx
30
+ kiro-cli chat --no-interactive "your prompt here"
31
+ ```
32
+
33
+ ## Community API Surface Findings
34
+
35
+ 공식 문서가 직접 LLM API를 설명하지는 않지만, community 구현들은 Kiro/CodeWhisperer 계열 API를 다음 방식으로 사용합니다.
36
+
37
+ - `opencode-kiro-auth`
38
+ - AWS `@aws/codewhisperer-streaming-client` 사용
39
+ - endpoint: `https://q.{region}.amazonaws.com`
40
+ - operation 성격: `generateAssistantResponse`
41
+ - Kiro header: `x-amzn-kiro-agent-mode: vibe`
42
+ - auth refresh endpoints:
43
+ - `https://prod.{region}.auth.desktop.kiro.dev/refreshToken`
44
+ - `https://oidc.{region}.amazonaws.com/token`
45
+ 이 경로들은 실전 구현으로는 유용하지만, 공식 stable API로 문서화된 것은 아니므로 compatibility risk를 별도로 관리해야 합니다.
46
+
47
+ ## Authentication
48
+
49
+ 공식 문서상 지원 인증:
50
+
51
+ - GitHub
52
+ - Google
53
+ - AWS Builder ID
54
+ - AWS IAM Identity Center
55
+ - external identity provider
56
+ - API key for headless mode
57
+
58
+ API key 인증은 Pro, Pro+, Pro Max, Power subscriber 또는 관리자 정책에 따라 사용 가능합니다.
59
+
60
+ 플러그인 구현에서는 Kiro token file을 직접 읽는 방식보다 다음 순서를 권장합니다.
61
+
62
+ 1. `KIRO_API_KEY`가 있으면 headless mode 사용
63
+ 2. 없으면 `kiro-cli whoami`로 login 상태 확인
64
+ 3. 미로그인 상태면 사용자에게 `kiro-cli login` 안내
65
+ 4. 조직/관리자 정책 오류는 그대로 노출
66
+
67
+ ## ACP Mode
68
+
69
+ Kiro는 `kiro-cli acp`로 ACP-compatible agent process를 실행할 수 있습니다.
70
+
71
+ 특성:
72
+
73
+ - transport: stdin/stdout
74
+ - protocol: JSON-RPC 2.0
75
+ - session methods: `initialize`, `session/new`, `session/load`, `session/prompt`, `session/cancel`, `session/set_mode`, `session/set_model`
76
+ - update events: `AgentMessageChunk`, `ToolCall`, `ToolCallUpdate`, `TurnEnd`
77
+
78
+ OpenCode와 연결할 때는 ACP event를 OpenCode model stream 또는 tool event로 변환하는 adapter가 필요합니다.
79
+
80
+ ## Model Notes
81
+
82
+ Kiro 공식 모델 문서와 community 구현에서 확인된 model 후보:
83
+
84
+ - `auto`
85
+ - `claude-opus-4.8`
86
+ - `claude-opus-4.7`
87
+ - `claude-opus-4.6`
88
+ - `claude-opus-4.5`
89
+ - `claude-sonnet-5`
90
+ - `claude-sonnet-4.6`
91
+ - `claude-sonnet-4.5`
92
+ - `claude-sonnet-4.0`
93
+ - `claude-haiku-4.5`
94
+ - `deepseek-3.2`
95
+ - `minimax-m2.5`
96
+ - `minimax-m2.1`
97
+ - `glm-5`
98
+ - `qwen3-coder-next`
99
+ - legacy/internal 후보:
100
+ - `claude-3-7-sonnet`
101
+ - `nova-swe`
102
+ - `gpt-oss-120b`
103
+ - `minimax-m2`
104
+ - `kimi-k2-thinking`
105
+
106
+ 문서화된 context window는 모델별로 다릅니다. 예를 들어 Kiro docs에는 Claude Opus 4.8/4.7/4.6과 Claude Sonnet 5/4.6가 1M context로 표시되고, Claude Sonnet 4.5/4.0 및 Claude Haiku 4.5는 200K context로 표시됩니다.
107
+
108
+ ## Model Flexibility Requirement
109
+
110
+ Kiro 모델 목록은 tier, region, release timing에 따라 바뀔 수 있으므로 static list를 runtime truth로 쓰면 안 됩니다.
111
+
112
+ 필수 동작:
113
+
114
+ - startup 시 model discovery를 시도합니다.
115
+ - discovery 결과는 TTL cache에 저장합니다.
116
+ - cache가 stale이면 background refresh를 시도합니다.
117
+ - refresh 실패 시 fallback preset으로 시작합니다.
118
+ - 사용자가 `hiddenModels`, `modelAliases`, `disabledModels`를 설정할 수 있게 합니다.
119
+ - 알 수 없는 모델은 기본적으로 pass-through합니다.
120
+ - Kiro가 거절한 경우 같은 model family의 후보를 제안합니다.
121
+
122
+ ## Risk Notes
123
+
124
+ - 공식 OpenAI-compatible endpoint가 확인되지 않았습니다.
125
+ - Kiro CLI는 폐쇄 소스입니다.
126
+ - 비공식 endpoint reverse engineering은 약관, 안정성, 계정 리스크가 큽니다.
127
+ - community 구현은 가능성을 보여주지만 공식 API 안정성을 보장하지 않습니다.
128
+ - Free/individual subscriber의 service improvement 정책과 Enterprise 데이터 처리 정책 차이를 README에 명확히 적어야 합니다.
129
+ - Kiro administrator policy가 model access, MCP, web fetch, API key 사용 가능 여부에 영향을 줄 수 있습니다.
@@ -0,0 +1,87 @@
1
+ # OpenCode Provider Notes
2
+
3
+ 조사 기준 upstream: `anomalyco/opencode` commit `9353559088fcb81d02290707e2da2e79d31b9bdc`
4
+
5
+ ## Plugin Loading
6
+
7
+ OpenCode plugin은 별도 manifest 파일이 필수인 구조가 아니라 JavaScript/TypeScript module export 중심입니다.
8
+
9
+ 로딩 경로:
10
+
11
+ - project local: `.opencode/plugins/`
12
+ - global local: `~/.config/opencode/plugins/`
13
+ - npm package: `opencode.json`의 `plugin` 배열
14
+
15
+ 공식 문서상 로드 순서:
16
+
17
+ 1. global config
18
+ 2. project config
19
+ 3. global plugin directory
20
+ 4. project plugin directory
21
+
22
+ npm plugin은 OpenCode 시작 시 Bun으로 설치되고 `~/.cache/opencode/node_modules/`에 cache됩니다.
23
+
24
+ ## Useful Plugin Hooks
25
+
26
+ `@opencode-ai/plugin`의 주요 hook:
27
+
28
+ - `config(input)`: OpenCode config를 수정할 수 있습니다. Kiro provider config 자동 주입 후보입니다.
29
+ - `auth`: `/connect` 흐름에 provider credential 입력 또는 OAuth를 붙일 수 있습니다.
30
+ - `provider`: 기존 catalog provider의 model 목록을 조정하는 데 사용할 수 있습니다.
31
+ - `chat.params`: LLM request parameter를 수정합니다.
32
+ - `chat.headers`: LLM request header를 수정합니다.
33
+ - `shell.env`: shell 실행 환경 변수를 추가합니다.
34
+ - `tool`: custom tool을 추가합니다.
35
+
36
+ 중요한 제약:
37
+
38
+ - source상 `provider` hook은 catalog/database에 이미 존재하는 provider를 대상으로 model 목록을 바꾸는 성격이 강합니다.
39
+ - 완전히 새로운 provider는 `config` hook으로 `provider.kiro`를 추가하거나 사용자가 `opencode.json`에 직접 설정하는 방식이 더 안전합니다.
40
+
41
+ ## Provider Config Shape
42
+
43
+ legacy/current docs 기준 최소 예시:
44
+
45
+ ```json
46
+ {
47
+ "$schema": "https://opencode.ai/config.json",
48
+ "plugin": ["@bogyie/opencode-kiro-plugin"],
49
+ "provider": {
50
+ "kiro": {
51
+ "npm": "@ai-sdk/openai-compatible",
52
+ "name": "Kiro",
53
+ "options": {
54
+ "baseURL": "https://example.invalid/v1",
55
+ "apiKey": "{env:KIRO_API_KEY}"
56
+ },
57
+ "models": {
58
+ "auto": {
59
+ "name": "Kiro Auto",
60
+ "limit": {
61
+ "context": 200000,
62
+ "output": 32000
63
+ }
64
+ }
65
+ }
66
+ }
67
+ },
68
+ "model": "kiro/auto"
69
+ }
70
+ ```
71
+
72
+ 이 config-only 방식은 Kiro가 OpenAI-compatible endpoint를 제공할 때만 유효합니다. 현재 공식 문서상 해당 endpoint가 확인되지 않았으므로 구현 문서에서는 fallback 또는 future path로만 취급합니다.
73
+
74
+ ## Source Pointers
75
+
76
+ - plugin types: `packages/plugin/src/index.ts`
77
+ - provider config schema: `packages/core/src/v1/config/provider.ts`
78
+ - provider loader: `packages/opencode/src/provider/provider.ts`
79
+ - provider auth: `packages/opencode/src/provider/auth.ts`
80
+ - CLI provider command: `packages/opencode/src/cli/cmd/providers.ts`
81
+ - built-in provider plugins: `packages/core/src/plugin/provider/*`
82
+ - OpenAI-compatible plugin: `packages/core/src/plugin/provider/openai-compatible.ts`
83
+ - session runner model support: `packages/core/src/session/runner/model.ts`
84
+
85
+ ## Version Caveat
86
+
87
+ OpenCode 문서와 source에는 legacy `provider`/`plugin` config와 v2 `providers`/`plugins` spec가 함께 보입니다. 초기 플러그인은 README에 지원 OpenCode 버전과 config key를 명시해야 합니다.
@@ -0,0 +1,50 @@
1
+ # References
2
+
3
+ ## OpenCode
4
+
5
+ - OpenCode plugins docs: https://opencode.ai/docs/plugins/
6
+ - OpenCode providers docs: https://opencode.ai/docs/providers/
7
+ - OpenCode ACP docs: https://opencode.ai/docs/acp/
8
+ - OpenCode upstream repo: https://github.com/anomalyco/opencode
9
+ - `@opencode-ai/plugin` types: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/packages/plugin/src/index.ts
10
+ - provider config schema: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/packages/core/src/v1/config/provider.ts
11
+ - provider loader: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/packages/opencode/src/provider/provider.ts
12
+ - built-in provider plugins: https://github.com/anomalyco/opencode/tree/9353559088fcb81d02290707e2da2e79d31b9bdc/packages/core/src/plugin/provider
13
+ - OpenAI-compatible plugin: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/packages/core/src/plugin/provider/openai-compatible.ts
14
+ - v2 provider/model spec: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/specs/v2/provider-model.md
15
+ - v2 config spec: https://github.com/anomalyco/opencode/blob/9353559088fcb81d02290707e2da2e79d31b9bdc/specs/v2/config.md
16
+
17
+ ## Kiro
18
+
19
+ - Kiro homepage: https://kiro.dev/
20
+ - Kiro CLI docs: https://kiro.dev/docs/cli/
21
+ - Kiro CLI quick start: https://kiro.dev/docs/cli/quick-start/
22
+ - Kiro headless mode: https://kiro.dev/docs/cli/headless/
23
+ - Kiro authentication: https://kiro.dev/docs/cli/authentication/
24
+ - Kiro ACP: https://kiro.dev/docs/cli/acp/
25
+ - Kiro models: https://kiro.dev/docs/models/
26
+ - Kiro firewall endpoints: https://kiro.dev/docs/privacy-and-security/firewalls/
27
+ - Kiro data protection: https://kiro.dev/docs/privacy-and-security/data-protection/
28
+ - Kiro license: https://kiro.dev/license/
29
+ - AWS Service Terms: https://aws.amazon.com/service-terms/
30
+ - Amazon Q Developer CLI notice: https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line.html
31
+ - Amazon Q Developer CLI repo: https://github.com/aws/amazon-q-developer-cli
32
+ - Kiro CLI latest manifest: https://prod.download.cli.kiro.dev/stable/latest/manifest.json
33
+
34
+ ## AI SDK
35
+
36
+ - OpenAI-compatible provider: https://ai-sdk.dev/providers/openai-compatible-providers
37
+ - Anthropic provider: https://ai-sdk.dev/providers/ai-sdk-providers/anthropic
38
+ - Amazon Bedrock provider: https://ai-sdk.dev/providers/ai-sdk-providers/amazon-bedrock
39
+
40
+ ## Community Examples
41
+
42
+ - OpenCode ecosystem docs: https://opencode.ai/docs/ecosystem/
43
+ - OpenAI Codex auth plugin: https://github.com/numman-ali/opencode-openai-codex-auth
44
+ - Gemini auth plugin: https://github.com/jenslys/opencode-gemini-auth
45
+ - OpenCode plugin template: https://github.com/zenobi-us/opencode-plugin-template
46
+ - OpenCode Kiro auth plugin: https://github.com/tickernelz/opencode-kiro-auth
47
+
48
+ ## License Notes
49
+
50
+ - `tickernelz/opencode-kiro-auth` is MIT licensed.
@@ -0,0 +1,69 @@
1
+ # Research Summary
2
+
3
+ 조사일: 2026-07-07
4
+ 조사 방식: OpenCode/Kiro 공식 문서 확인, OpenCode upstream source 확인, subagent 병렬 조사 결과 통합
5
+
6
+ ## 결론
7
+
8
+ OpenCode에 Kiro를 "provider"로 추가하려면 먼저 provider라는 단어를 두 의미로 나눠야 합니다.
9
+
10
+ 1. OpenCode LLM provider: OpenCode의 모델 호출 계층입니다. `@ai-sdk/openai-compatible`, `@ai-sdk/openai`, `@ai-sdk/anthropic` 같은 AI SDK provider와 `provider` config를 통해 동작합니다.
11
+ 2. Kiro agent provider: Kiro CLI/ACP agent를 OpenCode에서 호출 가능한 backend처럼 사용하는 방식입니다. Kiro가 공개한 공식 통합 표면은 이쪽에 가깝습니다.
12
+
13
+ Kiro가 공식적으로 OpenAI-compatible `/v1/chat/completions`, OpenAI Responses API, Anthropic Messages API 같은 직접 LLM endpoint를 공개하지 않았기 때문에, 현재 시점의 안전한 구현 방향은 Kiro CLI/ACP adapter입니다.
14
+
15
+ ## 핵심 발견
16
+
17
+ OpenCode 쪽:
18
+
19
+ - plugin은 JavaScript/TypeScript module이며 `@opencode-ai/plugin` 타입을 사용할 수 있습니다.
20
+ - local plugin은 `.opencode/plugins/` 또는 `~/.config/opencode/plugins/`에서 자동 로드됩니다.
21
+ - npm plugin은 `opencode.json`의 `plugin` 배열에 package name을 넣어 설치합니다.
22
+ - custom provider는 `provider.<id>.npm`, `provider.<id>.options.baseURL`, `provider.<id>.models`로 설정합니다.
23
+ - source상 plugin hook에는 `config`, `auth`, `provider`, `chat.params`, `chat.headers`, `shell.env` 등이 있습니다.
24
+ - `provider` hook만으로 완전히 새로운 provider를 만드는 것은 제한적입니다. 새 provider는 config에 등록하는 경로가 더 안정적입니다.
25
+
26
+ Kiro 쪽:
27
+
28
+ - Kiro는 AWS가 운영하는 IDE/CLI/Web agentic engineering 제품입니다.
29
+ - 인증은 GitHub, Google, AWS Builder ID, AWS IAM Identity Center, external IdP를 지원합니다.
30
+ - headless/CI는 `KIRO_API_KEY` 환경 변수를 사용하지만 Pro 계열 구독 및 관리자 설정이 필요합니다.
31
+ - 공개 문서에서 직접 LLM API endpoint와 request/response schema는 확인되지 않았습니다.
32
+ - 공식 통합 표면은 `kiro-cli chat`, `kiro-cli chat --no-interactive`, `kiro-cli acp`입니다.
33
+ - ACP 모드는 JSON-RPC 2.0 over stdio로 동작하며 streaming chunk, tool call update, turn end 이벤트를 제공합니다.
34
+
35
+ Community 구현:
36
+
37
+ - `tickernelz/opencode-kiro-auth`는 실제 OpenCode server plugin 형태로 Kiro provider를 등록합니다. `config` hook에서 `provider.kiro`에 `@ai-sdk/openai-compatible`와 base URL을 주입하고, `auth.loader`에서 custom `fetch`를 제공해 OpenCode의 OpenAI-compatible 요청을 Kiro/CodeWhisperer request로 변환합니다.
38
+
39
+ ## 구현 가설
40
+
41
+ 현재 가능한 구현 경로는 다섯 가지입니다.
42
+
43
+ 1. Config-only OpenAI-compatible provider
44
+ - Kiro가 OpenAI-compatible endpoint를 제공한다는 전제가 필요합니다.
45
+ - 현재 공식 문서상 근거가 부족합니다.
46
+
47
+ 2. `kiro-cli chat --no-interactive` subprocess adapter
48
+ - 가장 빠른 MVP 후보입니다.
49
+ - 단점은 OpenCode의 native streaming/tool-call provider와 완전히 같은 UX를 만들기 어렵다는 점입니다.
50
+
51
+ 3. `kiro-cli acp` JSON-RPC adapter
52
+ - 공식 표면을 쓰면서 streaming과 session control을 받을 수 있습니다.
53
+ - OpenCode provider interface에 ACP session events를 매핑하는 설계가 필요합니다.
54
+
55
+ 4. 비공식 HTTP adapter
56
+ - 직접 endpoint를 찾고 request schema를 맞추는 방식입니다.
57
+ - 약관, 안정성, 계정 리스크가 커서 기본 구현에서 제외해야 합니다.
58
+
59
+ 5. OpenCode plugin + custom fetch adapter
60
+ - `opencode-kiro-auth`가 이미 검증한 패턴입니다.
61
+ - OpenCode에는 `@ai-sdk/openai-compatible` provider로 보이게 하고, 실제 fetch에서 Kiro/CodeWhisperer SDK request로 변환합니다.
62
+ - provider UX는 가장 좋지만 비공식 API 및 request 변환 유지보수 부담이 있습니다.
63
+
64
+ ## 다음 액션
65
+
66
+ - `kiro-cli acp`의 JSON-RPC initialize/session flow를 실제로 기록합니다.
67
+ - OpenCode plugin으로 custom tool 또는 command를 추가해 Kiro CLI 호출 MVP를 먼저 만듭니다.
68
+ - 그 다음 OpenCode provider 계층에 붙일 수 있는지 검증합니다.
69
+ - Kiro model metadata는 정적 preset을 fallback으로만 두고, 실제 모델 목록은 discovery/cache/resolver로 보정합니다.
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "plugin": [
4
+ [
5
+ "@bogyie/opencode-kiro-plugin",
6
+ {
7
+ "backend": "auto",
8
+ "region": "us-east-1",
9
+ // Optional direct fetch overrides:
10
+ // "endpoint": "https://q.us-east-1.amazonaws.com",
11
+ // "profileArn": "arn:aws:q:...",
12
+ // "userAgent": "KiroIDE",
13
+ // "agentMode": "vibe",
14
+ "modelCacheTtlSeconds": 21600,
15
+ "modelDiscovery": "auto",
16
+ "modelDiscoveryCommand": [],
17
+ "maxAttempts": 3,
18
+ "requestTimeoutMs": 120000,
19
+ "modelAliases": {
20
+ "sonnet": "claude-sonnet-4.6",
21
+ "opus": "claude-opus-4.6"
22
+ },
23
+ "extraModels": {
24
+ "claude-opus-4-9": {
25
+ "name": "Claude Opus 4.9",
26
+ "limit": { "context": 1000000, "output": 64000 },
27
+ "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] },
28
+ "tool_call": true
29
+ }
30
+ },
31
+ "hiddenModels": {},
32
+ "disabledModels": [],
33
+ "disableModelPassThrough": false,
34
+ "trustAllTools": false
35
+ }
36
+ ]
37
+ ],
38
+ "provider": {
39
+ "kiro": {
40
+ "models": {
41
+ "sonnet": {
42
+ "name": "Claude Sonnet via Kiro"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }