@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,39 @@
1
+ import type { SpecPatch, EvaluationResult } from '../core/types.js';
2
+ export type StagnationPattern = 'spinning' | 'oscillation' | 'no_drift' | 'diminishing_returns';
3
+ export type LateralPersonaName = 'multistability' | 'simplicity' | 'reification' | 'invariance';
4
+ /**
5
+ * Stagnation Pattern → Lateral Persona 매핑
6
+ *
7
+ * | Pattern | Persona | 전략 |
8
+ * |--------------------|----------------|--------------------|
9
+ * | spinning (hard_cap)| Multistability | 다른 각도로 보기 |
10
+ * | oscillation | Simplicity | 단순하게 줄이기 |
11
+ * | no_drift | Reification | 빠진 조각 채우기 |
12
+ * | diminishing_returns| Invariance | 성공 패턴 복제하기 |
13
+ */
14
+ export declare const STAGNATION_PERSONA_MAP: Record<StagnationPattern, LateralPersonaName>;
15
+ export interface LateralContext {
16
+ systemPrompt: string;
17
+ lateralPrompt: string;
18
+ phase: 'evolving';
19
+ stage: 'lateral';
20
+ persona: LateralPersonaName;
21
+ pattern: StagnationPattern;
22
+ attemptNumber: number;
23
+ previousScores: number[];
24
+ }
25
+ export interface LateralResult {
26
+ persona: LateralPersonaName;
27
+ specPatch: SpecPatch;
28
+ description: string;
29
+ }
30
+ export interface EscalationContext {
31
+ phase: 'evolving';
32
+ stage: 'human_escalation';
33
+ message: string;
34
+ triedPersonas: LateralPersonaName[];
35
+ bestScore: number;
36
+ lastEvaluationResult: EvaluationResult;
37
+ suggestions: string[];
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/resilience/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,qBAAqB,CAAC;AAChG,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC;AAEhG;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAKhF,CAAC;AAIF,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,gBAAgB,CAAC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Stagnation Pattern → Lateral Persona 매핑
3
+ *
4
+ * | Pattern | Persona | 전략 |
5
+ * |--------------------|----------------|--------------------|
6
+ * | spinning (hard_cap)| Multistability | 다른 각도로 보기 |
7
+ * | oscillation | Simplicity | 단순하게 줄이기 |
8
+ * | no_drift | Reification | 빠진 조각 채우기 |
9
+ * | diminishing_returns| Invariance | 성공 패턴 복제하기 |
10
+ */
11
+ export const STAGNATION_PERSONA_MAP = {
12
+ spinning: 'multistability',
13
+ oscillation: 'simplicity',
14
+ no_drift: 'reification',
15
+ diminishing_returns: 'invariance',
16
+ };
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/resilience/types.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkD;IACnF,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EAAE,YAAY;IACzB,QAAQ,EAAE,aAAa;IACvB,mBAAmB,EAAE,YAAY;CAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { AgentDefinition, ReviewContext } from '../core/types.js';
2
+ export interface ReviewMatchContext {
3
+ systemPrompt: string;
4
+ matchingPrompt: string;
5
+ availableAgents: Array<{
6
+ name: string;
7
+ domain: string[];
8
+ description: string;
9
+ category: string;
10
+ }>;
11
+ }
12
+ export declare class ReviewAgentMatcher {
13
+ generateMatchContext(reviewContext: ReviewContext, roleAgents: AgentDefinition[], reviewAgents: AgentDefinition[]): ReviewMatchContext;
14
+ }
15
+ //# sourceMappingURL=agent-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-matcher.d.ts","sourceRoot":"","sources":["../../../src/review/agent-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnG;AAED,qBAAa,kBAAkB;IAC7B,oBAAoB,CAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,eAAe,EAAE,EAC7B,YAAY,EAAE,eAAe,EAAE,GAC9B,kBAAkB;CAkEtB"}
@@ -0,0 +1,61 @@
1
+ export class ReviewAgentMatcher {
2
+ generateMatchContext(reviewContext, roleAgents, reviewAgents) {
3
+ const allAgents = [...roleAgents, ...reviewAgents];
4
+ const availableAgents = allAgents.map((a) => ({
5
+ name: a.frontmatter.name,
6
+ domain: a.frontmatter.domain ?? [],
7
+ description: a.frontmatter.description,
8
+ category: a.frontmatter.pipeline === 'review' ? 'review-specialist' : 'role-agent',
9
+ }));
10
+ const systemPrompt = `You are a code review agent matcher for the Gestalt pipeline.
11
+ Your job is to select the most relevant agents for reviewing the code changes.
12
+
13
+ ## Agent Types
14
+ - **role-agent**: Domain experts (e.g., architect, frontend-developer) who review from their specialty perspective
15
+ - **review-specialist**: Code review experts (e.g., security-reviewer, performance-reviewer) who review specific quality aspects
16
+
17
+ ## Rules
18
+ 1. Always include at least one review-specialist
19
+ 2. Match role-agents based on the domain of changed files
20
+ 3. Each match should include a relevance score (0.0-1.0) and reasoning
21
+ 4. Consider the spec goal and constraints when matching
22
+
23
+ ## Output Format
24
+ Respond with ONLY a JSON object:
25
+ {
26
+ "matches": [
27
+ {
28
+ "agentName": "name",
29
+ "domain": ["relevant", "domains"],
30
+ "relevanceScore": 0.85,
31
+ "reasoning": "Why this agent should review"
32
+ }
33
+ ]
34
+ }`;
35
+ const agentList = availableAgents
36
+ .map((a) => `- **${a.name}** [${a.category}]: ${a.description} (domains: ${a.domain.join(', ')})`)
37
+ .join('\n');
38
+ const fileList = reviewContext.changedFiles.join('\n ');
39
+ const depList = reviewContext.dependencyFiles.length > 0
40
+ ? reviewContext.dependencyFiles.join('\n ')
41
+ : '(none)';
42
+ const matchingPrompt = `## Code Review Agent Matching
43
+
44
+ **Spec Goal**: ${reviewContext.spec.goal}
45
+
46
+ **Changed Files** (${reviewContext.changedFiles.length}):
47
+ ${fileList}
48
+
49
+ **Dependency Context** (${reviewContext.dependencyFiles.length}):
50
+ ${depList}
51
+
52
+ **Task Results Summary**: ${reviewContext.taskResults.length} tasks completed
53
+
54
+ **Available Agents** (${availableAgents.length}):
55
+ ${agentList}
56
+
57
+ Select the most relevant agents for reviewing these code changes. Include both role-agents and review-specialists.`;
58
+ return { systemPrompt, matchingPrompt, availableAgents };
59
+ }
60
+ }
61
+ //# sourceMappingURL=agent-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-matcher.js","sourceRoot":"","sources":["../../../src/review/agent-matcher.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,kBAAkB;IAC7B,oBAAoB,CAClB,aAA4B,EAC5B,UAA6B,EAC7B,YAA+B;QAE/B,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI;YACxB,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE;YAClC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW;YACtC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY;SACnF,CAAC,CAAC,CAAC;QAEJ,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;EAwBvB,CAAC;QAEC,MAAM,SAAS,GAAG,eAAe;aAC9B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,aAAa,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,cAAc,GAAG;;iBAEV,aAAa,CAAC,IAAI,CAAC,IAAI;;qBAEnB,aAAa,CAAC,YAAY,CAAC,MAAM;IAClD,QAAQ;;0BAEc,aAAa,CAAC,eAAe,CAAC,MAAM;IAC1D,OAAO;;4BAEiB,aAAa,CAAC,WAAW,CAAC,MAAM;;wBAEpC,eAAe,CAAC,MAAM;EAC5C,SAAS;;mHAEwG,CAAC;QAEhH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { Spec, TaskExecutionResult, ReviewContext } from '../core/types.js';
2
+ export declare class ReviewContextCollector {
3
+ collect(spec: Spec, taskResults: TaskExecutionResult[]): ReviewContext;
4
+ private extractChangedFiles;
5
+ private extractDependencies;
6
+ }
7
+ //# sourceMappingURL=context-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-collector.d.ts","sourceRoot":"","sources":["../../../src/review/context-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,sBAAsB;IACjC,OAAO,CACL,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,mBAAmB,EAAE,GACjC,aAAa;IAYhB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,mBAAmB;CA2B5B"}
@@ -0,0 +1,44 @@
1
+ export class ReviewContextCollector {
2
+ collect(spec, taskResults) {
3
+ const changedFiles = this.extractChangedFiles(taskResults);
4
+ const dependencyFiles = this.extractDependencies(taskResults, changedFiles);
5
+ return {
6
+ changedFiles,
7
+ dependencyFiles,
8
+ spec,
9
+ taskResults,
10
+ };
11
+ }
12
+ extractChangedFiles(taskResults) {
13
+ const files = new Set();
14
+ for (const result of taskResults) {
15
+ for (const artifact of result.artifacts) {
16
+ // Artifacts typically contain file paths
17
+ if (artifact.match(/\.\w+$/)) {
18
+ files.add(artifact);
19
+ }
20
+ }
21
+ }
22
+ return [...files].sort();
23
+ }
24
+ extractDependencies(taskResults, changedFiles) {
25
+ const deps = new Set();
26
+ // Extract import references from task output
27
+ for (const result of taskResults) {
28
+ const importMatches = result.output.matchAll(/(?:import|from)\s+['"]([^'"]+)['"]/g);
29
+ for (const match of importMatches) {
30
+ const importPath = match[1];
31
+ // Only include relative imports (not node_modules)
32
+ if (importPath.startsWith('.') || importPath.startsWith('/')) {
33
+ deps.add(importPath);
34
+ }
35
+ }
36
+ }
37
+ // Remove files that are already in changedFiles
38
+ for (const file of changedFiles) {
39
+ deps.delete(file);
40
+ }
41
+ return [...deps].sort();
42
+ }
43
+ }
44
+ //# sourceMappingURL=context-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-collector.js","sourceRoot":"","sources":["../../../src/review/context-collector.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,sBAAsB;IACjC,OAAO,CACL,IAAU,EACV,WAAkC;QAElC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAE5E,OAAO;YACL,YAAY;YACZ,eAAe;YACf,IAAI;YACJ,WAAW;SACZ,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,WAAkC;QAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAEhC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,yCAAyC;gBACzC,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,mBAAmB,CACzB,WAAkC,EAClC,YAAsB;QAEtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,6CAA6C;QAC7C,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAC1C,qCAAqC,CACtC,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBAC7B,mDAAmD;gBACnD,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ import type { ReviewSession, ReviewResult, ReviewConsensusResult, ReviewReport, ReviewIssue, ReviewContext, ExecuteSession, AgentDefinition } from '../core/types.js';
2
+ import { type Result } from '../core/result.js';
3
+ import { type ReviewMatchContext } from './agent-matcher.js';
4
+ import type { EventStore } from '../events/store.js';
5
+ export interface ReviewStartContext {
6
+ systemPrompt: string;
7
+ reviewPrompt: string;
8
+ matchContext: ReviewMatchContext;
9
+ reviewContext: ReviewContext;
10
+ }
11
+ export interface ReviewFixContext {
12
+ systemPrompt: string;
13
+ fixPrompt: string;
14
+ issues: ReviewIssue[];
15
+ attempt: number;
16
+ maxAttempts: number;
17
+ }
18
+ export declare class PassthroughReviewEngine {
19
+ private eventStore?;
20
+ private sessions;
21
+ private contextCollector;
22
+ private agentMatcher;
23
+ private reportGenerator;
24
+ constructor(eventStore?: EventStore | undefined);
25
+ startReview(executeSession: ExecuteSession, roleAgents: AgentDefinition[], reviewAgents: AgentDefinition[]): Result<{
26
+ sessionId: string;
27
+ reviewStartContext: ReviewStartContext;
28
+ }>;
29
+ submitReview(sessionId: string, agentName: string, result: ReviewResult): Result<{
30
+ allSubmitted: boolean;
31
+ submittedCount: number;
32
+ expectedCount: number;
33
+ }>;
34
+ submitConsensus(sessionId: string, consensus: ReviewConsensusResult): Result<{
35
+ approved: boolean;
36
+ report: ReviewReport;
37
+ needsFix: boolean;
38
+ canFix: boolean;
39
+ criticalHighCount: number;
40
+ }>;
41
+ startFix(sessionId: string): Result<ReviewFixContext | {
42
+ report: ReviewReport;
43
+ exhausted: true;
44
+ }>;
45
+ submitFix(sessionId: string): Result<{
46
+ readyForReReview: boolean;
47
+ attempt: number;
48
+ }>;
49
+ getSession(sessionId: string): ReviewSession;
50
+ listSessions(): ReviewSession[];
51
+ private emitEvent;
52
+ }
53
+ //# sourceMappingURL=passthrough-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passthrough-engine.d.ts","sourceRoot":"","sources":["../../../src/review/passthrough-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,kBAAkB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,uBAAuB;IAMtB,OAAO,CAAC,UAAU,CAAC;IAL/B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,eAAe,CAA+B;gBAElC,UAAU,CAAC,EAAE,UAAU,YAAA;IAG3C,WAAW,CACT,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,eAAe,EAAE,EAC7B,YAAY,EAAE,eAAe,EAAE,GAC9B,MAAM,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,kBAAkB,CAAA;KAAE,CAAC;IA0FxE,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAkCnF,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,qBAAqB,GAC/B,MAAM,CAAC;QACR,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,YAAY,CAAC;QACrB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IA+CF,QAAQ,CACN,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,gBAAgB,GAAG;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC;IAsFvE,SAAS,CACP,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC;QAAE,gBAAgB,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAqBzD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa;IAM5C,YAAY,IAAI,aAAa,EAAE;IAI/B,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,257 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { ok, err } from '../core/result.js';
3
+ import { ReviewContextCollector } from './context-collector.js';
4
+ import { ReviewAgentMatcher } from './agent-matcher.js';
5
+ import { ReviewReportGenerator } from './report-generator.js';
6
+ import { EventType } from '../events/types.js';
7
+ const MAX_REVIEW_ATTEMPTS = 3;
8
+ export class PassthroughReviewEngine {
9
+ eventStore;
10
+ sessions = new Map();
11
+ contextCollector = new ReviewContextCollector();
12
+ agentMatcher = new ReviewAgentMatcher();
13
+ reportGenerator = new ReviewReportGenerator();
14
+ constructor(eventStore) {
15
+ this.eventStore = eventStore;
16
+ }
17
+ // ─── review_start ─────────────────────────────────────────────
18
+ startReview(executeSession, roleAgents, reviewAgents) {
19
+ const reviewContext = this.contextCollector.collect(executeSession.spec, executeSession.taskResults);
20
+ const matchContext = this.agentMatcher.generateMatchContext(reviewContext, roleAgents, reviewAgents);
21
+ const sessionId = randomUUID();
22
+ const session = {
23
+ sessionId,
24
+ executeSessionId: executeSession.sessionId,
25
+ status: 'started',
26
+ currentAttempt: 0,
27
+ maxAttempts: MAX_REVIEW_ATTEMPTS,
28
+ reviewContext,
29
+ matchedAgents: [],
30
+ reviewResults: [],
31
+ reports: [],
32
+ createdAt: new Date().toISOString(),
33
+ updatedAt: new Date().toISOString(),
34
+ };
35
+ this.sessions.set(sessionId, session);
36
+ this.emitEvent(sessionId, EventType.REVIEW_STARTED, {
37
+ executeSessionId: executeSession.sessionId,
38
+ changedFiles: reviewContext.changedFiles.length,
39
+ dependencyFiles: reviewContext.dependencyFiles.length,
40
+ });
41
+ const systemPrompt = `You are a code reviewer in the Gestalt pipeline.
42
+ Your job is to review code changes from the perspective of the assigned agent role.
43
+
44
+ ## Review Rules
45
+ 1. Focus on your specific domain expertise
46
+ 2. Classify each issue as: critical, high, or warning
47
+ 3. Provide actionable suggestions with code examples when possible
48
+ 4. Be specific about file and line number
49
+ 5. Don't flag style issues that linters would catch
50
+
51
+ ## Output Format
52
+ Respond with ONLY a JSON object:
53
+ {
54
+ "issues": [
55
+ {
56
+ "id": "unique-id",
57
+ "severity": "critical" | "high" | "warning",
58
+ "category": "your-category",
59
+ "file": "path/to/file.ts",
60
+ "line": 42,
61
+ "message": "Description of the issue",
62
+ "suggestion": "How to fix it"
63
+ }
64
+ ],
65
+ "approved": true | false,
66
+ "summary": "Overall assessment"
67
+ }`;
68
+ const reviewPrompt = `## Code Review
69
+
70
+ **Spec Goal**: ${reviewContext.spec.goal}
71
+
72
+ **Changed Files** (${reviewContext.changedFiles.length}):
73
+ ${reviewContext.changedFiles.map((f) => ` - ${f}`).join('\n')}
74
+
75
+ **Dependency Context** (${reviewContext.dependencyFiles.length}):
76
+ ${reviewContext.dependencyFiles.map((f) => ` - ${f}`).join('\n')}
77
+
78
+ **Constraints**:
79
+ ${reviewContext.spec.constraints.map((c) => ` - ${c}`).join('\n')}
80
+
81
+ Review the code changes from your assigned perspective. Focus on issues that matter, not nitpicks.`;
82
+ return ok({
83
+ sessionId,
84
+ reviewStartContext: {
85
+ systemPrompt,
86
+ reviewPrompt,
87
+ matchContext,
88
+ reviewContext,
89
+ },
90
+ });
91
+ }
92
+ // ─── review_submit ────────────────────────────────────────────
93
+ submitReview(sessionId, agentName, result) {
94
+ const session = this.sessions.get(sessionId);
95
+ if (!session)
96
+ return err(new Error(`Review session not found: ${sessionId}`));
97
+ // Tag issues with reporter
98
+ const taggedResult = {
99
+ ...result,
100
+ issues: result.issues.map((issue) => ({
101
+ ...issue,
102
+ reportedBy: agentName,
103
+ })),
104
+ };
105
+ session.reviewResults.push(taggedResult);
106
+ if (!session.matchedAgents.includes(agentName)) {
107
+ session.matchedAgents.push(agentName);
108
+ }
109
+ session.status = 'reviewing';
110
+ session.updatedAt = new Date().toISOString();
111
+ this.emitEvent(sessionId, EventType.REVIEW_SUBMITTED, {
112
+ agentName,
113
+ issueCount: result.issues.length,
114
+ approved: result.approved,
115
+ });
116
+ return ok({
117
+ allSubmitted: false, // Caller decides when all agents have submitted
118
+ submittedCount: session.reviewResults.length,
119
+ expectedCount: session.matchedAgents.length,
120
+ });
121
+ }
122
+ // ─── review_consensus ─────────────────────────────────────────
123
+ submitConsensus(sessionId, consensus) {
124
+ const session = this.sessions.get(sessionId);
125
+ if (!session)
126
+ return err(new Error(`Review session not found: ${sessionId}`));
127
+ session.consensus = consensus;
128
+ session.status = 'consensus';
129
+ session.updatedAt = new Date().toISOString();
130
+ const criticalHighIssues = consensus.mergedIssues.filter((i) => i.severity === 'critical' || i.severity === 'high');
131
+ const approved = criticalHighIssues.length === 0;
132
+ const needsFix = !approved;
133
+ const canFix = session.currentAttempt < session.maxAttempts;
134
+ const report = this.reportGenerator.generate({ ...consensus, overallApproved: approved }, session.currentAttempt + 1);
135
+ session.reports.push(report);
136
+ this.emitEvent(sessionId, EventType.REVIEW_CONSENSUS_COMPLETED, {
137
+ totalIssues: consensus.mergedIssues.length,
138
+ criticalHighCount: criticalHighIssues.length,
139
+ approved,
140
+ approvedBy: consensus.approvedBy,
141
+ blockedBy: consensus.blockedBy,
142
+ });
143
+ if (approved) {
144
+ session.status = 'passed';
145
+ this.emitEvent(sessionId, EventType.REVIEW_PASSED, {
146
+ attempt: session.currentAttempt + 1,
147
+ warningCount: consensus.mergedIssues.filter((i) => i.severity === 'warning').length,
148
+ });
149
+ }
150
+ return ok({
151
+ approved,
152
+ report,
153
+ needsFix,
154
+ canFix,
155
+ criticalHighCount: criticalHighIssues.length,
156
+ });
157
+ }
158
+ // ─── review_fix ───────────────────────────────────────────────
159
+ startFix(sessionId) {
160
+ const session = this.sessions.get(sessionId);
161
+ if (!session)
162
+ return err(new Error(`Review session not found: ${sessionId}`));
163
+ if (!session.consensus)
164
+ return err(new Error('No consensus available for fix'));
165
+ session.currentAttempt++;
166
+ session.updatedAt = new Date().toISOString();
167
+ // Check if max attempts exceeded
168
+ if (session.currentAttempt > session.maxAttempts) {
169
+ session.status = 'failed_with_report';
170
+ const report = this.reportGenerator.generate(session.consensus, session.currentAttempt);
171
+ session.reports.push(report);
172
+ this.emitEvent(sessionId, EventType.REVIEW_FAILED, {
173
+ attempt: session.currentAttempt,
174
+ reason: 'max_attempts_exceeded',
175
+ remainingIssues: session.consensus.mergedIssues
176
+ .filter((i) => i.severity === 'critical' || i.severity === 'high')
177
+ .length,
178
+ });
179
+ return ok({ report, exhausted: true });
180
+ }
181
+ session.status = 'fixing';
182
+ const criticalHighIssues = session.consensus.mergedIssues.filter((i) => i.severity === 'critical' || i.severity === 'high');
183
+ this.emitEvent(sessionId, EventType.REVIEW_FIX_STARTED, {
184
+ attempt: session.currentAttempt,
185
+ issueCount: criticalHighIssues.length,
186
+ });
187
+ const systemPrompt = `You are a code fixer in the Gestalt pipeline.
188
+ Your job is to fix issues found during code review.
189
+
190
+ ## Rules
191
+ 1. Fix only critical and high severity issues
192
+ 2. Keep changes minimal — don't refactor unrelated code
193
+ 3. After fixing, the code must still pass lint, build, and test
194
+ 4. Explain each fix briefly
195
+
196
+ ## Output Format
197
+ Respond with ONLY a JSON object:
198
+ {
199
+ "fixes": [
200
+ {
201
+ "issueId": "id of the issue being fixed",
202
+ "file": "path/to/file.ts",
203
+ "description": "What was changed and why",
204
+ "resolved": true | false
205
+ }
206
+ ],
207
+ "structuralCheckRequired": true
208
+ }`;
209
+ const issueList = criticalHighIssues
210
+ .map((i) => `- [${i.severity.toUpperCase()}] ${i.file}${i.line ? `:${i.line}` : ''}: ${i.message}\n Suggestion: ${i.suggestion}`)
211
+ .join('\n');
212
+ const fixPrompt = `## Fix Code Review Issues (Attempt ${session.currentAttempt}/${session.maxAttempts})
213
+
214
+ **Issues to fix** (${criticalHighIssues.length}):
215
+ ${issueList}
216
+
217
+ Fix these issues while maintaining code integrity. Run structural checks after fixing.`;
218
+ return ok({
219
+ systemPrompt,
220
+ fixPrompt,
221
+ issues: criticalHighIssues,
222
+ attempt: session.currentAttempt,
223
+ maxAttempts: session.maxAttempts,
224
+ });
225
+ }
226
+ submitFix(sessionId) {
227
+ const session = this.sessions.get(sessionId);
228
+ if (!session)
229
+ return err(new Error(`Review session not found: ${sessionId}`));
230
+ // Reset for re-review
231
+ session.reviewResults = [];
232
+ session.consensus = undefined;
233
+ session.status = 'started';
234
+ session.updatedAt = new Date().toISOString();
235
+ this.emitEvent(sessionId, EventType.REVIEW_FIX_COMPLETED, {
236
+ attempt: session.currentAttempt,
237
+ });
238
+ return ok({
239
+ readyForReReview: true,
240
+ attempt: session.currentAttempt,
241
+ });
242
+ }
243
+ // ─── Helpers ──────────────────────────────────────────────────
244
+ getSession(sessionId) {
245
+ const session = this.sessions.get(sessionId);
246
+ if (!session)
247
+ throw new Error(`Review session not found: ${sessionId}`);
248
+ return session;
249
+ }
250
+ listSessions() {
251
+ return [...this.sessions.values()];
252
+ }
253
+ emitEvent(sessionId, eventType, payload) {
254
+ this.eventStore?.append('review', sessionId, eventType, payload);
255
+ }
256
+ }
257
+ //# sourceMappingURL=passthrough-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passthrough-engine.js","sourceRoot":"","sources":["../../../src/review/passthrough-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ReviewConsensusResult, ReviewReport } from '../core/types.js';
2
+ export declare class ReviewReportGenerator {
3
+ generate(consensus: ReviewConsensusResult, attempt: number): ReviewReport;
4
+ private renderMarkdown;
5
+ private renderIssueList;
6
+ }
7
+ //# sourceMappingURL=report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../../src/review/report-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,qBAAqB;IAChC,QAAQ,CACN,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,MAAM,GACd,YAAY;IAYf,OAAO,CAAC,cAAc;IAwEtB,OAAO,CAAC,eAAe;CAYxB"}
@@ -0,0 +1,82 @@
1
+ export class ReviewReportGenerator {
2
+ generate(consensus, attempt) {
3
+ const passed = consensus.overallApproved;
4
+ const markdown = this.renderMarkdown(consensus, attempt, passed);
5
+ return {
6
+ markdown,
7
+ generatedAt: new Date().toISOString(),
8
+ attempt,
9
+ passed,
10
+ };
11
+ }
12
+ renderMarkdown(consensus, attempt, passed) {
13
+ const lines = [];
14
+ const statusEmoji = passed ? '✅' : '❌';
15
+ lines.push(`# Code Review Report ${statusEmoji}`);
16
+ lines.push('');
17
+ lines.push(`**Attempt**: ${attempt}`);
18
+ lines.push(`**Status**: ${passed ? 'PASSED' : 'BLOCKED'}`);
19
+ lines.push('');
20
+ // Summary
21
+ lines.push('## Summary');
22
+ lines.push('');
23
+ lines.push(consensus.summary);
24
+ lines.push('');
25
+ // Agent decisions
26
+ if (consensus.approvedBy.length > 0) {
27
+ lines.push(`**Approved by**: ${consensus.approvedBy.join(', ')}`);
28
+ }
29
+ if (consensus.blockedBy.length > 0) {
30
+ lines.push(`**Blocked by**: ${consensus.blockedBy.join(', ')}`);
31
+ }
32
+ lines.push('');
33
+ // Issues by severity
34
+ const criticals = consensus.mergedIssues.filter((i) => i.severity === 'critical');
35
+ const highs = consensus.mergedIssues.filter((i) => i.severity === 'high');
36
+ const warnings = consensus.mergedIssues.filter((i) => i.severity === 'warning');
37
+ if (criticals.length > 0) {
38
+ lines.push('## 🔴 Critical Issues');
39
+ lines.push('');
40
+ this.renderIssueList(lines, criticals);
41
+ }
42
+ if (highs.length > 0) {
43
+ lines.push('## 🟠 High Issues');
44
+ lines.push('');
45
+ this.renderIssueList(lines, highs);
46
+ }
47
+ if (warnings.length > 0) {
48
+ lines.push('## 🟡 Warnings');
49
+ lines.push('');
50
+ this.renderIssueList(lines, warnings);
51
+ }
52
+ if (consensus.mergedIssues.length === 0) {
53
+ lines.push('## Issues');
54
+ lines.push('');
55
+ lines.push('No issues found.');
56
+ lines.push('');
57
+ }
58
+ // Stats
59
+ lines.push('---');
60
+ lines.push('');
61
+ lines.push(`| Severity | Count |`);
62
+ lines.push(`|----------|-------|`);
63
+ lines.push(`| Critical | ${criticals.length} |`);
64
+ lines.push(`| High | ${highs.length} |`);
65
+ lines.push(`| Warning | ${warnings.length} |`);
66
+ lines.push(`| **Total** | **${consensus.mergedIssues.length}** |`);
67
+ return lines.join('\n');
68
+ }
69
+ renderIssueList(lines, issues) {
70
+ for (const issue of issues) {
71
+ const location = issue.line ? `${issue.file}:${issue.line}` : issue.file;
72
+ lines.push(`### ${issue.message}`);
73
+ lines.push('');
74
+ lines.push(`- **Location**: \`${location}\``);
75
+ lines.push(`- **Category**: ${issue.category}`);
76
+ lines.push(`- **Reported by**: ${issue.reportedBy}`);
77
+ lines.push(`- **Suggestion**: ${issue.suggestion}`);
78
+ lines.push('');
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../../src/review/report-generator.ts"],"names":[],"mappings":"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"}