@tienne/gestalt 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +121 -6
- package/README.md +90 -12
- package/dist/bin/gestalt.js +0 -0
- package/dist/package.json +57 -0
- package/dist/schemas/gestalt.schema.json +98 -0
- package/dist/src/cli/commands/interview.js +2 -2
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/commands/setup.d.ts +2 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +20 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/spec.js +2 -2
- package/dist/src/cli/commands/spec.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +3 -3
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +9 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +77 -17
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +137 -31
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/constants.d.ts +2 -2
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +2 -2
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/types.d.ts +6 -2
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/version.d.ts +10 -0
- package/dist/src/core/version.d.ts.map +1 -0
- package/dist/src/core/version.js +89 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/events/types.d.ts +4 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +4 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +13 -0
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +117 -2
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/repository.d.ts.map +1 -1
- package/dist/src/execute/repository.js +24 -0
- package/dist/src/execute/repository.js.map +1 -1
- package/dist/src/execute/session.d.ts +2 -0
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +31 -0
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +169 -3
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +21 -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 +43 -6
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/execute-passthrough.js +76 -0
- package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +9 -1
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/resilience/lateral.d.ts +17 -0
- package/dist/src/resilience/lateral.d.ts.map +1 -0
- package/dist/src/resilience/lateral.js +62 -0
- package/dist/src/resilience/lateral.js.map +1 -0
- package/dist/src/resilience/prompts.d.ts +5 -0
- package/dist/src/resilience/prompts.d.ts.map +1 -0
- package/dist/src/resilience/prompts.js +130 -0
- package/dist/src/resilience/prompts.js.map +1 -0
- package/dist/src/resilience/stagnation-detector.d.ts +19 -0
- package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
- package/dist/src/resilience/stagnation-detector.js +38 -0
- package/dist/src/resilience/stagnation-detector.js.map +1 -0
- package/dist/src/resilience/types.d.ts +39 -0
- package/dist/src/resilience/types.d.ts.map +1 -0
- package/dist/src/resilience/types.js +17 -0
- package/dist/src/resilience/types.js.map +1 -0
- package/package.json +7 -3
- package/schemas/gestalt.schema.json +98 -0
package/CLAUDE.md
CHANGED
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
- **Interview Engine**: 게슈탈트 원리 기반 Q&A로 모호성 점수를 0.2 이하로 낮춤
|
|
9
9
|
- **Spec Generator**: 완료된 인터뷰에서 구조화된 프로젝트 스펙(Spec) 생성
|
|
10
10
|
- **Execute Engine**: 게슈탈트 5원리를 실행 전략으로 사용, Spec→ExecutionPlan 변환 (Figure-Ground→Closure→Proximity→Continuity)
|
|
11
|
+
- **Resilience Engine**: Stagnation 감지 → Lateral Thinking Personas → Human Escalation
|
|
11
12
|
- **MCP Server**: stdio transport로 Claude Code 등 AI 에이전트와 통합
|
|
12
13
|
- **Skill System**: SKILL.md 기반 확장, chokidar hot-reload 지원
|
|
13
14
|
- **Event Store**: better-sqlite3 WAL 모드 이벤트 소싱
|
|
14
15
|
|
|
15
16
|
## Tech Stack
|
|
16
17
|
TypeScript 5.x / ESM / pnpm / vitest
|
|
17
|
-
Dependencies: @anthropic-ai/sdk, @modelcontextprotocol/sdk, better-sqlite3, zod, chokidar, commander, gray-matter
|
|
18
|
+
Dependencies: @anthropic-ai/sdk, @modelcontextprotocol/sdk, better-sqlite3, zod, chokidar, commander, gray-matter, dotenv
|
|
18
19
|
|
|
19
20
|
## Key Commands
|
|
20
21
|
```bash
|
|
@@ -23,25 +24,92 @@ pnpm run serve # Start MCP server
|
|
|
23
24
|
pnpm tsx bin/gestalt.ts interview "topic" # Interactive interview
|
|
24
25
|
pnpm tsx bin/gestalt.ts spec <session-id> # Generate spec
|
|
25
26
|
pnpm tsx bin/gestalt.ts status # Check sessions
|
|
27
|
+
pnpm tsx bin/gestalt.ts setup # Generate gestalt.json config
|
|
26
28
|
```
|
|
27
29
|
|
|
30
|
+
## Configuration
|
|
31
|
+
|
|
32
|
+
설정값은 다음 우선순위로 merge된다 (높→낮):
|
|
33
|
+
1. `loadConfig(overrides)` — 코드에서 직접 전달
|
|
34
|
+
2. Shell 환경변수 (`export GESTALT_*`)
|
|
35
|
+
3. `.env` 파일 (dotenv)
|
|
36
|
+
4. `gestalt.json` 파일
|
|
37
|
+
5. 기본값
|
|
38
|
+
|
|
39
|
+
### gestalt.json
|
|
40
|
+
`gestalt setup` 명령어로 생성. JSON Schema로 IDE 자동완성 지원.
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"$schema": "./node_modules/@tienne/gestalt/schemas/gestalt.schema.json",
|
|
45
|
+
"llm": { "apiKey": "", "model": "claude-sonnet-4-20250514" },
|
|
46
|
+
"interview": { "ambiguityThreshold": 0.2, "maxRounds": 10 },
|
|
47
|
+
"execute": { "driftThreshold": 0.3, "successThreshold": 0.85, "goalAlignmentThreshold": 0.80 },
|
|
48
|
+
"dbPath": ".gestalt/gestalt.db",
|
|
49
|
+
"logLevel": "info"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### GestaltConfig 구조 (nested)
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
interface GestaltConfig {
|
|
57
|
+
llm: { apiKey: string; model: string };
|
|
58
|
+
interview: { ambiguityThreshold: number; maxRounds: number };
|
|
59
|
+
execute: { driftThreshold: number; successThreshold: number; goalAlignmentThreshold: number };
|
|
60
|
+
dbPath: string;
|
|
61
|
+
skillsDir: string;
|
|
62
|
+
agentsDir: string;
|
|
63
|
+
logLevel: 'debug' | 'info' | 'warn' | 'error';
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 환경변수 매핑
|
|
68
|
+
|
|
69
|
+
| 환경변수 | Config 경로 | 기본값 |
|
|
70
|
+
|----------|-------------|--------|
|
|
71
|
+
| `ANTHROPIC_API_KEY` | `llm.apiKey` | `""` |
|
|
72
|
+
| `GESTALT_MODEL` | `llm.model` | `"claude-sonnet-4-20250514"` |
|
|
73
|
+
| `GESTALT_AMBIGUITY_THRESHOLD` | `interview.ambiguityThreshold` | `0.2` |
|
|
74
|
+
| `GESTALT_MAX_ROUNDS` | `interview.maxRounds` | `10` |
|
|
75
|
+
| `GESTALT_DRIFT_THRESHOLD` | `execute.driftThreshold` | `0.3` |
|
|
76
|
+
| `GESTALT_EVOLVE_SUCCESS_THRESHOLD` | `execute.successThreshold` | `0.85` |
|
|
77
|
+
| `GESTALT_EVOLVE_GOAL_ALIGNMENT_THRESHOLD` | `execute.goalAlignmentThreshold` | `0.80` |
|
|
78
|
+
| `GESTALT_DB_PATH` | `dbPath` | `"~/.gestalt/events.db"` |
|
|
79
|
+
| `GESTALT_SKILLS_DIR` | `skillsDir` | `"skills"` |
|
|
80
|
+
| `GESTALT_AGENTS_DIR` | `agentsDir` | `"agents"` |
|
|
81
|
+
| `GESTALT_LOG_LEVEL` | `logLevel` | `"info"` |
|
|
82
|
+
|
|
83
|
+
잘못된 설정값은 경고를 출력하고 기본값으로 fallback한다 (에러를 throw하지 않음).
|
|
84
|
+
|
|
28
85
|
## MCP Tools
|
|
29
86
|
- `ges_interview`: action=[start|respond|score|complete]
|
|
30
87
|
- `ges_generate_spec`: sessionId, force?
|
|
31
|
-
- `ges_execute`: action=[start|plan_step|plan_complete|execute_start|execute_task|evaluate|status|evolve_fix|evolve|evolve_patch|evolve_re_execute]
|
|
88
|
+
- `ges_execute`: action=[start|plan_step|plan_complete|execute_start|execute_task|evaluate|status|evolve_fix|evolve|evolve_patch|evolve_re_execute|evolve_lateral|evolve_lateral_result]
|
|
32
89
|
- `ges_status`: sessionId?
|
|
33
90
|
|
|
34
91
|
## MCP Passthrough Mode
|
|
35
92
|
|
|
36
93
|
API 키(`ANTHROPIC_API_KEY`) 없이 MCP 서버 실행 시 자동 활성화. LLM 호출을 서버가 하지 않고, caller(Claude Code 등)에게 위임한다.
|
|
37
94
|
|
|
38
|
-
###
|
|
95
|
+
### 설치 방법
|
|
96
|
+
|
|
97
|
+
**Claude Plugin (Recommended)**
|
|
98
|
+
```bash
|
|
99
|
+
# 1. 마켓플레이스 등록 (최초 1회)
|
|
100
|
+
/plugin marketplace add tienne/gestalt
|
|
101
|
+
|
|
102
|
+
# 2. 플러그인 설치
|
|
103
|
+
/plugin install gestalt@gestalt
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**MCP 직접 설정** (claude_desktop_config.json / settings.json)
|
|
39
107
|
```json
|
|
40
108
|
{
|
|
41
109
|
"mcpServers": {
|
|
42
110
|
"gestalt": {
|
|
43
111
|
"command": "npx",
|
|
44
|
-
"args": ["
|
|
112
|
+
"args": ["-y", "@tienne/gestalt"]
|
|
45
113
|
}
|
|
46
114
|
}
|
|
47
115
|
}
|
|
@@ -173,9 +241,52 @@ ges_execute({ action: "evaluate", sessionId: "<id>" })
|
|
|
173
241
|
```
|
|
174
242
|
|
|
175
243
|
**Spec Patch 범위**: L1(AC)+L2(constraints) 자유, L3(ontology) 추가/변경만, L4(goal) 금지
|
|
176
|
-
**종료 조건**: success(≥0.85, ≥0.80), stagnation, oscillation, hard_cap(3+3), caller
|
|
244
|
+
**종료 조건**: success(≥0.85, ≥0.80), stagnation, oscillation, hard_cap(3+3), caller, human_escalation
|
|
177
245
|
**Caller 종료**: `ges_execute({ action: "evolve", sessionId: "<id>", terminateReason: "caller" })`
|
|
178
246
|
|
|
247
|
+
**Flow C: Lateral Thinking** (evolution stagnation/oscillation/hard_cap 감지 시 자동 분기)
|
|
248
|
+
|
|
249
|
+
evolve 호출 시 non-success termination이 감지되면 즉시 종료하는 대신 lateral thinking persona로 자동 분기한다.
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
// 1. evolve 호출 → lateralContext 자동 반환 (stagnation 시)
|
|
253
|
+
ges_execute({ action: "evolve", sessionId: "<id>" })
|
|
254
|
+
→ { status: "lateral_thinking", lateralContext: { persona, pattern, systemPrompt, lateralPrompt, ... } }
|
|
255
|
+
|
|
256
|
+
// 2. Lateral result 제출 (caller가 persona 관점으로 specPatch 생성)
|
|
257
|
+
ges_execute({
|
|
258
|
+
action: "evolve_lateral_result",
|
|
259
|
+
sessionId: "<id>",
|
|
260
|
+
lateralResult: {
|
|
261
|
+
persona: "multistability",
|
|
262
|
+
specPatch: { acceptanceCriteria: [...], constraints: [...] },
|
|
263
|
+
description: "관점 전환으로 요구사항 재구성"
|
|
264
|
+
}
|
|
265
|
+
})
|
|
266
|
+
→ impactedTaskIds + reExecuteContext 반환
|
|
267
|
+
|
|
268
|
+
// 3. Impacted tasks 재실행 (기존 action 재사용)
|
|
269
|
+
ges_execute({ action: "evolve_re_execute", sessionId: "<id>", reExecuteTaskResult: {...} })
|
|
270
|
+
→ 반복...
|
|
271
|
+
|
|
272
|
+
// 4. Re-evaluate
|
|
273
|
+
ges_execute({ action: "evaluate", sessionId: "<id>" })
|
|
274
|
+
|
|
275
|
+
// 5. 다음 persona 요청 (점수 미달 시)
|
|
276
|
+
ges_execute({ action: "evolve_lateral", sessionId: "<id>" })
|
|
277
|
+
→ 다음 lateralContext (or humanEscalation if 4개 persona 소진)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Stagnation Pattern → Persona 매핑**:
|
|
281
|
+
| Pattern | Persona | 전략 |
|
|
282
|
+
|---|---|---|
|
|
283
|
+
| spinning (hard_cap) | Multistability | 다른 각도로 보기 |
|
|
284
|
+
| oscillation | Simplicity | 단순하게 줄이기 |
|
|
285
|
+
| no_drift (delta≈0) | Reification | 빠진 조각 채우기 |
|
|
286
|
+
| diminishing_returns (delta↓) | Invariance | 성공 패턴 복제하기 |
|
|
287
|
+
|
|
288
|
+
**Human Escalation**: 4개 persona 모두 소진 시 `humanEscalation` 반환 (triedPersonas, bestScore, suggestions 포함). session은 `status: 'failed'`, `terminationReason: 'human_escalation'`으로 종료.
|
|
289
|
+
|
|
179
290
|
### 핵심 규칙
|
|
180
291
|
- `action: "respond"` 시 `generatedQuestion` **필수**, `ambiguityScore` 선택
|
|
181
292
|
- ambiguityScore 차원: `goalClarity`, `constraintClarity`, `successCriteria`, `priorityClarity` (필수), `contextClarity` (선택)
|
|
@@ -189,11 +300,15 @@ ges_execute({ action: "evaluate", sessionId: "<id>" })
|
|
|
189
300
|
- `src/interview/` — InterviewEngine, AmbiguityScorer, SessionManager
|
|
190
301
|
- `src/spec/` — SpecGenerator, SpecExtractor
|
|
191
302
|
- `src/execute/` — ExecuteEngine, DAG Validator, ExecuteSessionManager
|
|
303
|
+
- `src/resilience/` — Stagnation Detector, Lateral Thinking Personas, Human Escalation
|
|
192
304
|
- `src/skills/` — SkillRegistry, parser
|
|
305
|
+
- `src/agent/` — AgentRegistry, FiguralRouter, multi-provider LLM
|
|
306
|
+
- `src/registry/` — BaseRegistry 추상 클래스
|
|
193
307
|
- `src/mcp/` — MCP 서버 + 툴 핸들러
|
|
194
308
|
- `src/events/` — EventStore (SQLite)
|
|
195
309
|
- `src/llm/` — Anthropic SDK adapter
|
|
196
|
-
- `src/cli/` — commander 기반 CLI
|
|
310
|
+
- `src/cli/` — commander 기반 CLI (interview, spec, status, setup)
|
|
311
|
+
- `schemas/` — JSON Schema (gestalt.schema.json)
|
|
197
312
|
|
|
198
313
|
## Conventions
|
|
199
314
|
- MCP 서버에서 `console.log` 사용 금지 → stderr(`log()` 유틸)
|
package/README.md
CHANGED
|
@@ -1,19 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.svg" alt="Gestalt" width="600" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>Gestalt psychology-driven AI development harness</strong><br/>
|
|
7
|
+
Transforms scattered requirements into structured, validated specifications through interactive interviews.
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
---
|
|
4
11
|
|
|
5
12
|
## Installation
|
|
6
13
|
|
|
7
|
-
### Claude
|
|
14
|
+
### Claude Plugin (Recommended)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 1. 마켓플레이스 등록 (최초 1회)
|
|
18
|
+
/plugin marketplace add tienne/gestalt
|
|
19
|
+
|
|
20
|
+
# 2. 플러그인 설치
|
|
21
|
+
/plugin install gestalt@gestalt
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Skills, agents, MCP tools, and CLAUDE.md are all configured automatically.
|
|
25
|
+
|
|
26
|
+
### Claude Code MCP
|
|
8
27
|
|
|
9
28
|
```bash
|
|
10
|
-
claude mcp add gestalt -- npx @tienne/gestalt
|
|
29
|
+
claude mcp add gestalt -- npx -y @tienne/gestalt
|
|
11
30
|
```
|
|
12
31
|
|
|
13
32
|
### npx (No Install)
|
|
14
33
|
|
|
15
34
|
```bash
|
|
16
|
-
npx @tienne/gestalt
|
|
35
|
+
npx -y @tienne/gestalt
|
|
17
36
|
```
|
|
18
37
|
|
|
19
38
|
### Global Install
|
|
@@ -23,15 +42,56 @@ npm install -g @tienne/gestalt
|
|
|
23
42
|
gestalt
|
|
24
43
|
```
|
|
25
44
|
|
|
45
|
+
## How It Works
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Interview → Spec → Execute → Evaluate → Evolve
|
|
49
|
+
↓
|
|
50
|
+
Lateral Thinking (resilience)
|
|
51
|
+
↓
|
|
52
|
+
Human Escalation (if exhausted)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
1. **Interview** — Gestalt principles guide requirement clarification until ambiguity score drops below 0.2
|
|
56
|
+
2. **Spec** — Structured specification with goal, constraints, acceptance criteria, and ontology
|
|
57
|
+
3. **Execute** — 4-phase planning (Figure-Ground → Closure → Proximity → Continuity) produces a dependency-aware execution plan
|
|
58
|
+
4. **Evaluate** — 2-stage verification (structural + contextual) with evolution loop for iterative improvement
|
|
59
|
+
5. **Resilience** — Stagnation detection triggers Lateral Thinking Personas for alternative approaches; escalates to human when all personas exhausted
|
|
60
|
+
|
|
61
|
+
## Gestalt Principles
|
|
62
|
+
|
|
63
|
+
Each letter in the logo represents a core Gestalt principle used throughout the system:
|
|
64
|
+
|
|
65
|
+
| Principle | Role in Gestalt |
|
|
66
|
+
|-----------|----------------|
|
|
67
|
+
| **Closure** | Finds implicit requirements that aren't explicitly stated |
|
|
68
|
+
| **Proximity** | Groups related requirements and tasks by domain |
|
|
69
|
+
| **Continuation** | Validates dependency chains and execution order (DAG) |
|
|
70
|
+
| **Similarity** | Identifies repeating patterns across requirements |
|
|
71
|
+
| **Figure & Ground** | Separates core (figure) from supporting (ground) requirements |
|
|
72
|
+
|
|
73
|
+
## Lateral Thinking Personas
|
|
74
|
+
|
|
75
|
+
When the evolution loop stagnates, Gestalt classifies the pattern and activates a matching persona:
|
|
76
|
+
|
|
77
|
+
| Stagnation Pattern | Persona | Strategy |
|
|
78
|
+
|--------------------|---------|----------|
|
|
79
|
+
| Spinning (hard cap) | **Multistability** | See from a different angle |
|
|
80
|
+
| Oscillation | **Simplicity** | Simplify and converge |
|
|
81
|
+
| No drift | **Reification** | Fill in missing pieces |
|
|
82
|
+
| Diminishing returns | **Invariance** | Replicate success patterns |
|
|
83
|
+
|
|
84
|
+
All 4 personas are tried sequentially. If none succeed, the system triggers **Human Escalation** with actionable suggestions.
|
|
85
|
+
|
|
26
86
|
## MCP Tools
|
|
27
87
|
|
|
28
|
-
|
|
88
|
+
4 MCP tools exposed in passthrough mode (no API key required):
|
|
29
89
|
|
|
30
90
|
| Tool | Description |
|
|
31
91
|
|---|---|
|
|
32
92
|
| `ges_interview` | Gestalt-driven requirement interview (start, respond, score, complete) |
|
|
33
93
|
| `ges_generate_spec` | Generate a structured Spec from completed interview |
|
|
34
|
-
| `ges_execute` | Execute Spec via Gestalt
|
|
94
|
+
| `ges_execute` | Execute Spec via Gestalt pipeline (plan, execute, evaluate, evolve, lateral thinking) |
|
|
35
95
|
| `ges_status` | Check session status |
|
|
36
96
|
|
|
37
97
|
## CLI Commands
|
|
@@ -42,14 +102,32 @@ gestalt serve # Start MCP server (explicit)
|
|
|
42
102
|
gestalt interview "topic" # Interactive interview
|
|
43
103
|
gestalt spec <session-id> # Generate Spec from interview
|
|
44
104
|
gestalt status # List all sessions
|
|
105
|
+
gestalt setup # Generate gestalt.json config file
|
|
45
106
|
```
|
|
46
107
|
|
|
47
|
-
##
|
|
108
|
+
## Configuration
|
|
109
|
+
|
|
110
|
+
Run `gestalt setup` to generate a `gestalt.json` configuration file with IDE autocompletion support.
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"$schema": "./node_modules/@tienne/gestalt/schemas/gestalt.schema.json",
|
|
115
|
+
"interview": {
|
|
116
|
+
"ambiguityThreshold": 0.2,
|
|
117
|
+
"maxRounds": 10
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Configuration is loaded with the following priority (highest → lowest):
|
|
123
|
+
|
|
124
|
+
1. Code overrides (`loadConfig(overrides)`)
|
|
125
|
+
2. Shell environment variables (`GESTALT_*`)
|
|
126
|
+
3. `.env` file
|
|
127
|
+
4. `gestalt.json`
|
|
128
|
+
5. Built-in defaults
|
|
48
129
|
|
|
49
|
-
|
|
50
|
-
2. **Spec** - Structured specification generated with goal, constraints, acceptance criteria, and ontology
|
|
51
|
-
3. **Execute** - 4-phase planning (Figure-Ground, Closure, Proximity, Continuity) produces a dependency-aware execution plan
|
|
52
|
-
4. **Evaluate** - 2-stage verification (structural + contextual) with evolution loop for iterative improvement
|
|
130
|
+
Invalid values trigger a warning and fall back to defaults.
|
|
53
131
|
|
|
54
132
|
## Passthrough Mode
|
|
55
133
|
|
package/dist/bin/gestalt.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tienne/gestalt",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/src/index.js",
|
|
7
|
+
"types": "./dist/src/index.d.ts",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=20.0.0"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"gestalt": "./dist/bin/gestalt.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"agents",
|
|
17
|
+
"skills",
|
|
18
|
+
"schemas",
|
|
19
|
+
"CLAUDE.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "tsx bin/gestalt.ts",
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"postbuild": "cp -r agents dist/ && cp -r skills dist/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js",
|
|
25
|
+
"prepublishOnly": "pnpm build",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest",
|
|
28
|
+
"serve": "tsx bin/gestalt.ts serve",
|
|
29
|
+
"lint": "tsc --noEmit",
|
|
30
|
+
"version:sync": "tsx scripts/sync-version.ts",
|
|
31
|
+
"postversion": "pnpm run version:sync"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
36
|
+
"better-sqlite3": "^11.8.2",
|
|
37
|
+
"chokidar": "^4.0.3",
|
|
38
|
+
"commander": "^13.1.0",
|
|
39
|
+
"dotenv": "^17.3.1",
|
|
40
|
+
"gray-matter": "^4.0.3",
|
|
41
|
+
"openai": "^6.27.0",
|
|
42
|
+
"zod": "^3.24.2"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
46
|
+
"@types/node": "^22.13.10",
|
|
47
|
+
"tsx": "^4.19.3",
|
|
48
|
+
"typescript": "^5.8.2",
|
|
49
|
+
"vitest": "^3.0.9"
|
|
50
|
+
},
|
|
51
|
+
"pnpm": {
|
|
52
|
+
"onlyBuiltDependencies": [
|
|
53
|
+
"better-sqlite3",
|
|
54
|
+
"esbuild"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Gestalt Configuration",
|
|
4
|
+
"description": "Configuration file for Gestalt AI Development Harness",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"$schema": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "JSON Schema reference for IDE autocompletion"
|
|
10
|
+
},
|
|
11
|
+
"llm": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"description": "LLM provider settings",
|
|
14
|
+
"properties": {
|
|
15
|
+
"apiKey": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Anthropic API key (env: ANTHROPIC_API_KEY)"
|
|
18
|
+
},
|
|
19
|
+
"model": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Model to use (env: GESTALT_MODEL)",
|
|
22
|
+
"default": "claude-sonnet-4-20250514"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"additionalProperties": false
|
|
26
|
+
},
|
|
27
|
+
"interview": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"description": "Interview engine settings",
|
|
30
|
+
"properties": {
|
|
31
|
+
"ambiguityThreshold": {
|
|
32
|
+
"type": "number",
|
|
33
|
+
"minimum": 0,
|
|
34
|
+
"maximum": 1,
|
|
35
|
+
"description": "Ambiguity threshold below which requirements are considered clear (env: GESTALT_AMBIGUITY_THRESHOLD)",
|
|
36
|
+
"default": 0.2
|
|
37
|
+
},
|
|
38
|
+
"maxRounds": {
|
|
39
|
+
"type": "integer",
|
|
40
|
+
"minimum": 1,
|
|
41
|
+
"description": "Maximum number of interview rounds (env: GESTALT_MAX_ROUNDS)",
|
|
42
|
+
"default": 10
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
},
|
|
47
|
+
"execute": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"description": "Execute engine settings",
|
|
50
|
+
"properties": {
|
|
51
|
+
"driftThreshold": {
|
|
52
|
+
"type": "number",
|
|
53
|
+
"minimum": 0,
|
|
54
|
+
"maximum": 1,
|
|
55
|
+
"description": "Drift detection threshold (env: GESTALT_DRIFT_THRESHOLD)",
|
|
56
|
+
"default": 0.3
|
|
57
|
+
},
|
|
58
|
+
"successThreshold": {
|
|
59
|
+
"type": "number",
|
|
60
|
+
"minimum": 0,
|
|
61
|
+
"maximum": 1,
|
|
62
|
+
"description": "Evolution success threshold (env: GESTALT_EVOLVE_SUCCESS_THRESHOLD)",
|
|
63
|
+
"default": 0.85
|
|
64
|
+
},
|
|
65
|
+
"goalAlignmentThreshold": {
|
|
66
|
+
"type": "number",
|
|
67
|
+
"minimum": 0,
|
|
68
|
+
"maximum": 1,
|
|
69
|
+
"description": "Goal alignment threshold (env: GESTALT_EVOLVE_GOAL_ALIGNMENT_THRESHOLD)",
|
|
70
|
+
"default": 0.80
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"additionalProperties": false
|
|
74
|
+
},
|
|
75
|
+
"dbPath": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "Path to the SQLite event store database (env: GESTALT_DB_PATH)",
|
|
78
|
+
"default": ".gestalt/gestalt.db"
|
|
79
|
+
},
|
|
80
|
+
"skillsDir": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"description": "Directory containing skill definitions (env: GESTALT_SKILLS_DIR)",
|
|
83
|
+
"default": "skills"
|
|
84
|
+
},
|
|
85
|
+
"agentsDir": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "Directory containing agent definitions (env: GESTALT_AGENTS_DIR)",
|
|
88
|
+
"default": "agents"
|
|
89
|
+
},
|
|
90
|
+
"logLevel": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"enum": ["debug", "info", "warn", "error"],
|
|
93
|
+
"description": "Log level (env: GESTALT_LOG_LEVEL)",
|
|
94
|
+
"default": "info"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"additionalProperties": false
|
|
98
|
+
}
|
|
@@ -5,12 +5,12 @@ import { AnthropicAdapter } from '../../llm/adapter.js';
|
|
|
5
5
|
import { InterviewEngine } from '../../interview/engine.js';
|
|
6
6
|
export async function interviewCommand(topic) {
|
|
7
7
|
const config = loadConfig();
|
|
8
|
-
if (!config.
|
|
8
|
+
if (!config.llm.apiKey) {
|
|
9
9
|
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
10
10
|
process.exit(1);
|
|
11
11
|
}
|
|
12
12
|
const eventStore = new EventStore(config.dbPath);
|
|
13
|
-
const llm = new AnthropicAdapter(config.
|
|
13
|
+
const llm = new AnthropicAdapter(config.llm.apiKey, config.llm.model);
|
|
14
14
|
const engine = new InterviewEngine(llm, eventStore);
|
|
15
15
|
const rl = createInterface({
|
|
16
16
|
input: process.stdin,
|
|
@@ -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;AAE5D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"interview.js","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,IAAI,IAAI,CAkBnC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
const CONFIG_FILENAME = 'gestalt.json';
|
|
4
|
+
export function setupCommand() {
|
|
5
|
+
const filePath = resolve(CONFIG_FILENAME);
|
|
6
|
+
if (existsSync(filePath)) {
|
|
7
|
+
console.log('이미 설정이 존재합니다: ' + filePath);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const config = {
|
|
11
|
+
$schema: './node_modules/@tienne/gestalt/schemas/gestalt.schema.json',
|
|
12
|
+
interview: {
|
|
13
|
+
ambiguityThreshold: 0.2,
|
|
14
|
+
maxRounds: 10,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
18
|
+
console.log('gestalt.json 생성 완료: ' + filePath);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,4DAA4D;QACrE,SAAS,EAAE;YACT,kBAAkB,EAAE,GAAG;YACvB,SAAS,EAAE,EAAE;SACd;KACF,CAAC;IAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,QAAQ,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -5,12 +5,12 @@ import { InterviewEngine } from '../../interview/engine.js';
|
|
|
5
5
|
import { SpecGenerator } from '../../spec/generator.js';
|
|
6
6
|
export async function specCommand(sessionId, options) {
|
|
7
7
|
const config = loadConfig();
|
|
8
|
-
if (!config.
|
|
8
|
+
if (!config.llm.apiKey) {
|
|
9
9
|
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
10
10
|
process.exit(1);
|
|
11
11
|
}
|
|
12
12
|
const eventStore = new EventStore(config.dbPath);
|
|
13
|
-
const llm = new AnthropicAdapter(config.
|
|
13
|
+
const llm = new AnthropicAdapter(config.llm.apiKey, config.llm.model);
|
|
14
14
|
const engine = new InterviewEngine(llm, eventStore);
|
|
15
15
|
const generator = new SpecGenerator(llm, eventStore);
|
|
16
16
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../../src/cli/commands/spec.ts"],"names":[],"mappings":"AAAA,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,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,OAA4B;IAC/E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../../src/cli/commands/spec.ts"],"names":[],"mappings":"AAAA,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,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,OAA4B;IAC/E,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,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAkEtD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { loadConfig } from '../../core/config.js';
|
|
1
2
|
import { EventStore } from '../../events/store.js';
|
|
2
3
|
import { EventType } from '../../events/types.js';
|
|
3
|
-
const DEFAULT_DB_PATH = '.gestalt/events.db';
|
|
4
4
|
export function statusCommand(sessionId) {
|
|
5
|
-
const
|
|
6
|
-
const eventStore = new EventStore(dbPath);
|
|
5
|
+
const config = loadConfig();
|
|
6
|
+
const eventStore = new EventStore(config.dbPath);
|
|
7
7
|
try {
|
|
8
8
|
if (sessionId) {
|
|
9
9
|
const events = eventStore.getByAggregate('interview', sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,SAAS,IAAI,OAAO,CA6CnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -3,12 +3,14 @@ import { interviewCommand } from './commands/interview.js';
|
|
|
3
3
|
import { specCommand } from './commands/spec.js';
|
|
4
4
|
import { serveCommand } from './commands/serve.js';
|
|
5
5
|
import { statusCommand } from './commands/status.js';
|
|
6
|
+
import { setupCommand } from './commands/setup.js';
|
|
7
|
+
import { getVersion } from '../core/version.js';
|
|
6
8
|
export function createCli() {
|
|
7
9
|
const program = new Command();
|
|
8
10
|
program
|
|
9
11
|
.name('gestalt')
|
|
10
12
|
.description('Gestalt — AI Development Harness with Gestalt psychology-driven requirement clarification')
|
|
11
|
-
.version(
|
|
13
|
+
.version(getVersion());
|
|
12
14
|
program
|
|
13
15
|
.command('serve', { isDefault: true })
|
|
14
16
|
.description('Start the Gestalt MCP server (stdio transport)')
|
|
@@ -34,6 +36,12 @@ export function createCli() {
|
|
|
34
36
|
.action((sessionId) => {
|
|
35
37
|
statusCommand(sessionId);
|
|
36
38
|
});
|
|
39
|
+
program
|
|
40
|
+
.command('setup')
|
|
41
|
+
.description('Generate a gestalt.json configuration file')
|
|
42
|
+
.action(() => {
|
|
43
|
+
setupCommand();
|
|
44
|
+
});
|
|
37
45
|
return program;
|
|
38
46
|
}
|
|
39
47
|
//# sourceMappingURL=index.js.map
|
|
@@ -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;
|
|
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,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,OAAO,CAAC;AACjB,CAAC"}
|