@the-magic-tower/fixhive-opencode-plugin 0.1.5 → 0.1.6
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/LICENSE +21 -0
- package/README.ko.md +359 -58
- package/README.md +347 -46
- package/package.json +4 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Seoul Ventures / The Magic Tower
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ko.md
CHANGED
|
@@ -11,17 +11,31 @@
|
|
|
11
11
|
<a href="README.nl.md">Nederlands</a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
-
>
|
|
14
|
+
<p align="center">
|
|
15
|
+
<a href="https://www.npmjs.com/package/@the-magic-tower/fixhive-opencode-plugin">
|
|
16
|
+
<img src="https://img.shields.io/npm/v/@the-magic-tower/fixhive-opencode-plugin.svg" alt="npm version">
|
|
17
|
+
</a>
|
|
18
|
+
<a href="https://github.com/SeoulVentures/FixHive/actions/workflows/ci.yml">
|
|
19
|
+
<img src="https://github.com/SeoulVentures/FixHive/actions/workflows/ci.yml/badge.svg" alt="CI Status">
|
|
20
|
+
</a>
|
|
21
|
+
<a href="https://opensource.org/licenses/MIT">
|
|
22
|
+
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT">
|
|
23
|
+
</a>
|
|
24
|
+
<img src="https://img.shields.io/badge/Node.js-18%20%7C%2020%20%7C%2022-green" alt="Node.js Version">
|
|
25
|
+
</p>
|
|
15
26
|
|
|
16
|
-
|
|
27
|
+
> 커뮤니티 기반 오류 지식 공유 시스템 - OpenCode 플러그인
|
|
28
|
+
|
|
29
|
+
FixHive는 개발 세션 중 발생하는 오류를 자동으로 감지하고, 커뮤니티 지식 베이스에서 해결책을 검색하며, 해결된 오류를 다른 개발자들과 공유하는 OpenCode 플러그인입니다.
|
|
17
30
|
|
|
18
31
|
## 주요 기능
|
|
19
32
|
|
|
20
|
-
- **자동 오류 감지**: 도구 출력(bash, edit 등)에서
|
|
21
|
-
- **클라우드 지식 베이스**: 시맨틱 유사도
|
|
22
|
-
- **로컬 캐싱**:
|
|
23
|
-
-
|
|
24
|
-
- **실시간 동기화**: 오류/해결 시
|
|
33
|
+
- **자동 오류 감지**: 도구 출력(bash, edit 등)에서 자동으로 오류 감지
|
|
34
|
+
- **클라우드 지식 베이스**: 시맨틱 유사도 검색으로 커뮤니티 솔루션 검색 (pgvector)
|
|
35
|
+
- **로컬 캐싱**: SQLite 기반 로컬 저장소로 오프라인 접근 지원
|
|
36
|
+
- **프라이버시 필터링**: 민감한 데이터 자동 마스킹 (API 키, 경로, 이메일)
|
|
37
|
+
- **실시간 동기화**: 오류/해결 시 즉시 클라우드 통신
|
|
38
|
+
- **중복 방지**: 임베딩과 해시 매칭을 통한 스마트 중복 검사
|
|
25
39
|
|
|
26
40
|
## 설치
|
|
27
41
|
|
|
@@ -41,11 +55,35 @@ export default {
|
|
|
41
55
|
};
|
|
42
56
|
```
|
|
43
57
|
|
|
44
|
-
|
|
58
|
+
**끝입니다!** FixHive는 기본적으로 커뮤니티 지식 베이스에 연결됩니다. 환경 변수 설정이 필요 없습니다.
|
|
59
|
+
|
|
60
|
+
## 작동 원리
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
64
|
+
│ FixHive 흐름도 │
|
|
65
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
66
|
+
│ │
|
|
67
|
+
│ 1. 오류 발생 │
|
|
68
|
+
│ ↓ │
|
|
69
|
+
│ 2. 자동 감지 (tool.execute.after 훅) │
|
|
70
|
+
│ ↓ │
|
|
71
|
+
│ 3. 프라이버시 필터 (API 키, 경로 등 마스킹) │
|
|
72
|
+
│ ↓ │
|
|
73
|
+
│ 4. 로컬 저장 (SQLite) │
|
|
74
|
+
│ ↓ │
|
|
75
|
+
│ 5. 클라우드 검색 (Supabase + pgvector) │
|
|
76
|
+
│ ↓ │
|
|
77
|
+
│ 6. 솔루션 표시 (유사도 & 투표순 정렬) │
|
|
78
|
+
│ ↓ │
|
|
79
|
+
│ 7. 해결 → 커뮤니티 업로드 │
|
|
80
|
+
│ │
|
|
81
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
82
|
+
```
|
|
45
83
|
|
|
46
84
|
## 설정 (선택사항)
|
|
47
85
|
|
|
48
|
-
|
|
86
|
+
환경 변수로 동작 커스터마이징:
|
|
49
87
|
|
|
50
88
|
```bash
|
|
51
89
|
# 커뮤니티 대신 자체 Supabase 인스턴스 사용
|
|
@@ -55,54 +93,187 @@ FIXHIVE_SUPABASE_KEY=your-anon-key
|
|
|
55
93
|
# 시맨틱 검색 활성화 (권장)
|
|
56
94
|
OPENAI_API_KEY=sk-...
|
|
57
95
|
|
|
58
|
-
#
|
|
96
|
+
# 커스텀 기여자 ID (설정하지 않으면 자동 생성)
|
|
59
97
|
FIXHIVE_CONTRIBUTOR_ID=your-contributor-id
|
|
60
98
|
```
|
|
61
99
|
|
|
62
100
|
| 변수 | 기본값 | 설명 |
|
|
63
101
|
|------|--------|------|
|
|
64
102
|
| `FIXHIVE_SUPABASE_URL` | 커뮤니티 DB | Supabase 프로젝트 URL |
|
|
65
|
-
| `FIXHIVE_SUPABASE_KEY` | 커뮤니티
|
|
103
|
+
| `FIXHIVE_SUPABASE_KEY` | 커뮤니티 키 | Supabase anon 키 |
|
|
66
104
|
| `OPENAI_API_KEY` | 없음 | 시맨틱 유사도 검색 활성화 |
|
|
67
105
|
| `FIXHIVE_CONTRIBUTOR_ID` | 자동 생성 | 고유 기여자 ID |
|
|
68
106
|
|
|
69
|
-
## 사용 가능한
|
|
107
|
+
## 사용 가능한 도구
|
|
108
|
+
|
|
109
|
+
### `fixhive_search`
|
|
110
|
+
|
|
111
|
+
지식 베이스에서 오류 해결책 검색.
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// 인자
|
|
115
|
+
{
|
|
116
|
+
errorMessage: string; // 필수: 검색할 오류 메시지
|
|
117
|
+
language?: string; // 선택: 프로그래밍 언어 (typescript, python 등)
|
|
118
|
+
framework?: string; // 선택: 프레임워크 (react, nextjs, express 등)
|
|
119
|
+
limit?: number; // 선택: 최대 결과 수 (기본값: 5)
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**예시:**
|
|
124
|
+
```
|
|
125
|
+
fixhive_search "Cannot find module 'react'" --language typescript --framework nextjs
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `fixhive_resolve`
|
|
129
|
+
|
|
130
|
+
오류를 해결됨으로 표시하고 솔루션 공유.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// 인자
|
|
134
|
+
{
|
|
135
|
+
errorId: string; // 필수: fixhive_list에서 얻은 오류 ID
|
|
136
|
+
resolution: string; // 필수: 오류 해결 방법 설명
|
|
137
|
+
resolutionCode?: string; // 선택: 코드 수정 또는 diff
|
|
138
|
+
upload?: boolean; // 선택: 커뮤니티에 업로드 (기본값: true)
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**예시:**
|
|
143
|
+
```
|
|
144
|
+
fixhive_resolve abc12345 "의존성 누락. npm install react 실행으로 해결"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### `fixhive_list`
|
|
148
|
+
|
|
149
|
+
현재 세션에서 감지된 오류 목록.
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// 인자
|
|
153
|
+
{
|
|
154
|
+
status?: 'unresolved' | 'resolved' | 'uploaded'; // 선택: 상태로 필터링
|
|
155
|
+
limit?: number; // 선택: 최대 결과 수 (기본값: 10)
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### `fixhive_vote`
|
|
160
|
+
|
|
161
|
+
솔루션에 투표.
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// 인자
|
|
165
|
+
{
|
|
166
|
+
knowledgeId: string; // 필수: 지식 항목 ID
|
|
167
|
+
helpful: boolean; // 필수: true는 추천, false는 비추천
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### `fixhive_stats`
|
|
172
|
+
|
|
173
|
+
사용 통계 조회.
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// 인자 없음
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**출력:**
|
|
180
|
+
```markdown
|
|
181
|
+
## FixHive 통계
|
|
182
|
+
|
|
183
|
+
### 로컬
|
|
184
|
+
- 기록된 오류: 42
|
|
185
|
+
- 해결됨: 38
|
|
186
|
+
- 업로드됨: 25
|
|
187
|
+
|
|
188
|
+
### 커뮤니티 기여
|
|
189
|
+
- 공유한 솔루션: 25
|
|
190
|
+
- 내 솔루션이 도움 준 횟수: 156
|
|
191
|
+
- 받은 총 추천: 89
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### `fixhive_helpful`
|
|
195
|
+
|
|
196
|
+
솔루션이 도움이 되었다고 보고.
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// 인자
|
|
200
|
+
{
|
|
201
|
+
knowledgeId: string; // 필수: 도움이 된 지식 항목 ID
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### `fixhive_report`
|
|
206
|
+
|
|
207
|
+
부적절한 콘텐츠 신고.
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// 인자
|
|
211
|
+
{
|
|
212
|
+
knowledgeId: string; // 필수: 신고할 지식 항목 ID
|
|
213
|
+
reason?: string; // 선택: 신고 사유
|
|
214
|
+
}
|
|
215
|
+
```
|
|
70
216
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
| `fixhive_stats` | 사용 통계 조회 |
|
|
78
|
-
| `fixhive_helpful` | 솔루션이 도움됐음을 보고 |
|
|
79
|
-
| `fixhive_report` | 부적절한 콘텐츠 신고 |
|
|
217
|
+
## 예시 워크플로우
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
1. 실패하는 명령 실행
|
|
221
|
+
$ npm run build
|
|
222
|
+
> error TS2307: Cannot find module '@/components/Button'
|
|
80
223
|
|
|
81
|
-
|
|
224
|
+
2. FixHive 자동 동작:
|
|
225
|
+
- 오류 감지
|
|
226
|
+
- 로컬에 기록
|
|
227
|
+
- 솔루션 검색
|
|
228
|
+
- 매칭되는 커뮤니티 솔루션 표시
|
|
82
229
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
4.
|
|
230
|
+
3. 커뮤니티 솔루션의 수정 적용
|
|
231
|
+
$ npm install @/components/Button --save
|
|
232
|
+
|
|
233
|
+
4. 해결 표시 및 공유
|
|
234
|
+
fixhive_resolve <error-id> "tsconfig.json에 경로 별칭 설정 누락. paths 매핑 추가."
|
|
235
|
+
|
|
236
|
+
5. 당신의 솔루션이 다른 개발자들을 돕습니다!
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## 프라이버시
|
|
240
|
+
|
|
241
|
+
FixHive는 공유 전 민감한 정보를 자동으로 필터링합니다:
|
|
242
|
+
|
|
243
|
+
| 카테고리 | 예시 | 대체값 |
|
|
244
|
+
|----------|------|--------|
|
|
245
|
+
| API 키 | `sk-abc123...`, `ghp_xxx...` | `[API_KEY_REDACTED]` |
|
|
246
|
+
| 토큰 | `Bearer eyJ...`, `xoxb-...` | `[TOKEN_REDACTED]` |
|
|
247
|
+
| 이메일 | `user@example.com` | `[EMAIL_REDACTED]` |
|
|
248
|
+
| 경로 | `/Users/john/projects/...` | `~/projects/...` |
|
|
249
|
+
| 환경변수 | `DATABASE_URL=postgres://...` | `[ENV_REDACTED]` |
|
|
250
|
+
| 연결 문자열 | `mongodb://user:pass@...` | `[CONNECTION_STRING_REDACTED]` |
|
|
251
|
+
| IP 주소 | `192.168.1.100` | `[IP_REDACTED]` |
|
|
87
252
|
|
|
88
253
|
## 자체 호스팅 설정 (선택사항)
|
|
89
254
|
|
|
90
|
-
기본 커뮤니티 지식 베이스를
|
|
255
|
+
기본 커뮤니티 지식 베이스를 사용한다면 이 섹션을 건너뛰세요.
|
|
91
256
|
|
|
92
|
-
|
|
257
|
+
### 1. Supabase 프로젝트 생성
|
|
93
258
|
|
|
94
|
-
1. 새
|
|
95
|
-
2.
|
|
259
|
+
1. [supabase.com](https://supabase.com)에서 새 프로젝트 생성 (무료 티어 가능)
|
|
260
|
+
2. 프로젝트가 준비될 때까지 대기
|
|
96
261
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
262
|
+
### 2. pgvector 확장 활성화
|
|
263
|
+
|
|
264
|
+
SQL 에디터에서 실행:
|
|
265
|
+
```sql
|
|
266
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
100
267
|
```
|
|
101
268
|
|
|
102
|
-
3.
|
|
103
|
-
|
|
269
|
+
### 3. 설정 스크립트 실행
|
|
270
|
+
|
|
271
|
+
`scripts/setup-supabase.sql` 내용을 SQL 에디터에서 복사하여 실행.
|
|
272
|
+
|
|
273
|
+
### 4. 환경 설정
|
|
104
274
|
|
|
105
275
|
```bash
|
|
276
|
+
# Settings > API에서 가져오기
|
|
106
277
|
FIXHIVE_SUPABASE_URL=https://your-project.supabase.co
|
|
107
278
|
FIXHIVE_SUPABASE_KEY=your-anon-key
|
|
108
279
|
```
|
|
@@ -110,28 +281,129 @@ FIXHIVE_SUPABASE_KEY=your-anon-key
|
|
|
110
281
|
## 아키텍처
|
|
111
282
|
|
|
112
283
|
```
|
|
113
|
-
|
|
114
|
-
├──
|
|
115
|
-
├──
|
|
116
|
-
├──
|
|
117
|
-
│
|
|
118
|
-
│
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
284
|
+
@the-magic-tower/fixhive-opencode-plugin
|
|
285
|
+
├── src/
|
|
286
|
+
│ ├── plugin/
|
|
287
|
+
│ │ ├── index.ts # 플러그인 정의 (훅)
|
|
288
|
+
│ │ └── tools.ts # 커스텀 도구 (7개)
|
|
289
|
+
│ ├── core/
|
|
290
|
+
│ │ ├── error-detector.ts # 다중 신호 오류 감지
|
|
291
|
+
│ │ ├── privacy-filter.ts # 민감 데이터 마스킹
|
|
292
|
+
│ │ └── hash.ts # 핑거프린팅 & 중복 검사
|
|
293
|
+
│ ├── storage/
|
|
294
|
+
│ │ ├── local-store.ts # SQLite 로컬 저장소
|
|
295
|
+
│ │ └── migrations.ts # 데이터베이스 마이그레이션
|
|
296
|
+
│ ├── cloud/
|
|
297
|
+
│ │ ├── client.ts # Supabase 클라이언트
|
|
298
|
+
│ │ └── embedding.ts # OpenAI 임베딩
|
|
299
|
+
│ └── types/
|
|
300
|
+
│ └── index.ts # TypeScript 정의
|
|
301
|
+
└── scripts/
|
|
302
|
+
└── setup-supabase.sql # 클라우드 스키마
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## API 레퍼런스
|
|
306
|
+
|
|
307
|
+
### TypeScript 타입
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import type {
|
|
311
|
+
LocalErrorRecord,
|
|
312
|
+
CloudKnowledgeEntry,
|
|
313
|
+
ErrorType,
|
|
314
|
+
ErrorStatus,
|
|
315
|
+
Language,
|
|
316
|
+
Severity,
|
|
317
|
+
} from '@the-magic-tower/fixhive-opencode-plugin';
|
|
318
|
+
|
|
319
|
+
// 오류 타입
|
|
320
|
+
type ErrorType =
|
|
321
|
+
| 'runtime' | 'build' | 'lint' | 'test'
|
|
322
|
+
| 'network' | 'permission' | 'dependency'
|
|
323
|
+
| 'syntax' | 'type_error' | 'unknown';
|
|
324
|
+
|
|
325
|
+
// 오류 상태
|
|
326
|
+
type ErrorStatus = 'unresolved' | 'resolved' | 'uploaded';
|
|
327
|
+
|
|
328
|
+
// 지원 언어
|
|
329
|
+
type Language =
|
|
330
|
+
| 'typescript' | 'javascript' | 'python' | 'rust'
|
|
331
|
+
| 'go' | 'java' | 'ruby' | 'php' | 'csharp' | 'cpp' | 'other';
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 프로그래매틱 사용
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
import {
|
|
338
|
+
ErrorDetector,
|
|
339
|
+
PrivacyFilter,
|
|
340
|
+
LocalStore,
|
|
341
|
+
CloudClient,
|
|
342
|
+
createEmbeddingService,
|
|
343
|
+
} from '@the-magic-tower/fixhive-opencode-plugin';
|
|
344
|
+
|
|
345
|
+
// 인스턴스 생성
|
|
346
|
+
const detector = new ErrorDetector();
|
|
347
|
+
const filter = new PrivacyFilter();
|
|
348
|
+
const store = new LocalStore('/path/to/project');
|
|
349
|
+
const cloud = new CloudClient({
|
|
350
|
+
supabaseUrl: 'https://xxx.supabase.co',
|
|
351
|
+
supabaseAnonKey: 'your-key',
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// 오류 감지
|
|
355
|
+
const result = detector.detect({
|
|
356
|
+
tool: 'bash',
|
|
357
|
+
output: 'error TS2307: Cannot find module...',
|
|
358
|
+
exitCode: 1,
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// 콘텐츠 정제
|
|
362
|
+
const sanitized = filter.sanitize('API key: sk-abc123...');
|
|
363
|
+
// { sanitized: 'API key: [API_KEY_REDACTED]', redactedCount: 1, ... }
|
|
364
|
+
|
|
365
|
+
// 솔루션 검색
|
|
366
|
+
const solutions = await cloud.searchSimilar({
|
|
367
|
+
errorMessage: 'Module not found',
|
|
368
|
+
language: 'typescript',
|
|
369
|
+
});
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## 문제 해결
|
|
373
|
+
|
|
374
|
+
### 플러그인이 로드되지 않음
|
|
375
|
+
|
|
376
|
+
OpenCode v1.1.1 이상인지 확인:
|
|
377
|
+
```bash
|
|
378
|
+
npm list @opencode-ai/plugin
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### 솔루션을 찾을 수 없음
|
|
382
|
+
|
|
383
|
+
1. 시맨틱 검색을 위해 `OPENAI_API_KEY`가 설정되어 있는지 확인
|
|
384
|
+
2. 더 넓은 검색어 시도
|
|
385
|
+
3. 희귀한 오류는 커뮤니티 데이터베이스에 솔루션이 아직 없을 수 있음
|
|
386
|
+
|
|
387
|
+
### 프라이버시 우려
|
|
388
|
+
|
|
389
|
+
FixHive는 자동으로 민감한 데이터를 필터링하지만, 클라우드 동기화를 비활성화할 수 있습니다:
|
|
390
|
+
```typescript
|
|
391
|
+
fixhive_resolve <error-id> "내 해결책" --upload false
|
|
122
392
|
```
|
|
123
393
|
|
|
124
|
-
|
|
394
|
+
### SQLite 오류
|
|
125
395
|
|
|
126
|
-
|
|
396
|
+
로컬 데이터베이스 삭제:
|
|
397
|
+
```bash
|
|
398
|
+
rm -rf .fixhive/
|
|
399
|
+
```
|
|
127
400
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
-
|
|
133
|
-
|
|
134
|
-
- IP 주소 (localhost 제외)
|
|
401
|
+
### 연결 오류
|
|
402
|
+
|
|
403
|
+
네트워크와 Supabase 상태 확인:
|
|
404
|
+
```bash
|
|
405
|
+
curl https://your-project.supabase.co/rest/v1/
|
|
406
|
+
```
|
|
135
407
|
|
|
136
408
|
## 개발
|
|
137
409
|
|
|
@@ -150,16 +422,45 @@ npm run typecheck
|
|
|
150
422
|
|
|
151
423
|
# 테스트 실행
|
|
152
424
|
npm test
|
|
425
|
+
|
|
426
|
+
# 커버리지와 함께 테스트 실행
|
|
427
|
+
npm run test:coverage
|
|
153
428
|
```
|
|
154
429
|
|
|
155
|
-
|
|
430
|
+
### 테스트 커버리지
|
|
156
431
|
|
|
157
|
-
|
|
432
|
+
| 모듈 | 커버리지 |
|
|
433
|
+
|------|----------|
|
|
434
|
+
| Core (error-detector, privacy-filter, hash) | 99% |
|
|
435
|
+
| Storage (local-store) | 98% |
|
|
436
|
+
| Cloud (client, embedding) | 96% |
|
|
158
437
|
|
|
159
438
|
## 기여하기
|
|
160
439
|
|
|
161
440
|
1. 저장소 포크
|
|
162
|
-
2. 기능 브랜치 생성
|
|
163
|
-
3.
|
|
164
|
-
4. 브랜치에 푸시
|
|
441
|
+
2. 기능 브랜치 생성 (`git checkout -b feature/amazing`)
|
|
442
|
+
3. 변경사항 커밋 (`git commit -m 'Add amazing feature'`)
|
|
443
|
+
4. 브랜치에 푸시 (`git push origin feature/amazing`)
|
|
165
444
|
5. Pull Request 생성
|
|
445
|
+
|
|
446
|
+
### 가이드라인
|
|
447
|
+
|
|
448
|
+
- 새 기능에 테스트 작성
|
|
449
|
+
- 기존 코드 스타일 따르기
|
|
450
|
+
- 문서 업데이트
|
|
451
|
+
- 커밋은 원자적으로 유지
|
|
452
|
+
|
|
453
|
+
## 변경 로그
|
|
454
|
+
|
|
455
|
+
릴리스 히스토리는 [CHANGELOG.md](CHANGELOG.md)를 참조하세요.
|
|
456
|
+
|
|
457
|
+
## 라이선스
|
|
458
|
+
|
|
459
|
+
MIT - 자세한 내용은 [LICENSE](LICENSE)를 참조하세요.
|
|
460
|
+
|
|
461
|
+
## 감사의 말
|
|
462
|
+
|
|
463
|
+
- [OpenCode](https://github.com/opencode-ai/opencode) - AI 코딩 어시스턴트
|
|
464
|
+
- [Supabase](https://supabase.com) - Backend as a Service
|
|
465
|
+
- [pgvector](https://github.com/pgvector/pgvector) - 벡터 유사도 검색
|
|
466
|
+
- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) - 빠른 SQLite 바인딩
|
package/README.md
CHANGED
|
@@ -11,6 +11,19 @@
|
|
|
11
11
|
<a href="README.nl.md">Nederlands</a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
+
<p align="center">
|
|
15
|
+
<a href="https://www.npmjs.com/package/@the-magic-tower/fixhive-opencode-plugin">
|
|
16
|
+
<img src="https://img.shields.io/npm/v/@the-magic-tower/fixhive-opencode-plugin.svg" alt="npm version">
|
|
17
|
+
</a>
|
|
18
|
+
<a href="https://github.com/SeoulVentures/FixHive/actions/workflows/ci.yml">
|
|
19
|
+
<img src="https://github.com/SeoulVentures/FixHive/actions/workflows/ci.yml/badge.svg" alt="CI Status">
|
|
20
|
+
</a>
|
|
21
|
+
<a href="https://opensource.org/licenses/MIT">
|
|
22
|
+
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT">
|
|
23
|
+
</a>
|
|
24
|
+
<img src="https://img.shields.io/badge/Node.js-18%20%7C%2020%20%7C%2022-green" alt="Node.js Version">
|
|
25
|
+
</p>
|
|
26
|
+
|
|
14
27
|
> Community-based Error Knowledge Sharing for OpenCode
|
|
15
28
|
|
|
16
29
|
FixHive is an OpenCode plugin that automatically captures errors during development sessions, queries a community knowledge base for solutions, and shares resolved errors with other developers.
|
|
@@ -22,6 +35,7 @@ FixHive is an OpenCode plugin that automatically captures errors during developm
|
|
|
22
35
|
- **Local Caching**: SQLite-based local storage for offline access
|
|
23
36
|
- **Privacy Filtering**: Automatically redacts sensitive data (API keys, paths, emails)
|
|
24
37
|
- **Real-time Sync**: Immediate cloud communication on error/resolution
|
|
38
|
+
- **Duplicate Prevention**: Smart deduplication using embeddings and hash matching
|
|
25
39
|
|
|
26
40
|
## Installation
|
|
27
41
|
|
|
@@ -43,6 +57,30 @@ export default {
|
|
|
43
57
|
|
|
44
58
|
**That's it!** FixHive connects to the community knowledge base by default. No environment variables required.
|
|
45
59
|
|
|
60
|
+
## How It Works
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
64
|
+
│ FixHive Flow │
|
|
65
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
66
|
+
│ │
|
|
67
|
+
│ 1. Error Occurs │
|
|
68
|
+
│ ↓ │
|
|
69
|
+
│ 2. Auto Detection (tool.execute.after hook) │
|
|
70
|
+
│ ↓ │
|
|
71
|
+
│ 3. Privacy Filter (redact API keys, paths, etc.) │
|
|
72
|
+
│ ↓ │
|
|
73
|
+
│ 4. Local Storage (SQLite) │
|
|
74
|
+
│ ↓ │
|
|
75
|
+
│ 5. Cloud Search (Supabase + pgvector) │
|
|
76
|
+
│ ↓ │
|
|
77
|
+
│ 6. Display Solutions (ranked by similarity & votes) │
|
|
78
|
+
│ ↓ │
|
|
79
|
+
│ 7. Resolution → Upload to Community │
|
|
80
|
+
│ │
|
|
81
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
46
84
|
## Configuration (Optional)
|
|
47
85
|
|
|
48
86
|
Environment variables to customize behavior:
|
|
@@ -66,43 +104,176 @@ FIXHIVE_CONTRIBUTOR_ID=your-contributor-id
|
|
|
66
104
|
| `OPENAI_API_KEY` | None | Enables semantic similarity search |
|
|
67
105
|
| `FIXHIVE_CONTRIBUTOR_ID` | Auto-generated | Your unique contributor ID |
|
|
68
106
|
|
|
69
|
-
## Available
|
|
107
|
+
## Available Tools
|
|
108
|
+
|
|
109
|
+
### `fixhive_search`
|
|
110
|
+
|
|
111
|
+
Search the knowledge base for error solutions.
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// Arguments
|
|
115
|
+
{
|
|
116
|
+
errorMessage: string; // Required: The error message to search for
|
|
117
|
+
language?: string; // Optional: Programming language (typescript, python, etc.)
|
|
118
|
+
framework?: string; // Optional: Framework (react, nextjs, express, etc.)
|
|
119
|
+
limit?: number; // Optional: Maximum results (default: 5)
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Example:**
|
|
124
|
+
```
|
|
125
|
+
fixhive_search "Cannot find module 'react'" --language typescript --framework nextjs
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `fixhive_resolve`
|
|
129
|
+
|
|
130
|
+
Mark an error as resolved and share the solution.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// Arguments
|
|
134
|
+
{
|
|
135
|
+
errorId: string; // Required: Error ID from fixhive_list
|
|
136
|
+
resolution: string; // Required: Description of how the error was resolved
|
|
137
|
+
resolutionCode?: string; // Optional: Code fix or diff
|
|
138
|
+
upload?: boolean; // Optional: Upload to community (default: true)
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Example:**
|
|
143
|
+
```
|
|
144
|
+
fixhive_resolve abc12345 "Missing dependency. Fixed by running npm install react"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### `fixhive_list`
|
|
148
|
+
|
|
149
|
+
List errors detected in the current session.
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// Arguments
|
|
153
|
+
{
|
|
154
|
+
status?: 'unresolved' | 'resolved' | 'uploaded'; // Optional: Filter by status
|
|
155
|
+
limit?: number; // Optional: Maximum results (default: 10)
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### `fixhive_vote`
|
|
160
|
+
|
|
161
|
+
Upvote or downvote a solution.
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// Arguments
|
|
165
|
+
{
|
|
166
|
+
knowledgeId: string; // Required: Knowledge entry ID
|
|
167
|
+
helpful: boolean; // Required: true for upvote, false for downvote
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### `fixhive_stats`
|
|
172
|
+
|
|
173
|
+
View usage statistics.
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// No arguments required
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Output:**
|
|
180
|
+
```markdown
|
|
181
|
+
## FixHive Statistics
|
|
182
|
+
|
|
183
|
+
### Local
|
|
184
|
+
- Errors recorded: 42
|
|
185
|
+
- Resolved: 38
|
|
186
|
+
- Uploaded: 25
|
|
187
|
+
|
|
188
|
+
### Community Contributions
|
|
189
|
+
- Solutions shared: 25
|
|
190
|
+
- Times your solutions helped: 156
|
|
191
|
+
- Total upvotes received: 89
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### `fixhive_helpful`
|
|
195
|
+
|
|
196
|
+
Report that a solution was helpful.
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// Arguments
|
|
200
|
+
{
|
|
201
|
+
knowledgeId: string; // Required: Knowledge entry ID that helped
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### `fixhive_report`
|
|
206
|
+
|
|
207
|
+
Report inappropriate content.
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// Arguments
|
|
211
|
+
{
|
|
212
|
+
knowledgeId: string; // Required: Knowledge entry ID to report
|
|
213
|
+
reason?: string; // Optional: Reason for reporting
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Example Workflow
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
1. Run a command that fails
|
|
221
|
+
$ npm run build
|
|
222
|
+
> error TS2307: Cannot find module '@/components/Button'
|
|
70
223
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
| `fixhive_vote` | Upvote/downvote a solution |
|
|
77
|
-
| `fixhive_stats` | View usage statistics |
|
|
78
|
-
| `fixhive_helpful` | Report a solution was helpful |
|
|
79
|
-
| `fixhive_report` | Report inappropriate content |
|
|
224
|
+
2. FixHive automatically:
|
|
225
|
+
- Detects the error
|
|
226
|
+
- Records it locally
|
|
227
|
+
- Searches for solutions
|
|
228
|
+
- Displays matching community solutions
|
|
80
229
|
|
|
81
|
-
|
|
230
|
+
3. Apply the fix from community solution
|
|
231
|
+
$ npm install @/components/Button --save
|
|
82
232
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
233
|
+
4. Mark as resolved and share
|
|
234
|
+
fixhive_resolve <error-id> "Missing alias configuration in tsconfig.json. Added paths mapping."
|
|
235
|
+
|
|
236
|
+
5. Your solution helps other developers!
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Privacy
|
|
240
|
+
|
|
241
|
+
FixHive automatically filters sensitive information before sharing:
|
|
242
|
+
|
|
243
|
+
| Category | Examples | Replacement |
|
|
244
|
+
|----------|----------|-------------|
|
|
245
|
+
| API Keys | `sk-abc123...`, `ghp_xxx...` | `[API_KEY_REDACTED]` |
|
|
246
|
+
| Tokens | `Bearer eyJ...`, `xoxb-...` | `[TOKEN_REDACTED]` |
|
|
247
|
+
| Emails | `user@example.com` | `[EMAIL_REDACTED]` |
|
|
248
|
+
| Paths | `/Users/john/projects/...` | `~/projects/...` |
|
|
249
|
+
| Env Vars | `DATABASE_URL=postgres://...` | `[ENV_REDACTED]` |
|
|
250
|
+
| Connection Strings | `mongodb://user:pass@...` | `[CONNECTION_STRING_REDACTED]` |
|
|
251
|
+
| IP Addresses | `192.168.1.100` | `[IP_REDACTED]` |
|
|
87
252
|
|
|
88
253
|
## Self-Hosted Setup (Optional)
|
|
89
254
|
|
|
90
255
|
Skip this section if you're using the default community knowledge base.
|
|
91
256
|
|
|
92
|
-
|
|
257
|
+
### 1. Create Supabase Project
|
|
93
258
|
|
|
94
|
-
1.
|
|
95
|
-
2.
|
|
259
|
+
1. Go to [supabase.com](https://supabase.com) and create a new project (Free tier works)
|
|
260
|
+
2. Wait for the project to be ready
|
|
96
261
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
262
|
+
### 2. Enable pgvector Extension
|
|
263
|
+
|
|
264
|
+
In SQL Editor, run:
|
|
265
|
+
```sql
|
|
266
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
100
267
|
```
|
|
101
268
|
|
|
102
|
-
3.
|
|
103
|
-
|
|
269
|
+
### 3. Run Setup Script
|
|
270
|
+
|
|
271
|
+
Copy and run the contents of `scripts/setup-supabase.sql` in the SQL Editor.
|
|
272
|
+
|
|
273
|
+
### 4. Configure Environment
|
|
104
274
|
|
|
105
275
|
```bash
|
|
276
|
+
# Get these from Settings > API
|
|
106
277
|
FIXHIVE_SUPABASE_URL=https://your-project.supabase.co
|
|
107
278
|
FIXHIVE_SUPABASE_KEY=your-anon-key
|
|
108
279
|
```
|
|
@@ -110,28 +281,129 @@ FIXHIVE_SUPABASE_KEY=your-anon-key
|
|
|
110
281
|
## Architecture
|
|
111
282
|
|
|
112
283
|
```
|
|
113
|
-
|
|
114
|
-
├──
|
|
115
|
-
├──
|
|
116
|
-
├──
|
|
117
|
-
│
|
|
118
|
-
│
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
284
|
+
@the-magic-tower/fixhive-opencode-plugin
|
|
285
|
+
├── src/
|
|
286
|
+
│ ├── plugin/
|
|
287
|
+
│ │ ├── index.ts # Plugin definition (hooks)
|
|
288
|
+
│ │ └── tools.ts # Custom tools (7 tools)
|
|
289
|
+
│ ├── core/
|
|
290
|
+
│ │ ├── error-detector.ts # Multi-signal error detection
|
|
291
|
+
│ │ ├── privacy-filter.ts # Sensitive data redaction
|
|
292
|
+
│ │ └── hash.ts # Fingerprinting & deduplication
|
|
293
|
+
│ ├── storage/
|
|
294
|
+
│ │ ├── local-store.ts # SQLite local storage
|
|
295
|
+
│ │ └── migrations.ts # Database migrations
|
|
296
|
+
│ ├── cloud/
|
|
297
|
+
│ │ ├── client.ts # Supabase client
|
|
298
|
+
│ │ └── embedding.ts # OpenAI embeddings
|
|
299
|
+
│ └── types/
|
|
300
|
+
│ └── index.ts # TypeScript definitions
|
|
301
|
+
└── scripts/
|
|
302
|
+
└── setup-supabase.sql # Cloud schema
|
|
122
303
|
```
|
|
123
304
|
|
|
124
|
-
##
|
|
305
|
+
## API Reference
|
|
125
306
|
|
|
126
|
-
|
|
307
|
+
### TypeScript Types
|
|
127
308
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
309
|
+
```typescript
|
|
310
|
+
import type {
|
|
311
|
+
LocalErrorRecord,
|
|
312
|
+
CloudKnowledgeEntry,
|
|
313
|
+
ErrorType,
|
|
314
|
+
ErrorStatus,
|
|
315
|
+
Language,
|
|
316
|
+
Severity,
|
|
317
|
+
} from '@the-magic-tower/fixhive-opencode-plugin';
|
|
318
|
+
|
|
319
|
+
// Error types
|
|
320
|
+
type ErrorType =
|
|
321
|
+
| 'runtime' | 'build' | 'lint' | 'test'
|
|
322
|
+
| 'network' | 'permission' | 'dependency'
|
|
323
|
+
| 'syntax' | 'type_error' | 'unknown';
|
|
324
|
+
|
|
325
|
+
// Error status
|
|
326
|
+
type ErrorStatus = 'unresolved' | 'resolved' | 'uploaded';
|
|
327
|
+
|
|
328
|
+
// Supported languages
|
|
329
|
+
type Language =
|
|
330
|
+
| 'typescript' | 'javascript' | 'python' | 'rust'
|
|
331
|
+
| 'go' | 'java' | 'ruby' | 'php' | 'csharp' | 'cpp' | 'other';
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Programmatic Usage
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
import {
|
|
338
|
+
ErrorDetector,
|
|
339
|
+
PrivacyFilter,
|
|
340
|
+
LocalStore,
|
|
341
|
+
CloudClient,
|
|
342
|
+
createEmbeddingService,
|
|
343
|
+
} from '@the-magic-tower/fixhive-opencode-plugin';
|
|
344
|
+
|
|
345
|
+
// Create instances
|
|
346
|
+
const detector = new ErrorDetector();
|
|
347
|
+
const filter = new PrivacyFilter();
|
|
348
|
+
const store = new LocalStore('/path/to/project');
|
|
349
|
+
const cloud = new CloudClient({
|
|
350
|
+
supabaseUrl: 'https://xxx.supabase.co',
|
|
351
|
+
supabaseAnonKey: 'your-key',
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// Detect errors
|
|
355
|
+
const result = detector.detect({
|
|
356
|
+
tool: 'bash',
|
|
357
|
+
output: 'error TS2307: Cannot find module...',
|
|
358
|
+
exitCode: 1,
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// Sanitize content
|
|
362
|
+
const sanitized = filter.sanitize('API key: sk-abc123...');
|
|
363
|
+
// { sanitized: 'API key: [API_KEY_REDACTED]', redactedCount: 1, ... }
|
|
364
|
+
|
|
365
|
+
// Search solutions
|
|
366
|
+
const solutions = await cloud.searchSimilar({
|
|
367
|
+
errorMessage: 'Module not found',
|
|
368
|
+
language: 'typescript',
|
|
369
|
+
});
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Troubleshooting
|
|
373
|
+
|
|
374
|
+
### Plugin not loading
|
|
375
|
+
|
|
376
|
+
Make sure you're using OpenCode v1.1.1 or later:
|
|
377
|
+
```bash
|
|
378
|
+
npm list @opencode-ai/plugin
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### No solutions found
|
|
382
|
+
|
|
383
|
+
1. Check if you have `OPENAI_API_KEY` set for semantic search
|
|
384
|
+
2. Try broader search terms
|
|
385
|
+
3. The community database may not have solutions for rare errors yet
|
|
386
|
+
|
|
387
|
+
### Privacy concerns
|
|
388
|
+
|
|
389
|
+
FixHive automatically filters sensitive data, but you can disable cloud sync:
|
|
390
|
+
```typescript
|
|
391
|
+
fixhive_resolve <error-id> "My resolution" --upload false
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### SQLite errors
|
|
395
|
+
|
|
396
|
+
Clear local database:
|
|
397
|
+
```bash
|
|
398
|
+
rm -rf .fixhive/
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Connection errors
|
|
402
|
+
|
|
403
|
+
Check your network and Supabase status:
|
|
404
|
+
```bash
|
|
405
|
+
curl https://your-project.supabase.co/rest/v1/
|
|
406
|
+
```
|
|
135
407
|
|
|
136
408
|
## Development
|
|
137
409
|
|
|
@@ -150,16 +422,45 @@ npm run typecheck
|
|
|
150
422
|
|
|
151
423
|
# Run tests
|
|
152
424
|
npm test
|
|
425
|
+
|
|
426
|
+
# Run tests with coverage
|
|
427
|
+
npm run test:coverage
|
|
153
428
|
```
|
|
154
429
|
|
|
155
|
-
|
|
430
|
+
### Test Coverage
|
|
156
431
|
|
|
157
|
-
|
|
432
|
+
| Module | Coverage |
|
|
433
|
+
|--------|----------|
|
|
434
|
+
| Core (error-detector, privacy-filter, hash) | 99% |
|
|
435
|
+
| Storage (local-store) | 98% |
|
|
436
|
+
| Cloud (client, embedding) | 96% |
|
|
158
437
|
|
|
159
438
|
## Contributing
|
|
160
439
|
|
|
161
440
|
1. Fork the repository
|
|
162
|
-
2. Create your feature branch
|
|
163
|
-
3. Commit your changes
|
|
164
|
-
4. Push to the branch
|
|
441
|
+
2. Create your feature branch (`git checkout -b feature/amazing`)
|
|
442
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
443
|
+
4. Push to the branch (`git push origin feature/amazing`)
|
|
165
444
|
5. Create a Pull Request
|
|
445
|
+
|
|
446
|
+
### Guidelines
|
|
447
|
+
|
|
448
|
+
- Write tests for new features
|
|
449
|
+
- Follow existing code style
|
|
450
|
+
- Update documentation
|
|
451
|
+
- Keep commits atomic
|
|
452
|
+
|
|
453
|
+
## Changelog
|
|
454
|
+
|
|
455
|
+
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
456
|
+
|
|
457
|
+
## License
|
|
458
|
+
|
|
459
|
+
MIT - see [LICENSE](LICENSE) for details.
|
|
460
|
+
|
|
461
|
+
## Acknowledgments
|
|
462
|
+
|
|
463
|
+
- [OpenCode](https://github.com/opencode-ai/opencode) - AI coding assistant
|
|
464
|
+
- [Supabase](https://supabase.com) - Backend as a Service
|
|
465
|
+
- [pgvector](https://github.com/pgvector/pgvector) - Vector similarity search
|
|
466
|
+
- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) - Fast SQLite bindings
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@the-magic-tower/fixhive-opencode-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Community-based error knowledge sharing for OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"@supabase/supabase-js": "^2.45.0",
|
|
48
48
|
"better-sqlite3": "^11.3.0",
|
|
49
49
|
"openai": "^4.60.0",
|
|
50
|
-
"uuid": "^10.0.0"
|
|
50
|
+
"uuid": "^10.0.0",
|
|
51
|
+
"zod": "^3.25.76"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@opencode-ai/plugin": "^1.1.1",
|
|
@@ -60,8 +61,7 @@
|
|
|
60
61
|
"eslint": "^9.0.0",
|
|
61
62
|
"tsup": "^8.2.0",
|
|
62
63
|
"typescript": "^5.5.0",
|
|
63
|
-
"vitest": "^2.0.0"
|
|
64
|
-
"zod": "^4.3.5"
|
|
64
|
+
"vitest": "^2.0.0"
|
|
65
65
|
},
|
|
66
66
|
"engines": {
|
|
67
67
|
"node": ">=20.0.0"
|