chatup 0.2.3__tar.gz → 0.2.4__tar.gz

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.
Files changed (80) hide show
  1. {chatup-0.2.3/src/chatup.egg-info → chatup-0.2.4}/PKG-INFO +5 -4
  2. {chatup-0.2.3 → chatup-0.2.4}/README.md +4 -3
  3. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/__init__.py +1 -1
  4. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/cli.py +2 -0
  5. chatup-0.2.4/src/chatup/commands/playwright.py +213 -0
  6. chatup-0.2.4/src/chatup/playwright.py +62 -0
  7. chatup-0.2.4/src/chatup/runtime/__init__.py +6 -0
  8. chatup-0.2.4/src/chatup/runtime/playwright.py +444 -0
  9. {chatup-0.2.3 → chatup-0.2.4/src/chatup.egg-info}/PKG-INFO +5 -4
  10. {chatup-0.2.3 → chatup-0.2.4}/src/chatup.egg-info/SOURCES.txt +5 -0
  11. {chatup-0.2.3 → chatup-0.2.4}/tests/test_browser_backend_cli.py +6 -1
  12. {chatup-0.2.3 → chatup-0.2.4}/tests/test_cli_tree_docs.py +2 -0
  13. chatup-0.2.4/tests/test_playwright.py +160 -0
  14. chatup-0.2.4/tests/test_playwright_cli.py +104 -0
  15. {chatup-0.2.3 → chatup-0.2.4}/tests/test_version.py +2 -2
  16. chatup-0.2.3/src/chatup/runtime/__init__.py +0 -5
  17. {chatup-0.2.3 → chatup-0.2.4}/LICENSE +0 -0
  18. {chatup-0.2.3 → chatup-0.2.4}/pyproject.toml +0 -0
  19. {chatup-0.2.3 → chatup-0.2.4}/setup.cfg +0 -0
  20. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/chrome_for_testing.py +0 -0
  21. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/chromedriver.py +0 -0
  22. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/commands/__init__.py +0 -0
  23. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/commands/chrome_for_testing.py +0 -0
  24. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/commands/chromedriver.py +0 -0
  25. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/const.py +0 -0
  26. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/interaction/__init__.py +0 -0
  27. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/interaction/command_schema.py +0 -0
  28. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/interaction/policy.py +0 -0
  29. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/interaction/warnings.py +0 -0
  30. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/runtime/_managed_artifact.py +0 -0
  31. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/runtime/chrome_for_testing.py +0 -0
  32. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/runtime/chromedriver.py +0 -0
  33. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/__init__.py +0 -0
  34. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/assets/hermes/install.sh +0 -0
  35. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/assets/nvm.sh +0 -0
  36. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/cc_connect.py +0 -0
  37. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/claude.py +0 -0
  38. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/cli.py +0 -0
  39. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/codex.py +0 -0
  40. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/crs.py +0 -0
  41. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/docker.py +0 -0
  42. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/elements.py +0 -0
  43. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/frp.py +0 -0
  44. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/gitea.py +0 -0
  45. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/hermes.py +0 -0
  46. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/lark_cli.py +0 -0
  47. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/mode_prompt.py +0 -0
  48. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/mysql.py +0 -0
  49. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/nginx.py +0 -0
  50. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/nodejs.py +0 -0
  51. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/opencode.py +0 -0
  52. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/shell_rc.py +0 -0
  53. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/uv.py +0 -0
  54. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/__init__.py +0 -0
  55. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/cli.py +0 -0
  56. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/core.py +0 -0
  57. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/options.py +0 -0
  58. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/render.py +0 -0
  59. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/en/AGENTS.md +0 -0
  60. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/en/discussion/README.md +0 -0
  61. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/en/projects/README.md +0 -0
  62. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/zh/AGENTS.md +0 -0
  63. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/zh/discussion/README.md +0 -0
  64. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace/templates/default/zh/projects/README.md +0 -0
  65. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/workspace.py +0 -0
  66. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/setup/zsh.py +0 -0
  67. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/utils/__init__.py +0 -0
  68. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/utils/custom_logger.py +0 -0
  69. {chatup-0.2.3 → chatup-0.2.4}/src/chatup/utils/pathing.py +0 -0
  70. {chatup-0.2.3 → chatup-0.2.4}/src/chatup.egg-info/dependency_links.txt +0 -0
  71. {chatup-0.2.3 → chatup-0.2.4}/src/chatup.egg-info/entry_points.txt +0 -0
  72. {chatup-0.2.3 → chatup-0.2.4}/src/chatup.egg-info/requires.txt +0 -0
  73. {chatup-0.2.3 → chatup-0.2.4}/src/chatup.egg-info/top_level.txt +0 -0
  74. {chatup-0.2.3 → chatup-0.2.4}/tests/test_chrome_for_testing.py +0 -0
  75. {chatup-0.2.3 → chatup-0.2.4}/tests/test_chromedriver.py +0 -0
  76. {chatup-0.2.3 → chatup-0.2.4}/tests/test_crs_setup.py +0 -0
  77. {chatup-0.2.3 → chatup-0.2.4}/tests/test_publish_workflow.py +0 -0
  78. {chatup-0.2.3 → chatup-0.2.4}/tests/test_pyproject_metadata.py +0 -0
  79. {chatup-0.2.3 → chatup-0.2.4}/tests/test_setup_cli.py +0 -0
  80. {chatup-0.2.3 → chatup-0.2.4}/tests/test_workspace_setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chatup
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: ChatArch setup CLI extracted from ChatTool
5
5
  Author-email: rexwzh <1073853456@qq.com>
6
6
  License-Expression: MIT
@@ -37,7 +37,7 @@ ChatUp 是 ChatArch 的独立环境与工具安装 CLI。它承接原来 `chatto
37
37
  | 场景 | 文档 |
38
38
  | --- | --- |
39
39
  | 从空机器验证 ChatUp、Python runtime 和 workspace | `docs/quickstart.md` |
40
- | 查看完整一级 CLI 树与 CFT/ChromeDriver 独立 contract | `docs/cli-tree.md` |
40
+ | 阅读完整顶层 CLI 树和独立 CFT/ChromeDriver/Playwright contract | `docs/cli-tree.md` |
41
41
  | 查看命令分组、参数边界和服务默认路径 | `docs/commands.md` |
42
42
  | 校对哪些 ChatArch setup 流程已经有一等命令 | `docs/capability-map.md` |
43
43
  | 理解 `chatup workspace` 创建的目录和项目记录约定 | `docs/workspace.md` |
@@ -50,6 +50,7 @@ chatup --help
50
50
  chatup doctor
51
51
  chatup uv
52
52
  chatup chrome-for-testing install --channel stable -I
53
+ chatup playwright install 1.61.1 -I
53
54
  chatup workspace default ~/Playground
54
55
  ```
55
56
 
@@ -67,12 +68,12 @@ chatup crs --install-dir ~/.chatarch/crs/local --port 12392 --redis-port 6379
67
68
 
68
69
  | 能力组 | 命令 |
69
70
  | --- | --- |
70
- | 基础运行环境 | `doctor`、`uv`、`nodejs`、`docker`、`zsh`、`chrome-for-testing`、`chromedriver`、`frp` |
71
+ | 基础运行环境 | `doctor`、`uv`、`nodejs`、`docker`、`zsh`、`chrome-for-testing`、`chromedriver`、`playwright`、`frp` |
71
72
  | 工作区脚手架 | `workspace` |
72
73
  | 本地服务安装 | `gitea`、`mysql`、`nginx`、`crs` |
73
74
  | Agent 工具链 | `cc-connect`、`claude`、`codex`、`opencode`、`hermes`、`lark-cli` |
74
75
 
75
- 所有新增安装项默认目录都收敛到 `~/.chatarch/...`,例如 `~/.chatarch/chrome-for-testing`、`~/.chatarch/chromedriver`、`~/.chatarch/chattea`、`~/.chatarch/chatdata`、`~/.chatarch/nginx` 和 `~/.chatarch/crs/local`。更完整的能力边界见 `docs/capability-map.md`。
76
+ 所有新增安装项默认目录都收敛到 `~/.chatarch/...`,例如 `~/.chatarch/chrome-for-testing`、`~/.chatarch/chromedriver`、`~/.chatarch/playwright`、`~/.chatarch/chattea`、`~/.chatarch/chatdata`、`~/.chatarch/nginx` 和 `~/.chatarch/crs/local`。更完整的能力边界见 `docs/capability-map.md`。
76
77
 
77
78
  ## 开发
78
79
 
@@ -11,7 +11,7 @@ ChatUp 是 ChatArch 的独立环境与工具安装 CLI。它承接原来 `chatto
11
11
  | 场景 | 文档 |
12
12
  | --- | --- |
13
13
  | 从空机器验证 ChatUp、Python runtime 和 workspace | `docs/quickstart.md` |
14
- | 查看完整一级 CLI 树与 CFT/ChromeDriver 独立 contract | `docs/cli-tree.md` |
14
+ | 阅读完整顶层 CLI 树和独立 CFT/ChromeDriver/Playwright contract | `docs/cli-tree.md` |
15
15
  | 查看命令分组、参数边界和服务默认路径 | `docs/commands.md` |
16
16
  | 校对哪些 ChatArch setup 流程已经有一等命令 | `docs/capability-map.md` |
17
17
  | 理解 `chatup workspace` 创建的目录和项目记录约定 | `docs/workspace.md` |
@@ -24,6 +24,7 @@ chatup --help
24
24
  chatup doctor
25
25
  chatup uv
26
26
  chatup chrome-for-testing install --channel stable -I
27
+ chatup playwright install 1.61.1 -I
27
28
  chatup workspace default ~/Playground
28
29
  ```
29
30
 
@@ -41,12 +42,12 @@ chatup crs --install-dir ~/.chatarch/crs/local --port 12392 --redis-port 6379
41
42
 
42
43
  | 能力组 | 命令 |
43
44
  | --- | --- |
44
- | 基础运行环境 | `doctor`、`uv`、`nodejs`、`docker`、`zsh`、`chrome-for-testing`、`chromedriver`、`frp` |
45
+ | 基础运行环境 | `doctor`、`uv`、`nodejs`、`docker`、`zsh`、`chrome-for-testing`、`chromedriver`、`playwright`、`frp` |
45
46
  | 工作区脚手架 | `workspace` |
46
47
  | 本地服务安装 | `gitea`、`mysql`、`nginx`、`crs` |
47
48
  | Agent 工具链 | `cc-connect`、`claude`、`codex`、`opencode`、`hermes`、`lark-cli` |
48
49
 
49
- 所有新增安装项默认目录都收敛到 `~/.chatarch/...`,例如 `~/.chatarch/chrome-for-testing`、`~/.chatarch/chromedriver`、`~/.chatarch/chattea`、`~/.chatarch/chatdata`、`~/.chatarch/nginx` 和 `~/.chatarch/crs/local`。更完整的能力边界见 `docs/capability-map.md`。
50
+ 所有新增安装项默认目录都收敛到 `~/.chatarch/...`,例如 `~/.chatarch/chrome-for-testing`、`~/.chatarch/chromedriver`、`~/.chatarch/playwright`、`~/.chatarch/chattea`、`~/.chatarch/chatdata`、`~/.chatarch/nginx` 和 `~/.chatarch/crs/local`。更完整的能力边界见 `docs/capability-map.md`。
50
51
 
51
52
  ## 开发
52
53
 
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.2.3"
5
+ __version__ = "0.2.4"
@@ -5,6 +5,7 @@ import click
5
5
  from chatup import __version__
6
6
  from chatup.commands.chrome_for_testing import cli as chrome_for_testing_cli
7
7
  from chatup.commands.chromedriver import cli as chromedriver_cli
8
+ from chatup.commands.playwright import cli as playwright_cli
8
9
  from chatup.setup.cli import register_setup_commands
9
10
 
10
11
 
@@ -23,6 +24,7 @@ def doctor() -> None:
23
24
  register_setup_commands(main)
24
25
  main.add_command(chrome_for_testing_cli)
25
26
  main.add_command(chromedriver_cli)
27
+ main.add_command(playwright_cli)
26
28
 
27
29
 
28
30
  if __name__ == "__main__":
@@ -0,0 +1,213 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import re
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ import click
9
+ from chatstyle import (
10
+ CommandField,
11
+ CommandSchema,
12
+ add_interactive_option,
13
+ resolve_command_inputs,
14
+ )
15
+
16
+ import chatup.playwright as backend
17
+
18
+ OUTPUT_TYPES = ("text", "json")
19
+
20
+
21
+ def _validate_version(value: Any, _values: dict[str, Any]) -> str | None:
22
+ if re.fullmatch(r"\d+\.\d+\.\d+", str(value).strip()):
23
+ return None
24
+ return "Playwright version must contain three numeric components"
25
+
26
+
27
+ VERSION_SCHEMA = CommandSchema(
28
+ name="playwright version",
29
+ fields=(
30
+ CommandField(
31
+ "version",
32
+ prompt="Exact Playwright version",
33
+ required=True,
34
+ normalizer=lambda value: str(value).strip(),
35
+ validator=_validate_version,
36
+ ),
37
+ ),
38
+ )
39
+
40
+
41
+ def _resolve_version(version: str | None, interactive: bool | None, action: str) -> str:
42
+ values = resolve_command_inputs(
43
+ schema=VERSION_SCHEMA,
44
+ provided={"version": version},
45
+ interactive=interactive,
46
+ usage=f"Usage: chatup playwright {action} [VERSION] [-i|-I]",
47
+ )
48
+ return str(values["version"])
49
+
50
+
51
+ def _call(operation):
52
+ try:
53
+ return operation()
54
+ except backend.PlaywrightError as exc:
55
+ raise click.ClickException(str(exc)) from exc
56
+
57
+
58
+ def _emit(payload: dict[str, Any], output: str) -> None:
59
+ if output.lower() == "json":
60
+ click.echo(json.dumps(payload, indent=2, sort_keys=True))
61
+ return
62
+ for key, value in payload.items():
63
+ if value is not None:
64
+ click.echo(f"{key}: {value}")
65
+
66
+
67
+ @click.group(name="playwright")
68
+ def cli() -> None:
69
+ """Manage user-level Playwright browser installations."""
70
+
71
+
72
+ @cli.command(name="install")
73
+ @click.argument("version", required=False)
74
+ @click.option(
75
+ "--browser",
76
+ type=click.Choice(backend.SUPPORTED_BROWSERS, case_sensitive=False),
77
+ default="chromium",
78
+ show_default=True,
79
+ )
80
+ @click.option(
81
+ "--home",
82
+ type=click.Path(path_type=Path, file_okay=False),
83
+ default=backend.DEFAULT_HOME,
84
+ show_default=True,
85
+ )
86
+ @click.option("--force", is_flag=True, help="Atomically replace an existing installation.")
87
+ @click.option(
88
+ "--doctor/--no-doctor",
89
+ default=True,
90
+ show_default=True,
91
+ help="Probe the installed browser version.",
92
+ )
93
+ @click.option(
94
+ "--output",
95
+ type=click.Choice(OUTPUT_TYPES, case_sensitive=False),
96
+ default="text",
97
+ show_default=True,
98
+ )
99
+ @add_interactive_option
100
+ def install_command(
101
+ version: str | None,
102
+ browser: str,
103
+ home: Path,
104
+ force: bool,
105
+ doctor: bool,
106
+ output: str,
107
+ interactive: bool | None,
108
+ ) -> None:
109
+ """Install one exact Playwright package and browser."""
110
+
111
+ exact = _resolve_version(version, interactive, "install")
112
+ installation = _call(
113
+ lambda: backend.install(
114
+ exact,
115
+ browser=browser,
116
+ home=home,
117
+ force=force,
118
+ )
119
+ )
120
+ health = _call(lambda: backend.doctor(installation, execute=doctor))
121
+ _emit(health, output)
122
+ if health["status"] != "ready":
123
+ raise click.ClickException(
124
+ "Playwright installation is unhealthy: " + ", ".join(health["errors"])
125
+ )
126
+
127
+
128
+ @cli.command(name="path")
129
+ @click.argument("version", required=False)
130
+ @click.option(
131
+ "--browser",
132
+ type=click.Choice(backend.SUPPORTED_BROWSERS, case_sensitive=False),
133
+ default="chromium",
134
+ show_default=True,
135
+ )
136
+ @click.option(
137
+ "--home",
138
+ type=click.Path(path_type=Path, file_okay=False),
139
+ default=backend.DEFAULT_HOME,
140
+ show_default=True,
141
+ )
142
+ @click.option(
143
+ "--output",
144
+ type=click.Choice(OUTPUT_TYPES, case_sensitive=False),
145
+ default="text",
146
+ show_default=True,
147
+ )
148
+ @add_interactive_option
149
+ def path_command(
150
+ version: str | None,
151
+ browser: str,
152
+ home: Path,
153
+ output: str,
154
+ interactive: bool | None,
155
+ ) -> None:
156
+ """Print the browser executable path for an installed Playwright version."""
157
+
158
+ exact = _resolve_version(version, interactive, "path")
159
+ installation = _call(
160
+ lambda: backend.resolve(exact, browser=browser, home=home)
161
+ )
162
+ if output.lower() == "json":
163
+ _emit(installation.to_dict(), output)
164
+ else:
165
+ click.echo(installation.binary_path)
166
+
167
+
168
+ @cli.command(name="doctor")
169
+ @click.argument("version", required=False)
170
+ @click.option(
171
+ "--browser",
172
+ type=click.Choice(backend.SUPPORTED_BROWSERS, case_sensitive=False),
173
+ default="chromium",
174
+ show_default=True,
175
+ )
176
+ @click.option(
177
+ "--home",
178
+ type=click.Path(path_type=Path, file_okay=False),
179
+ default=backend.DEFAULT_HOME,
180
+ show_default=True,
181
+ )
182
+ @click.option(
183
+ "--execute/--no-execute",
184
+ default=True,
185
+ show_default=True,
186
+ )
187
+ @click.option(
188
+ "--output",
189
+ type=click.Choice(OUTPUT_TYPES, case_sensitive=False),
190
+ default="text",
191
+ show_default=True,
192
+ )
193
+ @add_interactive_option
194
+ def doctor_command(
195
+ version: str | None,
196
+ browser: str,
197
+ home: Path,
198
+ execute: bool,
199
+ output: str,
200
+ interactive: bool | None,
201
+ ) -> None:
202
+ """Validate one installed Playwright browser."""
203
+
204
+ exact = _resolve_version(version, interactive, "doctor")
205
+ installation = _call(
206
+ lambda: backend.resolve(exact, browser=browser, home=home)
207
+ )
208
+ health = _call(lambda: backend.doctor(installation, execute=execute))
209
+ _emit(health, output)
210
+ if health["status"] != "ready":
211
+ raise click.ClickException(
212
+ "Playwright installation is unhealthy: " + ", ".join(health["errors"])
213
+ )
@@ -0,0 +1,62 @@
1
+ """Public API for ChatArch-managed Playwright browsers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from chatup.runtime.playwright import (
9
+ DEFAULT_PLAYWRIGHT_HOME,
10
+ SUPPORTED_PLAYWRIGHT_BROWSERS,
11
+ PlaywrightBrowserInstallation,
12
+ PlaywrightError,
13
+ doctor_playwright_browser,
14
+ install_playwright_browser,
15
+ resolve_playwright_browser,
16
+ )
17
+
18
+ DEFAULT_HOME = DEFAULT_PLAYWRIGHT_HOME
19
+ SUPPORTED_BROWSERS = SUPPORTED_PLAYWRIGHT_BROWSERS
20
+
21
+
22
+ def install(
23
+ version: str,
24
+ *,
25
+ browser: str = "chromium",
26
+ home: Path | str | None = None,
27
+ force: bool = False,
28
+ ) -> PlaywrightBrowserInstallation:
29
+ return install_playwright_browser(
30
+ version,
31
+ browser=browser,
32
+ home=home,
33
+ force=force,
34
+ )
35
+
36
+
37
+ def resolve(
38
+ version: str,
39
+ *,
40
+ browser: str = "chromium",
41
+ home: Path | str | None = None,
42
+ ) -> PlaywrightBrowserInstallation:
43
+ return resolve_playwright_browser(version, browser=browser, home=home)
44
+
45
+
46
+ def doctor(
47
+ installation: PlaywrightBrowserInstallation,
48
+ *,
49
+ execute: bool = True,
50
+ ) -> dict[str, Any]:
51
+ return doctor_playwright_browser(installation, execute=execute)
52
+
53
+
54
+ __all__ = [
55
+ "DEFAULT_HOME",
56
+ "SUPPORTED_BROWSERS",
57
+ "PlaywrightBrowserInstallation",
58
+ "PlaywrightError",
59
+ "doctor",
60
+ "install",
61
+ "resolve",
62
+ ]
@@ -0,0 +1,6 @@
1
+ """Internal implementations for backend-specific ChatUp artifacts.
2
+
3
+ Public consumers should import :mod:`chatup.chrome_for_testing`,
4
+ :mod:`chatup.chromedriver`, or :mod:`chatup.playwright` instead of this
5
+ internal package.
6
+ """