Skip to content

Commit f729cbb

Browse files
Merge pull request #359 from Checkmarx/feature/agentic_ai
CxOne Dev Assist - OSS - Feature/agentic ai - AST-109602
2 parents cf21f21 + 3f79ef5 commit f729cbb

File tree

179 files changed

+11151
-133
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

179 files changed

+11151
-133
lines changed

README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ This plugin provides easy integration with JetBrains and is compatible with all
8181

8282
- AI Secure Coding Assistant (ASCA) - A lightweight scan engine that runs in the background while you work, enabling developers to identify and remediate secure coding best practice violations **as they code**.
8383

84+
## Checkmarx One Developer Assist – AI guided remediation
85+
- An advanced security agent that delivers real-time context-aware prevention, remediation, and guidance to developers from the IDE.
86+
- OSS Realtime scanner identifies risks in open source packages used in your project.
87+
- MCP-based agentic AI remediation.
88+
- AI powered explanation of risk details
89+
90+
**COMING SOON** - additional realtime scanners for identifying risks in container images, as well as exposed secrets and IaC risks.
91+
92+
8493
## Prerequisites
8594

8695
- You are running IntelliJ version 2022.2+ or another JetBrains IDE that is based on a supported version of IntelliJ.
@@ -93,20 +102,25 @@ This plugin provides easy integration with JetBrains and is compatible with all
93102
> - CxOne role `view-policy-management`
94103
> - IAM role `default-roles`
95104
105+
To use **Dev Assist**, you need the following additional prerequisites:
106+
- A Checkmarx One account with a Checkmarx One Assist license
107+
- The Checkmarx MCP must be activated for your tenant account in the Checkmarx One UI under Settings → Plugins. This must be done by an account admin.
108+
- You must have GitHub Copilot Chat (AI Agent) installed
109+
96110
## Initial Setup
97111

98112
- Verify that all prerequisites are in place.
99113

100114
- Install the **Checkmarx One** plugin and configure the settings as
101115
described [here](https://docs.checkmarx.com/en/34965-68734-installing-and-setting-up-the-checkmarx-one-jetbrains-pluging-68734.html#UUID-8d3bdd51-782c-2816-65e2-38d7529651c8_section-idm449017032697283334758018635).
102116

117+
**Note:** To use Dev Assist, you need to Start the Checkmarx MCP server.
103118

104119
## Usage
105120

106121
To see how you can use our tool, please refer to the [Documentation](https://docs.checkmarx.com/en/34965-68734-installing-and-setting-up-the-checkmarx-one-jetbrains-pluging.html)
107122

108123

109-
110124
## Feedback
111125
We’d love to hear your feedback! If you come across a bug or have a feature request, please let us know by submitting an issue in [GitHub Issues](https://github.com/Checkmarx/ast-jetbrains-plugin/issues).
112126

src/main/java/com/checkmarx/intellij/Constants.java

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,23 @@
22

33
import org.jetbrains.annotations.NonNls;
44

5+
import java.util.List;
6+
57
/**
68
* Non-translatable constants.
79
*/
810
@NonNls
911
public final class Constants {
1012

13+
1114
private Constants() {
1215
// forbid instantiation of the class
1316
}
1417

1518
public static final String BUNDLE_PATH = "messages.CxBundle";
1619

1720
public static final String LOGGER_CAT_PREFIX = "CX#";
21+
public static final String CXONE_ASSIST = "CxOne Assist";
1822

1923
public static final String GLOBAL_SETTINGS_ID = "settings.ast";
2024
public static final String TOOL_WINDOW_ID = "Checkmarx";
@@ -78,10 +82,14 @@ private Constants() {
7882
public static final String SCAN_STATUS_RUNNING = "running";
7983
public static final String SCAN_STATUS_COMPLETED = "completed";
8084
public static final String JET_BRAINS_AGENT_NAME = "Jetbrains";
81-
public static final String ASCA_CRITICAL_SEVERITY = "Critical";
82-
public static final String ASCA_HIGH_SEVERITY = "High";
83-
public static final String ASCA_MEDIUM_SEVERITY = "Medium";
84-
public static final String ASCA_LOW_SEVERITY = "Low";
85+
86+
public static final String MALICIOUS_SEVERITY = "Malicious";
87+
public static final String CRITICAL_SEVERITY = "Critical";
88+
public static final String HIGH_SEVERITY = "High";
89+
public static final String MEDIUM_SEVERITY = "Medium";
90+
public static final String LOW_SEVERITY = "Low";
91+
public static final String OK = "OK";
92+
public static final String UNKNOWN = "Unknown";
8593

8694
public static final String IGNORE_LABEL = "IGNORED";
8795
public static final String NOT_IGNORE_LABEL = "NOT_IGNORED";
@@ -97,7 +105,11 @@ private Constants() {
97105
/**
98106
* Inner static final class, to maintain the constants used in authentication.
99107
*/
100-
public static final class AuthConstants{
108+
public static final class AuthConstants {
109+
110+
private AuthConstants() {
111+
throw new UnsupportedOperationException("Cannot instantiate AuthConstants class");
112+
}
101113

102114
public static final String OAUTH_IDE_CLIENT_ID = "ide-integration";
103115
public static final String ALGO_SHA256 = "SHA-256";
@@ -114,5 +126,76 @@ public static final class AuthConstants{
114126
public static final int TIME_OUT_SECONDS = 120;
115127
}
116128

129+
/**
130+
* The RealTimeConstants class defines a collection of constant values
131+
* related to real-time scanning functionalities, including support for
132+
* different scanning engines and associated configurations.
133+
*/
134+
public static final class RealTimeConstants {
135+
136+
private RealTimeConstants() {
137+
throw new UnsupportedOperationException("Cannot instantiate RealTimeConstants class");
138+
}
139+
140+
// Tab Name Constants
141+
public static final String DEVASSIST_TAB = "CxOne Assist Findings";
142+
143+
// OSS Scanner Constants
144+
public static final String ACTIVATE_OSS_REALTIME_SCANNER = "Activate OSS-Realtime";
145+
public static final String OSS_REALTIME_SCANNER = "Checkmarx Open Source Realtime Scanner (OSS-Realtime)";
146+
public static final String OSS_REALTIME_SCANNER_START = "Realtime OSS Scanner Engine started";
147+
public static final String OSS_REALTIME_SCANNER_DISABLED = "Realtime OSS Scanner Engine disabled";
148+
public static final String OSS_REALTIME_SCANNER_DIRECTORY = "Cx-oss-realtime-scanner";
149+
public static final String ERROR_OSS_REALTIME_SCANNER = "Failed to handle OSS Realtime scan";
150+
151+
//Dev Assist Fixes Constants
152+
public static final String FIX_WITH_CXONE_ASSIST = "Copy fix prompt";
153+
public static final String VIEW_DETAILS_FIX_NAME = "View details";
154+
public static final String IGNORE_THIS_VULNERABILITY_FIX_NAME = "Ignore this vulnerability";
155+
public static final String IGNORE_ALL_OF_THIS_TYPE_FIX_NAME = "Ignore all of this type";
156+
157+
public static final List<String> MANIFEST_FILE_PATTERNS = List.of(
158+
"**/Directory.Packages.props",
159+
"**/packages.config",
160+
"**/pom.xml",
161+
"**/package.json",
162+
"**/requirements.txt",
163+
"**/go.mod",
164+
"**/*.csproj"
165+
);
166+
//Tooltip description constants
167+
public static final String RISK_PACKAGE = "risk package";
168+
public static final String SEVERITY_PACKAGE = "Severity Package";
169+
public static final String PACKAGE_DETECTED = "package detected";
170+
public static final String THEME = "THEME";
171+
// Dev Assist Remediation
172+
public static final String CX_AGENT_NAME = "Checkmarx One Assist";
173+
// Files generated by the agent (Copilot)
174+
public static final List<String> AGENT_DUMMY_FILES = List.of("/Dummy.txt", "/");
175+
}
176+
177+
/**
178+
* Constant class to hold image paths.
179+
*/
180+
public static final class ImagePaths {
181+
182+
private ImagePaths() {
183+
throw new UnsupportedOperationException("Cannot instantiate ImagePaths class");
184+
}
185+
186+
public static final String DEV_ASSIST_PNG = "/icons/devassist/tooltip/cxone_assist";
187+
public static final String CRITICAL_PNG = "/icons/devassist/tooltip/critical";
188+
public static final String HIGH_PNG = "/icons/devassist/tooltip/high";
189+
public static final String MEDIUM_PNG = "/icons/devassist/tooltip/medium";
190+
public static final String LOW_PNG = "/icons/devassist/tooltip/low";
191+
public static final String MALICIOUS_PNG = "/icons/devassist/tooltip/malicious";
192+
public static final String PACKAGE_PNG = "/icons/devassist/tooltip/package";
193+
194+
// Vulnerability Severity Count Icons
195+
public static final String CRITICAL_16_PNG = "/icons/devassist/tooltip/severity_count/critical";
196+
public static final String HIGH_16_PNG = "/icons/devassist/tooltip/severity_count/high";
197+
public static final String MEDIUM_16_PNG = "/icons/devassist/tooltip/severity_count/medium";
198+
public static final String LOW_16_PNG = "/icons/devassist/tooltip/severity_count/low";
199+
}
117200

118201
}

src/main/java/com/checkmarx/intellij/CxIcons.java

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,76 @@ public final class CxIcons {
1212
private CxIcons() {
1313
}
1414

15-
public static final Icon CHECKMARX_13 = IconLoader.getIcon("/icons/checkmarx-mono-13.png", CxIcons.class);
15+
public static final Icon CHECKMARX_13 = IconLoader.getIcon("/icons/checkmarx-plugin-13.png", CxIcons.class);
1616
public static final Icon CHECKMARX_13_COLOR = IconLoader.getIcon("/icons/checkmarx-13.png", CxIcons.class);
1717
public static final Icon CHECKMARX_80 = IconLoader.getIcon("/icons/checkmarx-80.png", CxIcons.class);
18-
public static final Icon CRITICAL = IconLoader.getIcon("/icons/critical.svg", CxIcons.class);
19-
public static final Icon HIGH = IconLoader.getIcon("/icons/high.svg", CxIcons.class);
20-
public static final Icon MEDIUM = IconLoader.getIcon("/icons/medium.svg", CxIcons.class);
21-
public static final Icon LOW = IconLoader.getIcon("/icons/low.svg", CxIcons.class);
22-
public static final Icon INFO = IconLoader.getIcon("/icons/info.svg", CxIcons.class);
2318
public static final Icon COMMENT = IconLoader.getIcon("/icons/comment.svg", CxIcons.class);
2419
public static final Icon STATE = IconLoader.getIcon("/icons/Flags.svg", CxIcons.class);
2520
public static final Icon ABOUT = IconLoader.getIcon("/icons/about.svg", CxIcons.class);
21+
public static final Icon INFO = IconLoader.getIcon("/icons/info.svg", CxIcons.class);
22+
23+
public static Icon getWelcomeScannerIcon() {
24+
return IconLoader.getIcon("/icons/welcomePageScanner.svg", CxIcons.class);
25+
}
26+
27+
public static Icon getWelcomeMcpDisableIcon() {
28+
return IconLoader.getIcon("/icons/cxAIError.svg", CxIcons.class);
29+
}
30+
31+
public static final Icon STAR_ACTION = IconLoader.getIcon("/icons/devassist/star-action.svg", CxIcons.class);
32+
33+
/**
34+
* Inner static final class, to maintain the constants used in icons for the value 24*24.
35+
*/
36+
public static final class Regular {
37+
38+
private Regular() {
39+
}
40+
41+
public static final Icon MALICIOUS = IconLoader.getIcon("/icons/devassist/severity_24/malicious.svg", CxIcons.class);
42+
public static final Icon CRITICAL = IconLoader.getIcon("/icons/devassist/severity_24/critical.svg", CxIcons.class);
43+
public static final Icon HIGH = IconLoader.getIcon("/icons/devassist/severity_24/high.svg", CxIcons.class);
44+
public static final Icon MEDIUM = IconLoader.getIcon("/icons/devassist/severity_24/medium.svg", CxIcons.class);
45+
public static final Icon LOW = IconLoader.getIcon("/icons/devassist/severity_24/low.svg", CxIcons.class);
46+
public static final Icon IGNORED = IconLoader.getIcon("/icons/devassist/severity_24/ignored.svg", CxIcons.class);
47+
public static final Icon OK = IconLoader.getIcon("/icons/devassist/severity_24/ok.svg", CxIcons.class);
48+
49+
}
50+
51+
/**
52+
* Inner static final class, to maintain the constants used in icons for the value 20*20.
53+
*/
54+
public static final class Medium {
55+
56+
private Medium() {
57+
}
58+
59+
public static final Icon MALICIOUS = IconLoader.getIcon("/icons/devassist/severity_20/malicious.svg", CxIcons.class);
60+
public static final Icon CRITICAL = IconLoader.getIcon("/icons/devassist/severity_20/critical.svg", CxIcons.class);
61+
public static final Icon HIGH = IconLoader.getIcon("/icons/devassist/severity_20/high.svg", CxIcons.class);
62+
public static final Icon MEDIUM = IconLoader.getIcon("/icons/devassist/severity_20/medium.svg", CxIcons.class);
63+
public static final Icon LOW = IconLoader.getIcon("/icons/devassist/severity_20/low.svg", CxIcons.class);
64+
public static final Icon IGNORED = IconLoader.getIcon("/icons/devassist/severity_20/ignored.svg", CxIcons.class);
65+
public static final Icon OK = IconLoader.getIcon("/icons/devassist/severity_20/ok.svg", CxIcons.class);
66+
67+
}
68+
69+
/**
70+
* Inner static final class, to maintain the constants used in icons for the value 16*16.
71+
*/
72+
public static final class Small {
73+
74+
private Small() {
75+
}
76+
77+
public static final Icon MALICIOUS = IconLoader.getIcon("/icons/devassist/severity_16/malicious.svg", CxIcons.class);
78+
public static final Icon CRITICAL = IconLoader.getIcon("/icons/devassist/severity_16/critical.svg", CxIcons.class);
79+
public static final Icon HIGH = IconLoader.getIcon("/icons/devassist/severity_16/high.svg", CxIcons.class);
80+
public static final Icon MEDIUM = IconLoader.getIcon("/icons/devassist/severity_16/medium.svg", CxIcons.class);
81+
public static final Icon LOW = IconLoader.getIcon("/icons/devassist/severity_16/low.svg", CxIcons.class);
82+
public static final Icon IGNORED = IconLoader.getIcon("/icons/devassist/severity_16/ignored.svg", CxIcons.class);
83+
public static final Icon OK = IconLoader.getIcon("/icons/devassist/severity_16/ok.svg", CxIcons.class);
84+
public static final Icon UNKNOWN = IconLoader.getIcon("/icons/devassist/severity_16/unknown.svg", CxIcons.class);
85+
86+
}
2687
}

src/main/java/com/checkmarx/intellij/Resource.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,5 +112,46 @@ public enum Resource {
112112
ERROR_SESSION_EXPIRED,
113113
SECRET_DETECTION,
114114
IAC_SECURITY,
115-
NO_CHANGES
115+
NO_CHANGES,
116+
CXONE_ASSIST_TITLE,
117+
OSS_REALTIME_TITLE,
118+
OSS_REALTIME_CHECKBOX,
119+
CXONE_ASSIST_LOGIN_MESSAGE,
120+
CXONE_ASSIST_MCP_DISABLED_MESSAGE,
121+
SECRETS_REALTIME_TITLE,
122+
SECRETS_REALTIME_CHECKBOX,
123+
CONTAINERS_REALTIME_TITLE,
124+
CONTAINERS_REALTIME_CHECKBOX,
125+
IAC_REALTIME_TITLE,
126+
IAC_REALTIME_CHECKBOX,
127+
CONTAINERS_TOOL_TITLE,
128+
IAC_REALTIME_SCANNER_PREFIX,
129+
GO_TO_CXONE_ASSIST_LINK,
130+
WELCOME_TITLE,
131+
WELCOME_SUBTITLE,
132+
WELCOME_ASSIST_TITLE,
133+
WELCOME_ASSIST_FEATURE_1,
134+
WELCOME_ASSIST_FEATURE_2,
135+
WELCOME_ASSIST_FEATURE_3,
136+
WELCOME_MAIN_FEATURE_1,
137+
WELCOME_MAIN_FEATURE_2,
138+
WELCOME_MAIN_FEATURE_3,
139+
WELCOME_MAIN_FEATURE_4,
140+
WELCOME_CLOSE_BUTTON,
141+
CONTAINERS_TOOL_DESCRIPTION,
142+
MCP_SECTION_TITLE,
143+
MCP_DESCRIPTION,
144+
MCP_INSTALL_LINK,
145+
MCP_EDIT_JSON_LINK,
146+
WELCOME_MCP_INSTALLED_INFO,
147+
MCP_NOTIFICATION_TITLE,
148+
MCP_CONFIG_SAVED,
149+
MCP_AUTH_REQUIRED,
150+
MCP_CONFIG_UP_TO_DATE,
151+
MCP_NOT_FOUND,
152+
CHECKING_MCP_STATUS,
153+
STARTING_CHECKMARX_OSS_SCAN,
154+
FAILED_OSS_SCAN_INITIALIZATION,
155+
DEV_ASSIST_COPY_FIX_PROMPT,
156+
DEV_ASSIST_COPY_VIEW_DETAILS_PROMPT
116157
}

src/main/java/com/checkmarx/intellij/Utils.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import com.checkmarx.ast.wrapper.CxException;
44
import com.checkmarx.intellij.settings.SettingsListener;
5+
import com.checkmarx.intellij.settings.global.GlobalSettingsState;
56
import com.intellij.dvcs.repo.Repository;
67
import com.intellij.dvcs.repo.VcsRepositoryManager;
7-
import com.intellij.notification.*;
8+
import com.intellij.notification.Notification;
9+
import com.intellij.notification.NotificationAction;
10+
import com.intellij.notification.NotificationGroupManager;
11+
import com.intellij.notification.NotificationType;
812
import com.intellij.openapi.application.ApplicationManager;
913
import com.intellij.openapi.diagnostic.Logger;
1014
import com.intellij.openapi.project.Project;
@@ -352,7 +356,7 @@ public static boolean isBlank(CharSequence cs) {
352356
if (strLen == 0) {
353357
return true;
354358
} else {
355-
for(int i = 0; i < strLen; ++i) {
359+
for (int i = 0; i < strLen; ++i) {
356360
if (!Character.isWhitespace(cs.charAt(i))) {
357361
return false;
358362
}
@@ -361,4 +365,34 @@ public static boolean isBlank(CharSequence cs) {
361365
}
362366
}
363367

368+
/**
369+
* Escape HTML special characters
370+
*
371+
* @param text String to escape
372+
* @return Escaped string
373+
*/
374+
public static String escapeHtml(String text) {
375+
if (Objects.isNull(text) || text.isBlank()) {
376+
return "";
377+
}
378+
return text.replace("&", "&amp;")
379+
.replace("<", "&lt;")
380+
.replace(">", "&gt;")
381+
.replace("\"", "&quot;")
382+
.replace("'", "&#39;");
383+
}
384+
385+
/**
386+
* Check if the user is authenticated or not
387+
*
388+
* @return true if a user is authenticated otherwise false
389+
*/
390+
public static boolean isUserAuthenticated() {
391+
try {
392+
return GlobalSettingsState.getInstance().isAuthenticated();
393+
} catch (Exception e) {
394+
LOGGER.error("Exception occurred while checking user authentication.", e.getMessage());
395+
return false;
396+
}
397+
}
364398
}

0 commit comments

Comments
 (0)