@tienne/gestalt 0.1.1 → 0.5.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 (218) hide show
  1. package/CLAUDE.md +175 -6
  2. package/README.md +381 -14
  3. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
  4. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
  5. package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
  6. package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
  7. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
  8. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
  9. package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
  10. package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
  11. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
  12. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
  13. package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
  14. package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
  15. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
  16. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
  17. package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
  18. package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
  19. package/dist/benchmarks/types.d.ts +148 -0
  20. package/dist/benchmarks/types.d.ts.map +1 -0
  21. package/dist/benchmarks/types.js +2 -0
  22. package/dist/benchmarks/types.js.map +1 -0
  23. package/dist/package.json +61 -0
  24. package/dist/schemas/gestalt.schema.json +98 -0
  25. package/dist/src/agent/parser.d.ts.map +1 -1
  26. package/dist/src/agent/parser.js +2 -0
  27. package/dist/src/agent/parser.js.map +1 -1
  28. package/dist/src/agent/passthrough-generator.d.ts +27 -0
  29. package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
  30. package/dist/src/agent/passthrough-generator.js +133 -0
  31. package/dist/src/agent/passthrough-generator.js.map +1 -0
  32. package/dist/src/agent/registry.d.ts +1 -0
  33. package/dist/src/agent/registry.d.ts.map +1 -1
  34. package/dist/src/agent/registry.js +4 -1
  35. package/dist/src/agent/registry.js.map +1 -1
  36. package/dist/src/agent/role-agent-registry.d.ts +18 -0
  37. package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
  38. package/dist/src/agent/role-agent-registry.js +62 -0
  39. package/dist/src/agent/role-agent-registry.js.map +1 -0
  40. package/dist/src/agent/role-consensus-engine.d.ts +9 -0
  41. package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
  42. package/dist/src/agent/role-consensus-engine.js +35 -0
  43. package/dist/src/agent/role-consensus-engine.js.map +1 -0
  44. package/dist/src/agent/role-match-engine.d.ts +14 -0
  45. package/dist/src/agent/role-match-engine.d.ts.map +1 -0
  46. package/dist/src/agent/role-match-engine.js +46 -0
  47. package/dist/src/agent/role-match-engine.js.map +1 -0
  48. package/dist/src/agent/role-prompt-generator.d.ts +10 -0
  49. package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
  50. package/dist/src/agent/role-prompt-generator.js +22 -0
  51. package/dist/src/agent/role-prompt-generator.js.map +1 -0
  52. package/dist/src/cli/commands/interview.js +2 -2
  53. package/dist/src/cli/commands/interview.js.map +1 -1
  54. package/dist/src/cli/commands/monitor.d.ts +2 -0
  55. package/dist/src/cli/commands/monitor.d.ts.map +1 -0
  56. package/dist/src/cli/commands/monitor.js +13 -0
  57. package/dist/src/cli/commands/monitor.js.map +1 -0
  58. package/dist/src/cli/commands/setup.d.ts +2 -0
  59. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  60. package/dist/src/cli/commands/setup.js +20 -0
  61. package/dist/src/cli/commands/setup.js.map +1 -0
  62. package/dist/src/cli/commands/spec.js +2 -2
  63. package/dist/src/cli/commands/spec.js.map +1 -1
  64. package/dist/src/cli/commands/status.d.ts.map +1 -1
  65. package/dist/src/cli/commands/status.js +3 -3
  66. package/dist/src/cli/commands/status.js.map +1 -1
  67. package/dist/src/cli/index.d.ts.map +1 -1
  68. package/dist/src/cli/index.js +16 -1
  69. package/dist/src/cli/index.js.map +1 -1
  70. package/dist/src/core/config.d.ts +80 -17
  71. package/dist/src/core/config.d.ts.map +1 -1
  72. package/dist/src/core/config.js +141 -31
  73. package/dist/src/core/config.js.map +1 -1
  74. package/dist/src/core/constants.d.ts +2 -2
  75. package/dist/src/core/constants.d.ts.map +1 -1
  76. package/dist/src/core/constants.js +2 -2
  77. package/dist/src/core/constants.js.map +1 -1
  78. package/dist/src/core/errors.d.ts +3 -0
  79. package/dist/src/core/errors.d.ts.map +1 -1
  80. package/dist/src/core/errors.js +6 -0
  81. package/dist/src/core/errors.js.map +1 -1
  82. package/dist/src/core/types.d.ts +83 -3
  83. package/dist/src/core/types.d.ts.map +1 -1
  84. package/dist/src/core/version.d.ts +10 -0
  85. package/dist/src/core/version.d.ts.map +1 -0
  86. package/dist/src/core/version.js +89 -0
  87. package/dist/src/core/version.js.map +1 -0
  88. package/dist/src/events/types.d.ts +16 -1
  89. package/dist/src/events/types.d.ts.map +1 -1
  90. package/dist/src/events/types.js +19 -0
  91. package/dist/src/events/types.js.map +1 -1
  92. package/dist/src/execute/passthrough-engine.d.ts +44 -2
  93. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  94. package/dist/src/execute/passthrough-engine.js +245 -10
  95. package/dist/src/execute/passthrough-engine.js.map +1 -1
  96. package/dist/src/execute/repository.d.ts.map +1 -1
  97. package/dist/src/execute/repository.js +24 -0
  98. package/dist/src/execute/repository.js.map +1 -1
  99. package/dist/src/execute/session.d.ts +6 -1
  100. package/dist/src/execute/session.d.ts.map +1 -1
  101. package/dist/src/execute/session.js +60 -0
  102. package/dist/src/execute/session.js.map +1 -1
  103. package/dist/src/mcp/schemas.d.ts +513 -9
  104. package/dist/src/mcp/schemas.d.ts.map +1 -1
  105. package/dist/src/mcp/schemas.js +102 -0
  106. package/dist/src/mcp/schemas.js.map +1 -1
  107. package/dist/src/mcp/server.d.ts.map +1 -1
  108. package/dist/src/mcp/server.js +253 -38
  109. package/dist/src/mcp/server.js.map +1 -1
  110. package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
  111. package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
  112. package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
  113. package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
  114. package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
  115. package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
  116. package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
  117. package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
  118. package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
  119. package/dist/src/mcp/tools/execute-passthrough.js +126 -0
  120. package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
  121. package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
  122. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
  123. package/dist/src/mcp/tools/review-passthrough.js +134 -0
  124. package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
  125. package/dist/src/mcp/tools/status.d.ts +2 -1
  126. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  127. package/dist/src/mcp/tools/status.js +81 -26
  128. package/dist/src/mcp/tools/status.js.map +1 -1
  129. package/dist/src/resilience/lateral.d.ts +17 -0
  130. package/dist/src/resilience/lateral.d.ts.map +1 -0
  131. package/dist/src/resilience/lateral.js +62 -0
  132. package/dist/src/resilience/lateral.js.map +1 -0
  133. package/dist/src/resilience/prompts.d.ts +5 -0
  134. package/dist/src/resilience/prompts.d.ts.map +1 -0
  135. package/dist/src/resilience/prompts.js +130 -0
  136. package/dist/src/resilience/prompts.js.map +1 -0
  137. package/dist/src/resilience/stagnation-detector.d.ts +19 -0
  138. package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
  139. package/dist/src/resilience/stagnation-detector.js +38 -0
  140. package/dist/src/resilience/stagnation-detector.js.map +1 -0
  141. package/dist/src/resilience/types.d.ts +39 -0
  142. package/dist/src/resilience/types.d.ts.map +1 -0
  143. package/dist/src/resilience/types.js +17 -0
  144. package/dist/src/resilience/types.js.map +1 -0
  145. package/dist/src/review/agent-matcher.d.ts +15 -0
  146. package/dist/src/review/agent-matcher.d.ts.map +1 -0
  147. package/dist/src/review/agent-matcher.js +61 -0
  148. package/dist/src/review/agent-matcher.js.map +1 -0
  149. package/dist/src/review/context-collector.d.ts +7 -0
  150. package/dist/src/review/context-collector.d.ts.map +1 -0
  151. package/dist/src/review/context-collector.js +44 -0
  152. package/dist/src/review/context-collector.js.map +1 -0
  153. package/dist/src/review/passthrough-engine.d.ts +53 -0
  154. package/dist/src/review/passthrough-engine.d.ts.map +1 -0
  155. package/dist/src/review/passthrough-engine.js +257 -0
  156. package/dist/src/review/passthrough-engine.js.map +1 -0
  157. package/dist/src/review/report-generator.d.ts +7 -0
  158. package/dist/src/review/report-generator.d.ts.map +1 -0
  159. package/dist/src/review/report-generator.js +82 -0
  160. package/dist/src/review/report-generator.js.map +1 -0
  161. package/dist/src/tui/components/TUIApp.d.ts +20 -0
  162. package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
  163. package/dist/src/tui/components/TUIApp.js +84 -0
  164. package/dist/src/tui/components/TUIApp.js.map +1 -0
  165. package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
  166. package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
  167. package/dist/src/tui/hooks/event-store-reader.js +143 -0
  168. package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
  169. package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
  170. package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
  171. package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
  172. package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
  173. package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
  174. package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
  175. package/dist/src/tui/screens/DashboardScreen.js +132 -0
  176. package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
  177. package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
  178. package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
  179. package/dist/src/tui/screens/DebugScreen.js +40 -0
  180. package/dist/src/tui/screens/DebugScreen.js.map +1 -0
  181. package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
  182. package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
  183. package/dist/src/tui/screens/EvolutionScreen.js +136 -0
  184. package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
  185. package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
  186. package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
  187. package/dist/src/tui/screens/HUDPanel.js +13 -0
  188. package/dist/src/tui/screens/HUDPanel.js.map +1 -0
  189. package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
  190. package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
  191. package/dist/src/tui/screens/InterviewScreen.js +103 -0
  192. package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
  193. package/dist/src/tui/screens/LogScreen.d.ts +4 -0
  194. package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
  195. package/dist/src/tui/screens/LogScreen.js +83 -0
  196. package/dist/src/tui/screens/LogScreen.js.map +1 -0
  197. package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
  198. package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
  199. package/dist/src/tui/screens/SessionListScreen.js +71 -0
  200. package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
  201. package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
  202. package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
  203. package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
  204. package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
  205. package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
  206. package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
  207. package/dist/src/tui/widgets/DriftMeter.js +27 -0
  208. package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
  209. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
  210. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
  211. package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
  212. package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
  213. package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
  214. package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
  215. package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
  216. package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
  217. package/package.json +11 -3
  218. package/schemas/gestalt.schema.json +98 -0
@@ -0,0 +1,115 @@
1
+ export const apiGatewayScenario = {
2
+ name: 'api-gateway',
3
+ description: 'API Gateway with routing, auth, and rate limiting',
4
+ topic: 'API Gateway',
5
+ userResponses: [
6
+ 'MSA 환경에서 API Gateway를 구현합니다. 라우팅, 인증, rate limiting, 로깅이 필요합니다.',
7
+ 'Express 기반, 서비스별 프록시 라우팅, JWT 토큰 검증 미들웨어입니다.',
8
+ 'Rate limiting은 sliding window 알고리즘, Redis로 카운터 관리, 서비스별 별도 한도입니다.',
9
+ '헬스체크 엔드포인트, 요청/응답 로깅, 에러 핸들링 미들웨어가 필요합니다.',
10
+ '우선순위: 1) 프록시 라우팅 2) JWT 인증 3) rate limiting 4) 로깅/헬스체크',
11
+ ],
12
+ expectedSpec: {
13
+ goal: 'MSA용 API Gateway 구현 (라우팅, 인증, rate limiting, 로깅)',
14
+ constraints: [
15
+ 'Express 프레임워크',
16
+ 'JWT 토큰 검증 미들웨어',
17
+ 'Redis 기반 sliding window rate limiting',
18
+ '서비스별 독립 rate limit 한도',
19
+ ],
20
+ acceptanceCriteria: [
21
+ 'AC0: 프록시 라우팅 — URL 패턴 기반 서비스 라우팅, 동적 서비스 등록/해제',
22
+ 'AC1: JWT 인증 — 모든 요청에 JWT 검증, 공개 경로 화이트리스트',
23
+ 'AC2: Rate Limiting — Redis sliding window, 서비스별 한도 설정',
24
+ 'AC3: 요청 로깅 — 요청/응답 메타데이터 구조화 로깅',
25
+ 'AC4: 헬스체크 — 게이트웨이 + 다운스트림 서비스 상태 확인',
26
+ ],
27
+ ontologySchema: {
28
+ entities: [
29
+ { name: 'Route', description: '서비스 라우팅 규칙', attributes: ['pattern', 'target', 'methods'] },
30
+ { name: 'Service', description: '다운스트림 서비스', attributes: ['name', 'url', 'healthEndpoint', 'rateLimit'] },
31
+ { name: 'Request', description: '게이트웨이 요청', attributes: ['id', 'method', 'path', 'headers', 'timestamp'] },
32
+ ],
33
+ relations: [
34
+ { from: 'Route', to: 'Service', type: 'routes_to' },
35
+ { from: 'Request', to: 'Route', type: 'matched_by' },
36
+ ],
37
+ },
38
+ gestaltAnalysis: [
39
+ { principle: 'figure_ground', finding: '프록시 라우팅이 핵심(figure), 로깅/헬스체크는 보조(ground)', confidence: 0.93 },
40
+ { principle: 'closure', finding: '에러 핸들링 미들웨어가 암묵적으로 필요', confidence: 0.87 },
41
+ { principle: 'continuity', finding: '요청 → 인증 → rate limit → 프록시 → 로깅 파이프라인 흐름', confidence: 0.91 },
42
+ ],
43
+ },
44
+ planningSteps: {
45
+ figureGround: {
46
+ classifiedACs: [
47
+ { acIndex: 0, classification: 'essential', reasoning: '게이트웨이 핵심 기능' },
48
+ { acIndex: 1, classification: 'essential', reasoning: '보안 필수 레이어' },
49
+ { acIndex: 2, classification: 'essential', reasoning: '트래픽 보호 필수' },
50
+ { acIndex: 3, classification: 'supplementary', reasoning: '운영 편의 기능' },
51
+ { acIndex: 4, classification: 'supplementary', reasoning: '모니터링 보조 기능' },
52
+ ],
53
+ },
54
+ closure: {
55
+ atomicTasks: [
56
+ { taskId: 'T1', title: 'Express 앱 스캐폴딩 + 라우트 설정 파서', acIndices: [0], dependencies: [] },
57
+ { taskId: 'T2', title: '프록시 미들웨어 (http-proxy-middleware)', acIndices: [0], dependencies: ['T1'] },
58
+ { taskId: 'T3', title: 'JWT 인증 미들웨어 + 화이트리스트', acIndices: [1], dependencies: ['T1'] },
59
+ { taskId: 'T4', title: 'Redis 연결 + sliding window 모듈', acIndices: [2], dependencies: [] },
60
+ { taskId: 'T5', title: 'Rate limiting 미들웨어', acIndices: [2], dependencies: ['T4', 'T1'] },
61
+ { taskId: 'T6', title: '요청/응답 로깅 미들웨어', acIndices: [3], dependencies: ['T1'] },
62
+ { taskId: 'T7', title: '헬스체크 엔드포인트', acIndices: [4], dependencies: ['T1'] },
63
+ { taskId: 'T8', title: '에러 핸들링 미들웨어', acIndices: [0, 1, 2], dependencies: ['T1'] },
64
+ ],
65
+ },
66
+ proximity: {
67
+ taskGroups: [
68
+ { groupId: 'G1', name: '코어 라우팅', taskIds: ['T1', 'T2'] },
69
+ { groupId: 'G2', name: '보안', taskIds: ['T3', 'T4', 'T5'] },
70
+ { groupId: 'G3', name: '관측성', taskIds: ['T6', 'T7'] },
71
+ { groupId: 'G4', name: '안정성', taskIds: ['T8'] },
72
+ ],
73
+ },
74
+ continuity: {
75
+ dagValidation: {
76
+ isValid: true,
77
+ hasCycles: false,
78
+ hasConflicts: false,
79
+ topologicalOrder: ['T1', 'T4', 'T2', 'T3', 'T5', 'T6', 'T7', 'T8'],
80
+ criticalPath: ['T1', 'T4', 'T5'],
81
+ },
82
+ },
83
+ },
84
+ taskOutputs: [
85
+ { taskId: 'T1', output: 'Express 앱 + YAML 기반 라우트 설정 파서', artifacts: ['src/app.ts', 'src/config/routes.yml'] },
86
+ { taskId: 'T2', output: 'http-proxy-middleware 기반 프록시', artifacts: ['src/middleware/proxy.ts'] },
87
+ { taskId: 'T3', output: 'JWT 검증 + 공개 경로 화이트리스트', artifacts: ['src/middleware/auth.ts'] },
88
+ { taskId: 'T4', output: 'Redis 연결 + sliding window 카운터', artifacts: ['src/lib/redis.ts', 'src/lib/sliding-window.ts'] },
89
+ { taskId: 'T5', output: '서비스별 rate limiting 미들웨어', artifacts: ['src/middleware/rate-limit.ts'] },
90
+ { taskId: 'T6', output: 'pino 기반 구조화 로깅', artifacts: ['src/middleware/logger.ts'] },
91
+ { taskId: 'T7', output: '/health 및 /health/:service 엔드포인트', artifacts: ['src/routes/health.ts'] },
92
+ { taskId: 'T8', output: '글로벌 에러 핸들러', artifacts: ['src/middleware/error-handler.ts'] },
93
+ ],
94
+ structuralResult: {
95
+ commands: [
96
+ { name: 'lint', command: 'eslint src/', exitCode: 0, output: 'No errors found' },
97
+ { name: 'build', command: 'tsc --noEmit', exitCode: 0, output: '' },
98
+ { name: 'test', command: 'vitest run', exitCode: 0, output: 'Tests: 31 passed' },
99
+ ],
100
+ allPassed: true,
101
+ },
102
+ evaluationResult: {
103
+ verifications: [
104
+ { acIndex: 0, satisfied: true, evidence: '프록시 라우팅 + 동적 서비스 등록', gaps: [] },
105
+ { acIndex: 1, satisfied: true, evidence: 'JWT 미들웨어 + 화이트리스트', gaps: [] },
106
+ { acIndex: 2, satisfied: true, evidence: 'Redis sliding window + 서비스별 한도', gaps: [] },
107
+ { acIndex: 3, satisfied: true, evidence: 'pino 구조화 로깅', gaps: [] },
108
+ { acIndex: 4, satisfied: true, evidence: '게이트웨이 + 다운스트림 헬스체크', gaps: [] },
109
+ ],
110
+ overallScore: 0.95,
111
+ goalAlignment: 0.92,
112
+ recommendations: ['서킷 브레이커 패턴 추가 고려'],
113
+ },
114
+ };
115
+ //# sourceMappingURL=api-gateway.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-gateway.scenario.js","sourceRoot":"","sources":["../../../benchmarks/scenarios/api-gateway.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BenchmarkScenario } from '../types.js';
2
+ export declare const authSystemScenario: BenchmarkScenario;
3
+ //# sourceMappingURL=auth-system.scenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-system.scenario.d.ts","sourceRoot":"","sources":["../../../benchmarks/scenarios/auth-system.scenario.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,kBAAkB,EAAE,iBAgHhC,CAAC"}
@@ -0,0 +1,114 @@
1
+ export const authSystemScenario = {
2
+ name: 'auth-system',
3
+ description: 'JWT 기반 사용자 인증 시스템',
4
+ topic: '사용자 인증 시스템',
5
+ userResponses: [
6
+ 'JWT 기반 인증 시스템을 구현하려 합니다. 회원가입, 로그인, 토큰 갱신이 필요합니다.',
7
+ 'bcrypt로 패스워드 해싱, access token 15분, refresh token 7일 유효기간입니다.',
8
+ 'PostgreSQL 사용, 이메일 중복 불가, 비밀번호 최소 8자, 대소문자+숫자 포함 필수입니다.',
9
+ 'rate limiting은 IP당 로그인 시도 5회/분, 실패 시 5분 잠금입니다.',
10
+ '우선순위: 1) 로그인/회원가입 2) 토큰 갱신 3) rate limiting 4) 로그아웃',
11
+ ],
12
+ expectedSpec: {
13
+ goal: 'JWT 기반 사용자 인증 시스템 구현 (회원가입, 로그인, 토큰 갱신, rate limiting)',
14
+ constraints: [
15
+ 'bcrypt 패스워드 해싱',
16
+ 'Access token 유효기간 15분',
17
+ 'Refresh token 유효기간 7일',
18
+ 'PostgreSQL 데이터베이스',
19
+ '비밀번호: 최소 8자, 대소문자+숫자 포함',
20
+ 'IP당 로그인 시도 5회/분, 실패 시 5분 잠금',
21
+ ],
22
+ acceptanceCriteria: [
23
+ 'AC0: 사용자 회원가입 — 이메일+비밀번호로 계정 생성, 이메일 중복 검증',
24
+ 'AC1: 사용자 로그인 — 이메일+비밀번호 인증 후 JWT access/refresh 토큰 발급',
25
+ 'AC2: 토큰 갱신 — refresh token으로 새 access token 발급',
26
+ 'AC3: Rate Limiting — IP당 5회/분 제한, 초과 시 5분 잠금',
27
+ 'AC4: 로그아웃 — refresh token 무효화',
28
+ ],
29
+ ontologySchema: {
30
+ entities: [
31
+ { name: 'User', description: '인증 사용자', attributes: ['id', 'email', 'passwordHash', 'createdAt'] },
32
+ { name: 'Token', description: 'JWT 토큰', attributes: ['id', 'userId', 'type', 'expiresAt'] },
33
+ { name: 'LoginAttempt', description: '로그인 시도 기록', attributes: ['ip', 'userId', 'success', 'timestamp'] },
34
+ ],
35
+ relations: [
36
+ { from: 'User', to: 'Token', type: 'has_many' },
37
+ { from: 'User', to: 'LoginAttempt', type: 'has_many' },
38
+ ],
39
+ },
40
+ gestaltAnalysis: [
41
+ { principle: 'closure', finding: '로그아웃 시 refresh token 무효화 로직 암묵적 요구', confidence: 0.9 },
42
+ { principle: 'figure_ground', finding: '로그인/회원가입이 핵심, rate limiting은 보조', confidence: 0.95 },
43
+ { principle: 'proximity', finding: '토큰 관리(발급/갱신/무효화)가 하나의 도메인 그룹', confidence: 0.85 },
44
+ ],
45
+ },
46
+ planningSteps: {
47
+ figureGround: {
48
+ classifiedACs: [
49
+ { acIndex: 0, classification: 'essential', reasoning: '핵심 진입점' },
50
+ { acIndex: 1, classification: 'essential', reasoning: '핵심 인증 기능' },
51
+ { acIndex: 2, classification: 'essential', reasoning: '토큰 수명 관리 필수' },
52
+ { acIndex: 3, classification: 'supplementary', reasoning: '보안 강화 부가 기능' },
53
+ { acIndex: 4, classification: 'supplementary', reasoning: '선택적 세션 종료' },
54
+ ],
55
+ },
56
+ closure: {
57
+ atomicTasks: [
58
+ { taskId: 'T1', title: 'User 엔티티 및 DB 스키마 생성', acIndices: [0], dependencies: [] },
59
+ { taskId: 'T2', title: '회원가입 API 엔드포인트', acIndices: [0], dependencies: ['T1'] },
60
+ { taskId: 'T3', title: 'JWT 토큰 발급 유틸리티', acIndices: [1, 2], dependencies: ['T1'] },
61
+ { taskId: 'T4', title: '로그인 API 엔드포인트', acIndices: [1], dependencies: ['T2', 'T3'] },
62
+ { taskId: 'T5', title: '토큰 갱신 API', acIndices: [2], dependencies: ['T3'] },
63
+ { taskId: 'T6', title: 'Rate Limiting 미들웨어', acIndices: [3], dependencies: ['T1'] },
64
+ { taskId: 'T7', title: '로그아웃 API 및 토큰 무효화', acIndices: [4], dependencies: ['T3'] },
65
+ ],
66
+ },
67
+ proximity: {
68
+ taskGroups: [
69
+ { groupId: 'G1', name: '사용자 관리', taskIds: ['T1', 'T2'] },
70
+ { groupId: 'G2', name: '인증/토큰', taskIds: ['T3', 'T4', 'T5', 'T7'] },
71
+ { groupId: 'G3', name: '보안', taskIds: ['T6'] },
72
+ ],
73
+ },
74
+ continuity: {
75
+ dagValidation: {
76
+ isValid: true,
77
+ hasCycles: false,
78
+ hasConflicts: false,
79
+ topologicalOrder: ['T1', 'T2', 'T3', 'T6', 'T4', 'T5', 'T7'],
80
+ criticalPath: ['T1', 'T2', 'T3', 'T4'],
81
+ },
82
+ },
83
+ },
84
+ taskOutputs: [
85
+ { taskId: 'T1', output: 'User 테이블 생성 마이그레이션 완료', artifacts: ['migrations/001_users.sql'] },
86
+ { taskId: 'T2', output: 'POST /auth/register 엔드포인트 구현 완료', artifacts: ['src/routes/auth.ts'] },
87
+ { taskId: 'T3', output: 'JWT 유틸리티 (sign, verify, refresh) 구현', artifacts: ['src/utils/jwt.ts'] },
88
+ { taskId: 'T4', output: 'POST /auth/login 엔드포인트 구현 완료', artifacts: ['src/routes/auth.ts'] },
89
+ { taskId: 'T5', output: 'POST /auth/refresh 엔드포인트 구현 완료', artifacts: ['src/routes/auth.ts'] },
90
+ { taskId: 'T6', output: 'Rate limiting 미들웨어 구현', artifacts: ['src/middleware/rate-limit.ts'] },
91
+ { taskId: 'T7', output: 'POST /auth/logout 구현, refresh token 블랙리스트', artifacts: ['src/routes/auth.ts'] },
92
+ ],
93
+ structuralResult: {
94
+ commands: [
95
+ { name: 'lint', command: 'eslint src/', exitCode: 0, output: 'No errors found' },
96
+ { name: 'build', command: 'tsc --noEmit', exitCode: 0, output: '' },
97
+ { name: 'test', command: 'vitest run', exitCode: 0, output: 'Tests: 24 passed' },
98
+ ],
99
+ allPassed: true,
100
+ },
101
+ evaluationResult: {
102
+ verifications: [
103
+ { acIndex: 0, satisfied: true, evidence: '회원가입 API, 이메일 중복 검증, 비밀번호 해싱 구현', gaps: [] },
104
+ { acIndex: 1, satisfied: true, evidence: '로그인 API, JWT 발급 구현', gaps: [] },
105
+ { acIndex: 2, satisfied: true, evidence: 'Refresh token으로 새 access token 발급', gaps: [] },
106
+ { acIndex: 3, satisfied: true, evidence: 'IP 기반 rate limiting 미들웨어 구현', gaps: [] },
107
+ { acIndex: 4, satisfied: true, evidence: '로그아웃 시 refresh token 블랙리스트', gaps: [] },
108
+ ],
109
+ overallScore: 0.92,
110
+ goalAlignment: 0.90,
111
+ recommendations: ['E2E 테스트 추가 권장'],
112
+ },
113
+ };
114
+ //# sourceMappingURL=auth-system.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-system.scenario.js","sourceRoot":"","sources":["../../../benchmarks/scenarios/auth-system.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BenchmarkScenario } from '../types.js';
2
+ export declare const dashboardScenario: BenchmarkScenario;
3
+ //# sourceMappingURL=dashboard.scenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.scenario.d.ts","sourceRoot":"","sources":["../../../benchmarks/scenarios/dashboard.scenario.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,iBAAiB,EAAE,iBA4G/B,CAAC"}
@@ -0,0 +1,110 @@
1
+ export const dashboardScenario = {
2
+ name: 'dashboard',
3
+ description: '실시간 모니터링 대시보드',
4
+ topic: '실시간 모니터링 대시보드',
5
+ userResponses: [
6
+ 'React 기반 실시간 메트릭 대시보드를 만들려 합니다. CPU, 메모리, 네트워크 트래픽을 시각화합니다.',
7
+ 'WebSocket으로 실시간 데이터 수신, Chart.js로 차트 렌더링, 5초 간격 업데이트입니다.',
8
+ '대시보드 레이아웃은 그리드 기반, 위젯 드래그앤드롭 재배치 가능해야 합니다.',
9
+ '알림 시스템: CPU > 90% 또는 메모리 > 85%일 때 토스트 알림 + 차트 색상 변경',
10
+ '우선순위: 1) 실시간 차트 2) WebSocket 연결 3) 알림 4) 레이아웃 커스텀',
11
+ ],
12
+ expectedSpec: {
13
+ goal: 'React 기반 실시간 시스템 메트릭 모니터링 대시보드 구현',
14
+ constraints: [
15
+ 'React + TypeScript',
16
+ 'WebSocket 실시간 통신',
17
+ 'Chart.js 차트 라이브러리',
18
+ '5초 간격 데이터 업데이트',
19
+ '그리드 기반 드래그앤드롭 레이아웃',
20
+ ],
21
+ acceptanceCriteria: [
22
+ 'AC0: 실시간 차트 위젯 — CPU, 메모리, 네트워크 메트릭을 Chart.js로 시각화',
23
+ 'AC1: WebSocket 연결 — 서버와 실시간 양방향 통신, 자동 재연결',
24
+ 'AC2: 알림 시스템 — 임계치 초과 시 토스트 알림 + 차트 색상 변경',
25
+ 'AC3: 그리드 레이아웃 — 위젯 드래그앤드롭 재배치, 레이아웃 저장/복원',
26
+ ],
27
+ ontologySchema: {
28
+ entities: [
29
+ { name: 'MetricData', description: '시스템 메트릭 데이터 포인트', attributes: ['type', 'value', 'timestamp'] },
30
+ { name: 'Widget', description: '대시보드 위젯', attributes: ['id', 'type', 'position', 'size'] },
31
+ { name: 'Alert', description: '알림 규칙', attributes: ['metric', 'threshold', 'severity'] },
32
+ { name: 'Layout', description: '대시보드 레이아웃', attributes: ['id', 'widgets', 'savedAt'] },
33
+ ],
34
+ relations: [
35
+ { from: 'Widget', to: 'MetricData', type: 'displays' },
36
+ { from: 'Alert', to: 'MetricData', type: 'monitors' },
37
+ { from: 'Layout', to: 'Widget', type: 'contains' },
38
+ ],
39
+ },
40
+ gestaltAnalysis: [
41
+ { principle: 'figure_ground', finding: '실시간 차트가 핵심(figure), 레이아웃 커스텀은 보조(ground)', confidence: 0.92 },
42
+ { principle: 'proximity', finding: 'WebSocket+차트+알림이 실시간 모니터링 도메인으로 그룹핑', confidence: 0.88 },
43
+ { principle: 'continuity', finding: 'WebSocket 연결 → 데이터 수신 → 차트 업데이트 → 알림 체크 흐름', confidence: 0.90 },
44
+ ],
45
+ },
46
+ planningSteps: {
47
+ figureGround: {
48
+ classifiedACs: [
49
+ { acIndex: 0, classification: 'essential', reasoning: '핵심 시각화 기능' },
50
+ { acIndex: 1, classification: 'essential', reasoning: '실시간 데이터의 근간' },
51
+ { acIndex: 2, classification: 'supplementary', reasoning: '사용성 강화 부가기능' },
52
+ { acIndex: 3, classification: 'supplementary', reasoning: '편의 기능' },
53
+ ],
54
+ },
55
+ closure: {
56
+ atomicTasks: [
57
+ { taskId: 'T1', title: 'WebSocket 클라이언트 훅 구현', acIndices: [1], dependencies: [] },
58
+ { taskId: 'T2', title: 'MetricData 타입 및 스토어', acIndices: [0], dependencies: [] },
59
+ { taskId: 'T3', title: 'Chart.js 차트 위젯 컴포넌트', acIndices: [0], dependencies: ['T2'] },
60
+ { taskId: 'T4', title: 'WebSocket-Chart 데이터 바인딩', acIndices: [0, 1], dependencies: ['T1', 'T3'] },
61
+ { taskId: 'T5', title: '알림 엔진 및 토스트 UI', acIndices: [2], dependencies: ['T2'] },
62
+ { taskId: 'T6', title: '그리드 레이아웃 + 드래그앤드롭', acIndices: [3], dependencies: ['T3'] },
63
+ ],
64
+ },
65
+ proximity: {
66
+ taskGroups: [
67
+ { groupId: 'G1', name: '데이터 레이어', taskIds: ['T1', 'T2'] },
68
+ { groupId: 'G2', name: '시각화', taskIds: ['T3', 'T4'] },
69
+ { groupId: 'G3', name: 'UX 기능', taskIds: ['T5', 'T6'] },
70
+ ],
71
+ },
72
+ continuity: {
73
+ dagValidation: {
74
+ isValid: true,
75
+ hasCycles: false,
76
+ hasConflicts: false,
77
+ topologicalOrder: ['T1', 'T2', 'T3', 'T5', 'T4', 'T6'],
78
+ criticalPath: ['T2', 'T3', 'T4'],
79
+ },
80
+ },
81
+ },
82
+ taskOutputs: [
83
+ { taskId: 'T1', output: 'useWebSocket 훅 구현, 자동 재연결 포함', artifacts: ['src/hooks/useWebSocket.ts'] },
84
+ { taskId: 'T2', output: 'MetricData 타입 정의 및 Zustand 스토어', artifacts: ['src/types/metric.ts', 'src/stores/metricStore.ts'] },
85
+ { taskId: 'T3', output: 'LineChart, AreaChart 위젯 컴포넌트', artifacts: ['src/components/charts/LineChart.tsx'] },
86
+ { taskId: 'T4', output: 'WebSocket 데이터를 Chart에 연결하는 바인딩 레이어', artifacts: ['src/hooks/useMetricStream.ts'] },
87
+ { taskId: 'T5', output: '알림 엔진 + react-toastify 통합', artifacts: ['src/features/alerts/AlertEngine.ts'] },
88
+ { taskId: 'T6', output: 'react-grid-layout 기반 드래그앤드롭', artifacts: ['src/components/DashboardGrid.tsx'] },
89
+ ],
90
+ structuralResult: {
91
+ commands: [
92
+ { name: 'lint', command: 'eslint src/', exitCode: 0, output: 'No errors found' },
93
+ { name: 'build', command: 'tsc --noEmit', exitCode: 0, output: '' },
94
+ { name: 'test', command: 'vitest run', exitCode: 0, output: 'Tests: 18 passed' },
95
+ ],
96
+ allPassed: true,
97
+ },
98
+ evaluationResult: {
99
+ verifications: [
100
+ { acIndex: 0, satisfied: true, evidence: 'Chart.js 기반 CPU/메모리/네트워크 위젯 구현', gaps: [] },
101
+ { acIndex: 1, satisfied: true, evidence: 'WebSocket 훅 + 자동 재연결 구현', gaps: [] },
102
+ { acIndex: 2, satisfied: true, evidence: '임계치 알림 엔진 + 토스트 UI', gaps: ['차트 색상 변경 미구현'] },
103
+ { acIndex: 3, satisfied: true, evidence: 'react-grid-layout 드래그앤드롭', gaps: [] },
104
+ ],
105
+ overallScore: 0.88,
106
+ goalAlignment: 0.85,
107
+ recommendations: ['알림 시 차트 색상 변경 기능 추가 권장'],
108
+ },
109
+ };
110
+ //# sourceMappingURL=dashboard.scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.scenario.js","sourceRoot":"","sources":["../../../benchmarks/scenarios/dashboard.scenario.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ export interface BenchmarkScenario {
2
+ name: string;
3
+ description: string;
4
+ topic: string;
5
+ userResponses: string[];
6
+ expectedSpec: {
7
+ goal: string;
8
+ constraints: string[];
9
+ acceptanceCriteria: string[];
10
+ ontologySchema: {
11
+ entities: Array<{
12
+ name: string;
13
+ description: string;
14
+ attributes: string[];
15
+ }>;
16
+ relations: Array<{
17
+ from: string;
18
+ to: string;
19
+ type: string;
20
+ }>;
21
+ };
22
+ gestaltAnalysis: Array<{
23
+ principle: string;
24
+ finding: string;
25
+ confidence: number;
26
+ }>;
27
+ };
28
+ planningSteps: {
29
+ figureGround: {
30
+ classifiedACs: Array<{
31
+ acIndex: number;
32
+ classification: 'essential' | 'supplementary';
33
+ reasoning: string;
34
+ }>;
35
+ };
36
+ closure: {
37
+ atomicTasks: Array<{
38
+ taskId: string;
39
+ title: string;
40
+ acIndices: number[];
41
+ dependencies: string[];
42
+ }>;
43
+ };
44
+ proximity: {
45
+ taskGroups: Array<{
46
+ groupId: string;
47
+ name: string;
48
+ taskIds: string[];
49
+ }>;
50
+ };
51
+ continuity: {
52
+ dagValidation: {
53
+ isValid: boolean;
54
+ hasCycles: boolean;
55
+ hasConflicts: boolean;
56
+ topologicalOrder: string[];
57
+ criticalPath: string[];
58
+ };
59
+ };
60
+ };
61
+ taskOutputs: Array<{
62
+ taskId: string;
63
+ output: string;
64
+ artifacts: string[];
65
+ }>;
66
+ structuralResult: {
67
+ commands: Array<{
68
+ name: string;
69
+ command: string;
70
+ exitCode: number;
71
+ output: string;
72
+ }>;
73
+ allPassed: boolean;
74
+ };
75
+ evaluationResult: {
76
+ verifications: Array<{
77
+ acIndex: number;
78
+ satisfied: boolean;
79
+ evidence: string;
80
+ gaps: string[];
81
+ }>;
82
+ overallScore: number;
83
+ goalAlignment: number;
84
+ recommendations: string[];
85
+ };
86
+ }
87
+ export interface StageMetrics {
88
+ name: string;
89
+ durationMs: number;
90
+ success: boolean;
91
+ }
92
+ export interface LLMCallMetric {
93
+ stage: string;
94
+ latencyMs: number;
95
+ inputTokens: number;
96
+ outputTokens: number;
97
+ jsonParseSuccess: boolean;
98
+ retried: boolean;
99
+ }
100
+ export interface LLMMetrics {
101
+ totalCalls: number;
102
+ totalInputTokens: number;
103
+ totalOutputTokens: number;
104
+ totalTokens: number;
105
+ estimatedCostUSD: number;
106
+ avgLatencyMs: number;
107
+ jsonParseFailures: number;
108
+ calls: LLMCallMetric[];
109
+ }
110
+ export interface PipelineMetrics {
111
+ mode: 'passthrough';
112
+ model: string;
113
+ scenario: string;
114
+ totalDurationMs: number;
115
+ stages: StageMetrics[];
116
+ interview: {
117
+ rounds: number;
118
+ finalAmbiguity: number;
119
+ };
120
+ spec: {
121
+ generated: boolean;
122
+ };
123
+ execute: {
124
+ taskCount: number;
125
+ completionRate: number;
126
+ driftAlerts: number;
127
+ };
128
+ evaluate: {
129
+ overallScore: number;
130
+ goalAlignment: number;
131
+ satisfiedACs: string;
132
+ };
133
+ llmMetrics: LLMMetrics;
134
+ }
135
+ export interface BenchmarkResult {
136
+ timestamp: string;
137
+ nodeVersion: string;
138
+ scenarios: PipelineMetrics[];
139
+ summary: {
140
+ totalScenarios: number;
141
+ allPassed: boolean;
142
+ avgScore: number;
143
+ avgGoalAlignment: number;
144
+ totalDurationMs: number;
145
+ totalCalls: number;
146
+ };
147
+ }
148
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../benchmarks/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../benchmarks/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@tienne/gestalt",
3
+ "version": "0.5.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
+ "bench": "tsx benchmarks/run.ts",
30
+ "lint": "tsc --noEmit",
31
+ "version:sync": "tsx scripts/sync-version.ts",
32
+ "postversion": "pnpm run version:sync"
33
+ },
34
+ "dependencies": {
35
+ "@anthropic-ai/sdk": "^0.39.0",
36
+ "@modelcontextprotocol/sdk": "^1.12.1",
37
+ "@types/react": "^19.2.14",
38
+ "better-sqlite3": "^11.8.2",
39
+ "chokidar": "^4.0.3",
40
+ "commander": "^13.1.0",
41
+ "dotenv": "^17.3.1",
42
+ "gray-matter": "^4.0.3",
43
+ "ink": "^6.8.0",
44
+ "openai": "^6.27.0",
45
+ "react": "^19.2.4",
46
+ "zod": "^3.24.2"
47
+ },
48
+ "devDependencies": {
49
+ "@types/better-sqlite3": "^7.6.13",
50
+ "@types/node": "^22.13.10",
51
+ "tsx": "^4.19.3",
52
+ "typescript": "^5.8.2",
53
+ "vitest": "^3.0.9"
54
+ },
55
+ "pnpm": {
56
+ "onlyBuiltDependencies": [
57
+ "better-sqlite3",
58
+ "esbuild"
59
+ ]
60
+ }
61
+ }