@@ -146,6 +146,7 @@ func configFileTemplate(tools []tools.Tool) string {
146146 PyLint : "3.3.6" ,
147147 PMD : "6.55.0" ,
148148 DartAnalyzer : "3.7.2" ,
149+ Semgrep : "1.78.0" ,
149150 }
150151
151152 // Build map of enabled tools with their versions
@@ -200,6 +201,7 @@ func configFileTemplate(tools []tools.Tool) string {
200201 PyLint : "pylint" ,
201202 PMD : "pmd" ,
202203 DartAnalyzer : "dartanalyzer" ,
204+ Semgrep : "semgrep" ,
203205 }
204206
205207 for uuid , name := range uuidToName {
@@ -214,6 +216,7 @@ func configFileTemplate(tools []tools.Tool) string {
214216 sb .WriteString (fmt .Sprintf (" - pylint@%s\n " , defaultVersions [PyLint ]))
215217 sb .WriteString (fmt .Sprintf (" - pmd@%s\n " , defaultVersions [PMD ]))
216218 sb .WriteString (fmt .Sprintf (" - dartanalyzer@%s\n " , defaultVersions [DartAnalyzer ]))
219+ sb .WriteString (fmt .Sprintf (" - semgrep@%s\n " , defaultVersions [Semgrep ]))
217220 }
218221
219222 return sb .String ()
@@ -280,7 +283,8 @@ func buildRepositoryConfigurationFiles(token string) error {
280283
281284 // Only generate config files for tools not using their own config file
282285 for _ , tool := range configuredToolsWithUI {
283- url := fmt .Sprintf ("%s/api/v3/analysis/organizations/%s/%s/repositories/%s/tools/%s/patterns?enabled=true" ,
286+
287+ url := fmt .Sprintf ("%s/api/v3/analysis/organizations/%s/%s/repositories/%s/tools/%s/patterns?enabled=true&limit=1000" ,
284288 CodacyApiBase ,
285289 initFlags .provider ,
286290 initFlags .organization ,
@@ -356,7 +360,7 @@ func createToolFileConfigurations(tool tools.Tool, patternConfiguration []domain
356360 if err != nil {
357361 return fmt .Errorf ("failed to write eslint config: %v" , err )
358362 }
359- fmt .Println ("ESLint configuration created based on Codacy settings" )
363+ fmt .Println ("ESLint configuration created based on Codacy settings. Ignoring plugin rules. ESLint plugins are not supported yet. " )
360364 } else {
361365 err := createDefaultEslintConfigFile (toolsConfigDir )
362366 if err != nil {
@@ -410,6 +414,13 @@ func createToolFileConfigurations(tool tools.Tool, patternConfiguration []domain
410414 return fmt .Errorf ("failed to create Dart Analyzer config: %v" , err )
411415 }
412416 }
417+ case Semgrep :
418+ if len (patternConfiguration ) > 0 {
419+ err := createSemgrepConfigFile (patternConfiguration , toolsConfigDir )
420+ if err != nil {
421+ return fmt .Errorf ("failed to create Semgrep config: %v" , err )
422+ }
423+ }
413424 }
414425 return nil
415426}
@@ -470,6 +481,24 @@ func createDefaultEslintConfigFile(toolsConfigDir string) error {
470481 return os .WriteFile (filepath .Join (toolsConfigDir , "eslint.config.mjs" ), []byte (content ), utils .DefaultFilePerms )
471482}
472483
484+ // SemgrepRulesFile represents the structure of the rules.yaml file
485+ type SemgrepRulesFile struct {
486+ Rules []map [string ]interface {} `yaml:"rules"`
487+ }
488+
489+ // createSemgrepConfigFile creates a semgrep.yaml configuration file based on the API configuration
490+ func createSemgrepConfigFile (config []domain.PatternConfiguration , toolsConfigDir string ) error {
491+ // Use the refactored function from tools package
492+ configData , err := tools .GetSemgrepConfig (config )
493+
494+ if err != nil {
495+ return fmt .Errorf ("failed to create Semgrep config: %v" , err )
496+ }
497+
498+ // Write to file
499+ return os .WriteFile (filepath .Join (toolsConfigDir , "semgrep.yaml" ), configData , utils .DefaultFilePerms )
500+ }
501+
473502// cleanConfigDirectory removes all previous configuration files in the tools-configs directory
474503func cleanConfigDirectory (toolsConfigDir string ) error {
475504 // Check if directory exists
@@ -503,4 +532,5 @@ const (
503532 PMD string = "9ed24812-b6ee-4a58-9004-0ed183c45b8f"
504533 PyLint string = "31677b6d-4ae0-4f56-8041-606a8d7a8e61"
505534 DartAnalyzer string = "d203d615-6cf1-41f9-be5f-e2f660f7850f"
535+ Semgrep string = "6792c561-236d-41b7-ba5e-9d6bee0d548b"
506536)
0 commit comments