@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.
- package/README.md +78 -84
- package/build/cli.js +131 -25
- package/build/cli.js.map +1 -1
- package/build/config/loader.d.ts.map +1 -1
- package/build/config/loader.js +2 -1
- package/build/config/loader.js.map +1 -1
- package/build/config/types.d.ts +2 -1
- package/build/config/types.d.ts.map +1 -1
- package/build/mcp/tools.d.ts.map +1 -1
- package/build/mcp/tools.js +51 -65
- package/build/mcp/tools.js.map +1 -1
- package/build/prompts/ExecutorPrompt.d.ts +4 -2
- package/build/prompts/ExecutorPrompt.d.ts.map +1 -1
- package/build/prompts/ExecutorPrompt.js +72 -34
- package/build/prompts/ExecutorPrompt.js.map +1 -1
- package/build/prompts/PartitionerPrompt.d.ts +12 -0
- package/build/prompts/PartitionerPrompt.d.ts.map +1 -0
- package/build/prompts/PartitionerPrompt.js +54 -0
- package/build/prompts/PartitionerPrompt.js.map +1 -0
- package/build/prompts/ResolverPrompt.d.ts +11 -0
- package/build/prompts/ResolverPrompt.d.ts.map +1 -0
- package/build/prompts/ResolverPrompt.js +45 -0
- package/build/prompts/ResolverPrompt.js.map +1 -0
- package/build/renderers/review/MarkdownRenderer.d.ts.map +1 -1
- package/build/renderers/review/MarkdownRenderer.js +30 -11
- package/build/renderers/review/MarkdownRenderer.js.map +1 -1
- package/build/renderers/review/TerminalRenderer.d.ts.map +1 -1
- package/build/renderers/review/TerminalRenderer.js +38 -13
- package/build/renderers/review/TerminalRenderer.js.map +1 -1
- package/build/renderers/review/WatchRenderer.d.ts.map +1 -1
- package/build/renderers/review/WatchRenderer.js +12 -3
- package/build/renderers/review/WatchRenderer.js.map +1 -1
- package/build/renderers/shared.d.ts +11 -11
- package/build/renderers/shared.d.ts.map +1 -1
- package/build/renderers/shared.js +15 -15
- package/build/renderers/shared.js.map +1 -1
- package/build/server/controllers/ReviewController.d.ts +12 -3
- package/build/server/controllers/ReviewController.d.ts.map +1 -1
- package/build/server/controllers/ReviewController.js +50 -6
- package/build/server/controllers/ReviewController.js.map +1 -1
- package/build/server/server.d.ts.map +1 -1
- package/build/server/server.js +22 -1
- package/build/server/server.js.map +1 -1
- package/build/services/ExecutorService.d.ts +17 -2
- package/build/services/ExecutorService.d.ts.map +1 -1
- package/build/services/ExecutorService.js +37 -5
- package/build/services/ExecutorService.js.map +1 -1
- package/build/services/FindingsParserService.d.ts +7 -6
- package/build/services/FindingsParserService.d.ts.map +1 -1
- package/build/services/FindingsParserService.js +44 -14
- package/build/services/FindingsParserService.js.map +1 -1
- package/build/services/criteria/module-parser.d.ts +1 -1
- package/build/services/criteria/module-parser.d.ts.map +1 -1
- package/build/services/criteria/module-parser.js +20 -16
- package/build/services/criteria/module-parser.js.map +1 -1
- package/build/services/review/CodeSnippetService.d.ts +10 -0
- package/build/services/review/CodeSnippetService.d.ts.map +1 -0
- package/build/services/review/CodeSnippetService.js +54 -0
- package/build/services/review/CodeSnippetService.js.map +1 -0
- package/build/services/review/ReviewInputResolverService.d.ts +25 -0
- package/build/services/review/ReviewInputResolverService.d.ts.map +1 -0
- package/build/services/review/ReviewInputResolverService.js +106 -0
- package/build/services/review/ReviewInputResolverService.js.map +1 -0
- package/build/services/review/ReviewOrchestratorService.d.ts +2 -2
- package/build/services/review/ReviewOrchestratorService.d.ts.map +1 -1
- package/build/services/review/ReviewOrchestratorService.js +28 -27
- package/build/services/review/ReviewOrchestratorService.js.map +1 -1
- package/build/services/review/ReviewPartitionerService.d.ts +46 -0
- package/build/services/review/ReviewPartitionerService.d.ts.map +1 -0
- package/build/services/review/ReviewPartitionerService.js +208 -0
- package/build/services/review/ReviewPartitionerService.js.map +1 -0
- package/build/services/review/ReviewPlanBuilderService.d.ts +25 -7
- package/build/services/review/ReviewPlanBuilderService.d.ts.map +1 -1
- package/build/services/review/ReviewPlanBuilderService.js +88 -30
- package/build/services/review/ReviewPlanBuilderService.js.map +1 -1
- package/build/services/review/ReviewStorageService.d.ts +35 -11
- package/build/services/review/ReviewStorageService.d.ts.map +1 -1
- package/build/services/review/ReviewStorageService.js +136 -35
- package/build/services/review/ReviewStorageService.js.map +1 -1
- package/build/services/testing/TestRunnerService.d.ts.map +1 -1
- package/build/services/testing/TestRunnerService.js +10 -8
- package/build/services/testing/TestRunnerService.js.map +1 -1
- package/build/types/criteria.d.ts +8 -6
- package/build/types/criteria.d.ts.map +1 -1
- package/build/types/review.d.ts +173 -50
- package/build/types/review.d.ts.map +1 -1
- package/package.json +3 -1
- package/ui/dist/index.html +12 -63
- package/build/prompts/PlannerPrompt.d.ts +0 -12
- package/build/prompts/PlannerPrompt.d.ts.map +0 -1
- package/build/prompts/PlannerPrompt.js +0 -34
- package/build/prompts/PlannerPrompt.js.map +0 -1
- package/build/services/review/ReviewContextExtractorService.d.ts +0 -17
- package/build/services/review/ReviewContextExtractorService.d.ts.map +0 -1
- package/build/services/review/ReviewContextExtractorService.js +0 -69
- package/build/services/review/ReviewContextExtractorService.js.map +0 -1
- package/build/services/review/ReviewPlannerService.d.ts +0 -29
- package/build/services/review/ReviewPlannerService.d.ts.map +0 -1
- package/build/services/review/ReviewPlannerService.js +0 -122
- 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,
|
|
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 {
|
|
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}
|
|
12
|
+
lines.push(`**${total} issues** (${critical} critical, ${warning} warning, ${info} info) | ${completed}/${totalTasks} tasks`);
|
|
13
13
|
lines.push("");
|
|
14
|
-
//
|
|
15
|
-
for (const section of
|
|
14
|
+
// Issues grouped by severity
|
|
15
|
+
for (const section of groupIssuesBySeveritySection(results)) {
|
|
16
16
|
lines.push(`### ${section.label}`);
|
|
17
|
-
for (const {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
-
//
|
|
51
|
-
const sections =
|
|
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.
|
|
55
|
+
lines.push(`${BOLD}${color} ${icon} ${section.label} (${section.issues.length})${RESET}`);
|
|
56
56
|
lines.push("");
|
|
57
|
-
for (let i = 0; i < section.
|
|
58
|
-
const {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"TerminalRenderer.js","sourceRoot":"","sources":["../../../src/renderers/review/TerminalRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE5D,mBAAmB;AACnB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,KAAK,GAAG,UAAU,CAAC;AAEzB,MAAM,eAAe,GAAoC;IACvD,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,MAAM,cAAc,GAAoC;IACtD,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,GAAG;CACV,CAAC;AAEF,wDAAwD;AACxD,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,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,gBAAgB,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,UAAU,KAAK,EAAE,CAAC,CAAC;IAE5H,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,cAAc;IACd,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IACpD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAG,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,QAAQ,YAAY,KAAK,EAAE,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,WAAW,KAAK,EAAE,CAAC,CAAC;IAC1E,IAAI,IAAI,GAAG,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC;IAE/D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,gBAAgB,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,QAAQ,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEvD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YAE/C,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAEjE,kBAAkB;YAClB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,QAAQ,GAAG,KAAK,KAAK,GAAG,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC5E,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACb,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5C,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,iBAAiB,KAAK,EAAE,CAAC,CAAC;oBACnD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACrD,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QAC9B,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC;QACrD,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,YAAY,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,aAAa,CAAC,cAAc,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC;QACvJ,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,WAAW,cAAc,CAAC,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;QAClH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,WAAW;IACX,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,IAAI,CAAC,aAAa,CAAC,MAAM,qBAAqB,IAAI,CAAC,eAAe,CAAC,MAAM,eAAe,KAAK,EAAE,CAAC,CAAC;QACjI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,GAAc;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC;QACjC,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE;QAC1F,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -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,
|
|
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].
|
|
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].
|
|
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
|
-
|
|
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 {
|
|
2
|
-
/**
|
|
3
|
-
export interface
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
11
|
+
issues: TaggedIssue[];
|
|
12
12
|
}
|
|
13
|
-
/** Collect all
|
|
14
|
-
export declare function
|
|
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
|
|
17
|
-
* filtering out sections with zero
|
|
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
|
|
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,
|
|
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
|
|
2
|
-
export function
|
|
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
|
|
6
|
-
if (
|
|
7
|
-
collected.push({
|
|
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
|
|
15
|
-
* filtering out sections with zero
|
|
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
|
|
21
|
-
const all =
|
|
22
|
-
.concat(
|
|
23
|
-
.concat(
|
|
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",
|
|
26
|
-
{ severity: "warning", label: "Warnings",
|
|
27
|
-
{ severity: "info", label: "Info",
|
|
28
|
-
].filter(s => s.
|
|
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,
|
|
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
|
-
|
|
11
|
-
|
|
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,
|
|
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
|
|
40
|
-
let
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|