From 1a5e3767a0a7ec8ca08f6855ade269d5847334e6 Mon Sep 17 00:00:00 2001 From: Nitish Kumar Singh Date: Wed, 16 Jul 2025 21:27:37 -0700 Subject: [PATCH 1/4] fix(amazonq): enable qCodeReview tool feature flag --- packages/amazonq/src/lsp/client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index e6ef1e5dd9c..98427d17276 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -168,6 +168,7 @@ export async function startLanguageServer( reroute: true, modelSelection: true, workspaceFilePath: vscode.workspace.workspaceFile?.fsPath, + qCodeReviewInChat: true, }, window: { notifications: true, From c9c061ed2b9b1df279fcd567915a90ae45fedd3a Mon Sep 17 00:00:00 2001 From: Blake Lazarine Date: Thu, 17 Jul 2025 12:13:39 -0700 Subject: [PATCH 2/4] fix(amazonq): handle suppress single finding in agentic reviewer --- packages/amazonq/src/lsp/chat/messages.ts | 17 +++++++++++++---- packages/core/src/shared/utilities/index.ts | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 9841c7edee9..f869bbe0da3 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -95,6 +95,7 @@ import { decryptResponse, encryptRequest } from '../encryption' import { getCursorState } from '../utils' import { focusAmazonQPanel } from './commands' import { ChatMessage } from '@aws/language-server-runtimes/server-interface' +import { CommentUtils } from 'aws-core-vscode/utils' export function registerActiveEditorChangeListener(languageClient: LanguageClient) { let debounceTimer: NodeJS.Timeout | undefined @@ -701,7 +702,7 @@ async function handleCompleteResult( ) { const decryptedMessage = await decryptResponse(result, encryptionKey) - handleSecurityFindings(decryptedMessage, languageClient) + await handleSecurityFindings(decryptedMessage, languageClient) void provider.webview?.postMessage({ command: chatRequestType.method, @@ -716,10 +717,10 @@ async function handleCompleteResult( disposable.dispose() } -function handleSecurityFindings( +async function handleSecurityFindings( decryptedMessage: { additionalMessages?: ChatMessage[] }, languageClient: LanguageClient -): void { +): Promise { if (decryptedMessage.additionalMessages === undefined || decryptedMessage.additionalMessages.length === 0) { return } @@ -730,10 +731,18 @@ function handleSecurityFindings( try { const aggregatedCodeScanIssues: AggregatedCodeScanIssue[] = JSON.parse(message.body) for (const aggregatedCodeScanIssue of aggregatedCodeScanIssues) { + const document = await vscode.workspace.openTextDocument(aggregatedCodeScanIssue.filePath) for (const issue of aggregatedCodeScanIssue.issues) { - issue.visible = !CodeWhispererSettings.instance + const isIssueTitleIgnored = CodeWhispererSettings.instance .getIgnoredSecurityIssues() .includes(issue.title) + const isSingleIssueIgnored = CommentUtils.detectCommentAboveLine( + document, + issue.startLine, + CodeWhispererConstants.amazonqIgnoreNextLine + ) + + issue.visible = !isIssueTitleIgnored && !isSingleIssueIgnored } } initSecurityScanRender(aggregatedCodeScanIssues, undefined, CodeAnalysisScope.PROJECT) diff --git a/packages/core/src/shared/utilities/index.ts b/packages/core/src/shared/utilities/index.ts index ecf753090ca..18d86da4d55 100644 --- a/packages/core/src/shared/utilities/index.ts +++ b/packages/core/src/shared/utilities/index.ts @@ -7,3 +7,4 @@ export { isExtensionInstalled, isExtensionActive } from './vsCodeUtils' export { VSCODE_EXTENSION_ID } from '../extensions' export * from './functionUtils' export * as messageUtils from './messages' +export * as CommentUtils from './commentUtils' From c9a3e9e54551e79a70ded448fdf8750cbec927b5 Mon Sep 17 00:00:00 2001 From: mkovelam Date: Thu, 17 Jul 2025 12:16:58 -0700 Subject: [PATCH 3/4] fix(amazonq): changed the icon for security issue hover fix option to keep it consistent in all places --- .../src/codewhisperer/service/securityIssueHoverProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/codewhisperer/service/securityIssueHoverProvider.ts b/packages/core/src/codewhisperer/service/securityIssueHoverProvider.ts index c907f99abe3..bb9fe2cafa4 100644 --- a/packages/core/src/codewhisperer/service/securityIssueHoverProvider.ts +++ b/packages/core/src/codewhisperer/service/securityIssueHoverProvider.ts @@ -90,7 +90,7 @@ export class SecurityIssueHoverProvider implements vscode.HoverProvider { const generateFixCommand = this._getCommandMarkdown( 'aws.amazonq.generateFix', [issue, filePath], - 'comment', + 'wrench', 'Fix', 'Fix with Amazon Q' ) From 9bb3be3f07dfb0728bf62cdcffad53ab500060e4 Mon Sep 17 00:00:00 2001 From: mkovelam Date: Thu, 17 Jul 2025 12:55:34 -0700 Subject: [PATCH 4/4] fix(core): fixing Fix icon failed unit test --- .../securityIssueHoverProvider.test.ts | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/amazonq/test/unit/codewhisperer/service/securityIssueHoverProvider.test.ts b/packages/amazonq/test/unit/codewhisperer/service/securityIssueHoverProvider.test.ts index 9c1bb751a35..7709eed10fe 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/securityIssueHoverProvider.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/securityIssueHoverProvider.test.ts @@ -21,17 +21,41 @@ describe('securityIssueHoverProvider', () => { token = new vscode.CancellationTokenSource() }) - function buildCommandLink(command: string, args: any[], label: string, tooltip: string): string { - return `[$(${command.includes('ignore') ? 'error' : 'comment'}) ${label}](command:${command}?${encodeURIComponent(JSON.stringify(args))} '${tooltip}')` + function buildCommandLink( + command: string, + commandIcon: string, + args: any[], + label: string, + tooltip: string + ): string { + return `[$(${commandIcon}) ${label}](command:${command}?${encodeURIComponent(JSON.stringify(args))} '${tooltip}')` } function buildExpectedContent(issue: any, fileName: string, description: string, severity?: string): string { const severityBadge = severity ? ` ![${severity}](severity-${severity.toLowerCase()}.svg)` : ' ' const commands = [ - buildCommandLink('aws.amazonq.explainIssue', [issue, fileName], 'Explain', 'Explain with Amazon Q'), - buildCommandLink('aws.amazonq.generateFix', [issue, fileName], 'Fix', 'Fix with Amazon Q'), - buildCommandLink('aws.amazonq.security.ignore', [issue, fileName, 'hover'], 'Ignore', 'Ignore Issue'), - buildCommandLink('aws.amazonq.security.ignoreAll', [issue, 'hover'], 'Ignore All', 'Ignore Similar Issues'), + buildCommandLink( + 'aws.amazonq.explainIssue', + 'comment', + [issue, fileName], + 'Explain', + 'Explain with Amazon Q' + ), + buildCommandLink('aws.amazonq.generateFix', 'wrench', [issue, fileName], 'Fix', 'Fix with Amazon Q'), + buildCommandLink( + 'aws.amazonq.security.ignore', + 'error', + [issue, fileName, 'hover'], + 'Ignore', + 'Ignore Issue' + ), + buildCommandLink( + 'aws.amazonq.security.ignoreAll', + 'error', + [issue, 'hover'], + 'Ignore All', + 'Ignore Similar Issues' + ), ] return `## title${severityBadge}\n${description}\n\n${commands.join('\n | ')}\n` }