NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3855 most downloaded on PyPI
Static code analysis tool (linter) and code formatter for Robot Framework
Last release 9 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
130 releases · first in 2020
One column per quarter.
register deprecated rules so they are recognized in configuration
The main focus of the 9.0.0 release is project rules - rules that read the whole project context instead of a single file. We added 12 project rules (
The main focus of the 9.0.0 release is project rules - rules that read the whole project context instead of a
single file. We added 12 project rules (argument, import, keyword and variable checks across files) and merged
the separate robocop check-project command into the regular robocop check.
Beyond project rules, this is a large release with several other big changes:
GROUP syntax category, continue-on-failure tag rules andextends = ["robocop:minimal"].robocop config init - generate a fully documented configuration file.[Metadata] support (Robot Framework 7.5) across the linter and the formatter.AlignBDDStatements formatterDetailed changelog here.
The main focus of the 9.0.0 release is project rules - rules that read the whole project context instead of a
single file. We added 12 project rules (argument, import, keyword and variable checks across files) and merged
the separate robocop check-project command into the regular robocop check.
Beyond project rules, this is a large release with several other big changes:
GROUP syntax category, continue-on-failure tag rules and
new spacing/documentation/variable checks.extends = ["robocop:minimal"].robocop config init - generate a fully documented configuration file.[Metadata] support (Robot Framework 7.5) across the linter and the formatter.AlignBDDStatements formatterRemoved formatters:
empty-variable rule)empty-* rules - LEN11-LEN26, LEN29-LEN31, TAG08, MISC02)missing-space-after-comment rule)deprecated-run-keyword-if (DEPR08) rule)inconsistent-assignment (MISC04) and
inconsistent-assignment-in-variables (MISC05) rules.)empty-section (LEN09) rule. Note that, unlike the
formatter's allow_only_comments=False option, the rule fix never removes sections that contain comments.)deprecated-loop-keyword (DEPR09) rule)The functionality of the above formatters is now fully replaced by the corresponding rule fixes, and those formatters became redundant. It's part of an ongoing process to deliver more rule fixes while keeping formatters leaner. Ideally, a formatter should focus on alignment or whitespace, not on replacing/rewriting the code.
if-can-be-used ruleIt only worked for Robot Framework versions we don't support anymore.
Its functionality is replaced by the deprecated-run-keyword-if rule.
robocop check-project commandThis release focuses on implementing project rules. It became clear that keeping project rules in a separate command
does not make sense. It requires the user to run robocop twice, merge reports, etc. Now you can run project rules
by simply selecting them by name/id or using the 'PROJECT' keyword (robocop check --select PROJECT).
Refactored how a project checker works, which may affect custom rules. Now the scan_project method accepts a
context argument which contains the accumulated project context (it's now done automatically by robocop if a
project rule is enabled).
Robocop used a special algorithm when calculating whitespace alignment in various formatters. The idea was to keep the whole width of a 'column' (setting/name + whitespace) as a multiple of 4. It made writing the code slightly easier (so you could more easily TAB to the next column) but was confusing to users and also produced wider lines than necessary.
Now the separator uses a fixed minimum of 4 spaces (the default min_separator). For example, if you had a
6-character-long name:
${VAR} value
Previously, the column was rounded up to the next multiple of 4, so it was aligned to at least 12 characters (6 + 4 = 10, rounded up to 12):
${VAR} value
And now it is simply 10 characters (6 + 4) at minimum (the line will still be aligned to the other lines as well):
${VAR} value
While it is not a breaking change itself, it may result in multiple file changes after the Robocop update.
The main focus in 9.0.0 is project rules. Robocop is now capable of reading project context and uses it for a set of new rules.
To support it, we now have several new commands and options:
robocop list rules --filter PROJECT lists all project rules--project/--no-project to enable/disable running project rules. By default, robocop runs project rules if they
are selected, but it may be disabled with --no-project--analyze-libraries/--no-analyze-libraries - robocop imports libraries to check the keywords they provide. Use
this option to disable it if you're using project rules but do not want to import libraries (in exchange, robocop
will not find related issues)--load-library-timeout <SECONDS> - maximum time for importing a single library (default 10). Only used together
with --library-workers--library-workers/--no-library-workers - use it to import libraries in parallel, in a separate process with a timeout.
It is useful when you have multiple libraries that take a long time to import--ignored-library <NAME> - library that should not be imported. Supports glob patterns--pythonpath/-P <PATH> - additional locations to search for resources, variable files and libraries. Equivalent of the Robot Framework option.--variable/-v <NAME:VALUE> - set a variable used to resolve dynamic import paths. Equivalent of the Robot Framework option.--variablefile/-V <NAME:VALUE> - Python or YAML file with variables used to resolve dynamic import paths. Equivalent of the Robot Framework option.All project rules are optional – not everything may fit the code guidelines in your project.
The following rules were added:
invalid-argument-count: Keyword is called with a wrong number of argumentsExample of rule violation:
*** Test Cases ***
Scenario 1
Keyword Call 1
*** Keywords ***
Keyword Call
[Arguments] ${arg1} ${arg2}
missing-argument-name: Keyword is called with a positional argument instead of a named oneExample of rule violation:
*** Test Cases ***
Scenario 1
Keyword Call arg1=value value2
*** Keywords ***
Keyword Call
[Arguments] ${arg1} ${arg2}
duplicated-variable-in-project: Variable with the same name defined in multiple files visible togetherRobot Framework does not report an error when the same variable is defined in a suite and in a resource file imported by it, or in two resource files imported by the same suite. The value used at runtime depends on the import order, which makes such duplications a common source of hard to debug problems.
Example of rule violation:
*** Settings ***
Resource variables.resource
*** Variables ***
${BROWSER} firefox # variables.resource also defines ${BROWSER}
unused-resource-import: Imported resource file is not used.Reports resource imports whose keywords and variables are never used in the importing file.
Example of rule violation:
*** Settings ***
Resource unused.resource # nothing from this file is used
*** Test Cases ***
Test
Keyword From Other Resource
unused-library-import: Imported library is not usedReports library imports whose keywords are never used in the importing file.
Example of rule violation:
*** Settings ***
Library Collections # no keyword from this library is used
*** Test Cases ***
Test
Log message
unresolved-resource-import: Imported resource file does not existReports resource imports that point to a file that cannot be found in the project. Such import makes the whole suite fail during the execution.
Example of rule violation:
*** Settings ***
Resource does_not_exist.resource # file is not found next to the importing file
circular-import: Resource file is a part of a circular importReports resource imports that import, directly or indirectly, the file they are used in.
Example of rule violation:
# keywords.resource
*** Settings ***
Resource helpers.resource
# helpers.resource
*** Settings ***
Resource keywords.resource # keywords.resource imports this file already
unresolved-library-import: Imported library could not be importedReports library imports that Robot Framework would not be able to import during the execution.
Example of rule violation:
*** Settings ***
Library libs/does_not_exist.py # file is not found next to the importing file
Library NotInstalledLibrary # module is not installed and is not found in the search paths
unused-keyword: Keyword is not usedReports keywords that are defined in the project but never called.
Example:
*** Test Cases ***
Test that only non used keywords are reported
Used Keyword
*** Keywords ***
Used Keyword
Log used
Not Used Keyword # this keyword will be reported as not used
[Arguments] ${arg}
Should Be True ${arg}>50
keyword-not-found: Keyword is not defined anywhereReports keyword calls that do not match any keyword defined in the file, in the imported resource files or in
the imported libraries. Robot Framework fails such call with the No keyword with name 'X' found error.
Example of rule violation:
*** Settings ***
Resource login.resource # defines Login
*** Test Cases ***
Test
Login user password
Logout # Logout is not defined anywhere
ambiguous-keyword-name: Keyword name matches more than one keywordReports keyword calls that match keywords defined in more than one place. Robot Framework fails such call
with the Multiple keywords with name 'X' found error, unless the call uses the full name of the keyword.
Example of rule violation:
*** Settings ***
Resource login.resource # defines Login
Resource admin.resource # defines Login as well
*** Test Cases ***
Test
Login user password # it is not known which keyword should be used
missing-keyword-prefix: Keyword is called without the name of the resource file or library it comes fromOptional rule for projects that require every keyword call to be prefixed with the source of the keyword. Such calls are unambiguous and it is immediately clear where the keyword comes from:
*** Settings ***
Resource login.resource
Library SeleniumLibrary
*** Test Cases ***
Test
Login user password # will be reported
Click Element id:submit # will be reported
login.Login user password # explicit, not reported
SeleniumLibrary.Click Element id:submit
New, non-default formatter that aligns BDD statements in the test case body. Keyword calls prefixed with the BDD
reserved keywords (Given, When, And, But and Then) are indented so the keyword names following
the prefixes are aligned in a single column:
*** Test Cases ***
There can be only one
Given there are 3 ninjas
And there are more than one ninja alive
When 2 ninjas meet, they will fight
Then one ninja dies (but not me)
And there is one ninja less alive
Enable it with robocop format --select AlignBDDStatements. See
AlignBDDStatements documentation for more details.
args_with_test)AlignTemplatedTestCases now exposes an args_with_test parameter that controls whether template arguments and
settings stay in the same line as the test case name. Possible values are split (new default),
split_on_settings and keep:
split always moves template arguments and settings to their own line, keeping only the test case name in the
first line. Test case names are ignored when calculating the column widths (header names are still respected) and
settings are no longer counted towards the column widths.split_on_settings moves template arguments and settings to their own line only if the test case contains any
setting (such as [Tags] or [Documentation]).keep keeps template arguments and settings in the same line as the test case name (the previous behaviour). When
header names are present, the first body row is pulled up to the test case name line.Test cases that contain block structures (FOR, IF, TRY, WHILE) are always split, regardless of the
selected mode. Additionally, [Documentation] no longer affects the calculated column widths.
Since the default changed to split, updating Robocop may reformat existing templated test cases. Configure
AlignTemplatedTestCases.args_with_test=keep to preserve the previous layout. See
AlignTemplatedTestCases documentation for more details.
Upcoming Robot Framework 7.5 allows using the [Metadata] setting inside test cases:
*** Test Cases ***
Test
[Documentation] Doc.
[Metadata] Requirement REQ-42
[Metadata] Component Login
Keyword
Robocop now recognizes it in both the linter and the formatter:
[Metadata] is accepted by ERR09 setting-not-supported when running with Robot Framework 7.5 or newerDUP06 duplicated-metadata now reports duplicated metadata per test case, instead of mixing test case metadata
with the suite metadata. Previously, the same metadata name used in two different test cases was incorrectly
reported as a duplicateLEN11 empty-metadata and the new LEN33 metadata-without-value rule work with test case metadataNAME05 setting-name-not-in-title-case now also validates the Metadata/[Metadata] setting nameSPC19 not-enough-whitespace-after-setting now also reports the [Metadata] settingORD01 test-case-section-out-of-order supports the new metadata value. The default order is now
documentation,metadata,tags,timeout,setup,template,keyword,teardownOrderSettings formatter orders [Metadata] right after [Documentation]. Its test_before default is now
documentation,metadata,tags,timeout,setup,template. The formatter also no longer removes repeated settings,
which previously would have dropped all but the last [Metadata]AlignTestCasesSection formatter aligns [Metadata] together with the other test case settings.
It can be disabled with --skip metadata or AlignTestCasesSection.skip_metadata=TrueRobot Framework 7.2 added the GROUP syntax. Robocop now ships a dedicated GRP rule category for it:
too-few-calls-in-group: GROUP with too few keyword calls inside (configurable with min_calls,
defaults to 2 so groups wrapping a single keyword are reported)too-many-calls-in-group: GROUP with too many keyword calls inside (configurable with max_calls,
defaults to 10)group-without-name: GROUP used without a namenested-group: GROUP nested inside another GROUP (disabled by default)Empty and unterminated GROUP blocks are now reported by the parsing-error rule.
group-not-allowed: reports every use of the GROUP syntax (disabled by default). Enable it to keep
your project compatible with Robot Framework versions older than 7.2 or when your team decided not to use groups.Rules related to robot:continue-on-failure tag:
unnecessary-continue-on-failure reports Run Keyword And Continue On Failure calls in tests and keywords
that already enable the continue on failure mode with a tag.could-be-continue-on-failure-tag reports tests and keywords where every keyword call is wrapped in
Run Keyword And Continue On Failure and the robot:continue-on-failure tag could be used instead.New SPC23 empty-line-in-test-template rule (with a fix) that reports on:
*** Settings ***
Test Template Template Keyword
*** Test Cases ***
Suite template
first
second
New LEN33 metadata-without-value reports metadata with a name but without a value.
Example of rule violation:
*** Settings ***
Metadata Version
*** Test Cases ***
Test
[Metadata] Requirement
Such metadata is resolved to an empty value, which is almost always a mistake. Use LEN11 empty-metadata
to detect metadata without a name.
New SPC24 empty-lines-inside-block that reports on:
*** Keywords ***
Iterate
FOR ${var} IN 1 2
Keyword Call
END
New VAR13 automatic-variable-not-available rule that reports automatic variables used in a context where they are
not available (for example, using ${TEST_NAME} outside of a test case).
New DOC05 variable-in-documentation rule (disabled by default) that detects unescaped variables used in
documentation.
New MISC16 not-enough-whitespace-around-operator rule that reports comparison operators (==, !=, >,
<, >=, <=) used in conditions without surrounding whitespace. It inspects the conditions of IF and
WHILE blocks as well as the conditions passed to BuiltIn keywords such as Should Be True or Skip If. The
missing whitespace can be added automatically with the --fix option:
*** Test Cases ***
Test
IF ${variable}==5 # reported: should be '${variable} == 5'
Log Robocop
END
Several rules now have fixes:
deprecated-run-keyword-if (#1898)inconsistent-assignmentinline-if-can-be-usedduplicated-variable (#1857)else-not-upper-case (#1854)empty-return (#1846)empty-section (#1841)empty-tags (#1842)unnecessary-default-tags (#1850)unused-disabler (#1855)missing-space-after-comment (#1844)ignored-data (#1844)inconsistent-assignment-in-variables (#1859)misplaced-negative-condition (#1859)deprecated-with-name (#1843)deprecated-singular-header (#1843)duplicated-resource (#1848)duplicated-library (#1848)duplicated-variables-import (#1848)empty-* 18 rules (#1840)empty-library-alias (#1847)duplicated-library-alias (#1847)empty-variable (#1852)undefined-argument-default (#1852)wrong-import-order (#1856)builtin-imports-not-sorted (#1856)tag-already-set-in-test-tags (#1851)duplicated-tags (#1851)tag-already-set-in-keyword-tags (#1851)setting-name-not-in-title-case (#1858)section-name-invalid (#1858)wrong-case-in-keyword-name (#1860)wrong-case-in-keyword-call (#1860)not-enough-whitespace-after-setting (#1862)not-enough-whitespace-after-newline-marker (#1862)not-enough-whitespace-after-variable (#1862)Custom rules, formatters and configuration files can now be packaged and distributed as a Robocop plugin.
A plugin is a regular Python package that registers itself using the robocop.plugins entry point group:
[project]
name = "example-plugin"
[project.entry-points."robocop.plugins"]
example = "example_plugin.path.to.dir"
Robocop discovers installed plugins automatically. Use robocop list plugins to see them.
The entry point name becomes the plugin namespace, and its resources are referenced with the
<plugin_name>.<path.inside.the.plugin> syntax:
[tool.robocop]
extends = ["example.config.strict"]
[tool.robocop.lint]
custom_rules = ["example.rules"]
reports = ["example.reports"]
[tool.robocop.format]
select = ["example.formatters.FormatterA"]
Installing a plugin does not enable anything on its own - it only registers the namespace, so plugin resources can be referenced in the configuration.
Note that extends values that do not end with .toml were previously silently ignored. They are now
resolved as plugin references, and Robocop reports an error if the plugin or its configuration file is missing.
See the plugins documentation for more details.
Robocop ships with built-in rulesets that can be referenced using the robocop:<name> syntax in extends:
[tool.robocop]
extends = ["robocop:minimal"]
Currently, there is only one built-in ruleset available - robocop:minimal, a curated, minimal set of rules focused
on correctness and runtime issues. It selects only the rules from this set and overrides their default severity with
the one defined by the ruleset.
Just like any other configuration, a built-in ruleset can be extended and overridden. For example, to use the
minimal ruleset but add an extra rule:
[tool.robocop]
extends = ["robocop:minimal"]
[tool.robocop.lint]
select = ["line-too-long"]
As part of this change, several rules have updated severity values (in default configuration). We will monitor and analyze the best mappings and add next rulesets in upcoming releases.
Reports can now be defined outside Robocop, in the same way as the custom rules and formatters. Custom reports are
enabled with the existing --reports option by pointing it to the source of the reports: a path to the Python
file or a directory, an importable module or a plugin reference:
=== ":octicons-command-palette-24: cli"
```bash
robocop check --reports path/to/custom_report.py
robocop check --reports example.reports
```
=== ":material-file-cog-outline: toml"
```toml
[tool.robocop.lint]
reports = [
"all",
"path/to/custom_report.py"
]
```
All reports found in the source are loaded and enabled. Custom report is a class that inherits from the
robocop.linter.reports.Report class and defines the name and the description attributes. Such report
can be configured (--configure custom_report.param=value), listed (robocop list reports) and documented
(robocop docs custom_report) exactly like the built-in reports.
See the reports documentation for more details.
New robocop config init command generates a documented configuration file with all the available options.
The generated robocop.toml lists every global option, linter rule and formatter together with their default
values and a short description. All options are written as comments, so the generated file reproduces Robocop's
default behaviour until you uncomment and edit the options you want to change:
robocop config init # write robocop.toml in the current directory
robocop config init --force # overwrite an existing file
robocop config init --output config.toml # write to a custom location
robocop config init --output - # print to the standard output
See the configuration documentation for more details.
not-allowed-char-in-filename (file-wide rule) prints source code on report (#1871)VAR assignment sign in the inconsistent-assignment rule (#1902)imports_order=library, resource, variables are accepted (#1922)inconsistent-assignment (MISC04) rule now also checks the assignment sign in the VAR syntaxignored_docs parameter to line-too-long (#1892)AlignSettingsSection (#1890)IndentNestedKeywords (#1919)Combined several checkers (for better control and performance), split rules from checkers with dedicated responsibility (visitors separately from rule checks) in the following PRs:
Nothing published for this version
Nothing published for this version
Support Robot Framework 7.5 by relaxing upper version bound to <7.6
add --verbose option to list formatters command to print configurables
SplitTooLongLine: add per-type align_new_line options
support --config option in list rules/formatters docs options
mark --ignore values as matched for rules below --threshold ( #1786 ) ( 70d0ab6 ), closes #1775
keep first setting argument on the setting line in SplitTooLongLine ( #1784 ) ( 59416c8 ), closes #1723
respect fmt: off when aligning comments in keyword/test-case aligners
stop AlignKeywords/TestCasesSection from aligning comments outside test cases and keywords
Add test_types option to AlignTestCasesSection for templated/non-templated tests
Fix unused-variable false positive for variables consumed only in [Teardown]
add click as explicit dependency
Keyword naming rules with library import with underscores is now detected properly
ensure that configuration files are loaded in the order (robocop.toml > robot.toml > pyproject.toml)
Fix section-out-of-order not supporting comments section
Add missing robot:exit-on-failure tag to reserved tag list
Fix fatal attribute error when running Robocop
Fix circular import error due to ConfigManager split from config.py
mcp: Allow to pass configuration file path via MCP tools
Fix unused-variable reported on variable names starting with digit
unused-argument rule raised when argument is used in item access or inline eval
Deprecated deprecated-statement rule
More detailed notes regarding 8.0.0 here.
deprecated-statement ruleReplaceReturns formatterAddMissingEnd formatterSourceFile classdeprecated-statement rule and split into new rulesdeprecated-force-tagsdeprecated-run-keyword-ifdeprecated-loop-keyworddeprecated-return-keyword (with a fix)deprecated-return-setting (with a fix)report() can be now used from the rule class (#1644) (8aff795)set-keyword-with-typecase_normalization parameter to enforce case by RenameKeywords (#1667) (49a0b02)dropped support for Python 3.9
dropped support for Robot Framework 4
Robocop can still be used to lint/format Robot Framework 4 code. Install it in the environment
with supported version installed (5+) and use --target-version option.
Deprecated deprecated-statement rule
It is now replaced by new deprecated-- rules after split (covered in new features).
Fix the breaking change by removing deprecated-statement from your configuration.
Deprecated ReplaceReturns formatter
The functionality is now replaced by fix of new deprecated-return-keyword rule.
Remove ReplaceReturns from your configuration.
Deprecated AddMissingEnd formatter
I have decided to not keep formatters that fix incorrect / invalid syntax.
It should be either raised as a rule violation (and potentially fixed) or addressed
manually.
Remove AddMissingEnd from your configuration.
refactored source files handling with common SourceFile class
redesigned configuration layer for typing safety and OOP friendliness
It is an internal change, part of a bigger effort of improving Robocop design. This shouldn't affect you, but if you are using Robocop internal methods directly, you will need to update the usage. It also affects Robotcode, but I have raised the appropriate fix PR, and it should be updated soon.
Fixable rules! (#1617) (128c849)
robocop check now supports --fix. We can now define a potential fix for the rule.
When running robocop, if raised issues have fix, it will be mentioned in the summary:
Found 1 issue.
1 fixable with the '--fix' option.
Currently, I have added a few new rules with fixes and implemented fix for a few old rules.
Over time, I will go over existing rules and check which rules can benefit from having automatic fix.
It also means a shift in how we perceive format - ideally I want format to focus on general formatting,
whitespace changes, etc. For that reason I have already replaced ReplaceReturns formatter with its equivalent
in rules (deprecated-return-keyword). From now on, if the aim is to fix an issue in the code, typically
the rule with a fix will be a better option. You can find which rules currently have fix by running:
> robocop list rules --with-fix
DEPR07 [W]: deprecated-force-tags: 'Force Tags' is deprecated, use 'Test Tags' instead (enabled) [fixable]
DEPR10 [W]: deprecated-return-keyword: '{statement_name}' is deprecated, use '{alternative}' instead (enabled) [fixable]
DEPR11 [W]: deprecated-return-setting: '[Return]' is deprecated, use 'RETURN' instead (enabled) [fixable]
SPC01 [W]: trailing-whitespace: Trailing whitespace at the end of line (enabled) [fixable]
Altogether 4 rules (4 enabled).
It is also marked in our documentation.
I have mimicked similar tools and robocop also has support for --diff (show fixes output without applying them)
and --unsafe-fixes (apply fixes labelled as unsafe).
It is also possible to define which rules are fixable or unfixable. Fixable will work as select - only fixing listed rules,
and unfixable works as ignore - fixing all rules except listed:
[tool.robocop.lint]
fix = true
unfixable = [
"rule-name-or-id",
"other-rule"
]
Custom rules also support fixes. It is documented in our documentation (https://robocop.dev/stable/linter/custom_rules/). Short example:
class ExampleRuleWithFix(FixableRule):
"""
Check if there is a parametrised substring in the test case name.
"""
name = "rule-name"
rule_id = "EX01"
message = "Error message"
severity = RuleSeverity.WARNING
fix_availability = FixAvailability.ALWAYS
def fix(self, diag: Diagnostic, source_lines: list[str]) -> Fix | None:
return Fix(
edits=[TextEdit.replace_at_range(self.rule_id, self.name, diag.range, "")],
message="Remove unnecessary part of string",
applicability=FixApplicability.SAFE,
)
Fixes can be defined inside the Rule class - it will receive a raised diagnostic and create fix based on it. Otherwise, you can create a fix manually and pass it when reporting the rule violation.
deprecate deprecated-statement rule and split into new rules
deprecated-statement covered various deprecated statements. It wasn't ideal when user wanted to ignore specific
deprecation and interfered with fixes. The rule is now split into the following new rules:
deprecated-run-keyword-ifdeprecated-loop-keyworddeprecated-return-keyword (with a fix)deprecated-return-setting (with a fix)Robocop is now more verbose
By default, Robocop didn't print anything if there wasn't any issue found and no report was enabled. It wasn't friendly for new users or for quick checks without configuration. Now Robocop prints a short summary, regardless of enabled reports:
Found 8 issues.
No issues found.
Also, Robocop will now print a warning if non-existing rule is used in the select / extend-select / ignore:
Option value 'idontexist' from '--select' did not match with any rule name or id.
Keyword naming rules and formatters quotation handling
Updated keyword naming rules (such as wrong-case-in-keyword-call) and RenameKeywords formatter to ignore quoted
values. Refactored variable naming handling.
Following name:
Keyword with "potential embedded value" and ${variable}
Will be formatted (with the default configuration) to:
Keyword With "potential embedded value" And ${variable}
performance improvements
Several performance improvements in the configuration handling, caching and also specific rules which were refactored.
For example unused-variable, unused-argument, inconsistent-variable-name and possible-overwriting rules
are now 2x faster on average.
We have also performance tests for benchmarking. Since new features will slowly slow down Robocop, it is important to monitor it and keep improving the performance based on arbitary results. (#1611) (eea1c56)
report() can be now used from the rule class (#1644) (8aff795)
The current goal is to move rule-specific code into the rule classes and keep visiting / context-specific code in the visitor. Also, to minimalize the number of visitors, since we currently revisit the file for each checker. It's an internal change, but I am adding new tools that can be also reused in the custom rules.
report() could be only from inside the checker, but now it can be used within the rule class. It allows
to define check() methods:
Rule:
class LibraryImportRule(Rule):
"""
<docs>
"""
<rule attributes>
def check(self, node: LibraryImport) -> None:
if not self.enabled:
return
with_name_token = node.get_token(Token.WITH_NAME)
if not with_name_token or with_name_token.value == "AS":
return
self.report(
node=with_name_token,
col=with_name_token.col_offset + 1,
end_col=with_name_token.end_col_offset + 1,
)
Visitor / Checker:
(...)
def visit_LibraryImport(self, node: LibraryImport) -> None: # noqa: N802
self.deprecated_with_name.check(node)
Robocop is now fully typed (#1661) (42045dc)
list rules can now return the result when used from the Python (#1629) (457d135)
MCP is now aware of local config (#1673) (55e18b6)
MCP overwrote local config before. It should now detect a configuration file in the directory when it runs and loads custom configuration, rules and formatters.
Skip documentation by default in NormalizeSeparators (#1672) (5b1ae35)
Added or improved support for variable type conversion (#1654) (#1650) (#1651) (#1652) #1653)
Updated rules:
duplicate-argument (#1654) (af8d35a)duplicated-assigned-var-name (#1650) (3f304e5)inconsistent-variable-name(#1651) (9a0f525)non-local-variables-should-be-uppercase (#1652) (97f4725)possible-variable-overwriting (#1653) (322cd95)New rule ANN04 set-keyword-with-type
Variable type conversion does not work with Set Test/Suite/Global Variable keywords. Robocop will detect the following syntax:
Set Suite Variable ${variable: int} value
Add case_normalization parameter to enforce case by RenameKeywords (#1667) (49a0b02)
RenameKeywords formatter only changed case for the first letter (in the sentence, or for each word).
It did not change the case of the remaining letters. It is now possible with case_normalization parameter.
When configured, it will rename the following:
*** Keywords ***
keyword name
Keyword Call
EXECUTE actioN
into
*** Keywords ***
Keyword Name
Keyword Call
Execute Action
mcp: add new tools and improve UX for large codebases
add commented-out-code detection rule (COM06)
Breaking change Add option --extend-select for linter and formatter (issue #1546)
Breaking change Add option --extend-select for linter and formatter (issue #1546)
--extend-select allows to enable rules and formatters on top of the select configuration. It can be used to
retain all default rules or formatters and only add additional ones:
robocop check --extend-select no-embedded-keyword-arguments
robocop format --extend-select AlignKeywordsSection --extend-select CustomFormatter
Since previous --custom-formatters formatter option already behaved like a --extend-select option (which was
not documented), it is now deprecated and renamed to --extend-select instead.
It is also recommended to use --extend-select over --configue name.enabled=True.
Breaking change Split wrong-case-in-keyword-name rule into two separate rules (issue #1471):
wrong-case-in-keyword-name which checks case convention in keyword definition name
wrong-case-in-keyword-call which checks case convention in keyword call name
It allows configuring different conventions for keyword definition and keyword call names. If you have existing
configuration for wrong-case-in-keyword-name (you are ignoring it or configuring) you need to apply the same
config to wrong-case-in-keyword-call to retain old behaviour.
SplitTooLongLine can now split more settings types: Library imports, Test Tags and Keyword Tags (issue #1454)
Example code before and after the change:
Library CustomLibraryWithLongerNameAndSeveralArguments first_argument second_argument=${longer_variable_name} WITH NAME name
Library CustomLibraryWithLongerNameAndSeveralArguments
... first_argument
... second_argument=${longer_variable_name}
... WITH NAME name
Restore project checkers (issue #1108)
Project checkers were temporarily removed in the Robocop 6.0. There are now brought back in a new form, as a separate command:
robocop check-project
This command behaves similarly to the check command, but it only runs project rules.
The project checks itself were also refactored to be more flexible. See project checker and custom rules project checker for reference.
Extend robocop disablers to the whole node (issue #1515
Robocop will now ignore issues in the whole node (keyword, test case, for loop, keyword call, etc.) when the disabler is set in the header / keyword call body. For example:
*** Keywords ***
My Keyword
FOR ${var} IN 1 2 3 # robocop: off=unused-variable
Log 1
END
Keyword # robocop: off=bad-indent
... ${var}
... ${var2}
Previously, Robocop would ignore unused-variable only when reported on the FOR header and bad-indent only
when reported on the same line as disabler comment. After this change, those issues will be ignored in the whole
FOR loop and the whole Keyword call respectively.
Ignore unused variables starting with _ (${_variable}) (issue #1457
unused-variable and variable-overwritten-before-usage rules not reporting violations in TRY blocks (issue #1548)wrong-case-in-keyword-call rule false positive report on names with . character with first_word_capitalized = True (issue #1555)wrong-case-in-keyword-name rule incorrectly handling names with . character (issue #1555)Add per_file_ignores option to ignore rules matching file patterns (issue #1134)
per_file_ignores option to ignore rules matching file patterns (issue #1134)Example configuration:
[tool.robocop.lint.per_file_ignores]
"test.robot" = ["VAR02"]
"ignore_subdir/*" = ["empty-line-after-section", "DOC01"]
"ignore_file_in_subpath/test2.robot" = ["SPC10"]
enabled=False. It can be used to disable default print_issues report (issue #1540)docs_url property to rule class which points to rule documentation URL (issue #1432)robocop check > output.txt) not working on Windows because of code lines converted to emojis (issue #1539)--ignore-file-config option enabled (other configuration files were correctly ignored)docs_url as an example (here).Add deprecated names section to all the rules that list previous names and ids of the rule
extends configuration parameter which allows to inherit configuration from another file. Read more in the documentation (issue #1453)mixed-tabs-and-spaces (SPC06) rule behaviour to report all occurrences of mixed tabs and spaces in a file (issue #848)format_files (robocop API entrypoint for formatting files) now accepts return_result parameter for returning exit code instead of raising SystemExitRenameVariables not longer replaces spaces in variable names with the math operators (issue #1428)AlignKeywordsSection and AlignTestCasesSection not aligning VAR variables (issue #1493)no-embedded-keyword-arguments rule fatal exception when reading a file with invalid syntaxdeprecated names section to all the rules that list previous names and ids of the ruleAdd --silent option to disable all output when running Robocop (issue #1512)
--silent option to disable all output when running Robocop (issue #1512).gitignore file not ignored (issue #1503)migrate command migrating formatters with enabled=False from the old transform to select option (issue #1492)migrate command not splitting multiline configurations (issue #1491)*** Test Cases ***
Multiline inline IF
IF True
... Something
becomes:
*** Test Cases ***
Multiline inline IF
IF True Something
enabled formatter parameter not validating as a boolean (issue #1476)Fix verbose, force_exclude and skip_gitignore options not supported in the configuration file
verbose, force_exclude and skip_gitignore options not supported in the configuration fileRelease a new documentation website.
Release a new documentation website.
Rewrite of our documentation from Sphinx to MkDocs, now hosted at https://robocop.dev.
Update all internal links to new urls.
Fixed corrupted pyproject.toml file - which led to incorrect Robot Framework dependency version (==6.* instead of >=4.0,<7.5).
Fixed corrupted pyproject.toml file - which led to incorrect Robot Framework dependency version (==6.* instead of >=4.0,<7.5).
Fix invalid rule positions stopping Sonar Qube import
End-to-end testing of Sonar Qube issue imports revealed multiple problems with diagnostic positioning. All problematic rules included an incorrect offset of 1. The following rules have been corrected:
invalid-setting-in-resource (ERR16)unreachable-code (MISC10)keyword-name-is-reserved-word (NAME03)invalid-section (NAME16)Bumped maximum supported Robot Framework version to 7.4.
Bumped maximum supported Robot Framework version to 7.4.
Rule documentation now contains information about deprecated names. It is especially helpful during migration to Robocop 6.0 or comparing results between old and new Robocop reports.
Fix Robocop failing to scan directory with dangling symlink
Robocop should be able to scan directory with dangling (pointing to non-existing path) symlink.
Robocop should be able to scan a directory with dangling (pointing to a non-existing path) symlink.
Fix comment handling in Set Variable If with ReplaceWithVAR formatter
ReplaceWithVAR no longer abruptly stops when converting Set Variable If with comments to VAR.
Fixed an issue where Robocop had 1/3 of its rules disabled when executed with Python 3.14.
Fixed an issue where Robocop had 1/3 of its rules disabled when executed with Python 3.14.
This release focus on improving & fixing issues with disablers and comment handling. Includes following changes:
This release focus on improving & fixing issues with disablers and comment handling. Includes following changes:
SplitTooLongLine formatterand fixes:
You can read full release notes at https://github.com/MarketSquare/robotframework-robocop/blob/main/docs/releasenotes/6.8.0.rst
A new rule unused-disabler (MISC15) has been added to detect Robocop disabler directives (such as # noqa or
# robocop: off) that are not being used. This typically occurs when:
A code violation is fixed, but the disabler is not removed
A rule is disabled globally, making local disablers redundant
Multiple overlapping disablers are present
Improved comment handling in SplitTooLongLine formatter (issue #1444)
The SplitTooLongLine formatter now has better comment handling.
Previous behavior:
When formatting keyword call or VAR by SplitTooLongLine formatter, comments were moved above the statement,
for example:
Long Keyword That Will Be Split multiple args # comment
Was formatted to:
# comment
Long Keyword That Will Be Split
... multiple
... args
This caused unindented effect where robocop disabler directives (e.g. # robocop: off) were also moved above the
statement and no longer applied correctly.
New behavior:
Comments are now kept on the first line of the split statement:
Long Keyword That Will Be Split # comment
... multiple
... args
This ensures that disablers and other comments remain associated with the correct statement.
Disabler directives can now be placed anywhere within a comment, not just at the beginning.
Previous behavior:
Only the first disabler at the start of a comment was recognised:
# only robocop: off=some-rule is recognized
Keyword Call # robocop: off=some-rule robocop: fmt: off
# only noqa is recognized
Keyword Call # noqa robocop fmt: off
# nothing is recognized
Keyword Call # TODO: robocop: off
New behavior:
All disablers are now recognised regardless of their position in the comment. Additionally, the syntax is more flexible and rules can be separated by commas with or without spaces:
# Both formats are now valid:
# robocop: off=rule1,rule2
# robocop: off=rule1, rule2
Fixed an issue where the overwrite mode was not being applied when specified in the configuration file. The
following configuration now works correctly:
[tool.robocop.format]
overwrite = false
Rules urls (such as SARIF helpUri, or diagnostic message urls) were pointing to non-existent locations after a documentation refactor. URLs now correctly point to:
https://robocop.readthedocs.io/en/v{version}/rules/rules_list.html#{rule-name} .
New disabler directives (robocop: fmt: off and fmt: off) were not ignored by line-too-long rule.
From now on, together with other disablers, comments with disablers will be ignored when checking line length.
Assertion keywords reported as undefined-argument-value
Assertion keywords used by popular AssertionEngine library were reported as undefined-argument-value errors::
785 | Get Text ${selector} *= ${alv_check}
| ^^ ARG04
Robocop should now ignore arguments that match following list: "==", "!=", "<", ">", "<=", ">=", "*=", "^=", "$=", "$".
Fixed issues when reporting SPC10 too-many-trailing-blank-lines and LEN08 line-too-long outside physical
locations. Now it should only report start/end lines.
Following code:
*** Keywords ***
Some keyword
&{SOME_DICT} Some keyword that returns a dict
VAR &{SOME_DICT} &{SOME_DICT} scope=TEST
was incorrectly converted to:
*** Keywords ***
Some keyword
&{some_dict} Some keyword that returns a dict
VAR &{some_dict} &{some_dict} scope=TEST
It should now correctly detect new (global) case of variable and convert it to:
*** Keywords ***
Some keyword
&{some_dict} Some keyword that returns a dict
VAR &{SOME_DICT} &{some_dict} scope=TEST
When using VAR with local scope, VAR did not change back to global scope after switching scope again.
Following code:
*** Keywords ***
Some keyword
VAR ${local_variable} scope=local
Log ${local_variable}
VAR ${local_variable} scope=SUITE
Log ${local_variable}
will now be formatted to:
*** Keywords ***
Some keyword
VAR ${local_variable} scope=local
Log ${local_variable}
VAR ${LOCAL_VARIABLE} scope=SUITE
Log ${LOCAL_VARIABLE}
` from deprecated import deprecated # duplicates with robocop.linter.rules.deprecated.py `
Running Robocop with older Robot Framework versions than 7.0 no longer crashes when trying to configure with integer based parameter::
robocop format AlignSettingsSection.fixed_width=30
The issue was coming from not supporting the Python extended typing in formatter definition::
min_width: int | None = None
| is not supported for Robot Framework < 7.0 and needs to be removed if you're using it in custom formatter::
min_width: int = None
Rules that require more granular version of Robot Framework (such as > 6.1) will no longer be silently ignored if Robocop is executed on the same major version (6.1.1 for example) without target version set.
If custom rule used external module with the same name as one of Robocop rules categories, it failed on import:
from deprecated import deprecated # duplicates with robocop.linter.rules.deprecated.py
It was resolved by redesigning our rules importing logic to follow the same behaviour as formatter importer.
This release was entirely community driven, huge thanks for @p-zander, @pavezzo & others for discussing and implementing new changes and fixes.
This release was entirely community driven, huge thanks for @p-zander, @pavezzo & others for discussing and implementing new changes and fixes.
New LEN32 too-long-variable-name rule which reports variables with names longer than 40 characters. Allowed length
can be configured with max_len parameter.
Using Robocop with custom formatter will no longer throw an error when importing from inside Python module::
robocop --custom-formatters formatpath.to.my.CustomFormatter --configure CustomFormatter.enabled=True
Robocop should no longer throw AttributeError when using dataclasses in custom rules with Python 3.12.
Fix false positive possible-variable-overwriting on dictionary access
Following code will no longer trigger VAR08 possible-variable-overwriting:
Dictionary item
VAR &{data} = &{EMPTY}
${data}[key] = Browser.Get Text ${LABEL.contentItem('${content}')}
From now on variable type should also be ignored by possible-variable-overwriting and inconsistent-variable-name
rules. For example ${variable} and &{variable} are considered as the same name.
New parameter ignore_templated for too-long-test-case rule
LEN04 too-long-test-case can be now configured with ignore_templated=True if you want to ignore long,
templated test cases.
Thanks @GeoGegl for contribution!
LEN04 too-long-test-case can be now configured with ignore_templated=True if you want to ignore long, templated test cases.
Add missing support for GROUP syntax in formatter. It was already added in old robotidy, but omitted during migration.
Add missing support for GROUP syntax in formatter. It was already added in old robotidy, but omitted during migration.
Add missing support for GROUP syntax in formatter. It was already added in old robotidy, but omitted during migration.
Additional fixes to our rule locations. Following rule(s) have their location adjusted to real location:
Additional fixes to our rule locations. Following rule(s) have their location adjusted to real location:
underscore-in-keyword-name (which used last line in keyword for end column instead of keyword name)arguments-per-line (which was offset by 1)consecutive-empty-lines (which reported start/end column positions in SonarQube report)--check flag functionality was not ported correctly. Now Robocop with --check flag set will only modify files if additional --overwrite flag is set (retaining behaviour before 6.0 release).
Updated fixed tomli version for Python <3.11
From tomli==2.0.2 to 2.2.1.
From tomli==2.0.2 to 2.2.1.
Configurable issue format in extended print_issues report
Robocop 6.0 introduced print_issues format with new output formats (including now default extended).
Old parameter for configuring format of the line was renamed to --issue-format but only affects simple
output format.
As partial solution for it, this release adds issue_format parameter to print_issues report that allows
to change format of the line:
> robocop check -c print_issues.issue_format="{source}
set_variable.robot
|
17 | Set Variables For Dev
| ^^^^^^^^^^^^^^^^^^^^^ DOC01
18 | No Operation
SonarQube issue position fixes (#1400, #1404)
See full release notes at release notes.
There are two major SonarQube versions supported with different report syntax. I have added option to configure used Sonar Qube version (minimal supported) to adjust Robocop report syntax:
robocop check --configure sonarqube.sonar_version=9.9
Allowed values:
10.3 (default)
9.9
There are two major SonarQube versions supported with different report syntax. I have added option to configure used Sonar Qube version (minimal supported) to adjust Robocop report syntax:
robocop check --configure sonarqube.sonar_version=9.9
Allowed values:
10.3 (default)
9.9
SonarQube requires to follow its own set of rules when parsing the issue positions. Some rules need to be additionally handled:
SPC03, SPC04, SPC05, SPC09 rule positions will not have column position anymore
LEN07, LEN08, LEN26, DUP rules will have adjusted end col
Fixed issue where variables with attribute access were incorrectly recognized as assignment sign by NormalizeAssignments formatter:
${variable}[attribute] Save Value To Attribute
This could lead to either removal or duplication of variable attributes.
Added support to most recent version of Robot Framework, which mostly includes updated to existing rules to handle new variable type conversion syntax
Added support to most recent version of Robot Framework, which mostly includes updated to existing rules to handle new variable type conversion syntax.
Typer package requires some dependencies that are not required for Robocop to run. Instead, we will now use typer-slip dependency which offers the same capabilities but with smaller size.
Added support to most recent version of Robot Framework, which mostly includes updated to existing rules to handle new variable type conversion syntax.
Typer package requires some dependencies that are not required for Robocop to run. Instead, we will now use typer-slip dependency which offers the same capabilities but with smaller size.
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
Set Variable ignored by replace-set-variable-with-var rule
Fixes:
See full release notes at release notes.
replace-set-variable-with-var (DEPR05) rule raise issue when Set Variable variant is used instead of VAR syntax. It did not recognize basic Set Variable form though (only other forms, such as Set Local Variable, Set Global Variable..). It should now work properly. Since Set Variable is one of the most often used keywords it may lead to increased amount of issues after upgrading to this version.
When configuring Robocop with invalid language (for example ple instead of pl) Robocop issued decoding error for each file instead of failing when reading the configuration file.
Our documentation also contained configuration examples with non-existing languages, which is now fixed.
Robocop issues decoding error when the Robot Framework fails to read the file. However had different behaviour for the linter and formatter:
linter only displayed simplified message
formatter displayer error message which could be used to pinpoint what's the issue with the file or configuration
Robocop format should now colorize output when displaying differences before and after formatting. --color option should be now respected and will allow to disable colorized output:
--no-color in the command line
or color = false in tool.robocop.format section of the configuration file
Fixed issues with issue positions in SonarQube:
SonarQube doesn't accept identical start and end position. It was usually issue reported for whole file ( for example missing suite documentation). In such cases we are now only reporting startLine
column position was offset by 1 (Robocop use 1 as start position, where SonarQube uses 0)
NormalizeAssignments support for VAR
Formatting changes:
NormalizeAssignments support for VAR (#1382)ReplaceWithVAR matches original assignment character = (#1381)Fixes:
could-be-test-tags and could-be-keyword-tags are not deterministic (#1377)See full release notes at release notes.
NormalizeAssignments formatter now supports VAR. VAR allows to use assignment character in similar fashion as keyword calls. Following code is valid:
VAR ${variable} = value
VAR ${variable}= value
VAR ${variable} value=
NormalizeAssignments can now normalize assignments as it was already possible for keyword calls, configurable with equal_sign_type parameter:
autodetect (default) - use most common assignment character in current file
remove - do not use = character
equal_sign - use =
space_and_equal_sign - use `` =``
ReplaceWithVAR formatter removed assignment chars when converting keywords:
${dict}= Create Dictionary key=value
VAR &{dict} key=value
Assignment character are now preserved. They can be removed / changed using NormalizeAssignments formatter.
Output of TAG5 could-be-test-tags and TAG10 could-be-keyword-tags should be now deterministic and print tags in alphabetical order.
It should be possible to use both variants of options in configuration file - with underscores or with hyphens ( target_version or target-version).
Migrate command will now correctly convert option names that uses hyphens. For example ext-rules will be converted to custom_rules.
Following command:
robocop format
did not overwrite files by default and required --overwrite flag. It was not expected behaviour and is now fixed.
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
Filtering out paths does not work from cli
File inclusion options such as --include, --exclude, --default-include and --default-exclude should
now work from the cli.
File inclusion options such as --include, --exclude, --default-include and --default-exclude should now work from the cli.
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
Enabling reports in configuration does not work
Options common for whole run (such as reports) should be now loaded correctly from the configuration file.
--check should now return correct exit code:
--check is used and there are modified filesOptions common for whole run (such as reports) should be now loaded correctly from the configuration file.
--check should now return correct exit code:
1 if --check is used and there are modified files
0 otherwise
2 on invalid configuration, robocop exceptions
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
File-based reports breaks after 6.0.1 release
Fix for symlink paths affected other areas in Robocop - mostly file-based reports such as Gitlab or SonarQube.
It should no longer fail with ValueError: 'test.robot' is not in the subpath of '/tests' exception.
Fix for symlink affected other areas in Robocop - mostly file-based reports such as Gitlab or SonarQube. It should no longer fail with ValueError: 'test.robot' is not in the subpath of '/tests' exception.
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
return_status report fails with no attribute exception
Fixed:
--reports is not loaded from the configuration file
---configure overwritting configuration fileSee full release notes at release notes.
return_status report should no longer fail with has no exit_code attribute error.
Reports settings was not read correctly from the configuration file. It should now work as expected and reports can be enabled from the configuration file.
--configure can be now used in combination with the configuration file. Following configuration:
> robocop check --configure line-too-long.line_length=140 [tool.robocop.lint] configure = ["too-long-test-case.max_len=60"]
will result in Robocop using both configurations for line-too-long and too-long-test-case rules instead of only using value from cli.
Rule severity can be now configured:
robocop check --configure line-too-long.severity=e
Because of the attribute name clash for severity, configuration for it was ignored before.
Some of the Robocop dependencies used older upper version than 5.8.1 release. I have decided to not limit upper level of dependency with exception of Robot Framework version. Read following article to understand pros and cons of it: https://iscinumpy.dev/post/bound-version-constraints/ . For our users it means more flexibility and better backward compatibility. If the latest version of any of our dependency is breaking, we can always release fix version for it.
Thanks to the whole community for submitting bug reports and feature requests. Without you, Robocop wouldn't be in the place where it is now. All the feedback is essential to drive the tool towards higher quality and better user experience.
If you want to help us more, consider contributing to the project directly. We can offer our constant support to make the work fun and effective. We do our best to create a supportive and welcoming environment for everyone. Feel free to ping us on our official #robocop-linter Slack channel anytime.
Your coding agent can read these notes before it upgrades. Set up the MCP server →