@tienne/gestalt 0.5.1 → 0.7.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/README.backup.md +442 -0
- package/README.ko.md +487 -0
- package/README.md +324 -286
- package/dist/package.json +10 -3
- package/dist/review-agents/performance-reviewer/AGENT.md +31 -0
- package/dist/review-agents/quality-reviewer/AGENT.md +31 -0
- package/dist/review-agents/security-reviewer/AGENT.md +32 -0
- package/dist/role-agents/architect/AGENT.md +30 -0
- package/dist/role-agents/backend-developer/AGENT.md +30 -0
- package/dist/role-agents/designer/AGENT.md +30 -0
- package/dist/role-agents/devops-engineer/AGENT.md +30 -0
- package/dist/role-agents/frontend-developer/AGENT.md +30 -0
- package/dist/role-agents/product-planner/AGENT.md +30 -0
- package/dist/role-agents/qa-engineer/AGENT.md +30 -0
- package/dist/role-agents/researcher/AGENT.md +30 -0
- package/dist/role-agents/technical-writer/AGENT.md +212 -0
- package/dist/skills/agent/SKILL.md +102 -0
- package/dist/skills/execute/SKILL.md +274 -6
- package/dist/src/agent/role-agent-registry.d.ts +4 -2
- package/dist/src/agent/role-agent-registry.d.ts.map +1 -1
- package/dist/src/agent/role-agent-registry.js +12 -3
- package/dist/src/agent/role-agent-registry.js.map +1 -1
- package/dist/src/cli/commands/interview.d.ts +5 -1
- package/dist/src/cli/commands/interview.d.ts.map +1 -1
- package/dist/src/cli/commands/interview.js +15 -3
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +3 -0
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +4 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/types.d.ts +28 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/mcp/schemas.d.ts +3 -0
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +2 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +12 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/agent-passthrough.d.ts +7 -0
- package/dist/src/mcp/tools/agent-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/agent-passthrough.js +49 -0
- package/dist/src/mcp/tools/agent-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/interview-passthrough.js +26 -1
- package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/interview.d.ts.map +1 -1
- package/dist/src/mcp/tools/interview.js +26 -1
- package/dist/src/mcp/tools/interview.js.map +1 -1
- package/dist/src/recording/agg-converter.d.ts +25 -0
- package/dist/src/recording/agg-converter.d.ts.map +1 -0
- package/dist/src/recording/agg-converter.js +80 -0
- package/dist/src/recording/agg-converter.js.map +1 -0
- package/dist/src/recording/agg-installer.d.ts +6 -0
- package/dist/src/recording/agg-installer.d.ts.map +1 -0
- package/dist/src/recording/agg-installer.js +50 -0
- package/dist/src/recording/agg-installer.js.map +1 -0
- package/dist/src/recording/asciinema-installer.d.ts +6 -0
- package/dist/src/recording/asciinema-installer.d.ts.map +1 -0
- package/dist/src/recording/asciinema-installer.js +50 -0
- package/dist/src/recording/asciinema-installer.js.map +1 -0
- package/dist/src/recording/asciinema-recorder.d.ts +26 -0
- package/dist/src/recording/asciinema-recorder.d.ts.map +1 -0
- package/dist/src/recording/asciinema-recorder.js +52 -0
- package/dist/src/recording/asciinema-recorder.js.map +1 -0
- package/dist/src/recording/cast-generator.d.ts +7 -0
- package/dist/src/recording/cast-generator.d.ts.map +1 -0
- package/dist/src/recording/cast-generator.js +72 -0
- package/dist/src/recording/cast-generator.js.map +1 -0
- package/dist/src/recording/filename-generator.d.ts +19 -0
- package/dist/src/recording/filename-generator.d.ts.map +1 -0
- package/dist/src/recording/filename-generator.js +67 -0
- package/dist/src/recording/filename-generator.js.map +1 -0
- package/dist/src/recording/gif-generator.d.ts +21 -0
- package/dist/src/recording/gif-generator.d.ts.map +1 -0
- package/dist/src/recording/gif-generator.js +121 -0
- package/dist/src/recording/gif-generator.js.map +1 -0
- package/dist/src/recording/recording-dir.d.ts +5 -0
- package/dist/src/recording/recording-dir.d.ts.map +1 -0
- package/dist/src/recording/recording-dir.js +13 -0
- package/dist/src/recording/recording-dir.js.map +1 -0
- package/dist/src/recording/recording-orchestrator.d.ts +50 -0
- package/dist/src/recording/recording-orchestrator.d.ts.map +1 -0
- package/dist/src/recording/recording-orchestrator.js +98 -0
- package/dist/src/recording/recording-orchestrator.js.map +1 -0
- package/dist/src/recording/resume-detector.d.ts +10 -0
- package/dist/src/recording/resume-detector.d.ts.map +1 -0
- package/dist/src/recording/resume-detector.js +14 -0
- package/dist/src/recording/resume-detector.js.map +1 -0
- package/dist/src/recording/segment-merger.d.ts +27 -0
- package/dist/src/recording/segment-merger.d.ts.map +1 -0
- package/dist/src/recording/segment-merger.js +65 -0
- package/dist/src/recording/segment-merger.js.map +1 -0
- package/dist/src/recording/terminal-recorder.d.ts +31 -0
- package/dist/src/recording/terminal-recorder.d.ts.map +1 -0
- package/dist/src/recording/terminal-recorder.js +111 -0
- package/dist/src/recording/terminal-recorder.js.map +1 -0
- package/dist/src/scripts/postinstall.d.ts +2 -0
- package/dist/src/scripts/postinstall.d.ts.map +1 -0
- package/dist/src/scripts/postinstall.js +27 -0
- package/dist/src/scripts/postinstall.js.map +1 -0
- package/package.json +10 -3
- package/review-agents/performance-reviewer/AGENT.md +31 -0
- package/review-agents/quality-reviewer/AGENT.md +31 -0
- package/review-agents/security-reviewer/AGENT.md +32 -0
- package/role-agents/architect/AGENT.md +30 -0
- package/role-agents/backend-developer/AGENT.md +30 -0
- package/role-agents/designer/AGENT.md +30 -0
- package/role-agents/devops-engineer/AGENT.md +30 -0
- package/role-agents/frontend-developer/AGENT.md +30 -0
- package/role-agents/product-planner/AGENT.md +30 -0
- package/role-agents/qa-engineer/AGENT.md +30 -0
- package/role-agents/researcher/AGENT.md +30 -0
- package/role-agents/technical-writer/AGENT.md +212 -0
- package/skills/agent/SKILL.md +102 -0
- package/skills/execute/SKILL.md +274 -6
package/README.ko.md
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.svg" alt="Gestalt" width="600" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>Gestalt — AI 개발 하네스</strong><br/>
|
|
7
|
+
모호한 요구사항을 구조화된 실행 계획으로 — Claude Code 안에서 바로.
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://www.npmjs.com/package/@tienne/gestalt"><img src="https://img.shields.io/npm/v/@tienne/gestalt" alt="npm version" /></a>
|
|
12
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License" /></a>
|
|
13
|
+
<a href="https://github.com/tienne/gestalt/actions/workflows/ci.yml"><img src="https://github.com/tienne/gestalt/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<a href="./README.md">English</a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Gestalt는 무엇인가요?
|
|
23
|
+
|
|
24
|
+
Gestalt는 Claude Code 안에서 실행되는 MCP(Model Context Protocol) 서버예요. 구조화된 요구사항 인터뷰를 진행해 검증된 **Spec**(목표·제약조건·완료 기준을 담은 JSON 문서)을 만들어요. 그 Spec을 의존성 기반 실행 계획으로 변환할 때 별도 API 키는 필요하지 않아요.
|
|
25
|
+
|
|
26
|
+
> **시작 전 확인** — Node.js >= 20.0.0이 필요해요. `nvm install 22 && nvm use 22`로 설치할 수 있어요.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 실제로 어떻게 작동하나요?
|
|
31
|
+
|
|
32
|
+
> **30초 만에 구조화된 실행 계획** — API 키 없이도 돼요.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Gestalt 기반 요구사항 인터뷰 시작
|
|
36
|
+
/interview "사용자 인증 시스템"
|
|
37
|
+
|
|
38
|
+
# 인터뷰 완료 후 구조화된 Spec 생성
|
|
39
|
+
/spec
|
|
40
|
+
|
|
41
|
+
# Spec을 검증된 실행 계획으로 변환하고 실행
|
|
42
|
+
/execute
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+

|
|
46
|
+
_(데모 영상 준비 중)_
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Gestalt가 해결하는 문제
|
|
51
|
+
|
|
52
|
+
AI에게 무엇을 만들지 설명하는 건 생각보다 어려워요. 방향은 맞는데 세부 구현이 기대와 달라 다시 처음부터 시작하게 되는 일이 생기죠.
|
|
53
|
+
|
|
54
|
+
Gestalt는 코드를 작성하기 전에 요구사항을 함께 구체화해줘요. 게슈탈트 심리학 원리를 토대로 인터뷰를 진행하면서 빠진 요구사항, 핵심 기능, 모순되는 조건을 체계적으로 짚어줘요.
|
|
55
|
+
|
|
56
|
+
인터뷰를 마치면 결과가 **Spec**으로 정리돼요. 목표, 제약조건, 완료 기준을 담은 이 문서가 실행 계획부터 코드 리뷰까지 이후 모든 단계의 기준이 돼요.
|
|
57
|
+
|
|
58
|
+
### 다섯 가지 게슈탈트 원리
|
|
59
|
+
|
|
60
|
+
- **Closure** — 빠진 요구사항과 암묵적 가정을 찾아요
|
|
61
|
+
- **Proximity** — 함께 묶여야 할 기능과 태스크를 식별해요
|
|
62
|
+
- **Similarity** — 요구사항 전반의 반복 패턴을 파악해요
|
|
63
|
+
- **Figure-Ground** — 핵심 MVP(전경)와 선택사항(배경)을 구분해요
|
|
64
|
+
- **Continuity** — 의존성 체인을 검증하고 모순을 감지해요
|
|
65
|
+
|
|
66
|
+
> "전체는 부분의 합보다 크다." — 아리스토텔레스
|
|
67
|
+
|
|
68
|
+
### Passthrough 모드는 어떻게 작동하나요?
|
|
69
|
+
|
|
70
|
+
Gestalt는 **MCP 서버**로 실행돼요. Claude Code를 통해 사용할 경우 Claude Code가 LLM 역할을 담당해요 — Gestalt는 프롬프트와 컨텍스트를 반환하고, 실제 추론은 Claude Code가 수행해요. 서버 자체는 별도 API 호출을 하지 않아요.
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Claude Code
|
|
74
|
+
│
|
|
75
|
+
▼ /interview "주제"
|
|
76
|
+
Gestalt MCP 서버
|
|
77
|
+
(컨텍스트 + 프롬프트 반환)
|
|
78
|
+
│
|
|
79
|
+
▼
|
|
80
|
+
Claude Code가 프롬프트 실행
|
|
81
|
+
(질문 생성, 점수 산출, 계획 수립)
|
|
82
|
+
│
|
|
83
|
+
▼
|
|
84
|
+
Gestalt MCP 서버
|
|
85
|
+
(검증, 상태 저장, 단계 진행)
|
|
86
|
+
│
|
|
87
|
+
▼ 모호성 ≤ 0.2 될 때까지 반복
|
|
88
|
+
최종 Spec → 실행 계획
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`ANTHROPIC_API_KEY`는 필요하지 않아요. 모든 LLM 작업은 Claude Code가 처리해요.
|
|
92
|
+
|
|
93
|
+
> **참고해 주세요** — CLI 직접 실행 모드에서는 `ANTHROPIC_API_KEY`가 필요해요. Claude Code 없이 터미널에서 바로 사용할 경우에만 해당돼요.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 설치
|
|
98
|
+
|
|
99
|
+
### 옵션 1: Claude Code 플러그인 (권장)
|
|
100
|
+
|
|
101
|
+
MCP 서버, 슬래시 커맨드 스킬, Gestalt 에이전트, 프로젝트 컨텍스트를 단일 설치로 묶어서 제공해요.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# 1단계: 마켓플레이스 등록 (최초 1회)
|
|
105
|
+
/plugin marketplace add tienne/gestalt
|
|
106
|
+
|
|
107
|
+
# 2단계: 플러그인 설치
|
|
108
|
+
/plugin install gestalt@gestalt
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
기본 제공 항목:
|
|
112
|
+
|
|
113
|
+
| 항목 | 내용 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| **MCP 도구** | `ges_interview`, `ges_generate_spec`, `ges_execute`, `ges_create_agent`, `ges_agent`, `ges_status` |
|
|
116
|
+
| **슬래시 커맨드** | `/interview`, `/spec`, `/execute`, `/agent` |
|
|
117
|
+
| **에이전트** | Gestalt 파이프라인 에이전트 5개 + Role 에이전트 9개 + Review 에이전트 3개 |
|
|
118
|
+
| **CLAUDE.md** | 프로젝트 컨텍스트 및 MCP 사용 가이드 자동 주입 |
|
|
119
|
+
|
|
120
|
+
> **Node.js >= 20.0.0** 필요 — [nvm](https://github.com/nvm-sh/nvm) 사용 시: `nvm install 22 && nvm use 22`
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### 옵션 2: Claude Code Desktop
|
|
125
|
+
|
|
126
|
+
Claude Code Desktop 설정에서 `settings.json` (또는 `claude_desktop_config.json`)에 추가하세요:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"mcpServers": {
|
|
131
|
+
"gestalt": {
|
|
132
|
+
"command": "npx",
|
|
133
|
+
"args": ["-y", "@tienne/gestalt"]
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Claude Code Desktop을 재시작하면 MCP 도구가 즉시 사용 가능해요. 슬래시 커맨드는 플러그인 설치 또는 별도 스킬 설정이 필요해요.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### 옵션 3: Claude Code CLI
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# claude CLI로 추가
|
|
147
|
+
claude mcp add gestalt -- npx -y @tienne/gestalt
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
또는 `~/.claude/settings.json`을 직접 편집하세요:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"mcpServers": {
|
|
155
|
+
"gestalt": {
|
|
156
|
+
"command": "npx",
|
|
157
|
+
"args": ["-y", "@tienne/gestalt"]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 사용법: 전체 파이프라인
|
|
166
|
+
|
|
167
|
+
### 1단계 — 인터뷰
|
|
168
|
+
|
|
169
|
+
주제를 입력해 인터뷰를 시작하세요. 한 줄짜리 문장도 충분해요.
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
/interview "Stripe로 결제 플로우를 만들고 싶어"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
각 라운드는 특정 모호성 차원을 목표로 진행돼요:
|
|
176
|
+
|
|
177
|
+
- **Closure** — 빠진 요구사항과 말하지 않고 가정한 것을 찾아요
|
|
178
|
+
- **Proximity** — 함께 묶여야 할 기능을 식별해요
|
|
179
|
+
- **Similarity** — 요구사항에 반복되는 패턴을 파악해요
|
|
180
|
+
- **Figure-Ground** — 핵심 MVP와 선택사항을 구분해요
|
|
181
|
+
- **Continuity** — 모순이나 충돌을 검증해요
|
|
182
|
+
|
|
183
|
+
**모호성 점수가 ≤ 0.2에 도달할 때까지** 인터뷰가 계속돼요:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
1라운드 → 모호성: 0.72 (모르는 것이 많음)
|
|
187
|
+
4라운드 → 모호성: 0.45 (점점 명확해짐)
|
|
188
|
+
8라운드 → 모호성: 0.19 ✓ Spec 생성 준비 완료
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### 2단계 — Spec 생성
|
|
194
|
+
|
|
195
|
+
모호성 점수가 ≤ 0.2에 도달하면 실행하세요:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
/spec
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
파이프라인 전체를 구동하는 구조화된 **Spec**을 생성해요:
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
goal → 명확하고 모호성 없는 프로젝트 목표
|
|
205
|
+
constraints → 기술적·비즈니스적 제약 조건
|
|
206
|
+
acceptanceCriteria → 측정 가능한 완료 기준
|
|
207
|
+
ontologySchema → 엔티티-관계 모델 (entities + relations)
|
|
208
|
+
gestaltAnalysis → 게슈탈트 원리별 핵심 발견 사항
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### 3단계 — Execute (계획 + 실행)
|
|
214
|
+
|
|
215
|
+
Spec을 의존성 기반 실행 계획으로 변환하고 실행해요:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
/execute
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Planning 단계**에서 4가지 게슈탈트 원리를 고정 순서로 적용해요:
|
|
222
|
+
|
|
223
|
+
| 단계 | 원리 | 역할 |
|
|
224
|
+
|:---:|-----------|-------------|
|
|
225
|
+
| 1 | **Figure-Ground** | 완료 조건(AC)을 핵심(전경) vs. 보조(배경)로 분류 |
|
|
226
|
+
| 2 | **Closure** | AC를 원자적 태스크로 분해 (암묵적 태스크 포함) |
|
|
227
|
+
| 3 | **Proximity** | 관련 태스크를 도메인별 그룹으로 묶음 |
|
|
228
|
+
| 4 | **Continuity** | 의존성 DAG 검증 — 순환 없음, 위상 정렬 순서 확인 |
|
|
229
|
+
|
|
230
|
+
**Execution 단계**에서 위상 정렬 순서대로 태스크를 실행해요. 각 태스크 후 **Drift Detection**이 Spec과의 정렬 상태를 확인해요:
|
|
231
|
+
|
|
232
|
+
- 3차원 점수: Goal (50%) + Constraint (30%) + Ontology (20%)
|
|
233
|
+
- Jaccard 유사도 기반 측정
|
|
234
|
+
- Threshold를 초과하면 소급 검토가 자동으로 시작돼요
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### 4단계 — Evaluate (평가)
|
|
239
|
+
|
|
240
|
+
실행 후 2단계 평가가 자동으로 실행돼요:
|
|
241
|
+
|
|
242
|
+
| 단계 | 방식 | 실패 시 |
|
|
243
|
+
|:---:|-------|-----------|
|
|
244
|
+
| 1 | **Structural** — lint → build → test 실행 | 단락(short-circuit); 2단계 스킵 |
|
|
245
|
+
| 2 | **Contextual** — LLM이 각 AC + goal alignment 검증 | Evolution Loop 진입 |
|
|
246
|
+
|
|
247
|
+
**성공 조건:** `score ≥ 0.85` AND `goalAlignment ≥ 0.80`
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### 5단계 — Evolve (진화)
|
|
252
|
+
|
|
253
|
+
평가가 실패하면 Evolution Loop가 동작해요. 세 가지 복구 흐름을 제공해요:
|
|
254
|
+
|
|
255
|
+
**Flow A — Structural Fix** (lint/build/test 실패 시)
|
|
256
|
+
```
|
|
257
|
+
evolve_fix → 수정 태스크 제출 → 재평가
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Flow B — Contextual Evolution** (AC 점수 미달 시)
|
|
261
|
+
```
|
|
262
|
+
evolve → Spec 패치 (AC/constraints) → 영향받은 태스크 재실행 → 재평가
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Spec 패치 범위: AC와 constraints는 자유 수정; ontology는 추가/변경만; **goal은 변경 불가**.
|
|
266
|
+
|
|
267
|
+
**Flow C — Lateral Thinking** (스태그네이션 감지 시)
|
|
268
|
+
|
|
269
|
+
종료하는 대신 Lateral Thinking Persona를 순환하며 다른 접근을 시도해요:
|
|
270
|
+
|
|
271
|
+
| 스태그네이션 패턴 | Persona | 전략 |
|
|
272
|
+
|--------------------|---------|---------|
|
|
273
|
+
| Hard cap 도달 | **Multistability** | 다른 각도로 보기 |
|
|
274
|
+
| 진동하는 점수 | **Simplicity** | 단순하게 줄이고 수렴 |
|
|
275
|
+
| 진전 없음 (no drift) | **Reification** | 빠진 것 채우기 |
|
|
276
|
+
| 수익 체감 | **Invariance** | 성공한 패턴 복제 |
|
|
277
|
+
|
|
278
|
+
4개 Persona를 모두 소진하면 세션이 **Human Escalation**으로 종료돼요 — 수동 해결을 위한 구체적인 제안 목록과 함께.
|
|
279
|
+
|
|
280
|
+
**종료 조건:**
|
|
281
|
+
|
|
282
|
+
| 조건 | 트리거 |
|
|
283
|
+
|-----------|---------|
|
|
284
|
+
| `success` | score ≥ 0.85 AND goalAlignment ≥ 0.80 |
|
|
285
|
+
| `stagnation` | 2회 연속 delta < 0.05 |
|
|
286
|
+
| `oscillation` | 2회 연속 점수 역전 |
|
|
287
|
+
| `hard_cap` | structural 3회 + contextual 3회 실패 |
|
|
288
|
+
| `caller` | 수동 종료 |
|
|
289
|
+
| `human_escalation` | 4개 lateral persona 모두 소진 |
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
### 6단계 — Code Review (코드 리뷰)
|
|
294
|
+
|
|
295
|
+
Evolution 완료 후 코드 리뷰 파이프라인이 자동으로 실행돼요:
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
review_start → 에이전트 관점 제출 → 합의 → 자동 수정
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
9개의 내장 **Role 에이전트**가 다중 관점 리뷰를 제공해요:
|
|
302
|
+
|
|
303
|
+
| 에이전트 | 도메인 |
|
|
304
|
+
|-------|--------|
|
|
305
|
+
| `architect` | 시스템 설계, 확장성 |
|
|
306
|
+
| `frontend-developer` | UI, React, 접근성 |
|
|
307
|
+
| `backend-developer` | API, 데이터베이스, 서버 |
|
|
308
|
+
| `devops-engineer` | CI/CD, 인프라, 모니터링 |
|
|
309
|
+
| `qa-engineer` | 테스팅, 품질, 자동화 |
|
|
310
|
+
| `designer` | UX/UI, 디자인 시스템 |
|
|
311
|
+
| `product-planner` | 로드맵, 사용자 스토리, 지표 |
|
|
312
|
+
| `researcher` | 분석, 데이터, 벤치마크 |
|
|
313
|
+
| `technical-writer` | 문서화, API 문서, 가이드, README |
|
|
314
|
+
|
|
315
|
+
3개의 내장 **Review 에이전트**가 코드를 집중 분석해요:
|
|
316
|
+
|
|
317
|
+
| 에이전트 | 집중 영역 |
|
|
318
|
+
|-------|-------|
|
|
319
|
+
| `security-reviewer` | 인젝션, XSS, 인증 취약점, 시크릿 |
|
|
320
|
+
| `performance-reviewer` | 메모리 누수, N+1 쿼리, 번들 크기, 비동기 |
|
|
321
|
+
| `quality-reviewer` | 가독성, SOLID, 에러 핸들링, DRY |
|
|
322
|
+
|
|
323
|
+
파이프라인 밖에서도 `/agent`로 언제든 에이전트를 사용할 수 있어요:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 사용 가능한 에이전트 목록 조회
|
|
327
|
+
/agent
|
|
328
|
+
|
|
329
|
+
# 특정 에이전트로 임의 태스크 실행
|
|
330
|
+
/agent architect "이 코드베이스의 모듈 경계를 리뷰해줘"
|
|
331
|
+
/agent security-reviewer "이 인증 코드의 취약점을 확인해줘"
|
|
332
|
+
/agent technical-writer "이 모듈의 README를 작성해줘"
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
인터뷰 결과에서 커스텀 Role 에이전트를 생성할 수도 있어요:
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
# 인터뷰 완료 후 커스텀 에이전트 생성
|
|
339
|
+
|
|
340
|
+
# 1단계: 에이전트 생성 컨텍스트 요청
|
|
341
|
+
ges_create_agent → action: "start", sessionId: "<id>"
|
|
342
|
+
→ agentContext 반환 (systemPrompt, creationPrompt, schema)
|
|
343
|
+
|
|
344
|
+
# 2단계: 생성한 AGENT.md 내용 제출
|
|
345
|
+
ges_create_agent → action: "submit", sessionId: "<id>", agentContent: "..."
|
|
346
|
+
→ agents/{name}/AGENT.md 생성
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
### 대안: CLI 직접 실행 모드
|
|
352
|
+
|
|
353
|
+
`ANTHROPIC_API_KEY`가 필요해요. Claude Code 없이 터미널에서 직접 실행할 수 있어요:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# 인터랙티브 인터뷰 시작
|
|
357
|
+
npx @tienne/gestalt interview "주제"
|
|
358
|
+
|
|
359
|
+
# 터미널 세션을 GIF로 녹화
|
|
360
|
+
npx @tienne/gestalt interview "주제" --record
|
|
361
|
+
|
|
362
|
+
# 완료된 세션에서 Spec 생성
|
|
363
|
+
npx @tienne/gestalt spec <session-id>
|
|
364
|
+
|
|
365
|
+
# 전체 세션 목록 확인
|
|
366
|
+
npx @tienne/gestalt status
|
|
367
|
+
|
|
368
|
+
# gestalt.json 설정 파일 생성
|
|
369
|
+
npx @tienne/gestalt setup
|
|
370
|
+
|
|
371
|
+
# MCP 서버 수동 시작
|
|
372
|
+
npx @tienne/gestalt serve
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
#### 인터뷰 세션 녹화
|
|
376
|
+
|
|
377
|
+
`--record` (또는 `-r`) 플래그를 추가하면 터미널 세션을 GIF로 녹화할 수 있어요:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
npx @tienne/gestalt interview "주제" --record
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
인터뷰가 완료되면 현재 디렉토리에 GIF 파일이 생성돼요:
|
|
384
|
+
|
|
385
|
+
```
|
|
386
|
+
user-auth-interview-20260327.gif
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
파일명은 LLM이 인터뷰 주제를 기반으로 kebab-case로 생성하고, `YYYYMMDD` 날짜를 붙여요. 외부 바이너리는 필요하지 않아요 — `gifencoder`와 `jimp` npm 패키지만 사용해요.
|
|
390
|
+
|
|
391
|
+
**중단된 세션 이어 녹화:** 녹화 중 세션이 중단되더라도 걱정하지 않아도 돼요. 동일 세션을 다시 실행하면 `.frames` 파일을 자동으로 감지해 이어서 녹화해요. 임시 프레임 데이터는 `.gestalt/recordings/{sessionId}.frames`에 저장되고, GIF 생성이 완료되면 자동으로 삭제돼요.
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## 설정
|
|
396
|
+
|
|
397
|
+
다음 명령어로 `gestalt.json`을 생성하세요. IDE 자동완성을 지원해요.
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
npx @tienne/gestalt setup
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
```json
|
|
404
|
+
{
|
|
405
|
+
"$schema": "./node_modules/@tienne/gestalt/schemas/gestalt.schema.json",
|
|
406
|
+
"llm": {
|
|
407
|
+
"model": "claude-sonnet-4-20250514"
|
|
408
|
+
},
|
|
409
|
+
"interview": {
|
|
410
|
+
"ambiguityThreshold": 0.2,
|
|
411
|
+
"maxRounds": 10
|
|
412
|
+
},
|
|
413
|
+
"execute": {
|
|
414
|
+
"driftThreshold": 0.3,
|
|
415
|
+
"successThreshold": 0.85,
|
|
416
|
+
"goalAlignmentThreshold": 0.80
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**설정 우선순위** (높음 → 낮음): 코드 override → 쉘 환경변수 → `.env` → `gestalt.json` → 기본값
|
|
422
|
+
|
|
423
|
+
잘못된 값은 경고를 출력하고 기본값으로 fallback해요.
|
|
424
|
+
|
|
425
|
+
### 환경변수
|
|
426
|
+
|
|
427
|
+
| 변수 | Config 경로 | 기본값 | 설명 |
|
|
428
|
+
|----------|-------------|---------|-------------|
|
|
429
|
+
| `ANTHROPIC_API_KEY` | `llm.apiKey` | `""` | CLI 직접 모드에서만 필요 |
|
|
430
|
+
| `GESTALT_MODEL` | `llm.model` | `claude-sonnet-4-20250514` | LLM 모델 (provider 모드) |
|
|
431
|
+
| `GESTALT_AMBIGUITY_THRESHOLD` | `interview.ambiguityThreshold` | `0.2` | 인터뷰 완료 임계값 |
|
|
432
|
+
| `GESTALT_MAX_ROUNDS` | `interview.maxRounds` | `10` | 최대 인터뷰 라운드 수 |
|
|
433
|
+
| `GESTALT_DRIFT_THRESHOLD` | `execute.driftThreshold` | `0.3` | 태스크 drift 감지 임계값 |
|
|
434
|
+
| `GESTALT_EVOLVE_SUCCESS_THRESHOLD` | `execute.successThreshold` | `0.85` | Evolution 성공 점수 |
|
|
435
|
+
| `GESTALT_EVOLVE_GOAL_ALIGNMENT_THRESHOLD` | `execute.goalAlignmentThreshold` | `0.80` | Goal alignment 임계값 |
|
|
436
|
+
| `GESTALT_DB_PATH` | `dbPath` | `~/.gestalt/events.db` | SQLite 이벤트 스토어 경로 |
|
|
437
|
+
| `GESTALT_SKILLS_DIR` | `skillsDir` | `skills` | 커스텀 스킬 디렉토리 |
|
|
438
|
+
| `GESTALT_AGENTS_DIR` | `agentsDir` | `agents` | 커스텀 에이전트 디렉토리 |
|
|
439
|
+
| `GESTALT_LOG_LEVEL` | `logLevel` | `info` | 로그 레벨 (`debug`/`info`/`warn`/`error`) |
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## 아키텍처
|
|
444
|
+
|
|
445
|
+

|
|
446
|
+
_(다이어그램 준비 중)_
|
|
447
|
+
|
|
448
|
+
```
|
|
449
|
+
Claude Code
|
|
450
|
+
│
|
|
451
|
+
▼ MCP / stdio transport
|
|
452
|
+
┌──────────────────────────────────┐
|
|
453
|
+
│ Gestalt MCP 서버 │
|
|
454
|
+
│ │
|
|
455
|
+
│ Interview Engine │
|
|
456
|
+
│ ├─ GestaltPrincipleSelector │
|
|
457
|
+
│ ├─ AmbiguityScorer │
|
|
458
|
+
│ └─ SessionManager │
|
|
459
|
+
│ │
|
|
460
|
+
│ Spec Generator │
|
|
461
|
+
│ └─ PassthroughSpecGenerator │
|
|
462
|
+
│ │
|
|
463
|
+
│ Execute Engine │
|
|
464
|
+
│ ├─ DAG Validator │
|
|
465
|
+
│ ├─ DriftDetector │
|
|
466
|
+
│ ├─ EvaluationEngine │
|
|
467
|
+
│ └─ ExecuteSessionManager │
|
|
468
|
+
│ │
|
|
469
|
+
│ Resilience Engine │
|
|
470
|
+
│ ├─ StagnationDetector │
|
|
471
|
+
│ ├─ LateralThinkingPersonas │
|
|
472
|
+
│ └─ HumanEscalation │
|
|
473
|
+
│ │
|
|
474
|
+
│ Agent System │
|
|
475
|
+
│ ├─ RoleAgentRegistry │
|
|
476
|
+
│ ├─ RoleMatchEngine │
|
|
477
|
+
│ └─ RoleConsensusEngine │
|
|
478
|
+
│ │
|
|
479
|
+
│ EventStore (SQLite WAL) │
|
|
480
|
+
└──────────────────────────────────┘
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 라이선스
|
|
486
|
+
|
|
487
|
+
MIT © [tienne](https://github.com/tienne)
|