intent-hub 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.
- package/.claude/settings.local.json +7 -0
- package/.turbo/cache/019f5ae385027cb1-meta.json +1 -0
- package/.turbo/cache/019f5ae385027cb1.tar.zst +0 -0
- package/.turbo/cache/040af6112a552a64-meta.json +1 -0
- package/.turbo/cache/040af6112a552a64.tar.zst +0 -0
- package/.turbo/cache/11195eac3ca5c6ce-meta.json +1 -0
- package/.turbo/cache/11195eac3ca5c6ce.tar.zst +0 -0
- package/.turbo/cache/13d11166efdf11cf-meta.json +1 -0
- package/.turbo/cache/13d11166efdf11cf.tar.zst +0 -0
- package/.turbo/cache/19af1af3b136706c-meta.json +1 -0
- package/.turbo/cache/19af1af3b136706c.tar.zst +0 -0
- package/.turbo/cache/1d33efac91c05b50-meta.json +1 -0
- package/.turbo/cache/1d33efac91c05b50.tar.zst +0 -0
- package/.turbo/cache/200b85a612af2d13-meta.json +1 -0
- package/.turbo/cache/200b85a612af2d13.tar.zst +0 -0
- package/.turbo/cache/210308c9ea929858-meta.json +1 -0
- package/.turbo/cache/210308c9ea929858.tar.zst +0 -0
- package/.turbo/cache/38df8e44c617835e-meta.json +1 -0
- package/.turbo/cache/38df8e44c617835e.tar.zst +0 -0
- package/.turbo/cache/3e449de5ef60a7a0-meta.json +1 -0
- package/.turbo/cache/3e449de5ef60a7a0.tar.zst +0 -0
- package/.turbo/cache/51ff024a97c2b4f5-meta.json +1 -0
- package/.turbo/cache/51ff024a97c2b4f5.tar.zst +0 -0
- package/.turbo/cache/54bc756eeebb377a-meta.json +1 -0
- package/.turbo/cache/54bc756eeebb377a.tar.zst +0 -0
- package/.turbo/cache/5ed6a840acafc873-meta.json +1 -0
- package/.turbo/cache/5ed6a840acafc873.tar.zst +0 -0
- package/.turbo/cache/6702dc24e5ca3c2e-meta.json +1 -0
- package/.turbo/cache/6702dc24e5ca3c2e.tar.zst +0 -0
- package/.turbo/cache/725c72cf71ea854f-meta.json +1 -0
- package/.turbo/cache/725c72cf71ea854f.tar.zst +0 -0
- package/.turbo/cache/7344ca28d348037a-meta.json +1 -0
- package/.turbo/cache/7344ca28d348037a.tar.zst +0 -0
- package/.turbo/cache/748fb444cdc0b78c-meta.json +1 -0
- package/.turbo/cache/748fb444cdc0b78c.tar.zst +0 -0
- package/.turbo/cache/789677c36fe7fb98-meta.json +1 -0
- package/.turbo/cache/789677c36fe7fb98.tar.zst +0 -0
- package/.turbo/cache/89ff6c6f38dd4a18-meta.json +1 -0
- package/.turbo/cache/89ff6c6f38dd4a18.tar.zst +0 -0
- package/.turbo/cache/8dbc92d00de0c92e-meta.json +1 -0
- package/.turbo/cache/8dbc92d00de0c92e.tar.zst +0 -0
- package/.turbo/cache/8eb03f40082b9441-meta.json +1 -0
- package/.turbo/cache/8eb03f40082b9441.tar.zst +0 -0
- package/.turbo/cache/9157134d4b916017-meta.json +1 -0
- package/.turbo/cache/9157134d4b916017.tar.zst +0 -0
- package/.turbo/cache/94219ffd32b48e93-meta.json +1 -0
- package/.turbo/cache/94219ffd32b48e93.tar.zst +0 -0
- package/.turbo/cache/95c1d160b4fa84eb-meta.json +1 -0
- package/.turbo/cache/95c1d160b4fa84eb.tar.zst +0 -0
- package/.turbo/cache/998833ea02dfb225-meta.json +1 -0
- package/.turbo/cache/998833ea02dfb225.tar.zst +0 -0
- package/.turbo/cache/a5974ef6ade3eb90-meta.json +1 -0
- package/.turbo/cache/a5974ef6ade3eb90.tar.zst +0 -0
- package/.turbo/cache/aab811809257decb-meta.json +1 -0
- package/.turbo/cache/aab811809257decb.tar.zst +0 -0
- package/.turbo/cache/ab2f82a54da854fd-meta.json +1 -0
- package/.turbo/cache/ab2f82a54da854fd.tar.zst +0 -0
- package/.turbo/cache/abbf4d95d62a7303-meta.json +1 -0
- package/.turbo/cache/abbf4d95d62a7303.tar.zst +0 -0
- package/.turbo/cache/af4441f519f9ce50-meta.json +1 -0
- package/.turbo/cache/af4441f519f9ce50.tar.zst +0 -0
- package/.turbo/cache/b9b85aaaf03d00a6-meta.json +1 -0
- package/.turbo/cache/b9b85aaaf03d00a6.tar.zst +0 -0
- package/.turbo/cache/cd58ee8721bbfed7-meta.json +1 -0
- package/.turbo/cache/cd58ee8721bbfed7.tar.zst +0 -0
- package/.turbo/cache/d285e48b8afa30b5-meta.json +1 -0
- package/.turbo/cache/d285e48b8afa30b5.tar.zst +0 -0
- package/.turbo/cache/d33e90229142acce-meta.json +1 -0
- package/.turbo/cache/d33e90229142acce.tar.zst +0 -0
- package/.turbo/cache/d57839a0d3b04540-meta.json +1 -0
- package/.turbo/cache/d57839a0d3b04540.tar.zst +0 -0
- package/.turbo/cache/d8554ef2c8b6e5eb-meta.json +1 -0
- package/.turbo/cache/d8554ef2c8b6e5eb.tar.zst +0 -0
- package/.turbo/cache/dc7375b51290e102-meta.json +1 -0
- package/.turbo/cache/dc7375b51290e102.tar.zst +0 -0
- package/.turbo/cache/e5310fe547fdbf0a-meta.json +1 -0
- package/.turbo/cache/e5310fe547fdbf0a.tar.zst +0 -0
- package/.turbo/cache/f12bb5f2f188758d-meta.json +1 -0
- package/.turbo/cache/f12bb5f2f188758d.tar.zst +0 -0
- package/.turbo/cache/f2db5af0c0b4d23f-meta.json +1 -0
- package/.turbo/cache/f2db5af0c0b4d23f.tar.zst +0 -0
- package/.turbo/cache/f8935ade01a88cd7-meta.json +1 -0
- package/.turbo/cache/f8935ade01a88cd7.tar.zst +0 -0
- package/.turbo/cache/f982b8dd966f823a-meta.json +1 -0
- package/.turbo/cache/f982b8dd966f823a.tar.zst +0 -0
- package/.turbo/cache/f9d4036dd350ba1a-meta.json +1 -0
- package/.turbo/cache/f9d4036dd350ba1a.tar.zst +0 -0
- package/README.md +661 -0
- package/README_ko.md +577 -0
- package/bun.lock +135 -0
- package/package.json +26 -0
- package/packages/agent/.turbo/turbo-build.log +5 -0
- package/packages/agent/.turbo/turbo-typecheck.log +1 -0
- package/packages/agent/dist/connection/hub-client.d.ts +33 -0
- package/packages/agent/dist/connection/hub-client.d.ts.map +1 -0
- package/packages/agent/dist/connection/index.d.ts +2 -0
- package/packages/agent/dist/connection/index.d.ts.map +1 -0
- package/packages/agent/dist/hooks/index.d.ts +3 -0
- package/packages/agent/dist/hooks/index.d.ts.map +1 -0
- package/packages/agent/dist/hooks/intent-hub-hooks.d.ts +47 -0
- package/packages/agent/dist/hooks/intent-hub-hooks.d.ts.map +1 -0
- package/packages/agent/dist/index.d.ts +6 -0
- package/packages/agent/dist/index.d.ts.map +1 -0
- package/packages/agent/dist/index.js +3315 -0
- package/packages/agent/dist/plugin/index.d.ts +3 -0
- package/packages/agent/dist/plugin/index.d.ts.map +1 -0
- package/packages/agent/dist/plugin/intent-hub-plugin.d.ts +54 -0
- package/packages/agent/dist/plugin/intent-hub-plugin.d.ts.map +1 -0
- package/packages/agent/package.json +32 -0
- package/packages/agent/src/connection/hub-client.ts +152 -0
- package/packages/agent/src/connection/index.ts +1 -0
- package/packages/agent/src/hooks/index.ts +2 -0
- package/packages/agent/src/hooks/intent-hub-hooks.ts +245 -0
- package/packages/agent/src/index.ts +5 -0
- package/packages/agent/src/plugin/index.ts +2 -0
- package/packages/agent/src/plugin/intent-hub-plugin.ts +153 -0
- package/packages/agent/tsconfig.json +9 -0
- package/packages/hub/.turbo/turbo-build.log +6 -0
- package/packages/hub/.turbo/turbo-typecheck.log +1 -0
- package/packages/hub/dist/api/dashboard.d.ts +17 -0
- package/packages/hub/dist/api/dashboard.d.ts.map +1 -0
- package/packages/hub/dist/cli.d.ts +3 -0
- package/packages/hub/dist/cli.d.ts.map +1 -0
- package/packages/hub/dist/cli.js +7719 -0
- package/packages/hub/dist/core/conflict-detector.d.ts +36 -0
- package/packages/hub/dist/core/conflict-detector.d.ts.map +1 -0
- package/packages/hub/dist/core/index.d.ts +7 -0
- package/packages/hub/dist/core/index.d.ts.map +1 -0
- package/packages/hub/dist/core/intent-analyzer.d.ts +8 -0
- package/packages/hub/dist/core/intent-analyzer.d.ts.map +1 -0
- package/packages/hub/dist/core/lock-manager.d.ts +13 -0
- package/packages/hub/dist/core/lock-manager.d.ts.map +1 -0
- package/packages/hub/dist/core/orchestrator.d.ts +46 -0
- package/packages/hub/dist/core/orchestrator.d.ts.map +1 -0
- package/packages/hub/dist/index.d.ts +9 -0
- package/packages/hub/dist/index.d.ts.map +1 -0
- package/packages/hub/dist/index.js +4686 -0
- package/packages/hub/dist/llm/index.d.ts +7 -0
- package/packages/hub/dist/llm/index.d.ts.map +1 -0
- package/packages/hub/dist/llm/negotiation-engine.d.ts +40 -0
- package/packages/hub/dist/llm/negotiation-engine.d.ts.map +1 -0
- package/packages/hub/dist/llm/provider.d.ts +46 -0
- package/packages/hub/dist/llm/provider.d.ts.map +1 -0
- package/packages/hub/dist/llm/smart-analyzer.d.ts +20 -0
- package/packages/hub/dist/llm/smart-analyzer.d.ts.map +1 -0
- package/packages/hub/dist/server/hub-server.d.ts +35 -0
- package/packages/hub/dist/server/hub-server.d.ts.map +1 -0
- package/packages/hub/dist/server/index.d.ts +5 -0
- package/packages/hub/dist/server/index.d.ts.map +1 -0
- package/packages/hub/dist/server/message-handler.d.ts +18 -0
- package/packages/hub/dist/server/message-handler.d.ts.map +1 -0
- package/packages/hub/dist/server/smart-hub-server.d.ts +43 -0
- package/packages/hub/dist/server/smart-hub-server.d.ts.map +1 -0
- package/packages/hub/dist/state/index.d.ts +2 -0
- package/packages/hub/dist/state/index.d.ts.map +1 -0
- package/packages/hub/dist/state/session-manager.d.ts +19 -0
- package/packages/hub/dist/state/session-manager.d.ts.map +1 -0
- package/packages/hub/dist/tunnel/index.d.ts +14 -0
- package/packages/hub/dist/tunnel/index.d.ts.map +1 -0
- package/packages/hub/package.json +54 -0
- package/packages/hub/src/api/dashboard.ts +261 -0
- package/packages/hub/src/cli.ts +193 -0
- package/packages/hub/src/core/conflict-detector.ts +138 -0
- package/packages/hub/src/core/index.ts +6 -0
- package/packages/hub/src/core/intent-analyzer.ts +112 -0
- package/packages/hub/src/core/lock-manager.ts +95 -0
- package/packages/hub/src/core/orchestrator.ts +255 -0
- package/packages/hub/src/index.ts +8 -0
- package/packages/hub/src/llm/index.ts +17 -0
- package/packages/hub/src/llm/negotiation-engine.ts +297 -0
- package/packages/hub/src/llm/provider.ts +175 -0
- package/packages/hub/src/llm/smart-analyzer.ts +169 -0
- package/packages/hub/src/server/hub-server.ts +219 -0
- package/packages/hub/src/server/index.ts +4 -0
- package/packages/hub/src/server/message-handler.ts +111 -0
- package/packages/hub/src/server/smart-hub-server.ts +374 -0
- package/packages/hub/src/state/index.ts +1 -0
- package/packages/hub/src/state/session-manager.ts +59 -0
- package/packages/hub/src/tunnel/index.ts +153 -0
- package/packages/hub/tsconfig.json +9 -0
- package/packages/shared/.turbo/turbo-build.log +5 -0
- package/packages/shared/.turbo/turbo-typecheck.log +1 -0
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +50 -0
- package/packages/shared/dist/types/domain.d.ts +50 -0
- package/packages/shared/dist/types/domain.d.ts.map +1 -0
- package/packages/shared/dist/types/index.d.ts +4 -0
- package/packages/shared/dist/types/index.d.ts.map +1 -0
- package/packages/shared/dist/types/intent.d.ts +24 -0
- package/packages/shared/dist/types/intent.d.ts.map +1 -0
- package/packages/shared/dist/types/message.d.ts +151 -0
- package/packages/shared/dist/types/message.d.ts.map +1 -0
- package/packages/shared/dist/utils/id.d.ts +6 -0
- package/packages/shared/dist/utils/id.d.ts.map +1 -0
- package/packages/shared/dist/utils/index.d.ts +3 -0
- package/packages/shared/dist/utils/index.d.ts.map +1 -0
- package/packages/shared/dist/utils/message.d.ts +5 -0
- package/packages/shared/dist/utils/message.d.ts.map +1 -0
- package/packages/shared/package.json +33 -0
- package/packages/shared/src/index.ts +2 -0
- package/packages/shared/src/types/domain.ts +57 -0
- package/packages/shared/src/types/index.ts +3 -0
- package/packages/shared/src/types/intent.ts +34 -0
- package/packages/shared/src/types/message.ts +188 -0
- package/packages/shared/src/utils/id.ts +21 -0
- package/packages/shared/src/utils/index.ts +2 -0
- package/packages/shared/src/utils/message.ts +30 -0
- package/packages/shared/tsconfig.json +9 -0
- package/scripts/test-e2e.ts +194 -0
- package/scripts/test-mvp2.ts +167 -0
- package/scripts/test-mvp3.ts +405 -0
- package/tsconfig.json +19 -0
- package/turbo.json +22 -0
package/README_ko.md
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
# Intent Hub
|
|
2
|
+
|
|
3
|
+
**팀 기반 LLM 협업 플랫폼 - 시맨틱 충돌 해결 시스템**
|
|
4
|
+
|
|
5
|
+
> 여러 개발자가 AI 코딩 에이전트를 동시에 사용하면 코드 충돌이 발생합니다. Intent Hub는 이 문제를 **시맨틱 레벨**에서 조율하여 - 충돌이 발생하기 전에 해결합니다.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
╔═══════════════════════════════════════════════════════════════╗
|
|
9
|
+
║ ██╗███╗ ██╗████████╗███████╗███╗ ██╗████████╗ ║
|
|
10
|
+
║ ██║████╗ ██║╚══██╔══╝██╔════╝████╗ ██║╚══██╔══╝ ║
|
|
11
|
+
║ ██║██╔██╗ ██║ ██║ █████╗ ██╔██╗ ██║ ██║ ║
|
|
12
|
+
║ ██║██║╚██╗██║ ██║ ██╔══╝ ██║╚██╗██║ ██║ ║
|
|
13
|
+
║ ██║██║ ╚████║ ██║ ███████╗██║ ╚████║ ██║ ║
|
|
14
|
+
║ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ║
|
|
15
|
+
║ HUB ║
|
|
16
|
+
╚═══════════════════════════════════════════════════════════════╝
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
[English](README.md) | 한국어
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 목차
|
|
24
|
+
|
|
25
|
+
- [문제 상황](#문제-상황)
|
|
26
|
+
- [해결책](#해결책)
|
|
27
|
+
- [빠른 시작](#빠른-시작)
|
|
28
|
+
- [LLM 에이전트를 위한 설치 가이드](#llm-에이전트를-위한-설치-가이드)
|
|
29
|
+
- [팀 협업 가이드](#팀-협업-가이드)
|
|
30
|
+
- [통합 방법](#통합-방법)
|
|
31
|
+
- [작동 원리](#작동-원리)
|
|
32
|
+
- [설정](#설정)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 문제 상황
|
|
37
|
+
|
|
38
|
+
AI 코딩 어시스턴트(Cursor, GitHub Copilot, OpenCode 등)를 사용하는 현대 팀에서:
|
|
39
|
+
|
|
40
|
+
- **앨리스**가 AI에게 "OAuth 로그인 구현해줘"라고 요청
|
|
41
|
+
- **밥**이 AI에게 "세션 관리 추가해줘"라고 요청
|
|
42
|
+
- 두 AI가 동시에 `src/auth/*`를 수정
|
|
43
|
+
- **결과**: 머지 충돌, 작업 손실, 좌절
|
|
44
|
+
|
|
45
|
+
기존의 파일 레벨 락은 작동하지 않습니다:
|
|
46
|
+
1. AI 에이전트들은 서로의 존재를 모름
|
|
47
|
+
2. 시맨틱 겹침이 항상 파일 기반이 아님
|
|
48
|
+
3. "auth"와 "session"이 같은 파일을 건드리지 않아도 개념적으로 연관됨
|
|
49
|
+
|
|
50
|
+
## 해결책
|
|
51
|
+
|
|
52
|
+
Intent Hub는 **시맨틱 락**을 도입합니다 - 파일 레벨이 아닌 도메인 레벨(`auth`, `payment`, `user`)에서 잠금을 수행합니다.
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
┌─────────────┐ WebSocket ┌─────────────┐
|
|
56
|
+
│ 앨리스의 │◄──────────────────►│ │
|
|
57
|
+
│ AI 에이전트 │ │ Intent │
|
|
58
|
+
├─────────────┤ │ Hub │
|
|
59
|
+
│ 밥의 │◄──────────────────►│ 서버 │
|
|
60
|
+
│ AI 에이전트 │ │ │
|
|
61
|
+
├─────────────┤ │ (중앙 │
|
|
62
|
+
│ 캐롤의 │◄──────────────────►│ 조율기) │
|
|
63
|
+
│ AI 에이전트 │ │ │
|
|
64
|
+
└─────────────┘ └─────────────┘
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 주요 기능
|
|
68
|
+
|
|
69
|
+
- **스마트 의도 분석**: LLM 기반으로 각 개발자가 무엇을 하려는지 이해
|
|
70
|
+
- **시맨틱 도메인 잠금**: 파일이 아닌 개념적 영역을 잠금
|
|
71
|
+
- **LLM 협상**: 충돌 발생 시 AI 에이전트들이 해결책을 협상
|
|
72
|
+
- **자동 해결**: 호환 가능한 변경사항은 자동으로 진행
|
|
73
|
+
- **인간 에스컬레이션**: 호환 불가능한 변경은 개발자에게 결정 요청
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 빠른 시작
|
|
78
|
+
|
|
79
|
+
### 🚀 Live Share 모드 (팀 권장)
|
|
80
|
+
|
|
81
|
+
**VS Code Live Share처럼** - 한 명이 호스트하고, 다른 사람들은 링크로 참여. 네트워크 설정 불필요!
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 1. 설치
|
|
85
|
+
git clone https://github.com/your-org/intent-hub.git && cd intent-hub
|
|
86
|
+
bun install && bun run build
|
|
87
|
+
|
|
88
|
+
# 2. Live Share 모드로 시작
|
|
89
|
+
bun run packages/hub/dist/cli.js --share --llm=openai
|
|
90
|
+
|
|
91
|
+
# 출력:
|
|
92
|
+
# ╔═══════════════════════════════════════════════════════════════╗
|
|
93
|
+
# ║ 🔗 SHARE YOUR SESSION ║
|
|
94
|
+
# ╠═══════════════════════════════════════════════════════════════╣
|
|
95
|
+
# ║ Team members can connect using: ║
|
|
96
|
+
# ║ wss://intent-hub-a1b2c3d4.loca.lt ║
|
|
97
|
+
# ╚═══════════════════════════════════════════════════════════════╝
|
|
98
|
+
|
|
99
|
+
# 3. 이 URL을 팀원들에게 공유하세요!
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
끝! 팀원들은 공유된 URL로 연결 - 방화벽/NAT 설정 필요 없음.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### 필수 조건
|
|
107
|
+
|
|
108
|
+
- [Bun](https://bun.sh/) v1.1.0 이상
|
|
109
|
+
- Node.js 20+ (호환성용)
|
|
110
|
+
|
|
111
|
+
### 설치
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
git clone https://github.com/your-org/intent-hub.git
|
|
115
|
+
cd intent-hub
|
|
116
|
+
bun install
|
|
117
|
+
bun run build
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 허브 서버 시작
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# 🌐 Live Share 모드 (원격 팀용)
|
|
124
|
+
bun run packages/hub/dist/cli.js --share
|
|
125
|
+
|
|
126
|
+
# 🏠 로컬 모드 (같은 네트워크만)
|
|
127
|
+
bun run packages/hub/dist/cli.js
|
|
128
|
+
|
|
129
|
+
# OpenAI 사용
|
|
130
|
+
OPENAI_API_KEY=sk-xxx bun run packages/hub/dist/cli.js --share --llm=openai
|
|
131
|
+
|
|
132
|
+
# Anthropic 사용
|
|
133
|
+
ANTHROPIC_API_KEY=sk-ant-xxx bun run packages/hub/dist/cli.js --share --llm=anthropic
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 서버 옵션
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
사용법:
|
|
140
|
+
intent-hub [options]
|
|
141
|
+
|
|
142
|
+
옵션:
|
|
143
|
+
--port=<number> 포트 번호 (기본값: 9876)
|
|
144
|
+
--host=<string> 바인딩 호스트 (기본값: 0.0.0.0)
|
|
145
|
+
--mode=<mode> 서버 모드: simple | smart (기본값: smart)
|
|
146
|
+
--llm=<provider> LLM 제공자: openai | anthropic | mock (기본값: mock)
|
|
147
|
+
--api-key=<key> LLM 제공자 API 키 (또는 환경변수 사용)
|
|
148
|
+
--no-negotiate 자동 협상 비활성화
|
|
149
|
+
--dashboard 웹 대시보드 활성화
|
|
150
|
+
--share Live Share 모드 활성화 (공개 URL, 네트워크 설정 불필요)
|
|
151
|
+
--tunnel=<provider> 터널 제공자: auto | localtunnel | cloudflared (기본값: auto)
|
|
152
|
+
--help 도움말 표시
|
|
153
|
+
|
|
154
|
+
환경변수:
|
|
155
|
+
OPENAI_API_KEY OpenAI API 키
|
|
156
|
+
ANTHROPIC_API_KEY Anthropic API 키
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## LLM 에이전트를 위한 설치 가이드
|
|
162
|
+
|
|
163
|
+
> 이 섹션은 Claude Code, OpenCode, Cursor 등의 AI 코딩 에이전트가 Intent Hub를 설치할 때 참고하는 가이드입니다.
|
|
164
|
+
|
|
165
|
+
### 빠른 설치 (npx)
|
|
166
|
+
|
|
167
|
+
**한 줄 명령어로 공유 세션 시작:**
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Live Share로 Intent Hub 시작 (권장)
|
|
171
|
+
npx intent-hub --share
|
|
172
|
+
|
|
173
|
+
# OpenAI로 스마트 분석 사용
|
|
174
|
+
OPENAI_API_KEY=sk-xxx npx intent-hub --share --llm=openai
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
끝! 출력된 URL을 팀원들에게 공유하세요.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### Step 0: 사용자에게 환경 확인
|
|
182
|
+
|
|
183
|
+
사용자에게 확인하세요:
|
|
184
|
+
- **LLM 제공자**: OpenAI API 키 있나요? Anthropic API 키? 아니면 테스트용 mock?
|
|
185
|
+
|
|
186
|
+
### Step 1: 허브 서버 시작
|
|
187
|
+
|
|
188
|
+
**방법 A: npx (권장 - 설치 불필요):**
|
|
189
|
+
```bash
|
|
190
|
+
# Live Share로 빠른 시작
|
|
191
|
+
npx intent-hub --share
|
|
192
|
+
|
|
193
|
+
# OpenAI 사용
|
|
194
|
+
OPENAI_API_KEY=sk-xxx npx intent-hub --share --llm=openai
|
|
195
|
+
|
|
196
|
+
# Anthropic 사용
|
|
197
|
+
ANTHROPIC_API_KEY=sk-ant-xxx npx intent-hub --share --llm=anthropic
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**방법 B: 전역 설치:**
|
|
201
|
+
```bash
|
|
202
|
+
npm install -g intent-hub
|
|
203
|
+
intent-hub --share --llm=openai
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**방법 C: 소스에서 빌드:**
|
|
207
|
+
```bash
|
|
208
|
+
git clone https://github.com/anthropic-for-korea/intent-hub.git
|
|
209
|
+
cd intent-hub && bun install && bun run build
|
|
210
|
+
bun run packages/hub/dist/cli.js --share
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Step 2: URL 공유
|
|
214
|
+
|
|
215
|
+
`--share`로 서버를 시작하면 출력됨:
|
|
216
|
+
```
|
|
217
|
+
╔═══════════════════════════════════════════════════════════════╗
|
|
218
|
+
║ 🔗 SHARE YOUR SESSION ║
|
|
219
|
+
╠═══════════════════════════════════════════════════════════════╣
|
|
220
|
+
║ Team members can connect using: ║
|
|
221
|
+
║ wss://intent-hub-a1b2c3d4.loca.lt ║
|
|
222
|
+
╚═══════════════════════════════════════════════════════════════╝
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
이 URL을 복사해서 팀원들에게 공유하세요!
|
|
226
|
+
|
|
227
|
+
### Step 3: 에이전트 클라이언트 연결
|
|
228
|
+
|
|
229
|
+
각 팀원의 AI 에이전트가 연결:
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
import { HubClient } from '@anthropic-for-korea/intent-hub-agent';
|
|
233
|
+
|
|
234
|
+
const client = new HubClient({
|
|
235
|
+
hubUrl: 'wss://intent-hub-a1b2c3d4.loca.lt', // 공유받은 URL
|
|
236
|
+
userId: 'unique-user-id',
|
|
237
|
+
username: '사용자이름',
|
|
238
|
+
projectPath: '/path/to/project',
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
client.connect();
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 문제 해결
|
|
245
|
+
|
|
246
|
+
| 증상 | 원인 | 해결책 |
|
|
247
|
+
|------|------|--------|
|
|
248
|
+
| 연결 실패 | 서버 미실행 | `npx intent-hub --share` 실행 |
|
|
249
|
+
| 터널 에러 | 네트워크 문제 | cloudflared 설치 후 `--tunnel=cloudflared` 시도 |
|
|
250
|
+
| LLM 에러 | API 키 없음 | `OPENAI_API_KEY` 또는 `ANTHROPIC_API_KEY` 환경변수 설정 |
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 팀 협업 가이드
|
|
255
|
+
|
|
256
|
+
### 팀에서 Intent Hub 사용하기
|
|
257
|
+
|
|
258
|
+
Intent Hub는 팀 전체가 함께 사용할 때 진정한 가치를 발휘합니다.
|
|
259
|
+
|
|
260
|
+
#### 아키텍처
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
264
|
+
│ 팀 서버 │
|
|
265
|
+
│ ┌────────────────────────────────────────────────────────┐ │
|
|
266
|
+
│ │ Intent Hub Server │ │
|
|
267
|
+
│ │ (ws://team-server:9876) │ │
|
|
268
|
+
│ └────────────────────────────────────────────────────────┘ │
|
|
269
|
+
└──────────────────────────────────────────────────────────────┘
|
|
270
|
+
▲
|
|
271
|
+
│ WebSocket
|
|
272
|
+
┌───────────────────┼───────────────────┐
|
|
273
|
+
│ │ │
|
|
274
|
+
▼ ▼ ▼
|
|
275
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
276
|
+
│ 개발자 A │ │ 개발자 B │ │ 개발자 C │
|
|
277
|
+
│ Claude │ │ OpenCode │ │ Cursor │
|
|
278
|
+
│ Code │ │ │ │ │
|
|
279
|
+
└──────────┘ └──────────┘ └──────────┘
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
#### 설정 방법
|
|
283
|
+
|
|
284
|
+
**1. 팀 서버에서 허브 실행:**
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
# 팀 서버에서 백그라운드로 실행
|
|
288
|
+
nohup bun run packages/hub/dist/cli.js \
|
|
289
|
+
--llm=openai \
|
|
290
|
+
--dashboard \
|
|
291
|
+
--host=0.0.0.0 \
|
|
292
|
+
> intent-hub.log 2>&1 &
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**2. 각 개발자의 AI 에이전트 설정:**
|
|
296
|
+
|
|
297
|
+
개발자들은 자신이 사용하는 AI 에이전트(Claude Code, OpenCode, Cursor 등)에게 다음과 같이 요청하면 됩니다:
|
|
298
|
+
|
|
299
|
+
> "Intent Hub에 연결해줘. 허브 서버 주소는 ws://team-server:9876이고, 내 이름은 [사용자이름]이야."
|
|
300
|
+
|
|
301
|
+
또는 프로젝트 설정 파일에 추가:
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
// .intent-hub.json (프로젝트 루트에 생성)
|
|
305
|
+
{
|
|
306
|
+
"hubUrl": "ws://team-server:9876",
|
|
307
|
+
"autoConnect": true
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
#### LLM을 통한 설치 요청 방법
|
|
312
|
+
|
|
313
|
+
팀원들에게 다음과 같이 안내하세요:
|
|
314
|
+
|
|
315
|
+
> **"Claude Code / OpenCode / Cursor에게 이렇게 말해:"**
|
|
316
|
+
>
|
|
317
|
+
> "Intent Hub 클라이언트를 설치하고 ws://team-server:9876에 연결해줘.
|
|
318
|
+
> 내 userId는 'my-unique-id'이고 이름은 '홍길동'이야.
|
|
319
|
+
> GitHub: https://github.com/your-org/intent-hub"
|
|
320
|
+
|
|
321
|
+
AI 에이전트가 알아서:
|
|
322
|
+
1. 필요한 패키지 설치
|
|
323
|
+
2. 설정 파일 생성
|
|
324
|
+
3. 허브 서버에 연결
|
|
325
|
+
4. 테스트 수행
|
|
326
|
+
|
|
327
|
+
#### 협업 워크플로우
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
331
|
+
│ 협업 시나리오 │
|
|
332
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
333
|
+
│ │
|
|
334
|
+
│ 1. 앨리스: "OAuth 로그인 구현해줘" │
|
|
335
|
+
│ └─> Intent Hub: auth/oauth 도메인 잠금 획득 ✓ │
|
|
336
|
+
│ │
|
|
337
|
+
│ 2. 밥: "세션 관리 추가해줘" │
|
|
338
|
+
│ └─> Intent Hub: auth 도메인 충돌 감지! │
|
|
339
|
+
│ └─> 밥의 AI에게 알림: "앨리스가 auth 작업 중입니다. │
|
|
340
|
+
│ 다른 작업을 먼저 하거나 기다려주세요." │
|
|
341
|
+
│ │
|
|
342
|
+
│ 3. 캐롤: "결제 시스템 리팩토링해줘" │
|
|
343
|
+
│ └─> Intent Hub: payment 도메인 잠금 획득 ✓ │
|
|
344
|
+
│ (auth와 무관하므로 동시 진행 가능) │
|
|
345
|
+
│ │
|
|
346
|
+
│ 4. 앨리스 작업 완료 │
|
|
347
|
+
│ └─> Intent Hub: auth/oauth 잠금 해제 │
|
|
348
|
+
│ └─> 밥의 AI에게 알림: "이제 auth 작업 가능합니다" │
|
|
349
|
+
│ │
|
|
350
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
#### 팀 규모별 권장 설정
|
|
354
|
+
|
|
355
|
+
| 팀 규모 | 서버 위치 | LLM 설정 | 비고 |
|
|
356
|
+
|---------|----------|----------|------|
|
|
357
|
+
| 1-3명 | 로컬 (개발자 중 한 명) | Mock 또는 OpenAI | 간단한 설정 |
|
|
358
|
+
| 4-10명 | 전용 팀 서버 | OpenAI 또는 Anthropic | 안정적인 연결 필요 |
|
|
359
|
+
| 10명+ | 클라우드 (AWS/GCP) | OpenAI + 고가용성 | 프로덕션 수준 |
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## 통합 방법
|
|
364
|
+
|
|
365
|
+
### OpenCode와 통합 (Hooks)
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
import { createIntentHubHooks } from '@intent-hub/agent';
|
|
369
|
+
|
|
370
|
+
const hooks = createIntentHubHooks({
|
|
371
|
+
hubUrl: 'ws://localhost:9876',
|
|
372
|
+
userId: 'alice',
|
|
373
|
+
username: 'Alice',
|
|
374
|
+
projectPath: '/path/to/project',
|
|
375
|
+
onNotification: (event, data) => {
|
|
376
|
+
console.log(`[IntentHub] ${event}:`, data);
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// AI 에이전트의 도구 훅에서:
|
|
381
|
+
// Pre-tool 훅 - 액션이 허용되는지 확인
|
|
382
|
+
const result = await hooks.preToolUse({
|
|
383
|
+
toolName: 'edit',
|
|
384
|
+
toolInput: { filePath: 'src/auth/login.ts', content: '...' },
|
|
385
|
+
sessionId: 'session-123',
|
|
386
|
+
userId: 'alice',
|
|
387
|
+
username: 'Alice',
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
if (!result.allow) {
|
|
391
|
+
console.log(result.message); // 다른 사용자가 도메인을 잠금 중
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// 사용자가 프롬프트를 제출할 때
|
|
395
|
+
const promptResult = await hooks.onUserPromptSubmit('Google OAuth 로그인 추가');
|
|
396
|
+
if (promptResult.message) {
|
|
397
|
+
console.log(promptResult.message); // 잠긴 도메인에 대한 경고
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 프로그래매틱 사용
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
import { HubClient } from '@intent-hub/agent';
|
|
405
|
+
|
|
406
|
+
const client = new HubClient({
|
|
407
|
+
hubUrl: 'ws://localhost:9876',
|
|
408
|
+
userId: 'alice',
|
|
409
|
+
username: 'Alice',
|
|
410
|
+
projectPath: '/path/to/project',
|
|
411
|
+
onConnected: (sessionId) => {
|
|
412
|
+
console.log('연결됨:', sessionId);
|
|
413
|
+
},
|
|
414
|
+
onMessage: (message) => {
|
|
415
|
+
switch (message.type) {
|
|
416
|
+
case 'hub:lock:acquired':
|
|
417
|
+
console.log('잠금 획득:', message.payload.domains);
|
|
418
|
+
break;
|
|
419
|
+
case 'hub:lock:blocked':
|
|
420
|
+
console.log('차단됨:', message.payload.blockedBy);
|
|
421
|
+
break;
|
|
422
|
+
case 'hub:negotiation:start':
|
|
423
|
+
console.log('협상 시작:', message.payload.participants);
|
|
424
|
+
break;
|
|
425
|
+
case 'hub:decision:required':
|
|
426
|
+
console.log('결정 필요:', message.payload.question);
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
client.connect();
|
|
433
|
+
|
|
434
|
+
// 사용자가 프롬프트를 줄 때 의도 제출
|
|
435
|
+
client.submitIntent('Google OAuth 로그인 구현');
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## 작동 원리
|
|
441
|
+
|
|
442
|
+
### 1. 의도 제출
|
|
443
|
+
|
|
444
|
+
개발자가 AI에게 작업을 요청하면:
|
|
445
|
+
```
|
|
446
|
+
사용자: "Google OAuth 로그인 추가해줘"
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
에이전트가 이 의도를 Intent Hub에 제출:
|
|
450
|
+
```typescript
|
|
451
|
+
client.submitIntent('Google OAuth 로그인 추가해줘');
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### 2. 스마트 분석
|
|
455
|
+
|
|
456
|
+
Intent Hub가 LLM을 사용해 의도 분석:
|
|
457
|
+
```json
|
|
458
|
+
{
|
|
459
|
+
"domain": "auth",
|
|
460
|
+
"subdomain": "oauth",
|
|
461
|
+
"affectedFiles": ["src/auth/oauth.ts", "src/auth/providers/google.ts"],
|
|
462
|
+
"semanticTags": ["login", "oauth", "google", "authentication"],
|
|
463
|
+
"estimatedScope": "medium"
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### 3. 충돌 감지
|
|
468
|
+
|
|
469
|
+
시스템이 시맨틱 충돌 확인:
|
|
470
|
+
|
|
471
|
+
| 시나리오 | 결과 |
|
|
472
|
+
|----------|------|
|
|
473
|
+
| 겹침 없음 | **승인** - 즉시 진행 |
|
|
474
|
+
| 같은 도메인, 다른 서브도메인 | **경고** - 주의하며 진행 가능 |
|
|
475
|
+
| 같은 도메인, 같은 서브도메인 | **차단** 또는 **협상** |
|
|
476
|
+
|
|
477
|
+
### 4. 해결
|
|
478
|
+
|
|
479
|
+
**자동 승인:**
|
|
480
|
+
```
|
|
481
|
+
앨리스: auth/oauth ✓
|
|
482
|
+
캐롤: payment ✓ (다른 도메인)
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**차단:**
|
|
486
|
+
```
|
|
487
|
+
앨리스: auth/oauth ✓
|
|
488
|
+
밥: auth/session ⚠️ (같은 도메인 - 앨리스 완료까지 대기)
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**협상 (활성화 시):**
|
|
492
|
+
```
|
|
493
|
+
앨리스: auth/oauth
|
|
494
|
+
밥: auth/session
|
|
495
|
+
→ LLM들이 논의 후 제안: "앨리스가 OAuth 먼저, 밥은 이후에 세션 작업"
|
|
496
|
+
→ 양쪽 사용자에게 계획 알림
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## 시맨틱 도메인
|
|
502
|
+
|
|
503
|
+
Intent Hub는 작업을 자동으로 시맨틱 도메인으로 분류합니다:
|
|
504
|
+
|
|
505
|
+
| 도메인 | 트리거 |
|
|
506
|
+
|--------|--------|
|
|
507
|
+
| `auth` | `/auth/`, `login`, `oauth`, `session`, `jwt` |
|
|
508
|
+
| `user` | `/user/`, `profile`, `account` |
|
|
509
|
+
| `payment` | `/payment/`, `checkout`, `stripe`, `billing` |
|
|
510
|
+
| `api` | `/api/`, `route`, `endpoint` |
|
|
511
|
+
| `ui` | `.tsx`, `.jsx`, `/component` |
|
|
512
|
+
| `database` | `/db/`, `migration`, `schema` |
|
|
513
|
+
| `config` | `config`, `.env` |
|
|
514
|
+
| `test` | `.test.`, `.spec.`, `/test/` |
|
|
515
|
+
|
|
516
|
+
프로젝트 구조에 따라 커스텀 도메인 설정 가능합니다.
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
## 설정
|
|
521
|
+
|
|
522
|
+
### 허브 서버 설정
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
interface SmartHubServerOptions {
|
|
526
|
+
port: number; // WebSocket 포트
|
|
527
|
+
host?: string; // 바인딩 주소 (기본값: 0.0.0.0)
|
|
528
|
+
llmProvider: LLMProvider; // OpenAI, Anthropic, 또는 Mock
|
|
529
|
+
orchestratorConfig?: {
|
|
530
|
+
useLLMAnalysis?: boolean; // 의도 분석에 LLM 사용
|
|
531
|
+
autoNegotiate?: boolean; // 충돌 자동 협상
|
|
532
|
+
conflictThreshold?: 'low' | 'medium' | 'high';
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### 에이전트 설정
|
|
538
|
+
|
|
539
|
+
```typescript
|
|
540
|
+
interface IntentHubHooksConfig {
|
|
541
|
+
hubUrl: string; // 허브 WebSocket URL
|
|
542
|
+
userId: string; // 고유 사용자 식별자
|
|
543
|
+
username: string; // 표시 이름
|
|
544
|
+
projectPath: string; // 프로젝트 루트 경로
|
|
545
|
+
autoConnect?: boolean; // 생성 시 자동 연결 (기본값: true)
|
|
546
|
+
onNotification?: (event: string, data: unknown) => void;
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## 로드맵
|
|
553
|
+
|
|
554
|
+
- [x] **MVP 1**: 기본 도메인 잠금
|
|
555
|
+
- [x] **MVP 2**: LLM 기반 의도 분석 & 협상
|
|
556
|
+
- [x] **MVP 3**: OpenCode 통합 훅
|
|
557
|
+
- [ ] **MVP 4**: 팀 가시성 웹 대시보드
|
|
558
|
+
- [ ] **MVP 5**: 히스토리 & 분석
|
|
559
|
+
- [ ] **MVP 6**: VS Code 확장
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
## 기여하기
|
|
564
|
+
|
|
565
|
+
1. 저장소 포크
|
|
566
|
+
2. 기능 브랜치 생성 (`git checkout -b feature/amazing-feature`)
|
|
567
|
+
3. 변경사항 커밋 (`git commit -m 'Add amazing feature'`)
|
|
568
|
+
4. 브랜치에 푸시 (`git push origin feature/amazing-feature`)
|
|
569
|
+
5. Pull Request 열기
|
|
570
|
+
|
|
571
|
+
## 라이선스
|
|
572
|
+
|
|
573
|
+
MIT License - 자세한 내용은 [LICENSE](LICENSE)를 참조하세요.
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
Intent Hub 팀이 사랑을 담아 만들었습니다. AI 협업이 인간 협업만큼 (혹은 더) 매끄러워야 하니까요.
|