@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
|
@@ -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,6 @@
|
|
|
1
|
-
export
|
|
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":"
|
|
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
|
-
|
|
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":"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,CAsDnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -21,8 +21,10 @@ export function createCli() {
|
|
|
21
21
|
program
|
|
22
22
|
.command('interview [topic]')
|
|
23
23
|
.description('Start an interactive Gestalt interview')
|
|
24
|
-
.
|
|
25
|
-
|
|
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;
|
|
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
|
|
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"}
|
package/dist/src/core/config.js
CHANGED
|
@@ -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
|