@prowi/deskcheck 0.2.0 → 0.4.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 (100) hide show
  1. package/README.md +78 -84
  2. package/build/cli.js +131 -25
  3. package/build/cli.js.map +1 -1
  4. package/build/config/loader.d.ts.map +1 -1
  5. package/build/config/loader.js +2 -1
  6. package/build/config/loader.js.map +1 -1
  7. package/build/config/types.d.ts +2 -1
  8. package/build/config/types.d.ts.map +1 -1
  9. package/build/mcp/tools.d.ts.map +1 -1
  10. package/build/mcp/tools.js +51 -65
  11. package/build/mcp/tools.js.map +1 -1
  12. package/build/prompts/ExecutorPrompt.d.ts +4 -2
  13. package/build/prompts/ExecutorPrompt.d.ts.map +1 -1
  14. package/build/prompts/ExecutorPrompt.js +72 -34
  15. package/build/prompts/ExecutorPrompt.js.map +1 -1
  16. package/build/prompts/PartitionerPrompt.d.ts +12 -0
  17. package/build/prompts/PartitionerPrompt.d.ts.map +1 -0
  18. package/build/prompts/PartitionerPrompt.js +54 -0
  19. package/build/prompts/PartitionerPrompt.js.map +1 -0
  20. package/build/prompts/ResolverPrompt.d.ts +11 -0
  21. package/build/prompts/ResolverPrompt.d.ts.map +1 -0
  22. package/build/prompts/ResolverPrompt.js +45 -0
  23. package/build/prompts/ResolverPrompt.js.map +1 -0
  24. package/build/renderers/review/MarkdownRenderer.d.ts.map +1 -1
  25. package/build/renderers/review/MarkdownRenderer.js +30 -11
  26. package/build/renderers/review/MarkdownRenderer.js.map +1 -1
  27. package/build/renderers/review/TerminalRenderer.d.ts.map +1 -1
  28. package/build/renderers/review/TerminalRenderer.js +38 -13
  29. package/build/renderers/review/TerminalRenderer.js.map +1 -1
  30. package/build/renderers/review/WatchRenderer.d.ts.map +1 -1
  31. package/build/renderers/review/WatchRenderer.js +12 -3
  32. package/build/renderers/review/WatchRenderer.js.map +1 -1
  33. package/build/renderers/shared.d.ts +11 -11
  34. package/build/renderers/shared.d.ts.map +1 -1
  35. package/build/renderers/shared.js +15 -15
  36. package/build/renderers/shared.js.map +1 -1
  37. package/build/server/controllers/ReviewController.d.ts +12 -3
  38. package/build/server/controllers/ReviewController.d.ts.map +1 -1
  39. package/build/server/controllers/ReviewController.js +50 -6
  40. package/build/server/controllers/ReviewController.js.map +1 -1
  41. package/build/server/server.d.ts.map +1 -1
  42. package/build/server/server.js +22 -1
  43. package/build/server/server.js.map +1 -1
  44. package/build/services/ExecutorService.d.ts +17 -2
  45. package/build/services/ExecutorService.d.ts.map +1 -1
  46. package/build/services/ExecutorService.js +37 -5
  47. package/build/services/ExecutorService.js.map +1 -1
  48. package/build/services/FindingsParserService.d.ts +7 -6
  49. package/build/services/FindingsParserService.d.ts.map +1 -1
  50. package/build/services/FindingsParserService.js +44 -14
  51. package/build/services/FindingsParserService.js.map +1 -1
  52. package/build/services/criteria/module-parser.d.ts +1 -1
  53. package/build/services/criteria/module-parser.d.ts.map +1 -1
  54. package/build/services/criteria/module-parser.js +20 -16
  55. package/build/services/criteria/module-parser.js.map +1 -1
  56. package/build/services/review/CodeSnippetService.d.ts +10 -0
  57. package/build/services/review/CodeSnippetService.d.ts.map +1 -0
  58. package/build/services/review/CodeSnippetService.js +54 -0
  59. package/build/services/review/CodeSnippetService.js.map +1 -0
  60. package/build/services/review/ReviewInputResolverService.d.ts +25 -0
  61. package/build/services/review/ReviewInputResolverService.d.ts.map +1 -0
  62. package/build/services/review/ReviewInputResolverService.js +106 -0
  63. package/build/services/review/ReviewInputResolverService.js.map +1 -0
  64. package/build/services/review/ReviewOrchestratorService.d.ts +2 -2
  65. package/build/services/review/ReviewOrchestratorService.d.ts.map +1 -1
  66. package/build/services/review/ReviewOrchestratorService.js +28 -27
  67. package/build/services/review/ReviewOrchestratorService.js.map +1 -1
  68. package/build/services/review/ReviewPartitionerService.d.ts +46 -0
  69. package/build/services/review/ReviewPartitionerService.d.ts.map +1 -0
  70. package/build/services/review/ReviewPartitionerService.js +208 -0
  71. package/build/services/review/ReviewPartitionerService.js.map +1 -0
  72. package/build/services/review/ReviewPlanBuilderService.d.ts +25 -7
  73. package/build/services/review/ReviewPlanBuilderService.d.ts.map +1 -1
  74. package/build/services/review/ReviewPlanBuilderService.js +88 -30
  75. package/build/services/review/ReviewPlanBuilderService.js.map +1 -1
  76. package/build/services/review/ReviewStorageService.d.ts +35 -11
  77. package/build/services/review/ReviewStorageService.d.ts.map +1 -1
  78. package/build/services/review/ReviewStorageService.js +136 -35
  79. package/build/services/review/ReviewStorageService.js.map +1 -1
  80. package/build/services/testing/TestRunnerService.d.ts.map +1 -1
  81. package/build/services/testing/TestRunnerService.js +10 -8
  82. package/build/services/testing/TestRunnerService.js.map +1 -1
  83. package/build/types/criteria.d.ts +8 -6
  84. package/build/types/criteria.d.ts.map +1 -1
  85. package/build/types/review.d.ts +173 -50
  86. package/build/types/review.d.ts.map +1 -1
  87. package/package.json +3 -1
  88. package/ui/dist/index.html +12 -63
  89. package/build/prompts/PlannerPrompt.d.ts +0 -12
  90. package/build/prompts/PlannerPrompt.d.ts.map +0 -1
  91. package/build/prompts/PlannerPrompt.js +0 -34
  92. package/build/prompts/PlannerPrompt.js.map +0 -1
  93. package/build/services/review/ReviewContextExtractorService.d.ts +0 -17
  94. package/build/services/review/ReviewContextExtractorService.d.ts.map +0 -1
  95. package/build/services/review/ReviewContextExtractorService.js +0 -69
  96. package/build/services/review/ReviewContextExtractorService.js.map +0 -1
  97. package/build/services/review/ReviewPlannerService.d.ts +0 -29
  98. package/build/services/review/ReviewPlannerService.d.ts.map +0 -1
  99. package/build/services/review/ReviewPlannerService.js +0 -122
  100. package/build/services/review/ReviewPlannerService.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Build the system prompt for a partitioner agent.
3
+ *
4
+ * The partitioner is given exactly one criterion and the list of files that
5
+ * matched its globs. Its job is to read the criterion's natural-language
6
+ * `partition` instruction and divide the files into one or more subtasks,
7
+ * each of which will become an executor task downstream.
8
+ */
9
+ export function buildPartitionerPrompt(criterion, matchedFiles, scope) {
10
+ const fileList = matchedFiles.map((f) => `- ${f}`).join("\n");
11
+ const scopeLine = scope.type === "changes"
12
+ ? `changes against \`${scope.ref}\` (only the diff matters; you can run \`git diff ${scope.ref} -- <file>\` to inspect what changed)`
13
+ : `full files (every line of every file is in scope)`;
14
+ return `You are a deskcheck partitioner. You receive ONE criterion and a list of files that matched its globs. Your job is to split those files into review subtasks according to the criterion's \`partition\` instruction. You do NOT review code yourself.
15
+
16
+ ## Criterion
17
+
18
+ - ID: ${criterion.id}
19
+ - Description: ${criterion.description}
20
+ - Partition instruction: ${criterion.partition}
21
+
22
+ ### Criterion body (for reference, do NOT review against it)
23
+
24
+ ${criterion.prompt}
25
+
26
+ ## Files to partition
27
+
28
+ ${fileList}
29
+
30
+ ## Scope
31
+
32
+ ${scopeLine}
33
+
34
+ ## How to partition
35
+
36
+ 1. Read the partition instruction above. It is natural language — interpret it.
37
+ 2. If the instruction implies you need to look inside files to make a sensible split (e.g. "one task per public method", "group by class"), use Read/Grep/Glob/Bash to inspect the files. For changes-mode scope, use \`git diff\` to focus on what was actually changed.
38
+ 3. Decide how to split the files into subtasks. Each subtask becomes one downstream reviewer call.
39
+ 4. Call the \`submit_partition\` tool with your decision.
40
+
41
+ ## Constraints
42
+
43
+ - **Every file in the input list MUST appear in at least one subtask.** Do not silently drop files. If a file is irrelevant to this criterion, that's a glob-matching problem — not your call to make.
44
+ - A file MAY appear in multiple subtasks if you set a different \`focus\` on each. This is the right choice when partitioning sub-file (e.g. one method per subtask): same file, different focus values.
45
+ - Each subtask must have at least one file.
46
+ - \`focus\` is optional. Use it for sub-file narrowing (method name, class name, region). Leave it null when the whole file(s) is the unit.
47
+ - \`hint\` is optional but encouraged. Write one short sentence explaining why these files belong together. The downstream reviewer sees it.
48
+ - Output via the \`submit_partition\` tool only. Do not write the JSON to stdout.
49
+
50
+ ## Tools
51
+
52
+ You have Read, Grep, Glob, and Bash for inspection, plus the \`submit_partition\` MCP tool for output. You do not have any other tools and you do not need them.`;
53
+ }
54
+ //# sourceMappingURL=PartitionerPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartitionerPrompt.js","sourceRoot":"","sources":["../../src/prompts/PartitionerPrompt.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAuB,EACvB,YAAsB,EACtB,KAAY;IAEZ,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GACb,KAAK,CAAC,IAAI,KAAK,SAAS;QACtB,CAAC,CAAC,qBAAqB,KAAK,CAAC,GAAG,qDAAqD,KAAK,CAAC,GAAG,uCAAuC;QACrI,CAAC,CAAC,mDAAmD,CAAC;IAE1D,OAAO;;;;QAID,SAAS,CAAC,EAAE;iBACH,SAAS,CAAC,WAAW;2BACX,SAAS,CAAC,SAAS;;;;EAI5C,SAAS,CAAC,MAAM;;;;EAIhB,QAAQ;;;;EAIR,SAAS;;;;;;;;;;;;;;;;;;;;iKAoBsJ,CAAC;AAClK,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Build the system prompt for the input resolver agent.
3
+ *
4
+ * The resolver's only job is to translate the user's natural-language request
5
+ * into a structured `{ scope, files }` pair. It does NOT match criteria, run
6
+ * partitioners, or review code — those are downstream pipeline steps that run
7
+ * the same way regardless of whether the input came from this agent or from
8
+ * the deterministic `deskcheck diff` path.
9
+ */
10
+ export declare function buildResolverPrompt(): string;
11
+ //# sourceMappingURL=ResolverPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolverPrompt.d.ts","sourceRoot":"","sources":["../../src/prompts/ResolverPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkC5C"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Build the system prompt for the input resolver agent.
3
+ *
4
+ * The resolver's only job is to translate the user's natural-language request
5
+ * into a structured `{ scope, files }` pair. It does NOT match criteria, run
6
+ * partitioners, or review code — those are downstream pipeline steps that run
7
+ * the same way regardless of whether the input came from this agent or from
8
+ * the deterministic `deskcheck diff` path.
9
+ */
10
+ export function buildResolverPrompt() {
11
+ return `You are the deskcheck input resolver. The user will describe what they want reviewed in natural language. Your ONLY job is to figure out:
12
+
13
+ 1. **Which files** they're talking about.
14
+ 2. **What scope** to apply: \`all\` (review the full files) or \`changes\` against a specific git ref (review only the diff against that ref).
15
+
16
+ You then call the \`submit_resolution\` tool with that information. You do NOT match criteria, plan tasks, or review code.
17
+
18
+ ## How to determine the file list
19
+
20
+ - **Directory mention** (e.g. "everything in app/Services/"): use Bash/Glob to list files recursively. Pass all of them.
21
+ - **Specific file** (e.g. "review src/cli.ts"): use that file path directly.
22
+ - **Branch / "changes" / "diff" mention** (e.g. "changes against develop"): run \`git diff <ref> --name-only\` to get the changed files.
23
+ - **Symbol mention** (e.g. "the foo function in bar.ts"): include the file in the file list. The downstream partitioner will narrow to the symbol via its \`focus\` mechanism.
24
+ - **Vague**: use Bash/Glob/Read to explore and pick a sensible default.
25
+
26
+ ## How to determine the scope
27
+
28
+ - If the user mentioned a branch or "changes against X" → \`scope_type: "changes"\`, \`scope_ref: "<X>"\`.
29
+ - If the user mentioned "the diff" / "what I changed" / "uncommitted changes" → \`scope_type: "changes"\`, \`scope_ref: "HEAD"\`.
30
+ - Otherwise (full file review, directory review, symbol review, vague request) → \`scope_type: "all"\`.
31
+
32
+ ## Empty result is OK
33
+
34
+ If after exploring you genuinely can't find any files that match the request, call \`submit_resolution\` with an empty \`files\` array. Don't guess. The CLI will surface an "empty plan" message to the user.
35
+
36
+ ## What you MUST NOT do
37
+
38
+ - Do not list or interpret review criteria. You don't see them.
39
+ - Do not group, partition, or split files into tasks.
40
+ - Do not read code looking for issues.
41
+ - Do not output anything to stdout. Use the \`submit_resolution\` tool.
42
+
43
+ You have Bash, Read, Glob, and Grep for filesystem and git exploration, plus the \`submit_resolution\` MCP tool.`;
44
+ }
45
+ //# sourceMappingURL=ResolverPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolverPrompt.js","sourceRoot":"","sources":["../../src/prompts/ResolverPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iHAgCwG,CAAC;AAClH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/MarkdownRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGvE,kEAAkE;AAClE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,UAAU,GAChB,MAAM,CA2CR"}
1
+ {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/MarkdownRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAa,MAAM,uBAAuB,CAAC;AAGlF,kEAAkE;AAClE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,UAAU,GAChB,MAAM,CAsDR"}
@@ -1,4 +1,4 @@
1
- import { groupFindingsBySeveritySection } from "../shared.js";
1
+ import { groupIssuesBySeveritySection } from "../shared.js";
2
2
  /** Render review results as markdown suitable for PR comments. */
3
3
  export function renderMarkdown(results, plan) {
4
4
  const lines = [];
@@ -9,18 +9,27 @@ export function renderMarkdown(results, plan) {
9
9
  const { critical, warning, info, total } = results.summary;
10
10
  const completed = results.completion.completed;
11
11
  const totalTasks = results.completion.total;
12
- lines.push(`**${total} findings** (${critical} critical, ${warning} warning, ${info} info) | ${completed}/${totalTasks} tasks`);
12
+ lines.push(`**${total} issues** (${critical} critical, ${warning} warning, ${info} info) | ${completed}/${totalTasks} tasks`);
13
13
  lines.push("");
14
- // Findings grouped by severity
15
- for (const section of groupFindingsBySeveritySection(results)) {
14
+ // Issues grouped by severity
15
+ for (const section of groupIssuesBySeveritySection(results)) {
16
16
  lines.push(`### ${section.label}`);
17
- for (const { finding, reviewId } of section.findings) {
18
- const location = finding.line
19
- ? `${finding.file}:${finding.line}`
20
- : finding.file;
21
- lines.push(`- **${location}** ${finding.description} *(from ${reviewId})*`);
22
- if (finding.suggestion) {
23
- lines.push(` > ${finding.suggestion}`);
17
+ for (const { issue, reviewId } of section.issues) {
18
+ lines.push(`- ${issue.description} *(from ${reviewId})*`);
19
+ // Show references
20
+ for (const ref of issue.references) {
21
+ const location = formatRefLocation(ref);
22
+ lines.push(` - \`${location}\`${ref.note ? ` — ${ref.note}` : ""}`);
23
+ if (ref.code) {
24
+ lines.push(` \`\`\`\n ${ref.code.split("\n").join("\n ")}\n \`\`\``);
25
+ }
26
+ if (ref.suggestedCode) {
27
+ lines.push(` **Suggested:**`);
28
+ lines.push(` \`\`\`\n ${ref.suggestedCode.split("\n").join("\n ")}\n \`\`\``);
29
+ }
30
+ }
31
+ if (issue.suggestion) {
32
+ lines.push(` > ${issue.suggestion}`);
24
33
  }
25
34
  }
26
35
  lines.push("");
@@ -33,4 +42,14 @@ export function renderMarkdown(results, plan) {
33
42
  }
34
43
  return lines.join("\n");
35
44
  }
45
+ /** Format a reference's location string for markdown. */
46
+ function formatRefLocation(ref) {
47
+ const lineRange = ref.startLine > 0
48
+ ? ref.startLine === ref.endLine ? `:${ref.startLine}` : `:${ref.startLine}-${ref.endLine}`
49
+ : "";
50
+ if (ref.symbol) {
51
+ return `${ref.file} ${ref.symbol}${lineRange}`;
52
+ }
53
+ return `${ref.file}${lineRange}`;
54
+ }
36
55
  //# sourceMappingURL=MarkdownRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/MarkdownRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAE9D,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAC5B,OAAsB,EACtB,IAAiB;IAEjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;IAC5C,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,gBAAgB,QAAQ,cAAc,OAAO,aAAa,IAAI,YAAY,SAAS,IAAI,UAAU,QAAQ,CACpH,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,+BAA+B;IAC/B,KAAK,MAAM,OAAO,IAAI,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI;gBAC3B,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;gBACnC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACjB,KAAK,CAAC,IAAI,CACR,OAAO,QAAQ,QAAQ,OAAO,CAAC,WAAW,WAAW,QAAQ,IAAI,CAClE,CAAC;YACF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,WAAW;IACX,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,qBAAqB,IAAI,CAAC,eAAe,CAAC,MAAM,qCAAqC,CAClH,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/MarkdownRenderer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TerminalRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/TerminalRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,uBAAuB,CAAC;AA0BxF,wDAAwD;AACxD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,UAAU,GAChB,MAAM,CAyER"}
1
+ {"version":3,"file":"TerminalRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/TerminalRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAA8B,MAAM,uBAAuB,CAAC;AA0BnG,wDAAwD;AACxD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,UAAU,GAChB,MAAM,CA0FR"}
@@ -1,4 +1,4 @@
1
- import { groupFindingsBySeveritySection } from "../shared.js";
1
+ import { groupIssuesBySeveritySection } from "../shared.js";
2
2
  // ANSI color codes
3
3
  const RESET = "\x1b[0m";
4
4
  const BOLD = "\x1b[1m";
@@ -47,22 +47,37 @@ export function renderTerminal(results, plan) {
47
47
  lines.push(` ${summaryParts.join(`${DIM} │ ${RESET}`)}`);
48
48
  }
49
49
  lines.push("");
50
- // Findings grouped by severity
51
- const sections = groupFindingsBySeveritySection(results);
50
+ // Issues grouped by severity
51
+ const sections = groupIssuesBySeveritySection(results);
52
52
  for (const section of sections) {
53
53
  const color = SEVERITY_COLORS[section.severity];
54
54
  const icon = SEVERITY_ICONS[section.severity];
55
- lines.push(`${BOLD}${color} ${icon} ${section.label} (${section.findings.length})${RESET}`);
55
+ lines.push(`${BOLD}${color} ${icon} ${section.label} (${section.issues.length})${RESET}`);
56
56
  lines.push("");
57
- for (let i = 0; i < section.findings.length; i++) {
58
- const { finding, reviewId } = section.findings[i];
59
- const location = finding.line
60
- ? `${finding.file}:${finding.line}`
61
- : finding.file;
62
- lines.push(` ${color}${i + 1}.${RESET} ${finding.description}`);
63
- lines.push(` ${DIM}${location}${RESET} ${DIM}(${reviewId})${RESET}`);
64
- if (finding.suggestion) {
65
- lines.push(` ${CYAN}${finding.suggestion}${RESET}`);
57
+ for (let i = 0; i < section.issues.length; i++) {
58
+ const { issue, reviewId } = section.issues[i];
59
+ lines.push(` ${color}${i + 1}.${RESET} ${issue.description}`);
60
+ // Show references
61
+ for (const ref of issue.references) {
62
+ const location = formatRefLocation(ref);
63
+ lines.push(` ${DIM}${location}${RESET} ${DIM}(${reviewId})${RESET}`);
64
+ if (ref.note) {
65
+ lines.push(` ${DIM} ${ref.note}${RESET}`);
66
+ }
67
+ if (ref.code) {
68
+ for (const codeLine of ref.code.split("\n")) {
69
+ lines.push(` ${DIM} │ ${codeLine}${RESET}`);
70
+ }
71
+ }
72
+ if (ref.suggestedCode) {
73
+ lines.push(` ${CYAN} → suggested:${RESET}`);
74
+ for (const codeLine of ref.suggestedCode.split("\n")) {
75
+ lines.push(` ${CYAN} │ ${codeLine}${RESET}`);
76
+ }
77
+ }
78
+ }
79
+ if (issue.suggestion) {
80
+ lines.push(` ${CYAN}→ ${issue.suggestion}${RESET}`);
66
81
  }
67
82
  lines.push("");
68
83
  }
@@ -85,4 +100,14 @@ export function renderTerminal(results, plan) {
85
100
  }
86
101
  return lines.join("\n");
87
102
  }
103
+ /** Format a reference's location string: prefer symbol, fall back to file:line. */
104
+ function formatRefLocation(ref) {
105
+ const lineRange = ref.startLine > 0
106
+ ? ref.startLine === ref.endLine ? `:${ref.startLine}` : `:${ref.startLine}-${ref.endLine}`
107
+ : "";
108
+ if (ref.symbol) {
109
+ return `${ref.file} ${ref.symbol}${lineRange}`;
110
+ }
111
+ return `${ref.file}${lineRange}`;
112
+ }
88
113
  //# sourceMappingURL=TerminalRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TerminalRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/TerminalRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TerminalRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/TerminalRenderer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"WatchRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/WatchRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAc,MAAM,uBAAuB,CAAC;AA2BnF,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAqGnF"}
1
+ {"version":3,"file":"WatchRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/review/WatchRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAc,MAAM,uBAAuB,CAAC;AA2BnF,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CA+GnF"}
@@ -66,6 +66,7 @@ export function renderWatch(plan, results) {
66
66
  }
67
67
  for (const [moduleId, moduleTasks] of moduleGroups) {
68
68
  const moduleName = moduleId.split("/").pop() ?? moduleId;
69
+ const decision = plan.partition_decisions[moduleId];
69
70
  // Determine module-level status (worst of children)
70
71
  let moduleStatus = "complete";
71
72
  let moduleFindings = 0;
@@ -78,7 +79,7 @@ export function renderWatch(plan, results) {
78
79
  moduleStatus = "pending";
79
80
  // Count findings for this task from results
80
81
  if (results?.task_results[task.task_id]) {
81
- moduleFindings += results.task_results[task.task_id].findings.length;
82
+ moduleFindings += results.task_results[task.task_id].issues.length;
82
83
  }
83
84
  }
84
85
  const moduleColor = STATUS_COLORS[moduleStatus];
@@ -87,6 +88,13 @@ export function renderWatch(plan, results) {
87
88
  ? ` ${DIM}(${moduleFindings} findings)${RESET}`
88
89
  : moduleStatus === "complete" ? ` ${DIM}(clean)${RESET}` : "";
89
90
  lines.push(` ${moduleColor}${moduleIcon}${RESET} ${BOLD}${moduleName}${RESET}${findingsBadge}`);
91
+ // Partition decision (one line under the module header)
92
+ if (decision) {
93
+ const reasoning = decision.reasoning.length > 80
94
+ ? decision.reasoning.slice(0, 77) + "..."
95
+ : decision.reasoning;
96
+ lines.push(` ${DIM}partition: ${decision.subtasks.length} subtask(s) — ${reasoning}${RESET}`);
97
+ }
90
98
  // Child tasks (files)
91
99
  for (const task of moduleTasks) {
92
100
  const fileName = task.files.map(f => f.split("/").pop()).join(", ");
@@ -94,13 +102,14 @@ export function renderWatch(plan, results) {
94
102
  const taskIcon = STATUS_ICONS[task.status];
95
103
  let taskSuffix = "";
96
104
  if (task.status === "complete" && results?.task_results[task.task_id]) {
97
- const count = results.task_results[task.task_id].findings.length;
105
+ const count = results.task_results[task.task_id].issues.length;
98
106
  taskSuffix = count > 0 ? ` ${DIM}(${count} findings)${RESET}` : ` ${DIM}(clean)${RESET}`;
99
107
  }
100
108
  else if (task.status === "error") {
101
109
  taskSuffix = ` ${RED}(error)${RESET}`;
102
110
  }
103
- lines.push(` ${taskColor}${taskIcon}${RESET} ${DIM}${fileName}${RESET}${taskSuffix}`);
111
+ const focusSuffix = task.focus ? ` ${DIM}[${task.focus}]${RESET}` : "";
112
+ lines.push(` ${taskColor}${taskIcon}${RESET} ${DIM}${fileName}${RESET}${focusSuffix}${taskSuffix}`);
104
113
  }
105
114
  lines.push("");
106
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WatchRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/WatchRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WatchRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/WatchRenderer.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,23 @@
1
- import type { Finding, FindingSeverity, ReviewResults } from "../types/review.js";
2
- /** A finding tagged with the criterion that produced it. */
3
- export interface TaggedFinding {
4
- finding: Finding;
1
+ import type { Issue, FindingSeverity, ReviewResults } from "../types/review.js";
2
+ /** An issue tagged with the criterion that produced it. */
3
+ export interface TaggedIssue {
4
+ issue: Issue;
5
5
  reviewId: string;
6
6
  }
7
- /** A group of findings sharing the same severity, with a display label. */
7
+ /** A group of issues sharing the same severity, with a display label. */
8
8
  export interface SeveritySection {
9
9
  severity: FindingSeverity;
10
10
  label: string;
11
- findings: TaggedFinding[];
11
+ issues: TaggedIssue[];
12
12
  }
13
- /** Collect all findings of a given severity across all task results. */
14
- export declare function collectFindingsBySeverity(results: ReviewResults, severity: FindingSeverity): TaggedFinding[];
13
+ /** Collect all issues of a given severity across all task results. */
14
+ export declare function collectIssuesBySeverity(results: ReviewResults, severity: FindingSeverity): TaggedIssue[];
15
15
  /**
16
- * Group all findings from results into severity sections (critical, warning, info),
17
- * filtering out sections with zero findings.
16
+ * Group all issues from results into severity sections (critical, warning, info),
17
+ * filtering out sections with zero issues.
18
18
  *
19
19
  * Used by both terminal and markdown renderers to avoid duplicating the
20
20
  * severity iteration and labelling logic.
21
21
  */
22
- export declare function groupFindingsBySeveritySection(results: ReviewResults): SeveritySection[];
22
+ export declare function groupIssuesBySeveritySection(results: ReviewResults): SeveritySection[];
23
23
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElF,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,eAAe,GACxB,aAAa,EAAE,CAYjB;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,EAAE,CAUxF"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhF,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,sEAAsE;AACtE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,eAAe,GACxB,WAAW,EAAE,CAYf;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,EAAE,CAUtF"}
@@ -1,30 +1,30 @@
1
- /** Collect all findings of a given severity across all task results. */
2
- export function collectFindingsBySeverity(results, severity) {
1
+ /** Collect all issues of a given severity across all task results. */
2
+ export function collectIssuesBySeverity(results, severity) {
3
3
  const collected = [];
4
4
  for (const taskResult of Object.values(results.task_results)) {
5
- for (const finding of taskResult.findings) {
6
- if (finding.severity === severity) {
7
- collected.push({ finding, reviewId: taskResult.review_id });
5
+ for (const issue of taskResult.issues) {
6
+ if (issue.severity === severity) {
7
+ collected.push({ issue, reviewId: taskResult.review_id });
8
8
  }
9
9
  }
10
10
  }
11
11
  return collected;
12
12
  }
13
13
  /**
14
- * Group all findings from results into severity sections (critical, warning, info),
15
- * filtering out sections with zero findings.
14
+ * Group all issues from results into severity sections (critical, warning, info),
15
+ * filtering out sections with zero issues.
16
16
  *
17
17
  * Used by both terminal and markdown renderers to avoid duplicating the
18
18
  * severity iteration and labelling logic.
19
19
  */
20
- export function groupFindingsBySeveritySection(results) {
21
- const all = collectFindingsBySeverity(results, "critical")
22
- .concat(collectFindingsBySeverity(results, "warning"))
23
- .concat(collectFindingsBySeverity(results, "info"));
20
+ export function groupIssuesBySeveritySection(results) {
21
+ const all = collectIssuesBySeverity(results, "critical")
22
+ .concat(collectIssuesBySeverity(results, "warning"))
23
+ .concat(collectIssuesBySeverity(results, "info"));
24
24
  return [
25
- { severity: "critical", label: "Critical Issues", findings: all.filter(f => f.finding.severity === "critical") },
26
- { severity: "warning", label: "Warnings", findings: all.filter(f => f.finding.severity === "warning") },
27
- { severity: "info", label: "Info", findings: all.filter(f => f.finding.severity === "info") },
28
- ].filter(s => s.findings.length > 0);
25
+ { severity: "critical", label: "Critical Issues", issues: all.filter(f => f.issue.severity === "critical") },
26
+ { severity: "warning", label: "Warnings", issues: all.filter(f => f.issue.severity === "warning") },
27
+ { severity: "info", label: "Info", issues: all.filter(f => f.issue.severity === "info") },
28
+ ].filter(s => s.issues.length > 0);
29
29
  }
30
30
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"AAeA,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,OAAsB,EACtB,QAAyB;IAEzB,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAAsB;IACnE,MAAM,GAAG,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC;SACvD,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;SACrD,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtD,OAAQ;QACN,EAAE,QAAQ,EAAE,UAA6B,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE;QACnI,EAAE,QAAQ,EAAE,SAA4B,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE;QAC1H,EAAE,QAAQ,EAAE,MAAyB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE;KACpF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"AAeA,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CACrC,OAAsB,EACtB,QAAyB;IAEzB,MAAM,SAAS,GAAkB,EAAE,CAAC;IAEpC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAsB;IACjE,MAAM,GAAG,GAAG,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC;SACrD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;SACnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpD,OAAQ;QACN,EAAE,QAAQ,EAAE,UAA6B,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE;QAC/H,EAAE,QAAQ,EAAE,SAA4B,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE;QACtH,EAAE,QAAQ,EAAE,MAAyB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE;KAChF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -1,14 +1,15 @@
1
1
  import type http from "node:http";
2
2
  import type { ReviewStorageService } from "../../services/review/ReviewStorageService.js";
3
- import type { ReviewResults } from "../../types/review.js";
3
+ import type { PipelineStep, PlanFailure, ReviewResults, Scope } from "../../types/review.js";
4
4
  /** A run summary returned by GET /api/runs. */
5
5
  export interface RunSummary {
6
6
  planId: string;
7
7
  name: string;
8
8
  status: string;
9
9
  createdAt: string;
10
- sourceType: string | null;
11
- sourceTarget: string | null;
10
+ scope: Scope | null;
11
+ step: PipelineStep | null;
12
+ failure: PlanFailure | null;
12
13
  taskCount: number;
13
14
  moduleCount: number;
14
15
  moduleNames: string[];
@@ -20,4 +21,12 @@ export interface RunSummary {
20
21
  export declare function handleGetRuns(storage: ReviewStorageService, res: http.ServerResponse): void;
21
22
  export declare function handleGetPlan(storage: ReviewStorageService, res: http.ServerResponse, planId: string): void;
22
23
  export declare function handleGetResults(storage: ReviewStorageService, res: http.ServerResponse, planId: string): void;
24
+ /**
25
+ * GET /api/runs/:id — return plan and results merged into a single
26
+ * response. The UI uses this for V1/V2/V3 to halve fetch counts and avoid
27
+ * partial-state races between two separate requests.
28
+ */
29
+ export declare function handleGetRun(storage: ReviewStorageService, res: http.ServerResponse, planId: string): void;
30
+ export declare function handleGetTaskLog(storage: ReviewStorageService, res: http.ServerResponse, planId: string, taskId: string): void;
31
+ export declare function handleGetPartitionerLog(storage: ReviewStorageService, res: http.ServerResponse, planId: string, reviewId: string): void;
23
32
  //# sourceMappingURL=ReviewController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewController.d.ts","sourceRoot":"","sources":["../../../src/server/controllers/ReviewController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAM3D,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;CAChD;AAwBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAsD3F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO3G;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO9G"}
1
+ {"version":3,"file":"ReviewController.d.ts","sourceRoot":"","sources":["../../../src/server/controllers/ReviewController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,KAAK,EACN,MAAM,uBAAuB,CAAC;AAM/B,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzC,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;CAChD;AAwBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAyD3F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO3G;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO9G;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmB1G;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CAMN;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,IAAI,CAMN"}
@@ -36,8 +36,9 @@ export function handleGetRuns(storage, res) {
36
36
  let moduleNames = [];
37
37
  let matchedFiles = 0;
38
38
  let unmatchedFiles = 0;
39
- let sourceType = null;
40
- let sourceTarget = null;
39
+ let scope = null;
40
+ let step = null;
41
+ let failure = null;
41
42
  try {
42
43
  const plan = storage.getPlan(planSummary.planId);
43
44
  taskCount = Object.keys(plan.tasks).length;
@@ -45,8 +46,9 @@ export function handleGetRuns(storage, res) {
45
46
  moduleNames = Object.keys(plan.modules).map((id) => id.split("/").pop() ?? id);
46
47
  matchedFiles = plan.matched_files?.length ?? 0;
47
48
  unmatchedFiles = plan.unmatched_files?.length ?? 0;
48
- sourceType = plan.source?.type ?? null;
49
- sourceTarget = plan.source?.target ?? null;
49
+ scope = plan.scope ?? null;
50
+ step = plan.step ?? null;
51
+ failure = plan.failure ?? null;
50
52
  }
51
53
  catch {
52
54
  // Plan read error
@@ -56,8 +58,9 @@ export function handleGetRuns(storage, res) {
56
58
  name: planSummary.name,
57
59
  status: planSummary.status,
58
60
  createdAt: planSummary.createdAt,
59
- sourceType,
60
- sourceTarget,
61
+ scope,
62
+ step,
63
+ failure,
61
64
  taskCount,
62
65
  moduleCount,
63
66
  moduleNames,
@@ -87,4 +90,45 @@ export function handleGetResults(storage, res, planId) {
87
90
  sendError(res, 404, `Results not found for plan: ${planId}`);
88
91
  }
89
92
  }
93
+ /**
94
+ * GET /api/runs/:id — return plan and results merged into a single
95
+ * response. The UI uses this for V1/V2/V3 to halve fetch counts and avoid
96
+ * partial-state races between two separate requests.
97
+ */
98
+ export function handleGetRun(storage, res, planId) {
99
+ let plan;
100
+ try {
101
+ plan = storage.getPlan(planId);
102
+ }
103
+ catch {
104
+ sendError(res, 404, `Plan not found: ${planId}`);
105
+ return;
106
+ }
107
+ // Results may not exist yet (e.g. plan was just created and no tasks
108
+ // have completed). Returning null lets the UI render the in-progress state.
109
+ let results = null;
110
+ try {
111
+ results = storage.getResults(planId);
112
+ }
113
+ catch {
114
+ results = null;
115
+ }
116
+ sendJson(res, { plan, results });
117
+ }
118
+ export function handleGetTaskLog(storage, res, planId, taskId) {
119
+ try {
120
+ sendJson(res, storage.getTaskLog(planId, taskId));
121
+ }
122
+ catch {
123
+ sendError(res, 404, `Task log not found: ${planId}/${taskId}`);
124
+ }
125
+ }
126
+ export function handleGetPartitionerLog(storage, res, planId, reviewId) {
127
+ try {
128
+ sendJson(res, storage.getPartitionerLog(planId, reviewId));
129
+ }
130
+ catch {
131
+ sendError(res, 404, `Partitioner log not found: ${planId}/${reviewId}`);
132
+ }
133
+ }
90
134
  //# sourceMappingURL=ReviewController.js.map