@tienne/gestalt 0.5.0 → 0.6.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 +466 -0
- package/README.md +315 -283
- package/dist/bin/gestalt.js +8 -0
- package/dist/bin/gestalt.js.map +1 -1
- package/dist/package.json +9 -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 +4 -1
- package/dist/src/cli/commands/interview.d.ts.map +1 -1
- package/dist/src/cli/commands/interview.js +55 -2
- 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 +3 -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/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/recording/filename-generator.d.ts +18 -0
- package/dist/src/recording/filename-generator.d.ts.map +1 -0
- package/dist/src/recording/filename-generator.js +60 -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/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/package.json +9 -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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Invoke a Gestalt agent directly for any task — no pipeline required"
|
|
5
|
+
triggers:
|
|
6
|
+
- "agent"
|
|
7
|
+
- "use agent"
|
|
8
|
+
- "invoke agent"
|
|
9
|
+
- "run agent"
|
|
10
|
+
inputs:
|
|
11
|
+
name:
|
|
12
|
+
type: string
|
|
13
|
+
required: false
|
|
14
|
+
description: "Agent name (e.g. architect, security-reviewer). Omit to list all available agents."
|
|
15
|
+
task:
|
|
16
|
+
type: string
|
|
17
|
+
required: false
|
|
18
|
+
description: "Task or question for the agent to perform"
|
|
19
|
+
outputs:
|
|
20
|
+
- response
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Agent Skill
|
|
24
|
+
|
|
25
|
+
Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# List all available agents
|
|
31
|
+
/agent
|
|
32
|
+
|
|
33
|
+
# Run a Role Agent
|
|
34
|
+
/agent architect "review the module boundaries in this codebase"
|
|
35
|
+
/agent backend-developer "is this REST API design consistent?"
|
|
36
|
+
/agent qa-engineer "what edge cases am I missing for this login flow?"
|
|
37
|
+
/agent frontend-developer "review this React component for accessibility issues"
|
|
38
|
+
|
|
39
|
+
# Run a Review Agent
|
|
40
|
+
/agent security-reviewer "check this authentication code for vulnerabilities"
|
|
41
|
+
/agent performance-reviewer "are there any N+1 queries or memory leaks here?"
|
|
42
|
+
/agent quality-reviewer "review this for readability and maintainability"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Agent Groups
|
|
46
|
+
|
|
47
|
+
**Role Agents** — domain specialists for consultation and advice:
|
|
48
|
+
|
|
49
|
+
| Agent | Domain |
|
|
50
|
+
|-------|--------|
|
|
51
|
+
| `architect` | System design, scalability, design patterns |
|
|
52
|
+
| `backend-developer` | API, database, authentication, server |
|
|
53
|
+
| `frontend-developer` | UI, React, accessibility |
|
|
54
|
+
| `designer` | UX/UI, design systems, interaction |
|
|
55
|
+
| `qa-engineer` | Testing, edge cases, quality |
|
|
56
|
+
| `devops-engineer` | CI/CD, infrastructure, monitoring |
|
|
57
|
+
| `product-planner` | Requirements, roadmap, user stories |
|
|
58
|
+
| `researcher` | Analysis, benchmarks, best practices |
|
|
59
|
+
|
|
60
|
+
**Review Agents** — code review specialists:
|
|
61
|
+
|
|
62
|
+
| Agent | Focus |
|
|
63
|
+
|-------|-------|
|
|
64
|
+
| `security-reviewer` | Injection, XSS, auth vulnerabilities, secrets |
|
|
65
|
+
| `performance-reviewer` | Memory leaks, N+1 queries, bundle size, async |
|
|
66
|
+
| `quality-reviewer` | Readability, SOLID, error handling, DRY |
|
|
67
|
+
|
|
68
|
+
## Instructions
|
|
69
|
+
|
|
70
|
+
### Listing agents
|
|
71
|
+
|
|
72
|
+
When called without a `name` argument:
|
|
73
|
+
|
|
74
|
+
1. Call `ges_agent({ action: "list" })` to retrieve all available agents
|
|
75
|
+
2. Display the results grouped as **Role Agents** and **Review Agents**
|
|
76
|
+
3. For each agent, show name, description, and key domains
|
|
77
|
+
4. Suggest example invocations based on common use cases
|
|
78
|
+
|
|
79
|
+
### Running an agent
|
|
80
|
+
|
|
81
|
+
When called with a `name` and `task`:
|
|
82
|
+
|
|
83
|
+
1. Call `ges_agent({ action: "get", name: "<agent-name>" })` to retrieve the agent definition
|
|
84
|
+
2. If the agent is not found, list available agents and ask the user to choose one
|
|
85
|
+
3. Adopt the agent's `systemPrompt` as your active persona for this response
|
|
86
|
+
4. Perform the task from that agent's specialist perspective
|
|
87
|
+
5. Follow the output format defined in the agent's system prompt (severity levels, structured findings, etc.)
|
|
88
|
+
|
|
89
|
+
### Agent name only, no task
|
|
90
|
+
|
|
91
|
+
When a `name` is provided but no `task`:
|
|
92
|
+
|
|
93
|
+
1. Call `ges_agent({ action: "get", name: "<agent-name>" })` to retrieve the agent
|
|
94
|
+
2. Display the agent's description, domains, and what it can help with
|
|
95
|
+
3. Prompt the user to provide a specific task or question
|
|
96
|
+
|
|
97
|
+
### Partial name matching
|
|
98
|
+
|
|
99
|
+
If the provided name doesn't exactly match (e.g. "security" instead of "security-reviewer"):
|
|
100
|
+
|
|
101
|
+
1. Call `ges_agent({ action: "list" })` to get all agent names
|
|
102
|
+
2. Find the closest match and confirm with the user before proceeding
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: execute
|
|
3
|
-
version: "1.
|
|
3
|
+
version: "1.1.0"
|
|
4
4
|
description: "Gestalt-driven execution planner that transforms a Spec into a validated ExecutionPlan"
|
|
5
5
|
triggers:
|
|
6
6
|
- "execute"
|
|
@@ -17,14 +17,43 @@ outputs:
|
|
|
17
17
|
|
|
18
18
|
# Execute Skill
|
|
19
19
|
|
|
20
|
-
This skill transforms a validated Spec specification into a concrete, dependency-aware Execution Plan
|
|
20
|
+
This skill transforms a validated Spec specification into a concrete, dependency-aware Execution Plan, executes it with multi-perspective Role Agent guidance, and validates the result through a 2-stage evaluation pipeline.
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Full Pipeline
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Planning → Execution → Evaluate → (Evolve if needed)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Phase 1 — Planning
|
|
23
29
|
|
|
24
30
|
1. **Figure-Ground** (Step 1): Classify acceptance criteria as essential (figure) or supplementary (ground), assign priority levels
|
|
25
|
-
2. **Closure** (Step 2): Decompose ACs into atomic tasks,
|
|
26
|
-
3. **Proximity** (Step 3): Group related
|
|
27
|
-
4. **Continuity** (Step 4): Validate the dependency DAG —
|
|
31
|
+
2. **Closure** (Step 2): Decompose ACs into atomic tasks, including implicit sub-tasks
|
|
32
|
+
3. **Proximity** (Step 3): Group related tasks by domain into logical task groups
|
|
33
|
+
4. **Continuity** (Step 4): Validate the dependency DAG — no cycles, clear topological order
|
|
34
|
+
|
|
35
|
+
### Phase 2 — Execution
|
|
36
|
+
|
|
37
|
+
Run tasks in topological order. For each task:
|
|
38
|
+
|
|
39
|
+
1. **Role Match** (optional but recommended): identify which Role Agents are relevant to this task
|
|
40
|
+
2. **Role Consensus**: collect multi-perspective guidance from matched agents
|
|
41
|
+
3. **Execute Task**: perform the task using the role guidance
|
|
42
|
+
|
|
43
|
+
### Phase 3 — Evaluate
|
|
44
|
+
|
|
45
|
+
After all tasks complete, run a 2-stage evaluation:
|
|
46
|
+
|
|
47
|
+
- **Stage 1 (Structural)**: run lint → build → test — short-circuits if any fail
|
|
48
|
+
- **Stage 2 (Contextual)**: LLM validates each AC + goal alignment
|
|
49
|
+
|
|
50
|
+
Success condition: `score ≥ 0.85` AND `goalAlignment ≥ 0.80`
|
|
51
|
+
|
|
52
|
+
### Phase 4 — Evolve (when evaluation fails)
|
|
53
|
+
|
|
54
|
+
- **Flow A — Structural Fix**: fix lint/build/test failures → re-evaluate
|
|
55
|
+
- **Flow B — Contextual Evolution**: patch Spec ACs/constraints → re-execute impacted tasks → re-evaluate
|
|
56
|
+
- **Flow C — Lateral Thinking**: when stagnation detected, rotate through Multistability / Simplicity / Reification / Invariance personas
|
|
28
57
|
|
|
29
58
|
## Passthrough Mode
|
|
30
59
|
|
|
@@ -82,3 +111,242 @@ API 키 없이 MCP 서버 실행 시 자동 활성화. LLM 작업을 caller가
|
|
|
82
111
|
- 각 단계 결과는 이전 단계 데이터와 교차 검증됨
|
|
83
112
|
- Continuity 단계에서는 서버 측 DAG 검증이 추가로 수행됨
|
|
84
113
|
- 모든 AC가 분류되어야 하고, 모든 Task가 그룹에 포함되어야 함
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Phase 2 — Execution
|
|
118
|
+
|
|
119
|
+
### `execute_start` — 실행 시작
|
|
120
|
+
|
|
121
|
+
`plan_complete` 이후 호출. 태스크 목록을 받아 실행 준비.
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{ "action": "execute_start", "sessionId": "..." }
|
|
125
|
+
```
|
|
126
|
+
→ `{ status, sessionId, executionPlan, message }`
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### Role Agent 플로우 (태스크당, 선택적)
|
|
131
|
+
|
|
132
|
+
태스크 내용과 관련된 Role Agent가 있을 경우 role_match → role_consensus 순으로 호출해 guidance를 받는다. 문서 작성, 보안, 성능, 아키텍처 등 전문 영역이 필요한 태스크에 특히 유효하다.
|
|
133
|
+
|
|
134
|
+
**`role_match` — 관련 에이전트 매칭 (2-Call)**
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
// Call 1: 매칭 컨텍스트 요청
|
|
138
|
+
{ "action": "role_match", "sessionId": "..." }
|
|
139
|
+
```
|
|
140
|
+
→ `{ matchContext }` — 어떤 에이전트가 적합한지 판단하기 위한 프롬프트
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
// Call 2: 매칭 결과 제출
|
|
144
|
+
{
|
|
145
|
+
"action": "role_match",
|
|
146
|
+
"sessionId": "...",
|
|
147
|
+
"matchResult": [
|
|
148
|
+
{ "agentName": "technical-writer", "domain": ["documentation"], "relevanceScore": 0.9, "reasoning": "..." },
|
|
149
|
+
{ "agentName": "architect", "domain": ["architecture"], "relevanceScore": 0.7, "reasoning": "..." }
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
→ `{ perspectivePrompts }` — 각 에이전트별 관점 생성 프롬프트
|
|
154
|
+
|
|
155
|
+
**`role_consensus` — 다중 관점 합의 (2-Call)**
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
// Call 1: 각 에이전트 관점 수집 후 제출
|
|
159
|
+
{
|
|
160
|
+
"action": "role_consensus",
|
|
161
|
+
"sessionId": "...",
|
|
162
|
+
"perspectives": [
|
|
163
|
+
{ "agentName": "technical-writer", "perspective": "...", "confidence": 0.9 },
|
|
164
|
+
{ "agentName": "architect", "perspective": "...", "confidence": 0.8 }
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
→ `{ synthesisContext }` — 관점 통합 프롬프트
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
// Call 2: 합성된 합의 제출
|
|
172
|
+
{
|
|
173
|
+
"action": "role_consensus",
|
|
174
|
+
"sessionId": "...",
|
|
175
|
+
"consensus": {
|
|
176
|
+
"consensus": "통합된 가이드라인",
|
|
177
|
+
"conflictResolutions": ["...", "..."],
|
|
178
|
+
"perspectives": [...]
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
→ `{ roleGuidance }` — execute_task 시 참조할 최종 guidance
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
### `execute_task` — 태스크 실행 결과 제출
|
|
187
|
+
|
|
188
|
+
role_match/role_consensus로 얻은 `roleGuidance`를 참조해 태스크를 수행한 후 결과 제출.
|
|
189
|
+
`allTasksCompleted === true`가 될 때까지 반복.
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"action": "execute_task",
|
|
194
|
+
"sessionId": "...",
|
|
195
|
+
"taskResult": {
|
|
196
|
+
"taskId": "task-0",
|
|
197
|
+
"status": "completed",
|
|
198
|
+
"output": "태스크 수행 결과 요약",
|
|
199
|
+
"artifacts": ["path/to/file.ts"]
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
→ `{ status, nextTaskId?, allTasksCompleted, driftResult? }`
|
|
204
|
+
|
|
205
|
+
`driftResult`가 반환되면 Spec과의 drift 경고 — 계속 진행하되 다음 태스크에서 방향 보정.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Phase 3 — Evaluate
|
|
210
|
+
|
|
211
|
+
모든 태스크 완료 후 3-Call 평가 진행.
|
|
212
|
+
|
|
213
|
+
**Call 1 — Structural 단계 시작**
|
|
214
|
+
```json
|
|
215
|
+
{ "action": "evaluate", "sessionId": "..." }
|
|
216
|
+
```
|
|
217
|
+
→ `{ stage: "structural", structuralContext }` — lint/build/test 실행 지시
|
|
218
|
+
|
|
219
|
+
**Call 2 — Structural 결과 제출**
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"action": "evaluate",
|
|
223
|
+
"sessionId": "...",
|
|
224
|
+
"structuralResult": {
|
|
225
|
+
"commands": [
|
|
226
|
+
{ "name": "lint", "command": "pnpm run lint", "exitCode": 0, "output": "" },
|
|
227
|
+
{ "name": "build", "command": "pnpm run build", "exitCode": 0, "output": "" },
|
|
228
|
+
{ "name": "test", "command": "pnpm run test", "exitCode": 0, "output": "360 tests passed" }
|
|
229
|
+
],
|
|
230
|
+
"allPassed": true
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
→ structural 실패 시 `{ stage: "structural_failed", evolveContext }` → Evolve Flow A 진입
|
|
235
|
+
→ structural 통과 시 `{ stage: "contextual", evaluationContext }` — AC별 LLM 검증 지시
|
|
236
|
+
|
|
237
|
+
**Call 3 — Contextual 결과 제출**
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"action": "evaluate",
|
|
241
|
+
"sessionId": "...",
|
|
242
|
+
"evaluationResult": {
|
|
243
|
+
"verifications": [
|
|
244
|
+
{ "acIndex": 0, "satisfied": true, "evidence": "...", "gaps": [] }
|
|
245
|
+
],
|
|
246
|
+
"overallScore": 0.92,
|
|
247
|
+
"goalAlignment": 0.88,
|
|
248
|
+
"recommendations": []
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
→ `{ status: "completed" }` (score ≥ 0.85, goalAlignment ≥ 0.80)
|
|
253
|
+
→ 미달 시 `{ evolveContext }` → Evolve Flow B 진입
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Phase 4 — Evolve
|
|
258
|
+
|
|
259
|
+
### Flow A — Structural Fix
|
|
260
|
+
|
|
261
|
+
```json
|
|
262
|
+
// 1. Fix context 요청
|
|
263
|
+
{ "action": "evolve_fix", "sessionId": "..." }
|
|
264
|
+
→ fixContext 반환
|
|
265
|
+
|
|
266
|
+
// 2. Fix 수행 후 결과 제출
|
|
267
|
+
{
|
|
268
|
+
"action": "evolve_fix",
|
|
269
|
+
"sessionId": "...",
|
|
270
|
+
"fixTasks": [
|
|
271
|
+
{ "taskId": "fix-0", "failedCommand": "pnpm run lint", "errorOutput": "...", "fixDescription": "...", "artifacts": [] }
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// 3. Re-evaluate (Phase 3 반복)
|
|
276
|
+
{ "action": "evaluate", "sessionId": "..." }
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Flow B — Contextual Evolution
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
// 1. Evolution context 요청
|
|
283
|
+
{ "action": "evolve", "sessionId": "..." }
|
|
284
|
+
→ evolveContext (또는 terminateReason으로 종료)
|
|
285
|
+
|
|
286
|
+
// 2. Spec patch 제출 (AC/constraints 수정, goal 변경 불가)
|
|
287
|
+
{
|
|
288
|
+
"action": "evolve_patch",
|
|
289
|
+
"sessionId": "...",
|
|
290
|
+
"specPatch": {
|
|
291
|
+
"acceptanceCriteria": ["수정된 AC..."],
|
|
292
|
+
"constraints": ["추가 제약조건..."]
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
→ { impactedTaskIds, reExecuteContext }
|
|
296
|
+
|
|
297
|
+
// 3. 영향받은 태스크 재실행 (allTasksCompleted까지 반복)
|
|
298
|
+
{
|
|
299
|
+
"action": "evolve_re_execute",
|
|
300
|
+
"sessionId": "...",
|
|
301
|
+
"reExecuteTaskResult": { "taskId": "task-3", "status": "completed", "output": "...", "artifacts": [] }
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// 4. Re-evaluate
|
|
305
|
+
{ "action": "evaluate", "sessionId": "..." }
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Flow C — Lateral Thinking (stagnation 감지 시 자동 분기)
|
|
309
|
+
|
|
310
|
+
`evolve` 호출 시 stagnation/oscillation/hard_cap이 감지되면 자동으로 lateral thinking persona로 전환.
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
// evolve 호출 → lateralContext 반환
|
|
314
|
+
{ "action": "evolve", "sessionId": "..." }
|
|
315
|
+
→ { status: "lateral_thinking", lateralContext: { persona, pattern, lateralPrompt, ... } }
|
|
316
|
+
|
|
317
|
+
// Lateral result 제출
|
|
318
|
+
{
|
|
319
|
+
"action": "evolve_lateral_result",
|
|
320
|
+
"sessionId": "...",
|
|
321
|
+
"lateralResult": {
|
|
322
|
+
"persona": "multistability",
|
|
323
|
+
"specPatch": { "acceptanceCriteria": [...] },
|
|
324
|
+
"description": "관점 전환으로 요구사항 재구성"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Re-execute + Re-evaluate (Flow B와 동일)
|
|
329
|
+
|
|
330
|
+
// 다음 persona 요청 (점수 미달 시)
|
|
331
|
+
{ "action": "evolve_lateral", "sessionId": "..." }
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
| Stagnation 패턴 | Persona | 전략 |
|
|
335
|
+
|---|---|---|
|
|
336
|
+
| hard_cap | Multistability | 다른 각도로 보기 |
|
|
337
|
+
| oscillation | Simplicity | 단순하게 줄이기 |
|
|
338
|
+
| no_drift | Reification | 빠진 조각 채우기 |
|
|
339
|
+
| diminishing_returns | Invariance | 성공 패턴 복제 |
|
|
340
|
+
|
|
341
|
+
4개 persona 소진 → `human_escalation` 반환으로 세션 종료.
|
|
342
|
+
|
|
343
|
+
### 종료 조건
|
|
344
|
+
|
|
345
|
+
| 조건 | 트리거 |
|
|
346
|
+
|------|--------|
|
|
347
|
+
| `success` | score ≥ 0.85 AND goalAlignment ≥ 0.80 |
|
|
348
|
+
| `stagnation` | 2회 연속 delta < 0.05 |
|
|
349
|
+
| `oscillation` | 2회 연속 점수 역전 |
|
|
350
|
+
| `hard_cap` | structural 3회 + contextual 3회 실패 |
|
|
351
|
+
| `caller` | `{ action: "evolve", terminateReason: "caller" }` |
|
|
352
|
+
| `human_escalation` | 4개 lateral persona 소진 |
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import type { AgentDefinition } from '../core/types.js';
|
|
2
2
|
/**
|
|
3
|
-
* RoleAgentRegistry: 내장 role-agents/ + 사용자 agents/ (role=true)를 병합.
|
|
3
|
+
* RoleAgentRegistry: 내장 role-agents/ + review-agents/ + 사용자 agents/ (role=true)를 병합.
|
|
4
4
|
* 동일 이름은 커스텀이 오버라이드.
|
|
5
5
|
*/
|
|
6
6
|
export declare class RoleAgentRegistry {
|
|
7
7
|
private builtinDir;
|
|
8
8
|
private customDir?;
|
|
9
|
+
private reviewDir?;
|
|
9
10
|
private agents;
|
|
10
|
-
constructor(builtinDir: string, customDir?: string | undefined);
|
|
11
|
+
constructor(builtinDir: string, customDir?: string | undefined, reviewDir?: string | undefined);
|
|
11
12
|
loadAll(): void;
|
|
12
13
|
private loadFromDir;
|
|
13
14
|
getAll(): AgentDefinition[];
|
|
15
|
+
getByPipeline(pipeline: string): AgentDefinition[];
|
|
14
16
|
getByName(name: string): AgentDefinition | undefined;
|
|
15
17
|
getByDomain(domain: string): AgentDefinition[];
|
|
16
18
|
has(name: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-agent-registry.d.ts","sourceRoot":"","sources":["../../../src/agent/role-agent-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"role-agent-registry.d.ts","sourceRoot":"","sources":["../../../src/agent/role-agent-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS,CAAC;IAClB,OAAO,CAAC,SAAS,CAAC;IALpB,OAAO,CAAC,MAAM,CAAsC;gBAG1C,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA;IAG5B,OAAO,IAAI,IAAI;IAiBf,OAAO,CAAC,WAAW;IAsBnB,MAAM,IAAI,eAAe,EAAE;IAI3B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAIlD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAO9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B"}
|
|
@@ -3,21 +3,27 @@ import { join, resolve } from 'node:path';
|
|
|
3
3
|
import { log } from '../core/log.js';
|
|
4
4
|
import { parseAgentMd } from './parser.js';
|
|
5
5
|
/**
|
|
6
|
-
* RoleAgentRegistry: 내장 role-agents/ + 사용자 agents/ (role=true)를 병합.
|
|
6
|
+
* RoleAgentRegistry: 내장 role-agents/ + review-agents/ + 사용자 agents/ (role=true)를 병합.
|
|
7
7
|
* 동일 이름은 커스텀이 오버라이드.
|
|
8
8
|
*/
|
|
9
9
|
export class RoleAgentRegistry {
|
|
10
10
|
builtinDir;
|
|
11
11
|
customDir;
|
|
12
|
+
reviewDir;
|
|
12
13
|
agents = new Map();
|
|
13
|
-
constructor(builtinDir, customDir) {
|
|
14
|
+
constructor(builtinDir, customDir, reviewDir) {
|
|
14
15
|
this.builtinDir = builtinDir;
|
|
15
16
|
this.customDir = customDir;
|
|
17
|
+
this.reviewDir = reviewDir;
|
|
16
18
|
}
|
|
17
19
|
loadAll() {
|
|
18
20
|
// 1. 내장 role agents 로드
|
|
19
21
|
this.loadFromDir(resolve(this.builtinDir));
|
|
20
|
-
// 2.
|
|
22
|
+
// 2. review agents 로드
|
|
23
|
+
if (this.reviewDir) {
|
|
24
|
+
this.loadFromDir(resolve(this.reviewDir));
|
|
25
|
+
}
|
|
26
|
+
// 3. 커스텀 디렉토리에서 role=true인 에이전트 로드 (오버라이드)
|
|
21
27
|
if (this.customDir) {
|
|
22
28
|
this.loadFromDir(resolve(this.customDir), true);
|
|
23
29
|
}
|
|
@@ -48,6 +54,9 @@ export class RoleAgentRegistry {
|
|
|
48
54
|
getAll() {
|
|
49
55
|
return Array.from(this.agents.values());
|
|
50
56
|
}
|
|
57
|
+
getByPipeline(pipeline) {
|
|
58
|
+
return this.getAll().filter((a) => a.frontmatter.pipeline === pipeline);
|
|
59
|
+
}
|
|
51
60
|
getByName(name) {
|
|
52
61
|
return this.agents.get(name);
|
|
53
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-agent-registry.js","sourceRoot":"","sources":["../../../src/agent/role-agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAIlB;IACA;
|
|
1
|
+
{"version":3,"file":"role-agent-registry.js","sourceRoot":"","sources":["../../../src/agent/role-agent-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface InterviewCommandOptions {
|
|
2
|
+
record?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare function interviewCommand(topic: string, options?: InterviewCommandOptions): Promise<void>;
|
|
2
5
|
//# sourceMappingURL=interview.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAqGf"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline';
|
|
2
|
+
import { unlinkSync } from 'node:fs';
|
|
2
3
|
import { loadConfig } from '../../core/config.js';
|
|
3
4
|
import { EventStore } from '../../events/store.js';
|
|
4
5
|
import { AnthropicAdapter } from '../../llm/adapter.js';
|
|
5
6
|
import { InterviewEngine } from '../../interview/engine.js';
|
|
6
|
-
|
|
7
|
+
import { TerminalRecorder } from '../../recording/terminal-recorder.js';
|
|
8
|
+
import { detectResume } from '../../recording/resume-detector.js';
|
|
9
|
+
import { SegmentMerger } from '../../recording/segment-merger.js';
|
|
10
|
+
import { GifGenerator } from '../../recording/gif-generator.js';
|
|
11
|
+
import { FilenameGenerator } from '../../recording/filename-generator.js';
|
|
12
|
+
import { getFramesPath } from '../../recording/recording-dir.js';
|
|
13
|
+
export async function interviewCommand(topic, options = {}) {
|
|
7
14
|
const config = loadConfig();
|
|
8
15
|
if (!config.llm.apiKey) {
|
|
9
16
|
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
@@ -17,6 +24,7 @@ export async function interviewCommand(topic) {
|
|
|
17
24
|
output: process.stdout,
|
|
18
25
|
});
|
|
19
26
|
const prompt = (question) => new Promise((resolve) => rl.question(question, resolve));
|
|
27
|
+
let recorder = null;
|
|
20
28
|
try {
|
|
21
29
|
console.log(`\n🔍 Starting Gestalt interview for: "${topic}"\n`);
|
|
22
30
|
const startResult = await engine.start(topic);
|
|
@@ -25,12 +33,25 @@ export async function interviewCommand(topic) {
|
|
|
25
33
|
return;
|
|
26
34
|
}
|
|
27
35
|
const { session, firstQuestion, projectType, detectedFiles } = startResult.value;
|
|
36
|
+
const sessionId = session.sessionId;
|
|
37
|
+
// --record 플래그 또는 기존 .frames 파일이 있으면 녹화 시작 (resume 자동 감지)
|
|
38
|
+
const { isResuming } = detectResume(sessionId);
|
|
39
|
+
const shouldRecord = options.record === true || isResuming;
|
|
40
|
+
if (shouldRecord) {
|
|
41
|
+
recorder = new TerminalRecorder(sessionId);
|
|
42
|
+
recorder.start();
|
|
43
|
+
if (isResuming) {
|
|
44
|
+
console.log('📹 Resuming recording from previous session...\n');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log('📹 Recording started...\n');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
28
50
|
console.log(`Project type: ${projectType}`);
|
|
29
51
|
if (detectedFiles.length > 0) {
|
|
30
52
|
console.log(`Detected: ${detectedFiles.join(', ')}`);
|
|
31
53
|
}
|
|
32
54
|
console.log('');
|
|
33
|
-
let sessionId = session.sessionId;
|
|
34
55
|
let currentQuestion = firstQuestion;
|
|
35
56
|
while (true) {
|
|
36
57
|
console.log(`📋 Q${session.rounds.length}: ${currentQuestion}\n`);
|
|
@@ -58,10 +79,42 @@ export async function interviewCommand(topic) {
|
|
|
58
79
|
console.log(`\n✅ Interview completed. Session ID: ${sessionId}`);
|
|
59
80
|
console.log('Run `gestalt spec ' + sessionId + '` to generate a spec.\n');
|
|
60
81
|
}
|
|
82
|
+
// 녹화 중이었다면 GIF 생성
|
|
83
|
+
if (recorder && recorder.recording) {
|
|
84
|
+
recorder.stop();
|
|
85
|
+
await generateGif(sessionId, topic, llm);
|
|
86
|
+
}
|
|
61
87
|
}
|
|
62
88
|
finally {
|
|
89
|
+
// 프로세스 종료 시 recorder가 아직 녹화 중이면 pause
|
|
90
|
+
if (recorder?.recording) {
|
|
91
|
+
recorder.pause();
|
|
92
|
+
}
|
|
63
93
|
rl.close();
|
|
64
94
|
eventStore.close();
|
|
65
95
|
}
|
|
66
96
|
}
|
|
97
|
+
async function generateGif(sessionId, topic, llm) {
|
|
98
|
+
const framesPath = getFramesPath(sessionId);
|
|
99
|
+
try {
|
|
100
|
+
console.log('🎬 Generating GIF recording...');
|
|
101
|
+
const merger = new SegmentMerger();
|
|
102
|
+
const frames = await merger.readSingleFile(framesPath);
|
|
103
|
+
if (frames.length === 0) {
|
|
104
|
+
console.log('⚠️ No frames captured, skipping GIF generation.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const filenameGen = new FilenameGenerator(llm);
|
|
108
|
+
const outputPath = await filenameGen.generate(topic, sessionId);
|
|
109
|
+
const gifGen = new GifGenerator({ repeat: 0, quality: 10, frameDelay: 150 });
|
|
110
|
+
const result = await gifGen.generateFromFrames(frames, outputPath);
|
|
111
|
+
// 임시 .frames 파일 정리
|
|
112
|
+
unlinkSync(framesPath);
|
|
113
|
+
console.log(`✅ GIF saved: ${result.filePath} (${(result.sizeBytes / 1024).toFixed(1)} KB, ${result.frameCount} frames)\n`);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
117
|
+
console.error(`⚠️ GIF generation failed: ${message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
67
120
|
//# sourceMappingURL=interview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interview.js","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"interview.js","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,SAAS,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,SAAS,IAAI,OAAO,CAqDnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -21,8 +21,9 @@ export function createCli() {
|
|
|
21
21
|
program
|
|
22
22
|
.command('interview [topic]')
|
|
23
23
|
.description('Start an interactive Gestalt interview')
|
|
24
|
-
.
|
|
25
|
-
|
|
24
|
+
.option('-r, --record', 'Record terminal output as GIF')
|
|
25
|
+
.action(async (topic, options) => {
|
|
26
|
+
await interviewCommand(topic ?? 'Untitled project', options);
|
|
26
27
|
});
|
|
27
28
|
program
|
|
28
29
|
.command('spec <session-id>')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2FAA2F,CAAC;SACxG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2FAA2F,CAAC;SACxG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAA6B,EAAE,EAAE;QACzE,MAAM,gBAAgB,CAAC,KAAK,IAAI,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,aAAa,EAAE,yDAAyD,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA4B,EAAE,EAAE;QAChE,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,CAAC,SAAkB,EAAE,EAAE;QAC7B,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,SAAkB,EAAE,EAAE;QACnC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -37,6 +37,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
37
37
|
skillsDir: z.ZodDefault<z.ZodString>;
|
|
38
38
|
agentsDir: z.ZodDefault<z.ZodString>;
|
|
39
39
|
roleAgentsDir: z.ZodDefault<z.ZodString>;
|
|
40
|
+
reviewAgentsDir: z.ZodDefault<z.ZodString>;
|
|
40
41
|
logLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
|
|
41
42
|
}, "strip", z.ZodTypeAny, {
|
|
42
43
|
interview: {
|
|
@@ -56,6 +57,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
56
57
|
skillsDir: string;
|
|
57
58
|
agentsDir: string;
|
|
58
59
|
roleAgentsDir: string;
|
|
60
|
+
reviewAgentsDir: string;
|
|
59
61
|
logLevel: "debug" | "info" | "warn" | "error";
|
|
60
62
|
}, {
|
|
61
63
|
interview?: {
|
|
@@ -75,6 +77,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
75
77
|
skillsDir?: string | undefined;
|
|
76
78
|
agentsDir?: string | undefined;
|
|
77
79
|
roleAgentsDir?: string | undefined;
|
|
80
|
+
reviewAgentsDir?: string | undefined;
|
|
78
81
|
logLevel?: "debug" | "info" | "warn" | "error" | undefined;
|
|
79
82
|
}>;
|
|
80
83
|
export type GestaltConfig = z.infer<typeof configSchema>;
|