Skip to content
Open
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
28 changes: 28 additions & 0 deletions .github/workflows/skills-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: skills-tests
on:
push:
paths: ["src/webwright/skill_factory/**", "src/webwright/tools/skill_use.py", "tests/skill_factory/**"]
pull_request:
paths: ["src/webwright/skill_factory/**", "src/webwright/tools/skill_use.py", "tests/skill_factory/**"]
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
- 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
- name: wrapper usage check (F6)
run: |
set +e
bash src/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; }
bash -n src/webwright/skill_factory/examples/quickstart.sh || exit 1
bash src/webwright/skill_factory/examples/quickstart.sh badmode > /dev/null 2>&1
[ $? -eq 1 ] && echo "quickstart usage-exit OK" || { echo "quickstart must exit 1 on bad mode"; exit 1; }
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,25 @@ python assets/task_showcase/app.py \

---

## 🧠 Skill Library (reuse solved tasks across tasks)

[`webwright.skills`](src/webwright/skills/) turns solved tasks into **reusable, executable code
skills**, retrieves and judges them at solve time, gates what enters the library, and grows the
library incrementally — a self-evolving *store → retrieve → use/adapt → gate → evolve* loop on top
of Webwright's code-as-action solves. Plugs in with **no change to the agent loop**:

- **Reuse** — the agent calls `python -m webwright.tools.skill_use --task "..." --library ...`
(like `self_reflection`/`image_qa`); it returns `{verdict: use|adapt|skip, source_path}`.
- **Grow** — `python -m webwright.skills.update --manifest batch.json --library ./library`
distills a batch of gate-passed solves into a parameterized, primitive-decomposed skill.

Validated end-to-end on a real public website (read-only GitHub): solve two repos from scratch →
`update` builds a parameterized skill → a held-out repo is solved by reusing it (agent calls
`skill_use`, verdict `use`, answer correct); a wrong solve is kept out by the gate; a second batch
improves the existing skill in place. See [`src/webwright/skills/README.md`](src/webwright/skills/README.md).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update src/webwright/skills/README.md


---

## 🚀 Quick Start

### Prerequisites
Expand Down
Binary file added assets/skill_factory_demo.mp4
Binary file not shown.
Binary file added assets/skill_factory_pipeline.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
173 changes: 173 additions & 0 deletions assets/skill_factory_pipeline.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading