@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.
- package/CLAUDE.md +175 -6
- package/README.md +381 -14
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
- package/dist/benchmarks/types.d.ts +148 -0
- package/dist/benchmarks/types.d.ts.map +1 -0
- package/dist/benchmarks/types.js +2 -0
- package/dist/benchmarks/types.js.map +1 -0
- package/dist/package.json +61 -0
- package/dist/schemas/gestalt.schema.json +98 -0
- package/dist/src/agent/parser.d.ts.map +1 -1
- package/dist/src/agent/parser.js +2 -0
- package/dist/src/agent/parser.js.map +1 -1
- package/dist/src/agent/passthrough-generator.d.ts +27 -0
- package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
- package/dist/src/agent/passthrough-generator.js +133 -0
- package/dist/src/agent/passthrough-generator.js.map +1 -0
- package/dist/src/agent/registry.d.ts +1 -0
- package/dist/src/agent/registry.d.ts.map +1 -1
- package/dist/src/agent/registry.js +4 -1
- package/dist/src/agent/registry.js.map +1 -1
- package/dist/src/agent/role-agent-registry.d.ts +18 -0
- package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
- package/dist/src/agent/role-agent-registry.js +62 -0
- package/dist/src/agent/role-agent-registry.js.map +1 -0
- package/dist/src/agent/role-consensus-engine.d.ts +9 -0
- package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
- package/dist/src/agent/role-consensus-engine.js +35 -0
- package/dist/src/agent/role-consensus-engine.js.map +1 -0
- package/dist/src/agent/role-match-engine.d.ts +14 -0
- package/dist/src/agent/role-match-engine.d.ts.map +1 -0
- package/dist/src/agent/role-match-engine.js +46 -0
- package/dist/src/agent/role-match-engine.js.map +1 -0
- package/dist/src/agent/role-prompt-generator.d.ts +10 -0
- package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
- package/dist/src/agent/role-prompt-generator.js +22 -0
- package/dist/src/agent/role-prompt-generator.js.map +1 -0
- package/dist/src/cli/commands/interview.js +2 -2
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/commands/monitor.d.ts +2 -0
- package/dist/src/cli/commands/monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/monitor.js +13 -0
- package/dist/src/cli/commands/monitor.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts +2 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +20 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/spec.js +2 -2
- package/dist/src/cli/commands/spec.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +3 -3
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +16 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +80 -17
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +141 -31
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/constants.d.ts +2 -2
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +2 -2
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/errors.d.ts +3 -0
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +6 -0
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/types.d.ts +83 -3
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/version.d.ts +10 -0
- package/dist/src/core/version.d.ts.map +1 -0
- package/dist/src/core/version.js +89 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/events/types.d.ts +16 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +19 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +44 -2
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +245 -10
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/repository.d.ts.map +1 -1
- package/dist/src/execute/repository.js +24 -0
- package/dist/src/execute/repository.js.map +1 -1
- package/dist/src/execute/session.d.ts +6 -1
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +60 -0
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +513 -9
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +102 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +253 -38
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/execute-passthrough.js +126 -0
- package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
- package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/review-passthrough.js +134 -0
- package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +2 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +81 -26
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/resilience/lateral.d.ts +17 -0
- package/dist/src/resilience/lateral.d.ts.map +1 -0
- package/dist/src/resilience/lateral.js +62 -0
- package/dist/src/resilience/lateral.js.map +1 -0
- package/dist/src/resilience/prompts.d.ts +5 -0
- package/dist/src/resilience/prompts.d.ts.map +1 -0
- package/dist/src/resilience/prompts.js +130 -0
- package/dist/src/resilience/prompts.js.map +1 -0
- package/dist/src/resilience/stagnation-detector.d.ts +19 -0
- package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
- package/dist/src/resilience/stagnation-detector.js +38 -0
- package/dist/src/resilience/stagnation-detector.js.map +1 -0
- package/dist/src/resilience/types.d.ts +39 -0
- package/dist/src/resilience/types.d.ts.map +1 -0
- package/dist/src/resilience/types.js +17 -0
- package/dist/src/resilience/types.js.map +1 -0
- package/dist/src/review/agent-matcher.d.ts +15 -0
- package/dist/src/review/agent-matcher.d.ts.map +1 -0
- package/dist/src/review/agent-matcher.js +61 -0
- package/dist/src/review/agent-matcher.js.map +1 -0
- package/dist/src/review/context-collector.d.ts +7 -0
- package/dist/src/review/context-collector.d.ts.map +1 -0
- package/dist/src/review/context-collector.js +44 -0
- package/dist/src/review/context-collector.js.map +1 -0
- package/dist/src/review/passthrough-engine.d.ts +53 -0
- package/dist/src/review/passthrough-engine.d.ts.map +1 -0
- package/dist/src/review/passthrough-engine.js +257 -0
- package/dist/src/review/passthrough-engine.js.map +1 -0
- package/dist/src/review/report-generator.d.ts +7 -0
- package/dist/src/review/report-generator.d.ts.map +1 -0
- package/dist/src/review/report-generator.js +82 -0
- package/dist/src/review/report-generator.js.map +1 -0
- package/dist/src/tui/components/TUIApp.d.ts +20 -0
- package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
- package/dist/src/tui/components/TUIApp.js +84 -0
- package/dist/src/tui/components/TUIApp.js.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.js +143 -0
- package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
- package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.js +132 -0
- package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
- package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
- package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DebugScreen.js +40 -0
- package/dist/src/tui/screens/DebugScreen.js.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.js +136 -0
- package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
- package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
- package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
- package/dist/src/tui/screens/HUDPanel.js +13 -0
- package/dist/src/tui/screens/HUDPanel.js.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.js +103 -0
- package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
- package/dist/src/tui/screens/LogScreen.d.ts +4 -0
- package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/LogScreen.js +83 -0
- package/dist/src/tui/screens/LogScreen.js.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.js +71 -0
- package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
- package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.js +27 -0
- package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
- package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
- package/package.json +11 -3
- 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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"}
|