robotcode 2.7.0__py3-none-any.whl → 2.8.0.dev8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
robotcode/cli/__init__.py CHANGED
@@ -2,11 +2,8 @@ import json
2
2
  import logging
3
3
  import logging.config
4
4
  import os
5
- import shlex
6
- import subprocess
7
- import sys
8
5
  from pathlib import Path
9
- from typing import Any, List, Literal, Optional
6
+ from typing import IO, Any, List, Literal, Optional
10
7
 
11
8
  import click
12
9
 
@@ -20,8 +17,9 @@ from robotcode.plugin import (
20
17
  )
21
18
  from robotcode.plugin._agent_detection import is_running_in_ai_agent
22
19
  from robotcode.plugin.click_helper.aliases import AliasedGroup
20
+ from robotcode.plugin.click_helper.exit_codes import has_robot_exit_codes
23
21
  from robotcode.plugin.click_helper.types import EnumChoice
24
- from robotcode.plugin.click_helper.wrappable import WRAPPER_APPLIED_ENV, is_wrappable
22
+ from robotcode.plugin.click_helper.wrappable import WRAPPER_APPLIED_ENV, invoked_command_is_wrappable, is_wrappable
25
23
  from robotcode.plugin.manager import PluginManager
26
24
 
27
25
  from .__version__ import __version__
@@ -50,101 +48,68 @@ class RobotCodeFormatter(logging.Formatter):
50
48
  super().__init__(*args, defaults=defaults, **kwargs)
51
49
 
52
50
 
53
- def _maybe_reexec_under_wrapper(
54
- ctx: click.Context, app: Application, cli_wrapper: Optional[str] = None, no_wrapper: bool = False
55
- ) -> None:
56
- """Re-execute this process through a configured ``wrapper`` command.
57
-
58
- When a ``wrapper`` is configured - either via ``--wrapper`` on the command
59
- line (``cli_wrapper``) or the selected profile's ``wrapper`` (e.g. to run
60
- the tests inside a specific X11/Wayland session) - and the invoked command
61
- is ``@wrappable`` (i.e. it executes Robot Framework), the process
62
- re-executes itself **once** through that command before Robot Framework
63
- starts. ``--wrapper`` overrides the profile; ``--no-wrapper`` disables
64
- wrapping for this run. The guard env var prevents infinite recursion and
65
- lets an outer layer suppress the re-exec by setting it itself.
51
+ def _warn_about_ignored_wrapper(ctx: click.Context, app: Application) -> None:
52
+ """Warn about a ``--wrapper`` that does not apply.
53
+
54
+ The command itself starts robotcode under the ``wrapper``, once it has loaded its
55
+ configuration (see `robotcode.plugin.click_helper.wrappable.run_under_wrapper`).
66
56
  """
67
- if no_wrapper:
68
- if cli_wrapper:
57
+ if app.config.no_wrapper:
58
+ if app.config.wrapper:
69
59
  app.warning("Ignoring --wrapper because --no-wrapper was given.")
70
60
  return
71
- if os.environ.get(WRAPPER_APPLIED_ENV):
61
+ if not app.config.wrapper or os.environ.get(WRAPPER_APPLIED_ENV) or not ctx.invoked_subcommand:
72
62
  return
63
+ if not invoked_command_is_wrappable(ctx):
64
+ app.warning(f"Ignoring --wrapper: '{ctx.invoked_subcommand}' does not execute Robot Framework.")
73
65
 
74
- sub_name = ctx.invoked_subcommand
75
- if not sub_name:
76
- return
77
- # The command itself opts in via @wrappable; aliases resolve to the same
78
- # command object, so this is alias-safe and needs no central name list.
79
- sub_cmd = ctx.command.get_command(ctx, sub_name) if isinstance(ctx.command, click.Group) else None
80
- if sub_cmd is None or not is_wrappable(sub_cmd):
81
- if cli_wrapper:
82
- app.warning(f"Ignoring --wrapper: '{sub_name}' does not execute Robot Framework.")
83
- return
84
66
 
85
- from robotcode.robot.config.loader import load_robot_config_from_path
86
- from robotcode.robot.config.utils import get_config_files
67
+ class RobotDataError(click.ClickException):
68
+ """An error robotcode reports itself for a command that passes on Robot Framework's
69
+ exit codes.
87
70
 
88
- profile_wrapper = None
89
- try:
90
- config_files, _, _ = get_config_files(
91
- config_files=app.config.config_files,
92
- root_folder=app.config.root,
93
- no_vcs=app.config.no_vcs,
94
- verbose_callback=app.verbose,
95
- )
96
- # `evaluated_with_env` also applies the profile's `env` to `os.environ`,
97
- # so the wrapper command can rely on it.
98
- profile = (
99
- load_robot_config_from_path(*config_files, verbose_callback=app.verbose)
100
- .combine_profiles(*(app.config.profiles or []), verbose_callback=app.verbose, error_callback=app.error)
101
- .evaluated_with_env(verbose_callback=app.verbose, error_callback=app.error)
102
- )
103
- profile_wrapper = profile.wrapper
104
- except Exception as e:
105
- # Don't fail early on config problems here; the actual command loads the
106
- # config again and reports errors properly. An explicit --wrapper is
107
- # still honored below.
108
- message = str(e)
109
- app.verbose(lambda: f"Skipping profile wrapper detection: {message}")
110
-
111
- # `--wrapper` overrides the profile's `wrapper`. The evaluated profile turns
112
- # StringExpression entries into plain strings.
113
- if cli_wrapper:
114
- wrapper = shlex.split(cli_wrapper)
115
- elif profile_wrapper:
116
- wrapper = [str(w) for w in profile_wrapper]
117
- else:
118
- return
71
+ Shows the original error unchanged, but exits with Robot Framework's code for invalid
72
+ data or command line options instead of Click's 1 or 2.
73
+ """
74
+
75
+ exit_code = 252
76
+
77
+ def __init__(self, error: click.ClickException) -> None:
78
+ super().__init__(error.message)
79
+ self.error = error
80
+
81
+ def show(self, file: Optional[IO[Any]] = None) -> None:
82
+ self.error.show(file)
83
+
84
+
85
+ class RobotCodeGroup(AliasedGroup):
86
+ """The root command group.
87
+
88
+ Commands that run Robot Framework (`wrappable`) or pass on the exit code of a Robot
89
+ Framework tool (`robot_exit_codes`) answer with its exit codes, where 1-250 counts the
90
+ failed tests. An error robotcode reports itself for such a command - a Click error with
91
+ exit code 1 or 2, such as a broken configuration, a wrapper that doesn't start or an
92
+ invalid option - exits with Robot Framework's 252 instead. Robot Framework's own exit
93
+ codes never arrive as Click errors, so they pass through unchanged, and so does any
94
+ other code.
95
+ """
96
+
97
+ def invoke(self, ctx: click.Context) -> Any:
98
+ try:
99
+ return super().invoke(ctx)
100
+ except click.ClickException as e:
101
+ if e.exit_code in (1, 2) and self._passes_on_robot_exit_codes(ctx):
102
+ raise RobotDataError(e) from e
103
+ raise
119
104
 
120
- # Rebuild the invocation the way this process was actually started, so the
121
- # re-exec finds robotcode even when it runs from a bundled path (VS Code) and
122
- # is not installed in the interpreter. `launcher_script` is set only when we
123
- # were started through a bundled entry (its `__main__` sets it) or an explicit
124
- # `--launcher-script`; otherwise robotcode is importable directly and
125
- # `-m robotcode.cli` is correct. We deliberately do NOT consult the
126
- # ROBOTCODE_BUNDLED_ROBOTCODE_MAIN env var: VS Code sets it in every terminal,
127
- # so a directly started robotcode would be diverted to the bundled copy.
128
- # Mirrors the debug launcher's `debugger_script` handling.
129
- entry = [str(app.config.launcher_script)] if app.config.launcher_script else ["-m", "robotcode.cli"]
130
- command = [*wrapper, sys.executable, *entry, *sys.argv[1:]]
131
- app.verbose(lambda: "Running under wrapper: " + " ".join(command))
132
-
133
- # Run robotcode again under the wrapper; the guard env stops the spawned
134
- # robotcode from wrapping a second time. On POSIX we replace this process with
135
- # execvp (no extra process); Windows has no such exec, so there we spawn the
136
- # command, wait, and forward its exit code.
137
- os.environ[WRAPPER_APPLIED_ENV] = "1"
138
- try:
139
- if sys.platform == "win32":
140
- sys.exit(subprocess.run(command).returncode)
141
- os.execvp(command[0], command)
142
- except OSError as e:
143
- raise click.ClickException(f"Failed to execute wrapper command {wrapper!r}: {e}") from e
105
+ def _passes_on_robot_exit_codes(self, ctx: click.Context) -> bool:
106
+ name = ctx.invoked_subcommand
107
+ cmd = self.get_command(ctx, name) if name else None
108
+ return cmd is not None and (is_wrappable(cmd) or has_robot_exit_codes(cmd))
144
109
 
145
110
 
146
111
  @click.group(
147
- cls=AliasedGroup,
112
+ cls=RobotCodeGroup,
148
113
  context_settings={"auto_envvar_prefix": "ROBOTCODE"},
149
114
  invoke_without_command=False,
150
115
  )
@@ -205,8 +170,9 @@ def _maybe_reexec_under_wrapper(
205
170
  "color",
206
171
  default=None,
207
172
  help=(
208
- "Force or disable colored output. Default (no flag): auto-detect — colors only when stdout is a TTY,"
209
- " disabled if `NO_COLOR` is set, forced if `FORCE_COLOR` is set."
173
+ "Enable or disable colored output. Color codes are written only to a terminal; set `FORCE_COLOR` to get"
174
+ " them in a pipe. Default (no flag): auto-detect — colors only when stdout is a TTY, disabled if `NO_COLOR`"
175
+ " is set, forced if `FORCE_COLOR` is set."
210
176
  ),
211
177
  show_envvar=True,
212
178
  )
@@ -215,7 +181,8 @@ def _maybe_reexec_under_wrapper(
215
181
  "pager",
216
182
  default=None,
217
183
  help=(
218
- "Force or disable the pager. Default (no flag): auto-page when the rendered output exceeds the terminal height."
184
+ "Force or disable the pager on a terminal; no pager starts when stdout isn't a TTY. Default (no flag):"
185
+ " auto-page when the rendered output exceeds the terminal height."
219
186
  ),
220
187
  show_envvar=True,
221
188
  )
@@ -409,8 +376,10 @@ def robotcode(
409
376
  app.config.log_enabled = log
410
377
  app.config.log_level = log_level
411
378
  app.config.log_calls = log_calls
379
+ app.config.wrapper = wrapper
380
+ app.config.no_wrapper = no_wrapper
412
381
 
413
- _maybe_reexec_under_wrapper(ctx, app, wrapper, no_wrapper)
382
+ _warn_about_ignored_wrapper(ctx, app)
414
383
 
415
384
  if log_config:
416
385
  if log_calls:
@@ -1 +1 @@
1
- __version__ = "2.7.0"
1
+ __version__ = "2.8.0-dev.8"
@@ -13,6 +13,7 @@ from robotcode.robot.config.loader import (
13
13
  DiscoverdBy,
14
14
  load_robot_config_from_path,
15
15
  )
16
+ from robotcode.robot.config.model import UnknownProfile
16
17
  from robotcode.robot.config.utils import get_config_files
17
18
 
18
19
 
@@ -85,8 +86,20 @@ def list(app: Application, paths: List[Path], show_hidden: bool = False, sort_by
85
86
 
86
87
  config = load_robot_config_from_path(*config_files, verbose_callback=app.verbose)
87
88
 
89
+ # the editors fill their profile lists with this command, also when their selection names a profile that is
90
+ # gone, so a name that selects no profile is only reported, and those of the selection are listed for them
91
+ unknown_selected: List[str] = []
92
+
93
+ def report_unknown(unknown: UnknownProfile) -> None:
94
+ app.error(unknown.message)
95
+ if unknown.selected:
96
+ unknown_selected.append(unknown.name)
97
+
88
98
  _, selected_profiles, enabled_names = config.combine_profiles_ex(
89
- *(app.config.profiles or []), verbose_callback=app.verbose, error_callback=app.error
99
+ *(app.config.profiles or []),
100
+ verbose_callback=app.verbose,
101
+ error_callback=app.error,
102
+ unknown_profile_callback=report_unknown,
90
103
  )
91
104
 
92
105
  selected_names = [k for k in selected_profiles.keys()]
@@ -121,6 +134,8 @@ def list(app: Application, paths: List[Path], show_hidden: bool = False, sort_by
121
134
  messages += ["No profiles defined."]
122
135
  if messages:
123
136
  result["messages"] = messages
137
+ if unknown_selected:
138
+ result["unknownSelected"] = unknown_selected
124
139
 
125
140
  if app.config.output_format is None or app.config.output_format == OutputFormat.TEXT:
126
141
  for v in result["profiles"]:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: robotcode
3
- Version: 2.7.0
3
+ Version: 2.8.0-dev.8
4
4
  Summary: Command line interface for RobotCode
5
5
  Project-URL: Homepage, https://robotcode.io
6
6
  Project-URL: Donate, https://opencollective.com/robotcode
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Classifier: Programming Language :: Python :: 3.13
25
25
  Classifier: Programming Language :: Python :: 3.14
26
+ Classifier: Programming Language :: Python :: 3.15
26
27
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
28
  Classifier: Topic :: Software Development :: Debuggers
28
29
  Classifier: Topic :: Software Development :: Quality Assurance
@@ -33,35 +34,35 @@ Classifier: Topic :: Text Editors :: Integrated Development Environments (IDE)
33
34
  Classifier: Topic :: Utilities
34
35
  Classifier: Typing :: Typed
35
36
  Requires-Python: >=3.10
36
- Requires-Dist: robotcode-core==2.7.0
37
- Requires-Dist: robotcode-plugin==2.7.0
38
- Requires-Dist: robotcode-robot==2.7.0
37
+ Requires-Dist: robotcode-core==2.8.0-dev.8
38
+ Requires-Dist: robotcode-plugin==2.8.0-dev.8
39
+ Requires-Dist: robotcode-robot==2.8.0-dev.8
39
40
  Provides-Extra: all
40
41
  Requires-Dist: docutils; extra == 'all'
41
42
  Requires-Dist: pyyaml>=5.4; extra == 'all'
42
- Requires-Dist: robotcode-analyze==2.7.0; extra == 'all'
43
- Requires-Dist: robotcode-debugger==2.7.0; extra == 'all'
44
- Requires-Dist: robotcode-language-server==2.7.0; extra == 'all'
45
- Requires-Dist: robotcode-repl-server==2.7.0; extra == 'all'
46
- Requires-Dist: robotcode-repl==2.7.0; extra == 'all'
47
- Requires-Dist: robotcode-runner==2.7.0; extra == 'all'
43
+ Requires-Dist: robotcode-analyze==2.8.0-dev.8; extra == 'all'
44
+ Requires-Dist: robotcode-debugger==2.8.0-dev.8; extra == 'all'
45
+ Requires-Dist: robotcode-language-server==2.8.0-dev.8; extra == 'all'
46
+ Requires-Dist: robotcode-repl-server==2.8.0-dev.8; extra == 'all'
47
+ Requires-Dist: robotcode-repl==2.8.0-dev.8; extra == 'all'
48
+ Requires-Dist: robotcode-runner==2.8.0-dev.8; extra == 'all'
48
49
  Requires-Dist: robotframework-robocop>=6.0.0; extra == 'all'
49
50
  Provides-Extra: analyze
50
- Requires-Dist: robotcode-analyze==2.7.0; extra == 'analyze'
51
+ Requires-Dist: robotcode-analyze==2.8.0-dev.8; extra == 'analyze'
51
52
  Provides-Extra: debugger
52
- Requires-Dist: robotcode-debugger==2.7.0; extra == 'debugger'
53
+ Requires-Dist: robotcode-debugger==2.8.0-dev.8; extra == 'debugger'
53
54
  Provides-Extra: languageserver
54
- Requires-Dist: robotcode-language-server==2.7.0; extra == 'languageserver'
55
+ Requires-Dist: robotcode-language-server==2.8.0-dev.8; extra == 'languageserver'
55
56
  Provides-Extra: lint
56
57
  Requires-Dist: robotframework-robocop>=2.0.0; extra == 'lint'
57
58
  Provides-Extra: repl
58
- Requires-Dist: robotcode-repl==2.7.0; extra == 'repl'
59
+ Requires-Dist: robotcode-repl==2.8.0-dev.8; extra == 'repl'
59
60
  Provides-Extra: replserver
60
- Requires-Dist: robotcode-repl-server==2.7.0; extra == 'replserver'
61
+ Requires-Dist: robotcode-repl-server==2.8.0-dev.8; extra == 'replserver'
61
62
  Provides-Extra: rest
62
63
  Requires-Dist: docutils; extra == 'rest'
63
64
  Provides-Extra: runner
64
- Requires-Dist: robotcode-runner==2.7.0; extra == 'runner'
65
+ Requires-Dist: robotcode-runner==2.8.0-dev.8; extra == 'runner'
65
66
  Provides-Extra: yaml
66
67
  Requires-Dist: pyyaml>=5.4; extra == 'yaml'
67
68
  Description-Content-Type: text/markdown
@@ -69,7 +70,7 @@ Description-Content-Type: text/markdown
69
70
  # RobotCode - The Ultimate Robot Framework Toolset
70
71
 
71
72
  [![License](https://img.shields.io/github/license/robotcodedev/robotcode?style=flat&logo=apache)](https://github.com/robotcodedev/robotcode/blob/main/LICENSE)
72
- [![Build Status](https://img.shields.io/github/actions/workflow/status/robotcodedev/robotcode/build-test-package-publish.yml?branch=main&style=flat&logo=github)](https://github.com/robotcodedev/robotcode/actions?query=workflow:build_test_package_publish)
73
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/robotcodedev/robotcode/build-test-package.yml?branch=main&style=flat&logo=github)](https://github.com/robotcodedev/robotcode/actions/workflows/build-test-package.yml)
73
74
  [![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/d-biehl.robotcode?style=flat&label=VS%20Marketplace&logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode)
74
75
  [![Installs](https://img.shields.io/visual-studio-marketplace/i/d-biehl.robotcode?style=flat)](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode)
75
76
  [![JetBrains Marketplace](https://img.shields.io/jetbrains/plugin/v/26216.svg)](https://plugins.jetbrains.com/plugin/26216)
@@ -131,9 +132,22 @@ For the complete feature reference, see the [official documentation](https://rob
131
132
  - Python 3.10 or newer
132
133
  - Robot Framework 5.0 or newer
133
134
 
135
+ **Supported combinations:** each Robot Framework version is supported with the Python versions that it officially supports itself:
136
+
137
+ | Robot Framework | Python |
138
+ |---|---|
139
+ | 5.0 | 3.10 |
140
+ | 6.0 | 3.10 – 3.11 |
141
+ | 6.1, 7.0 | 3.10 – 3.12 |
142
+ | 7.1, 7.2 | 3.10 – 3.13 |
143
+ | 7.3, 7.4 | 3.10 – 3.14 |
144
+ | 7.5 | 3.10 – 3.15 |
145
+
146
+ RobotCode's CI tests only these combinations, to keep the effort low. Other combinations may work, but using them is your own responsibility. For example, Robot Framework versions before 7.5 may not work with Python 3.15.
147
+
134
148
  **Editor / IDE — any LSP-capable editor works.** For the dedicated extensions you need one of:
135
- - Visual Studio Code 1.108.0 or newer
136
- - PyCharm / IntelliJ IDEA 2025.3 or newer
149
+ - Visual Studio Code 1.127.0 or newer
150
+ - PyCharm / IntelliJ IDEA 2026.1 or newer
137
151
 
138
152
  Other editors (Neovim, Sublime Text, Helix, Emacs, …) connect to the language server via the `languageserver` extra from PyPI — see [Command Line and Other Editors](#command-line-and-other-editors) below.
139
153
 
@@ -143,7 +157,7 @@ Other editors (Neovim, Sublime Text, Helix, Emacs, …) connect to the language
143
157
  ### Visual Studio Code
144
158
 
145
159
  1. **Install the RobotCode Extension** from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode).
146
- 2. **Continue with the [Getting Started Guide](https://robotcode.io/02_get_started/)** for setup, your first `robot.toml`, and running your first test.
160
+ 2. **Continue with the [Getting Started Guide](https://robotcode.io/getting-started/)** for setup, your first `robot.toml`, and running your first test.
147
161
 
148
162
  **Extensions:**
149
163
  RobotCode declares dependencies on the [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) and [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) extensions so VS Code installs them when required. Additional extensions may be needed depending on your project.
@@ -157,7 +171,7 @@ RobotCode declares dependencies on the [Python](https://marketplace.visualstudio
157
171
  - **[JetBrains Marketplace](https://plugins.jetbrains.com/plugin/26216):** click <kbd>Install to ...</kbd> if your IDE is running.
158
172
  - **Manual:** download the [latest release](https://github.com/robotcodedev/robotcode/releases/latest) and use <kbd>Settings/Preferences</kbd> > <kbd>Plugins</kbd> > <kbd>⚙️</kbd> > <kbd>Install plugin from disk...</kbd>.
159
173
 
160
- 2. **Continue with the [Getting Started Guide](https://robotcode.io/02_get_started/)** for setup, your first `robot.toml`, and running your first test.
174
+ 2. **Continue with the [Getting Started Guide](https://robotcode.io/getting-started/)** for setup, your first `robot.toml`, and running your first test.
161
175
 
162
176
  **Plugins:**
163
177
  RobotCode declares a dependency on [LSP4IJ](https://plugins.jetbrains.com/plugin/23257) so your IDE installs it automatically. Additional plugins may be required depending on your project needs.
@@ -168,10 +182,10 @@ RobotCode declares a dependency on [LSP4IJ](https://plugins.jetbrains.com/plugin
168
182
  For CI pipelines, the command line, or LSP-compatible editors like Neovim, Sublime Text, or Helix, install RobotCode from PyPI. The base `robotcode` package is only the CLI core; the actual commands live in extras such as `runner`, `analyze`, `debugger`, `languageserver`, and `repl`:
169
183
 
170
184
  ```bash
171
- pip install robotcode[runner,analyze]
185
+ pip install "robotcode[runner,analyze]"
172
186
  ```
173
187
 
174
- Pick the extras that match your use case — see the [CLI reference](https://robotcode.io/03_reference/cli) for the available packages and how to install them.
188
+ Pick the extras that match your use case — see the [CLI reference](https://robotcode.io/reference/cli/) for the available packages and how to install them.
175
189
 
176
190
 
177
191
  ## Documentation
@@ -179,10 +193,10 @@ Pick the extras that match your use case — see the [CLI reference](https://rob
179
193
  For detailed instructions, visit our **[official documentation](https://robotcode.io)**. Additional resources:
180
194
 
181
195
  - **[Q&A](https://github.com/robotcodedev/robotcode/discussions/categories/q-a):** Answers to common questions about RobotCode.
182
- - **[Tips & Tricks](https://robotcode.io/04_tip_and_tricks/):** Common pitfalls, editor customization, and setup recipes.
183
- - **[Command Line Tools Reference](https://robotcode.io/03_reference/cli):** Comprehensive documentation on using RobotCode's CLI tools.
196
+ - **[Guides](https://robotcode.io/guides/):** How to use RobotCode's commands and set up projects, plus common pitfalls and editor customization.
197
+ - **[Command Line Tools Reference](https://robotcode.io/reference/cli/):** Comprehensive documentation on using RobotCode's CLI tools.
184
198
  - **[Changelog](https://github.com/robotcodedev/robotcode/blob/main/CHANGELOG.md):** Track changes, updates, and new features in each release.
185
- - **[Support & Contribute](https://robotcode.io/05_contributing/):** Ways to back the project — financial, code, feedback.
199
+ - **[Support & Contribute](https://robotcode.io/contributing/):** Ways to back the project — financial, code, feedback.
186
200
 
187
201
 
188
202
  ## Sponsor RobotCode
@@ -206,6 +220,7 @@ You don't need to sponsor to help. Every contribution — feedback, code, advoca
206
220
  - Leave a review on the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=d-biehl.robotcode) and [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/26216)
207
221
  - Ask questions & help others on [Slack #robotcode](https://slack.robotframework.org/), the [Forum](https://forum.robotframework.org), or [Discussions](https://github.com/robotcodedev/robotcode/discussions)
208
222
  - Report bugs in the [issue tracker](https://github.com/robotcodedev/robotcode/issues)
223
+ - Try the [dev builds](https://robotcode.io/getting-started/dev-builds/) and report what you find
209
224
  - Suggest enhancements or features (issues or [Discussions](https://github.com/robotcodedev/robotcode/discussions))
210
225
  - Share usage patterns & integration ideas in [Discussions](https://github.com/robotcodedev/robotcode/discussions)
211
226
  - Improve tests (edge cases, large suites, multi-root, versions)
@@ -0,0 +1,12 @@
1
+ robotcode/cli/__init__.py,sha256=7xeHiGyGZBYp5Gyx8t6VUVf0oZEuCMc0p_OL7Eag8tw,13766
2
+ robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
3
+ robotcode/cli/__version__.py,sha256=JvoVcYcO_7K_aZkOPOeHH31iT5EQpvrGTx1sNBjoeYU,28
4
+ robotcode/cli/py.typed,sha256=bWew9mHgMy8LqMu7RuqQXFXLBxh2CRx0dUbSx-3wE48,27
5
+ robotcode/cli/commands/__init__.py,sha256=XJHRt_YwMO2Ni2EfL2aj4jkJXMVG6NGFTpzvSVgIRnQ,92
6
+ robotcode/cli/commands/config.py,sha256=0Jmf7HDIo7IIaOMU9M_bYi7PdHAfcae6x3SW93NA3EA,10481
7
+ robotcode/cli/commands/profiles.py,sha256=tZ8K5KoPkbol4PwTyR3Qleb09CjvrFJaQVbY36MGVGE,6808
8
+ robotcode-2.8.0.dev8.dist-info/METADATA,sha256=YqDfJJVYdXslD1u-V6sAkcfXJCeDGqD70qQoRzZ_geA,15376
9
+ robotcode-2.8.0.dev8.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
10
+ robotcode-2.8.0.dev8.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
11
+ robotcode-2.8.0.dev8.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
12
+ robotcode-2.8.0.dev8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.31.0
2
+ Generator: hatchling 1.32.4
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,12 +0,0 @@
1
- robotcode/cli/__init__.py,sha256=qvIUqcHP8K1FNyu3whFDe6M_Wyeo_SKCqwBxtPeQfy0,15608
2
- robotcode/cli/__main__.py,sha256=hX3nwROMTnsYGT1KS0rXUYrslu9sFzctYdAh66Rcckw,153
3
- robotcode/cli/__version__.py,sha256=EtKWW0Hnl5oWglRNH0HZigvcDT2FEs58ek8buJdwW1E,22
4
- robotcode/cli/py.typed,sha256=bWew9mHgMy8LqMu7RuqQXFXLBxh2CRx0dUbSx-3wE48,27
5
- robotcode/cli/commands/__init__.py,sha256=XJHRt_YwMO2Ni2EfL2aj4jkJXMVG6NGFTpzvSVgIRnQ,92
6
- robotcode/cli/commands/config.py,sha256=0Jmf7HDIo7IIaOMU9M_bYi7PdHAfcae6x3SW93NA3EA,10481
7
- robotcode/cli/commands/profiles.py,sha256=5H9lvSVCMggWXf0IH54QtgDgqupEEvpcUrEsTZvZsNM,6127
8
- robotcode-2.7.0.dist-info/METADATA,sha256=nJWf0wXHOE5LlTfA-cTYK3NsBzv6tGYnOfKj8XZSt9M,14582
9
- robotcode-2.7.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
10
- robotcode-2.7.0.dist-info/entry_points.txt,sha256=Pb4DKVVdJb5PboVl48njwk3DkKQHBJOL1A8KkpemqA8,58
11
- robotcode-2.7.0.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
12
- robotcode-2.7.0.dist-info/RECORD,,