@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,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ function parseSpecEvents(events, sessionId) {
5
+ if (!sessionId)
6
+ return null;
7
+ // Spec events may be tied to the interview session or an execute session
8
+ // Look for SPEC_GENERATED events across all events matching the session
9
+ const specEvents = events.filter((e) => e.eventType === 'spec.generated' &&
10
+ (e.aggregateId === sessionId || hasMatchingSessionId(e, sessionId)));
11
+ if (specEvents.length === 0)
12
+ return null;
13
+ // Use the latest spec event
14
+ const latestSpec = specEvents[specEvents.length - 1];
15
+ if (!latestSpec)
16
+ return null;
17
+ const payload = latestSpec.payload;
18
+ // The spec may be nested under "spec" or at the top level
19
+ const spec = payload.spec ?? payload;
20
+ const ontology = spec.ontologySchema ?? {};
21
+ return {
22
+ goal: spec.goal ?? '',
23
+ constraints: spec.constraints ?? [],
24
+ acceptanceCriteria: spec.acceptanceCriteria ?? [],
25
+ entities: ontology.entities ?? [],
26
+ relations: ontology.relations ?? [],
27
+ gestaltAnalysis: spec.gestaltAnalysis ?? [],
28
+ generatedAt: latestSpec.timestamp,
29
+ };
30
+ }
31
+ function hasMatchingSessionId(event, sessionId) {
32
+ const payload = event.payload;
33
+ return (payload.interviewSessionId === sessionId ||
34
+ payload.sessionId === sessionId);
35
+ }
36
+ const PRINCIPLE_COLORS = {
37
+ closure: 'magenta',
38
+ proximity: 'blue',
39
+ similarity: 'yellow',
40
+ figure_ground: 'green',
41
+ continuity: 'cyan',
42
+ };
43
+ export function SpecViewerScreen({ events, selectedSessionId, }) {
44
+ const spec = useMemo(() => parseSpecEvents(events, selectedSessionId), [events, selectedSessionId]);
45
+ if (!selectedSessionId) {
46
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No session selected" }), _jsx(Text, { dimColor: true, children: "Press 1 to go to Sessions and select one." })] }));
47
+ }
48
+ if (!spec) {
49
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No spec found" }), _jsx(Text, { dimColor: true, children: "No SPEC_GENERATED event found for this session." })] }));
50
+ }
51
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Spec Viewer" }), _jsxs(Text, { dimColor: true, children: ["| generated: ", formatTimestamp(spec.generatedAt)] })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Goal" }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { children: spec.goal }) })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Constraints" }), _jsxs(Text, { dimColor: true, children: ["(", spec.constraints.length, ")"] })] }), spec.constraints.map((c, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { color: "yellow", children: "- " }), _jsx(Text, { children: truncate(c, 80) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "green", children: "Acceptance Criteria" }), _jsxs(Text, { dimColor: true, children: ["(", spec.acceptanceCriteria.length, ")"] })] }), spec.acceptanceCriteria.map((ac, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsxs(Text, { color: "green", children: [i + 1, ". "] }), _jsx(Text, { children: truncate(ac, 78) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "magenta", children: "Ontology" }), _jsxs(Text, { dimColor: true, children: ["(", spec.entities.length, " entities, ", spec.relations.length, " relations)"] })] }), spec.entities.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsx(Text, { bold: true, dimColor: true, children: "Entities:" }), spec.entities.map((entity) => (_jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "magenta", children: entity.name }), _jsxs(Text, { dimColor: true, children: ["- ", truncate(entity.description, 50)] })] }), entity.attributes.length > 0 && (_jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["attrs: ", entity.attributes.join(', ')] }) }))] }, entity.name)))] })), spec.relations.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Relations:" }), spec.relations.map((rel, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { color: "magenta", children: rel.from }), _jsxs(Text, { dimColor: true, children: ["--[", rel.type, "]--", '>'] }), _jsx(Text, { color: "magenta", children: rel.to })] }, i)))] }))] }), spec.gestaltAnalysis.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "blue", children: "Gestalt Analysis" }), _jsxs(Text, { dimColor: true, children: ["(", spec.gestaltAnalysis.length, ")"] })] }), spec.gestaltAnalysis.map((ga, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsxs(Text, { color: PRINCIPLE_COLORS[ga.principle] ?? 'gray', children: ["[", ga.principle, "]"] }), _jsx(Text, { children: truncate(ga.finding, 60) }), _jsxs(Text, { dimColor: true, children: ["(", (ga.confidence * 100).toFixed(0), "%)"] })] }, i)))] }))] }));
52
+ }
53
+ function truncate(str, max) {
54
+ if (str.length <= max)
55
+ return str;
56
+ return str.slice(0, max - 3) + '...';
57
+ }
58
+ function formatTimestamp(ts) {
59
+ try {
60
+ const d = new Date(ts);
61
+ return d.toLocaleString('en-US', {
62
+ month: 'short',
63
+ day: '2-digit',
64
+ hour: '2-digit',
65
+ minute: '2-digit',
66
+ hour12: false,
67
+ });
68
+ }
69
+ catch {
70
+ return ts.slice(0, 19);
71
+ }
72
+ }
73
+ //# sourceMappingURL=SpecViewerScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecViewerScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/SpecViewerScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface DriftDimension {
3
+ name: string;
4
+ score: number;
5
+ weight: number;
6
+ }
7
+ interface DriftMeterProps {
8
+ dimensions: DriftDimension[];
9
+ overall: number;
10
+ threshold: number;
11
+ barWidth?: number;
12
+ }
13
+ export declare function DriftMeter({ dimensions, overall, threshold, barWidth, }: DriftMeterProps): React.ReactElement;
14
+ export {};
15
+ //# sourceMappingURL=DriftMeter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriftMeter.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,OAAO,EACP,SAAS,EACT,QAAa,GACd,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAyCtC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const DIMENSION_COLORS = {
4
+ goal: 'blue',
5
+ constraint: 'magenta',
6
+ ontology: 'yellow',
7
+ };
8
+ export function DriftMeter({ dimensions, overall, threshold, barWidth = 20, }) {
9
+ const overThreshold = overall > threshold;
10
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Drift" }), _jsxs(Text, { color: overThreshold ? 'red' : 'green', bold: true, children: [(overall * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["threshold: ", (threshold * 100).toFixed(0), "%"] })] }), dimensions.map((dim) => {
11
+ const dimOver = dim.score > threshold;
12
+ const color = DIMENSION_COLORS[dim.name] ?? 'white';
13
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { color: color, children: padRight(dim.name, 11) }) }), _jsx(Text, { children: renderBar(dim.score, barWidth, dimOver) }), _jsxs(Text, { color: dimOver ? 'red' : 'green', children: [(dim.score * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["(", (dim.weight * 100).toFixed(0), "%w)"] })] }, dim.name));
14
+ }), overThreshold && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", bold: true, children: "WARNING: Drift exceeds threshold!" }) }))] }));
15
+ }
16
+ function renderBar(score, width, over) {
17
+ const filled = Math.round(score * width);
18
+ const empty = width - filled;
19
+ const fillChar = over ? '#' : '=';
20
+ return '[' + fillChar.repeat(filled) + ' '.repeat(empty) + ']';
21
+ }
22
+ function padRight(str, len) {
23
+ if (str.length >= len)
24
+ return str;
25
+ return str + ' '.repeat(len - str.length);
26
+ }
27
+ //# sourceMappingURL=DriftMeter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DriftMeter.js","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export type PrinciplePhase = 'figure_ground' | 'closure' | 'proximity' | 'continuity';
3
+ interface GestaltPrincipleBarProps {
4
+ currentPhase: PrinciplePhase | null;
5
+ completedPhases: PrinciplePhase[];
6
+ }
7
+ export declare function GestaltPrincipleBar({ currentPhase, completedPhases, }: GestaltPrincipleBarProps): React.ReactElement;
8
+ export {};
9
+ //# sourceMappingURL=GestaltPrincipleBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestaltPrincipleBar.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AA4BtF,UAAU,wBAAwB;IAChC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GAChB,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAuC/C"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text } from 'ink';
4
+ const PHASES = [
5
+ { key: 'figure_ground', label: 'Figure-Ground' },
6
+ { key: 'closure', label: 'Closure' },
7
+ { key: 'proximity', label: 'Proximity' },
8
+ { key: 'continuity', label: 'Continuity' },
9
+ ];
10
+ const STATUS_COLORS = {
11
+ completed: 'green',
12
+ active: 'cyan',
13
+ pending: 'gray',
14
+ };
15
+ const STATUS_ICONS = {
16
+ completed: '[x]',
17
+ active: '[>]',
18
+ pending: '[ ]',
19
+ };
20
+ export function GestaltPrincipleBar({ currentPhase, completedPhases, }) {
21
+ function getStatus(phase) {
22
+ if (completedPhases.includes(phase))
23
+ return 'completed';
24
+ if (phase === currentPhase)
25
+ return 'active';
26
+ return 'pending';
27
+ }
28
+ const completedCount = completedPhases.length;
29
+ const totalCount = PHASES.length;
30
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Gestalt Phases" }), _jsxs(Text, { dimColor: true, children: ["(", completedCount, "/", totalCount, ")"] })] }), _jsx(Box, { gap: 1, children: PHASES.map((phase, index) => {
31
+ const status = getStatus(phase.key);
32
+ return (_jsxs(React.Fragment, { children: [_jsx(Box, { children: _jsxs(Text, { color: STATUS_COLORS[status], bold: status === 'active', children: [STATUS_ICONS[status], " ", phase.label] }) }), index < PHASES.length - 1 && (_jsx(Text, { color: completedPhases.includes(phase.key) ? 'green' : 'gray', children: ' -> ' }))] }, phase.key));
33
+ }) })] }));
34
+ }
35
+ //# sourceMappingURL=GestaltPrincipleBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestaltPrincipleBar.js","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,MAAM,GAAgB;IAC1B,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;IAChD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACxC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;CAC3C,CAAC;AAEF,MAAM,aAAa,GAAgC;IACjD,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,YAAY,GAAgC;IAChD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;CACf,CAAC;AAOF,MAAM,UAAU,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GACU;IACzB,SAAS,SAAS,CAAC,KAAqB;QACtC,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACxD,IAAI,KAAK,KAAK,YAAY;YAAE,OAAO,QAAQ,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IAEjC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aAC1B,KAAC,IAAI,IAAC,IAAI,qCAAsB,EAChC,MAAC,IAAI,IAAC,QAAQ,wBACV,cAAc,OAAG,UAAU,SACxB,IACH,EACN,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACpC,OAAO,CACL,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,aAC1D,YAAY,CAAC,MAAM,CAAC,OAAG,KAAK,CAAC,KAAK,IAC9B,GACH,EACL,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5B,KAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAChE,MAAM,GACF,CACR,KAVkB,KAAK,CAAC,GAAG,CAWb,CAClB,CAAC;gBACJ,CAAC,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';
3
+ export interface TaskNode {
4
+ id: string;
5
+ title: string;
6
+ status: TaskStatus;
7
+ dependsOn: string[];
8
+ }
9
+ interface TaskDAGTreeProps {
10
+ tasks: TaskNode[];
11
+ maxHeight?: number;
12
+ }
13
+ export declare function TaskDAGTree({ tasks, maxHeight }: TaskDAGTreeProps): React.ReactElement;
14
+ export {};
15
+ //# sourceMappingURL=TaskDAGTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskDAGTree.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/TaskDAGTree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAkBD,UAAU,gBAAgB;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAwCtF"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const STATUS_ICONS = {
4
+ pending: 'o',
5
+ in_progress: '>',
6
+ completed: 'v',
7
+ failed: 'x',
8
+ skipped: '-',
9
+ };
10
+ const STATUS_COLORS = {
11
+ pending: 'gray',
12
+ in_progress: 'cyan',
13
+ completed: 'green',
14
+ failed: 'red',
15
+ skipped: 'yellow',
16
+ };
17
+ export function TaskDAGTree({ tasks, maxHeight }) {
18
+ const completedCount = tasks.filter((t) => t.status === 'completed').length;
19
+ const failedCount = tasks.filter((t) => t.status === 'failed').length;
20
+ const totalCount = tasks.length;
21
+ const layers = buildLayers(tasks);
22
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Task DAG" }), _jsxs(Text, { color: "green", children: [completedCount, "v"] }), failedCount > 0 && _jsxs(Text, { color: "red", children: [failedCount, "x"] }), _jsxs(Text, { dimColor: true, children: [completedCount, "/", totalCount] })] }), _jsx(Box, { flexDirection: "column", height: maxHeight, children: layers.map((layer, layerIdx) => (_jsxs(Box, { flexDirection: "column", children: [layerIdx > 0 && (_jsx(Text, { dimColor: true, children: " |" })), layer.map((task) => (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: STATUS_COLORS[task.status], children: STATUS_ICONS[task.status] }), _jsxs(Text, { color: STATUS_COLORS[task.status], bold: task.status === 'in_progress', children: [' ', task.id] }), _jsxs(Text, { dimColor: true, children: [" ", truncate(task.title, 40)] })] }, task.id)))] }, layerIdx))) })] }));
23
+ }
24
+ function buildLayers(tasks) {
25
+ if (tasks.length === 0)
26
+ return [];
27
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
28
+ const layers = [];
29
+ const placed = new Set();
30
+ // Kahn's algorithm for layer assignment
31
+ while (placed.size < tasks.length) {
32
+ const layer = [];
33
+ for (const task of tasks) {
34
+ if (placed.has(task.id))
35
+ continue;
36
+ const depsPlaced = task.dependsOn.every((dep) => placed.has(dep) || !taskMap.has(dep));
37
+ if (depsPlaced) {
38
+ layer.push(task);
39
+ }
40
+ }
41
+ if (layer.length === 0)
42
+ break; // cycle guard
43
+ for (const t of layer)
44
+ placed.add(t.id);
45
+ layers.push(layer);
46
+ }
47
+ return layers;
48
+ }
49
+ function truncate(str, max) {
50
+ if (str.length <= max)
51
+ return str;
52
+ return str.slice(0, max - 3) + '...';
53
+ }
54
+ //# sourceMappingURL=TaskDAGTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskDAGTree.js","sourceRoot":"","sources":["../../../../src/tui/widgets/TaskDAGTree.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.1.1",
3
+ "version": "0.5.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -15,26 +15,34 @@
15
15
  "dist",
16
16
  "agents",
17
17
  "skills",
18
+ "schemas",
18
19
  "CLAUDE.md"
19
20
  ],
20
21
  "scripts": {
21
22
  "dev": "tsx bin/gestalt.ts",
22
23
  "build": "tsc",
23
- "postbuild": "cp -r agents dist/ && cp -r skills dist/ && chmod +x dist/bin/gestalt.js",
24
+ "postbuild": "cp -r agents dist/ && cp -r skills dist/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js",
24
25
  "prepublishOnly": "pnpm build",
25
26
  "test": "vitest run",
26
27
  "test:watch": "vitest",
27
28
  "serve": "tsx bin/gestalt.ts serve",
28
- "lint": "tsc --noEmit"
29
+ "bench": "tsx benchmarks/run.ts",
30
+ "lint": "tsc --noEmit",
31
+ "version:sync": "tsx scripts/sync-version.ts",
32
+ "postversion": "pnpm run version:sync"
29
33
  },
30
34
  "dependencies": {
31
35
  "@anthropic-ai/sdk": "^0.39.0",
32
36
  "@modelcontextprotocol/sdk": "^1.12.1",
37
+ "@types/react": "^19.2.14",
33
38
  "better-sqlite3": "^11.8.2",
34
39
  "chokidar": "^4.0.3",
35
40
  "commander": "^13.1.0",
41
+ "dotenv": "^17.3.1",
36
42
  "gray-matter": "^4.0.3",
43
+ "ink": "^6.8.0",
37
44
  "openai": "^6.27.0",
45
+ "react": "^19.2.4",
38
46
  "zod": "^3.24.2"
39
47
  },
40
48
  "devDependencies": {
@@ -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
+ }