@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.
Files changed (119) hide show
  1. package/README.backup.md +442 -0
  2. package/README.ko.md +487 -0
  3. package/README.md +324 -286
  4. package/dist/package.json +10 -3
  5. package/dist/review-agents/performance-reviewer/AGENT.md +31 -0
  6. package/dist/review-agents/quality-reviewer/AGENT.md +31 -0
  7. package/dist/review-agents/security-reviewer/AGENT.md +32 -0
  8. package/dist/role-agents/architect/AGENT.md +30 -0
  9. package/dist/role-agents/backend-developer/AGENT.md +30 -0
  10. package/dist/role-agents/designer/AGENT.md +30 -0
  11. package/dist/role-agents/devops-engineer/AGENT.md +30 -0
  12. package/dist/role-agents/frontend-developer/AGENT.md +30 -0
  13. package/dist/role-agents/product-planner/AGENT.md +30 -0
  14. package/dist/role-agents/qa-engineer/AGENT.md +30 -0
  15. package/dist/role-agents/researcher/AGENT.md +30 -0
  16. package/dist/role-agents/technical-writer/AGENT.md +212 -0
  17. package/dist/skills/agent/SKILL.md +102 -0
  18. package/dist/skills/execute/SKILL.md +274 -6
  19. package/dist/src/agent/role-agent-registry.d.ts +4 -2
  20. package/dist/src/agent/role-agent-registry.d.ts.map +1 -1
  21. package/dist/src/agent/role-agent-registry.js +12 -3
  22. package/dist/src/agent/role-agent-registry.js.map +1 -1
  23. package/dist/src/cli/commands/interview.d.ts +5 -1
  24. package/dist/src/cli/commands/interview.d.ts.map +1 -1
  25. package/dist/src/cli/commands/interview.js +15 -3
  26. package/dist/src/cli/commands/interview.js.map +1 -1
  27. package/dist/src/cli/index.d.ts.map +1 -1
  28. package/dist/src/cli/index.js +4 -2
  29. package/dist/src/cli/index.js.map +1 -1
  30. package/dist/src/core/config.d.ts +3 -0
  31. package/dist/src/core/config.d.ts.map +1 -1
  32. package/dist/src/core/config.js +4 -0
  33. package/dist/src/core/config.js.map +1 -1
  34. package/dist/src/core/types.d.ts +28 -0
  35. package/dist/src/core/types.d.ts.map +1 -1
  36. package/dist/src/mcp/schemas.d.ts +3 -0
  37. package/dist/src/mcp/schemas.d.ts.map +1 -1
  38. package/dist/src/mcp/schemas.js +2 -0
  39. package/dist/src/mcp/schemas.js.map +1 -1
  40. package/dist/src/mcp/server.d.ts.map +1 -1
  41. package/dist/src/mcp/server.js +12 -1
  42. package/dist/src/mcp/server.js.map +1 -1
  43. package/dist/src/mcp/tools/agent-passthrough.d.ts +7 -0
  44. package/dist/src/mcp/tools/agent-passthrough.d.ts.map +1 -0
  45. package/dist/src/mcp/tools/agent-passthrough.js +49 -0
  46. package/dist/src/mcp/tools/agent-passthrough.js.map +1 -0
  47. package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
  48. package/dist/src/mcp/tools/interview-passthrough.js +26 -1
  49. package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
  50. package/dist/src/mcp/tools/interview.d.ts.map +1 -1
  51. package/dist/src/mcp/tools/interview.js +26 -1
  52. package/dist/src/mcp/tools/interview.js.map +1 -1
  53. package/dist/src/recording/agg-converter.d.ts +25 -0
  54. package/dist/src/recording/agg-converter.d.ts.map +1 -0
  55. package/dist/src/recording/agg-converter.js +80 -0
  56. package/dist/src/recording/agg-converter.js.map +1 -0
  57. package/dist/src/recording/agg-installer.d.ts +6 -0
  58. package/dist/src/recording/agg-installer.d.ts.map +1 -0
  59. package/dist/src/recording/agg-installer.js +50 -0
  60. package/dist/src/recording/agg-installer.js.map +1 -0
  61. package/dist/src/recording/asciinema-installer.d.ts +6 -0
  62. package/dist/src/recording/asciinema-installer.d.ts.map +1 -0
  63. package/dist/src/recording/asciinema-installer.js +50 -0
  64. package/dist/src/recording/asciinema-installer.js.map +1 -0
  65. package/dist/src/recording/asciinema-recorder.d.ts +26 -0
  66. package/dist/src/recording/asciinema-recorder.d.ts.map +1 -0
  67. package/dist/src/recording/asciinema-recorder.js +52 -0
  68. package/dist/src/recording/asciinema-recorder.js.map +1 -0
  69. package/dist/src/recording/cast-generator.d.ts +7 -0
  70. package/dist/src/recording/cast-generator.d.ts.map +1 -0
  71. package/dist/src/recording/cast-generator.js +72 -0
  72. package/dist/src/recording/cast-generator.js.map +1 -0
  73. package/dist/src/recording/filename-generator.d.ts +19 -0
  74. package/dist/src/recording/filename-generator.d.ts.map +1 -0
  75. package/dist/src/recording/filename-generator.js +67 -0
  76. package/dist/src/recording/filename-generator.js.map +1 -0
  77. package/dist/src/recording/gif-generator.d.ts +21 -0
  78. package/dist/src/recording/gif-generator.d.ts.map +1 -0
  79. package/dist/src/recording/gif-generator.js +121 -0
  80. package/dist/src/recording/gif-generator.js.map +1 -0
  81. package/dist/src/recording/recording-dir.d.ts +5 -0
  82. package/dist/src/recording/recording-dir.d.ts.map +1 -0
  83. package/dist/src/recording/recording-dir.js +13 -0
  84. package/dist/src/recording/recording-dir.js.map +1 -0
  85. package/dist/src/recording/recording-orchestrator.d.ts +50 -0
  86. package/dist/src/recording/recording-orchestrator.d.ts.map +1 -0
  87. package/dist/src/recording/recording-orchestrator.js +98 -0
  88. package/dist/src/recording/recording-orchestrator.js.map +1 -0
  89. package/dist/src/recording/resume-detector.d.ts +10 -0
  90. package/dist/src/recording/resume-detector.d.ts.map +1 -0
  91. package/dist/src/recording/resume-detector.js +14 -0
  92. package/dist/src/recording/resume-detector.js.map +1 -0
  93. package/dist/src/recording/segment-merger.d.ts +27 -0
  94. package/dist/src/recording/segment-merger.d.ts.map +1 -0
  95. package/dist/src/recording/segment-merger.js +65 -0
  96. package/dist/src/recording/segment-merger.js.map +1 -0
  97. package/dist/src/recording/terminal-recorder.d.ts +31 -0
  98. package/dist/src/recording/terminal-recorder.d.ts.map +1 -0
  99. package/dist/src/recording/terminal-recorder.js +111 -0
  100. package/dist/src/recording/terminal-recorder.js.map +1 -0
  101. package/dist/src/scripts/postinstall.d.ts +2 -0
  102. package/dist/src/scripts/postinstall.d.ts.map +1 -0
  103. package/dist/src/scripts/postinstall.js +27 -0
  104. package/dist/src/scripts/postinstall.js.map +1 -0
  105. package/package.json +10 -3
  106. package/review-agents/performance-reviewer/AGENT.md +31 -0
  107. package/review-agents/quality-reviewer/AGENT.md +31 -0
  108. package/review-agents/security-reviewer/AGENT.md +32 -0
  109. package/role-agents/architect/AGENT.md +30 -0
  110. package/role-agents/backend-developer/AGENT.md +30 -0
  111. package/role-agents/designer/AGENT.md +30 -0
  112. package/role-agents/devops-engineer/AGENT.md +30 -0
  113. package/role-agents/frontend-developer/AGENT.md +30 -0
  114. package/role-agents/product-planner/AGENT.md +30 -0
  115. package/role-agents/qa-engineer/AGENT.md +30 -0
  116. package/role-agents/researcher/AGENT.md +30 -0
  117. package/role-agents/technical-writer/AGENT.md +212 -0
  118. package/skills/agent/SKILL.md +102 -0
  119. 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.0.0"
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 by applying Gestalt psychology principles as a structured planning framework.
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
- ## Process
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, identify implicit sub-tasks not explicitly stated
26
- 3. **Proximity** (Step 3): Group related atomic tasks into logical task groups by domain
27
- 4. **Continuity** (Step 4): Validate the dependency DAG β€” ensure no cycles, no conflicts, clear execution order
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;IAJpB,OAAO,CAAC,MAAM,CAAsC;gBAG1C,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA;IAG5B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,WAAW;IAsBnB,MAAM,IAAI,eAAe,EAAE;IAI3B,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"}
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. μ»€μŠ€ν…€ λ””λ ‰ν† λ¦¬μ—μ„œ role=true인 μ—μ΄μ „νŠΈ λ‘œλ“œ (μ˜€λ²„λΌμ΄λ“œ)
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":"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"}
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,6 @@
1
- export declare function interviewCommand(topic: string): Promise<void>;
1
+ export interface InterviewCommandOptions {
2
+ record?: boolean;
3
+ mp4?: boolean;
4
+ }
5
+ export declare function interviewCommand(topic: string, options?: InterviewCommandOptions): Promise<void>;
2
6
  //# sourceMappingURL=interview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EnE"}
1
+ {"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA0Ff"}
@@ -3,14 +3,19 @@ import { loadConfig } from '../../core/config.js';
3
3
  import { EventStore } from '../../events/store.js';
4
4
  import { AnthropicAdapter } from '../../llm/adapter.js';
5
5
  import { InterviewEngine } from '../../interview/engine.js';
6
- export async function interviewCommand(topic) {
6
+ import { RecordingOrchestrator } from '../../recording/recording-orchestrator.js';
7
+ export async function interviewCommand(topic, options = {}) {
7
8
  const config = loadConfig();
8
9
  if (!config.llm.apiKey) {
9
10
  console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
10
11
  process.exit(1);
11
12
  }
12
- const eventStore = new EventStore(config.dbPath);
13
13
  const llm = new AnthropicAdapter(config.llm.apiKey, config.llm.model);
14
+ const orchestrator = new RecordingOrchestrator(llm);
15
+ // --record ν”Œλž˜κ·Έκ°€ 있고 아직 asciinema둜 감싸지지 μ•Šμ•˜μœΌλ©΄ respawn.
16
+ // respawn μ‹œ process.exit()이 ν˜ΈμΆœλ˜λ―€λ‘œ 이후 μ½”λ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμŒ.
17
+ await orchestrator.startIfNeeded(options);
18
+ const eventStore = new EventStore(config.dbPath);
14
19
  const engine = new InterviewEngine(llm, eventStore);
15
20
  const rl = createInterface({
16
21
  input: process.stdin,
@@ -19,18 +24,21 @@ export async function interviewCommand(topic) {
19
24
  const prompt = (question) => new Promise((resolve) => rl.question(question, resolve));
20
25
  try {
21
26
  console.log(`\nπŸ” Starting Gestalt interview for: "${topic}"\n`);
27
+ if (orchestrator.isRecording()) {
28
+ console.log('πŸ“Ή Recording in progress (asciinema)...\n');
29
+ }
22
30
  const startResult = await engine.start(topic);
23
31
  if (!startResult.ok) {
24
32
  console.error(`Error: ${startResult.error.message}`);
25
33
  return;
26
34
  }
27
35
  const { session, firstQuestion, projectType, detectedFiles } = startResult.value;
36
+ const sessionId = session.sessionId;
28
37
  console.log(`Project type: ${projectType}`);
29
38
  if (detectedFiles.length > 0) {
30
39
  console.log(`Detected: ${detectedFiles.join(', ')}`);
31
40
  }
32
41
  console.log('');
33
- let sessionId = session.sessionId;
34
42
  let currentQuestion = firstQuestion;
35
43
  while (true) {
36
44
  console.log(`πŸ“‹ Q${session.rounds.length}: ${currentQuestion}\n`);
@@ -58,6 +66,10 @@ export async function interviewCommand(topic) {
58
66
  console.log(`\nβœ… Interview completed. Session ID: ${sessionId}`);
59
67
  console.log('Run `gestalt spec ' + sessionId + '` to generate a spec.\n');
60
68
  }
69
+ // asciinema λ…Ήν™” μ€‘μ΄μ—ˆλ‹€λ©΄ λ°±κ·ΈλΌμš΄λ“œ GIF λ³€ν™˜ 트리거
70
+ if (orchestrator.isRecording()) {
71
+ await orchestrator.stopAndConvert(topic, sessionId, options);
72
+ }
61
73
  }
62
74
  finally {
63
75
  rl.close();
@@ -1 +1 @@
1
- {"version":3,"file":"interview.js","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"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"}
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;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAOlF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAAmC,EAAE;IAErC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAEpD,oDAAoD;IACpD,kDAAkD;IAClD,MAAM,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAmB,EAAE,CACnD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,yCAAyC,KAAK,KAAK,CAAC,CAAC;QAEjE,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;QACjF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAC5C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,eAAe,GAAG,aAAa,CAAC;QAEpC,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAC7C,MAAM;YACR,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,UAAU,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvD,MAAM;YACR,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,cAAc,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAE7E,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,eAAe,GAAG,YAAY,CAAC;QACjC,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,SAAS,GAAG,yBAAyB,CAAC,CAAC;QAC5E,CAAC;QAED,sCAAsC;QACtC,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,MAAM,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -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,CAoDnC"}
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,CAsDnC"}
@@ -21,8 +21,10 @@ export function createCli() {
21
21
  program
22
22
  .command('interview [topic]')
23
23
  .description('Start an interactive Gestalt interview')
24
- .action(async (topic) => {
25
- await interviewCommand(topic ?? 'Untitled project');
24
+ .option('--no-record', 'Disable automatic terminal session recording')
25
+ .option('--mp4', 'Also generate an MP4 alongside the GIF')
26
+ .action(async (topic, options) => {
27
+ await interviewCommand(topic ?? 'Untitled project', options);
26
28
  });
27
29
  program
28
30
  .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;QAC1C,MAAM,gBAAgB,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;IACtD,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"}
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,aAAa,EAAE,8CAA8C,CAAC;SACrE,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAA4C,EAAE,EAAE;QACxF,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>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgCxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAShB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAmBzD;;;GAGG;AACH,iBAAS,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAenG;AAED;;GAEG;AACH,iBAAS,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclD;AASD;;;GAGG;AACH,iBAAS,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyCjD;AAID,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CA4B9H;AAUD,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,eAAe,IAAI,gBAAgB,EAAE,cAAc,IAAI,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgCxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAmBzD;;;GAGG;AACH,iBAAS,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAenG;AAED;;GAEG;AACH,iBAAS,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclD;AASD;;;GAGG;AACH,iBAAS,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0CjD;AAID,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CA4B9H;AAWD,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,eAAe,IAAI,gBAAgB,EAAE,cAAc,IAAI,eAAe,EAAE,CAAC"}
@@ -30,6 +30,7 @@ const configSchema = z.object({
30
30
  skillsDir: z.string().default('skills'),
31
31
  agentsDir: z.string().default('agents'),
32
32
  roleAgentsDir: z.string().default('role-agents'),
33
+ reviewAgentsDir: z.string().default('review-agents'),
33
34
  logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
34
35
  });
35
36
  // ─── Internal Utilities ─────────────────────────────────────────
@@ -138,6 +139,8 @@ function buildEnvConfig() {
138
139
  result.agentsDir = env['GESTALT_AGENTS_DIR'];
139
140
  if (env['GESTALT_ROLE_AGENTS_DIR'] !== undefined)
140
141
  result.roleAgentsDir = env['GESTALT_ROLE_AGENTS_DIR'];
142
+ if (env['GESTALT_REVIEW_AGENTS_DIR'] !== undefined)
143
+ result.reviewAgentsDir = env['GESTALT_REVIEW_AGENTS_DIR'];
141
144
  if (env['GESTALT_LOG_LEVEL'] !== undefined)
142
145
  result.logLevel = env['GESTALT_LOG_LEVEL'];
143
146
  return result;
@@ -168,6 +171,7 @@ function applyPostProcessing(config) {
168
171
  config.skillsDir = resolveDir(config.skillsDir);
169
172
  config.agentsDir = resolveDir(config.agentsDir);
170
173
  config.roleAgentsDir = resolveDir(config.roleAgentsDir);
174
+ config.reviewAgentsDir = resolveDir(config.reviewAgentsDir);
171
175
  return config;
172
176
  }
173
177
  // Re-export for testing