Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
{
"name": "webwright",
"name": "cuawright",
"owner": {
"name": "Microsoft Research",
"url": "https://github.com/microsoft/Webwright"
},
"plugins": [
{
"name": "webwright",
"name": "cuawright",
"source": {
"source": "github",
"repo": "microsoft/Webwright"
},
"description": "Turn your coding agent into a SOTA browser agent. Drives a local Playwright workspace via one bash command at a time, saving screenshots and an action log into final_runs/run_<id>/, and visually self-verifies the result.",
"version": "0.1.0",
"description": "CUAWright browser automation skill; desktop runtime available through cuawright-desktop.",
"version": "0.2.0",
"category": "automation",
"keywords": ["browser", "playwright", "web-agent", "automation", "rpa"]
"keywords": [
"browser",
"playwright",
"web-agent",
"automation",
"rpa"
]
}
]
}
16 changes: 11 additions & 5 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
{
"name": "webwright",
"version": "0.1.0",
"description": "Turn your coding agent into a SOTA browser agent. Drives a local Playwright workspace via one bash command at a time, saving screenshots and an action log into final_runs/run_<id>/, and visually self-verifies the result.",
"name": "cuawright",
"version": "0.2.0",
"description": "CUAWright browser automation skill. The Python package also includes OSWorld desktop support through cuawright-desktop.",
"author": {
"name": "Microsoft Research",
"url": "https://github.com/microsoft/Webwright"
},
"homepage": "https://github.com/microsoft/Webwright",
"repository": "https://github.com/microsoft/Webwright",
"license": "MIT",
"keywords": ["browser", "playwright", "web-agent", "automation", "rpa"],
"commands": "./skills/webwright/commands",
"keywords": [
"browser",
"playwright",
"web-agent",
"automation",
"rpa"
],
"commands": "./skills/cuawright-web/commands",
"skills": "./skills"
}
23 changes: 16 additions & 7 deletions .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
{
"name": "webwright",
"version": "0.1.0",
"description": "Turn your coding agent into a SOTA browser agent. Drives a local Playwright workspace via one bash command at a time, saving screenshots and an action log into final_runs/run_<id>/, and visually self-verifies the result.",
"name": "cuawright",
"version": "0.2.0",
"description": "CUAWright browser automation skill. The Python package also includes OSWorld desktop support through cuawright-desktop.",
"author": {
"name": "Microsoft Research",
"url": "https://github.com/microsoft/Webwright"
},
"homepage": "https://github.com/microsoft/Webwright",
"repository": "https://github.com/microsoft/Webwright",
"license": "MIT",
"keywords": ["browser", "playwright", "web-agent", "automation", "rpa"],
"keywords": [
"browser",
"playwright",
"web-agent",
"automation",
"rpa"
],
"skills": "./skills/",
"interface": {
"displayName": "Webwright",
"shortDescription": "SOTA browser agent driven by your coding agent",
"displayName": "CUAWright",
"shortDescription": "Browser automation with CUAWright",
"longDescription": "Drives a local Playwright workspace via one bash command at a time, saving screenshots and an action log into final_runs/run_<id>/, and visually self-verifies the result.",
"developerName": "Microsoft Research",
"category": "Productivity",
"capabilities": ["Read", "Write"],
"capabilities": [
"Read",
"Write"
],
"websiteURL": "https://github.com/microsoft/Webwright"
}
}
20 changes: 20 additions & 0 deletions .github/workflows/runtime-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: runtime-tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -e ".[desktop,skill-factory,test,build]" -e extensions/skill-factory
- run: playwright install --with-deps chromium
- run: pytest -q
- run: python -m compileall -q src extensions/skill-factory/src
- run: git diff --check
- run: python -m build
- run: python -m build extensions/skill-factory
- run: python tests/packaging/check_wheels.py dist/cuawright-*.whl extensions/skill-factory/dist/*.whl
14 changes: 5 additions & 9 deletions .github/workflows/skills-tests.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
name: skills-tests
on:
push:
paths: ["src/webwright/skill_factory/**", "src/webwright/tools/skill_use.py", "tests/skill_factory/**"]
paths: ["extensions/skill-factory/**", "tests/skill_factory/**", "pyproject.toml"]
pull_request:
paths: ["src/webwright/skill_factory/**", "src/webwright/tools/skill_use.py", "tests/skill_factory/**"]
paths: ["extensions/skill-factory/**", "tests/skill_factory/**", "pyproject.toml"]
jobs:
unit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12" }
- run: pip install httpx pyyaml jinja2 pydantic
- run: pip install -e ".[skill-factory,test]" -e extensions/skill-factory
- name: skills unit tests (LLM-free)
run: |
set -e
for t in tests/skill_factory/test_*.py; do
echo "== $t"; PYTHONPATH=src python "$t"
done
run: python -m pytest -q tests/skill_factory
- name: wrapper usage check (F6)
run: |
set +e
bash src/webwright/skill_factory/examples/solve_with_library.sh > /dev/null 2>&1
bash extensions/skill-factory/src/cuawright/webwright/skill_factory/examples/solve_with_library.sh > /dev/null 2>&1
[ $? -eq 1 ] && echo "usage-exit OK" || { echo "wrapper must exit 1 on missing args"; exit 1; }
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,10 @@ outputs/
venv/
runs/
/library/

build/
dist/
release/osworld/.scratch/
release/osworld/dist/

.wheel-env/
36 changes: 36 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Working in CUAWright

Use Python 3.12 for desktop work. Install with:

```bash
pip install -e ".[desktop,skill-factory,test,build]" -e extensions/skill-factory
playwright install chromium
```

Keep the browser and desktop runtimes separate:

- `src/cuawright/webwright/` owns browser messages, tools, compaction, and completion.
- `src/cuawright/desktop/` owns the OSWorld VM, guest bridge, explicit submit, and evaluation.
- `src/cuawright/core/` holds shared API helpers. Add code here only when both runtimes use it.

Do not introduce a universal agent/model/environment abstraction or duplicate the
browser runtime under another package. Preserve `webwright` compatibility aliases.
Keep provider-specific private integrations outside this repository. Never save
credentials or custom endpoint URLs in run artifacts, examples, or diagnostics.

Before changing desktop prompts, read `src/cuawright/desktop/config/prompts.py` in
full. Plain final text never completes a desktop task; the Actor must execute the
standalone command `python /opt/cuawright-tools/submit.py`. Official reproduction
must retain the pinned release, task setup, evaluator, provenance, and score.

Validate focused changes first, then run:

```bash
pytest -q
python -m build
python -m build extensions/skill-factory
python tests/packaging/check_wheels.py dist/cuawright-*.whl extensions/skill-factory/dist/*.whl
```

Keep net changes within 900 production Python lines and 600 test lines. No newly
added production file should exceed 300 lines.
5 changes: 5 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CUAWright includes the Webwright browser runtime (MIT; see LICENSE) and
the CUAWright OSWorld release runtime imported from commit
47984a49 of the standalone CUAWright OSWorld release.
The imported desktop runtime is licensed under Apache-2.0; see
licenses/OSWorld-runtime-APACHE-2.0.txt.
Loading
Loading