( event: any, deps: CommandDeps )
| 49 | } |
| 50 | |
| 51 | export async function handleReviewCommand( |
| 52 | event: any, |
| 53 | deps: CommandDeps |
| 54 | ) { |
| 55 | const { client, reviewHtmlContent, getSharingEnabled, getShareBaseUrl, directory } = deps; |
| 56 | |
| 57 | // @ts-ignore - Event properties contain arguments |
| 58 | const reviewArgs = parseReviewArgs(event.properties?.arguments || ""); |
| 59 | const urlArg = reviewArgs.prUrl; |
| 60 | const isPRMode = urlArg !== undefined; |
| 61 | |
| 62 | let rawPatch: string; |
| 63 | let gitRef: string; |
| 64 | let diffError: string | undefined; |
| 65 | let userDiffType: DiffType | WorkspaceDiffType | undefined; |
| 66 | let gitContext: Awaited<ReturnType<typeof prepareLocalReviewDiff>>["gitContext"] | undefined; |
| 67 | let prMetadata: Awaited<ReturnType<typeof fetchPR>>["metadata"] | undefined; |
| 68 | let workspace: Awaited<ReturnType<typeof buildLocalWorkspaceReview>> | undefined; |
| 69 | let agentCwd: string | undefined; |
| 70 | |
| 71 | if (isPRMode) { |
| 72 | const prRef = parsePRUrl(urlArg); |
| 73 | if (!prRef) { |
| 74 | client.app.log({ level: "error", message: `Invalid PR/MR URL: ${urlArg}` }); |
| 75 | return; |
| 76 | } |
| 77 | |
| 78 | client.app.log({ level: "info", message: `Fetching ${getMRLabel(prRef)} ${getMRNumberLabel(prRef)} from ${getDisplayRepo(prRef)}...` }); |
| 79 | |
| 80 | try { |
| 81 | await checkPRAuth(prRef); |
| 82 | } catch (err) { |
| 83 | const cliName = getCliName(prRef); |
| 84 | client.app.log({ level: "error", message: err instanceof Error ? err.message : `${cliName} auth check failed` }); |
| 85 | return; |
| 86 | } |
| 87 | |
| 88 | try { |
| 89 | const pr = await fetchPR(prRef); |
| 90 | rawPatch = pr.rawPatch; |
| 91 | gitRef = `${getMRLabel(prRef)} ${getMRNumberLabel(prRef)}`; |
| 92 | prMetadata = pr.metadata; |
| 93 | } catch (err) { |
| 94 | client.app.log({ level: "error", message: err instanceof Error ? err.message : `Failed to fetch ${getMRLabel(prRef)} ${getMRNumberLabel(prRef)}` }); |
| 95 | return; |
| 96 | } |
| 97 | } else { |
| 98 | client.app.log({ level: "info", message: "Opening code review UI..." }); |
| 99 | |
| 100 | const config = loadConfig(); |
| 101 | const cwd = directory ?? process.cwd(); |
| 102 | const managedVcs = await detectManagedVcs(cwd, reviewArgs.vcsType); |
| 103 | const forcedVcs = !!reviewArgs.vcsType && reviewArgs.vcsType !== "auto"; |
| 104 | if (managedVcs || forcedVcs) { |
| 105 | try { |
| 106 | const diffResult = await prepareLocalReviewDiff({ |
| 107 | cwd, |
| 108 | vcsType: reviewArgs.vcsType, |
no test coverage detected