pywry-orientation
When to reach for PyWry MCP tools (native webview rendering, Plotly, TradingView, AgGrid, chat) instead of writing…
Autonomous PyWry application building using LLM sampling, elicitation, and progress reporting.
Claude Code
$ npx -y skills add deeleeramone/PyWry --skill autonomous_building --agent claude-code
Codex
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a codex -y
Cursor
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a cursor -y
Gemini CLI
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a gemini-cli -y
GitHub Copilot
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a github-copilot -y
OpenCode
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a opencode -y
Windsurf
$ npx skills add deeleeramone/PyWry --skill autonomous_building -a windsurf -y
description: Autonomous PyWry application building using LLM sampling, elicitation, and progress reporting.
This skill teaches agents how to use PyWry MCP's agentic tools to autonomously design, build, and export complete widget applications from a plain-English description.
Use the agentic tools when you need to:
---
Sends the description to the LLM via sampling and returns a validated `WidgetPlan` JSON object. Use this to **inspect the plan before committing** to building.
# Returns a WidgetPlan JSON (no widget is created yet)
result = await client.call_tool("plan_widget", {
"description": "A crypto price dashboard with symbol selector and refresh button"
})
plan = json.loads(result[0].text)
# plan contains: title, html_content, toolbars, callbacks, width, height, ...The primary tool for autonomous app building. One call: 1. Samples a `WidgetPlan` from the description 2. Registers the widget in the session 3. Returns `widget_id` **and complete runnable Python code**
result = await client.call_tool("build_app", {
"description": "Task tracker with add/remove buttons and completion percentage",
"open_window": False # set True to open a native window immediately
})
data = json.loads(result[0].text)
widget_id = data["widget_id"]
python_code = data["python_code"] # paste into a .py and run directlyThe returned `python_code` is a fully self-contained Python script requiring only `pywry`.
Takes one or more `widget_id`s and generates a full project tree:
my_app/
main.py ← entry-point
requirements.txt ← dependencies
README.md ← quickstart docs
widgets/
<widget_id>.py ← one file per widgetresult = await client.call_tool("export_project", {
"widget_ids": ["abc123", "def456"],
"project_name": "my_dashboard",
"output_dir": "", # leave empty to get file contents as JSON
# "output_dir": "/tmp" # set to write files to disk
})
data = json.loads(result[0].text)
files = data["files"] # {relative_path: file_content}Uses `ctx.elicit()` to ask the user questions before generating the plan:
result = await client.call_tool("scaffold_app", {})
# MCP client will prompt the user for each field
data = json.loads(result[0].text)
plan = data["widget_plan"]---
# 1. Build the app
build = await client.call_tool("build_app", {
"description": "Your plain-English description here"
})
data = json.loads(build[0].text)
# 2. Save the code
Path("my_widget.py").write_text(data["python_code"])
# 3. Or package as a full project
project = await client.call_tool("export_project", {
"widget_ids": [data["widget_id"]],
"project_name": "my_app",
"output_dir": "./output" # writes files to disk
})# 1. Plan first
plan_result = await client.call_tool("plan_widget", {
"description": "..."
})
plan = json.loads(plan_result[0].text)
# 2. Review and tweak the JSON plan manually
# 3. Then build using the reviewed description# Let the user guide the design
scaffold = await client.call_tool("scaffold_app", {})
data = json.loads(scaffold[0].text)
# Build from the collected spec
build = await client.call_tool("build_app", {
"description": data["collected"]["description"]
})---
All agentic tools emit `report_progress` events. Clients that display a progress bar will show real-time status: `Planning… → Generating code… → Writing files… → Done`
---
After `build_app` you can continue refining using the standard tools:
# Read the skill resource for styling tips
content = await client.read_resource("skill://styling/SKILL.md")
# Update a component dynamically
await client.call_tool("set-content", {
"widget_id": widget_id,
"component_id": "main-content",
"content": "<p>Updated!</p>"
})
# Check events emitted by toolbar buttons
await client.call_tool("get-events", {"widget_id": widget_id})---
produces better plans than "a finance app".
charts or tables.
PyWry is a cross-platform app factory, rendering engine and UI toolkit for Python that produces native desktop, web, and notebook experiences from a single API.
When to reach for PyWry MCP tools (native webview rendering, Plotly, TradingView, AgGrid, chat) instead of writing…
Add OAuth2 authentication to PyWry apps — Google, GitHub, Microsoft, or any OIDC provider.
How an agent operates inside a PyWry chat widget — reading user messages, attachments, @-context, tool-call result cards,…
**STOP. THIS IS THE AUTHORITATIVE REFERENCE FOR ALL COMPONENTS.** **YOU MUST USE THE EXACT EVENT SIGNATURES DOCUMENTED HERE.**…
Target elements for `set_content` and `set_style` updates using CSS selectors or component IDs.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.