From 9282b250331f1c426ef5209bdbf6a25afb4abf3d Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Tue, 5 May 2026 00:39:19 -0700 Subject: [PATCH 1/3] update sbom workflow --- .github/workflows/sbom.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml index 0e01085..5ebf362 100644 --- a/.github/workflows/sbom.yml +++ b/.github/workflows/sbom.yml @@ -101,7 +101,7 @@ jobs: echo "**Components:** $COMPONENT_COUNT" >> $GITHUB_STEP_SUMMARY - name: Upload SBOM as artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: sbom path: sbom.cdx.json From d8fab0d5d4a58d451f235b00f874956459add7e5 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Sat, 9 May 2026 13:59:26 -0700 Subject: [PATCH 2/3] Release/pywry 2.0.1 (#41) * patch release * missed file in commit * Fix SBOM step * Fix pip install command for dependencies * Prepare Python package artifacts for PyPI publishing Add step to prepare Python package artifacts for publishing. --------- Co-authored-by: deeleeramone <> --- .github/workflows/publish-pywry.yml | 69 ++++++++++++++++++++++++- claude/desktop-extension/pyproject.toml | 4 +- pywry/pyproject.toml | 4 +- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish-pywry.yml b/.github/workflows/publish-pywry.yml index d9121c9..72dfba8 100644 --- a/.github/workflows/publish-pywry.yml +++ b/.github/workflows/publish-pywry.yml @@ -443,9 +443,65 @@ jobs: name: Generate release SBOM needs: [test] if: ${{ !cancelled() && (needs.test.result == 'success' || needs.test.result == 'skipped') }} + runs-on: ubuntu-24.04 + defaults: + run: + working-directory: pywry permissions: contents: read - uses: ./.github/workflows/sbom.yml + steps: + - uses: actions/checkout@v5 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.12' + + - name: Set up Node.js + uses: actions/setup-node@v5 + with: + node-version: '22' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install ".[all,dev,freeze]" + + - name: Install CycloneDX tools + run: | + pip install cyclonedx-bom + npm ci --ignore-scripts + + - name: Generate and validate merged SBOM + shell: bash + run: | + cyclonedx-py environment --pyproject pyproject.toml --output-format JSON --output-file sbom-python.cdx.json + npx @cyclonedx/cyclonedx-npm --package-lock-only --output-format JSON --output-file sbom-node.cdx.json + + docker run --rm \ + -v "$PWD:/work" \ + -w /work \ + cyclonedx/cyclonedx-cli:latest \ + merge \ + --input-files sbom-python.cdx.json sbom-node.cdx.json \ + --output-format json \ + --output-file sbom.cdx.json + + docker run --rm \ + -v "$PWD:/work" \ + -w /work \ + cyclonedx/cyclonedx-cli:latest \ + validate \ + --input-file sbom.cdx.json \ + --input-format json \ + --fail-on-errors + + - name: Upload SBOM artifact + uses: actions/upload-artifact@v7 + with: + name: sbom + path: pywry/sbom.cdx.json + retention-days: 30 # ============================================================================= # Step 3: Merge all artifacts into single dist @@ -952,8 +1008,17 @@ jobs: echo "📦 Publishing to PyPI:" ls -la dist/ + - name: Prepare Python package artifacts + shell: bash + run: | + mkdir -p publish-dist + cp dist/*.whl publish-dist/ + cp dist/*.tar.gz publish-dist/ + echo "📦 Python package artifacts to publish:" + ls -la publish-dist/ + - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: + packages-dir: publish-dist verbose: true - diff --git a/claude/desktop-extension/pyproject.toml b/claude/desktop-extension/pyproject.toml index 02356a4..2ccaf0b 100644 --- a/claude/desktop-extension/pyproject.toml +++ b/claude/desktop-extension/pyproject.toml @@ -1,8 +1,8 @@ [project] name = "pywry-desktop-extension" -version = "0.1.0" +version = "0.1.1" description = "PyWry MCP Bundle (.mcpb) for Claude Desktop. Wraps pywry[mcp] so the uv runtime resolves dependencies automatically." requires-python = ">=3.10" dependencies = [ - "pywry[mcp]>=2.0.0", + "pywry[mcp]>=2.0.1", ] diff --git a/pywry/pyproject.toml b/pywry/pyproject.toml index 023cbda..d091de4 100644 --- a/pywry/pyproject.toml +++ b/pywry/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pywry" -version = "2.0.0" +version = "2.0.1" description = "A lightweight and blazingly fast, cross-platform, WebView rendering engine and desktop UI toolkit for Python. Batteries included." authors = [{ name = "PyWry", email = "pywry2@gmail.com" }] license = { text = "Apache 2.0" } @@ -54,7 +54,7 @@ test = [ "testcontainers>=4.14.0", ] lint = [ - "ruff>=0.13", + "ruff>=0.15", ] typecheck = [ "ty>=0.0.1a8", From 78fb02a6c3a3e3f1b3e8610a1a2f744c468b44de Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Sun, 17 May 2026 09:20:20 -0700 Subject: [PATCH 3/3] Release/pywry 2.0.2 (#56) * chore(sync): merge main into develop (#43) * update sbom workflow * Release/pywry 2.0.1 (#41) * patch release * missed file in commit * Fix SBOM step * Fix pip install command for dependencies * Prepare Python package artifacts for PyPI publishing Add step to prepare Python package artifacts for publishing. --------- Co-authored-by: deeleeramone <> --------- Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * chore(lockfiles): refresh uv.lock and package-lock.json * build(deps): bump python-multipart (#45) Bumps the uv group with 1 update in the /pywry directory: [python-multipart](https://github.com/Kludex/python-multipart). Updates `python-multipart` from 0.0.26 to 0.0.27 - [Release notes](https://github.com/Kludex/python-multipart/releases) - [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md) - [Commits](https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27) --- updated-dependencies: - dependency-name: python-multipart dependency-version: 0.0.27 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps): bump langchain-core (#46) Bumps the uv group with 1 update in the /pywry directory: [langchain-core](https://github.com/langchain-ai/langchain). Updates `langchain-core` from 1.3.2 to 1.3.3 - [Release notes](https://github.com/langchain-ai/langchain/releases) - [Commits](https://github.com/langchain-ai/langchain/compare/langchain-core==1.3.2...langchain-core==1.3.3) --- updated-dependencies: - dependency-name: langchain-core dependency-version: 1.3.3 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): update pydantic requirement in /pywry/docs (#47) Updates the requirements on [pydantic](https://github.com/pydantic/pydantic) to permit the latest version. - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/v2.13.4/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4) --- updated-dependencies: - dependency-name: pydantic dependency-version: 2.13.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): update pydantic-settings requirement in /pywry/docs (#48) Updates the requirements on [pydantic-settings](https://github.com/pydantic/pydantic-settings) to permit the latest version. - [Release notes](https://github.com/pydantic/pydantic-settings/releases) - [Commits](https://github.com/pydantic/pydantic-settings/compare/v2.14.0...v2.14.1) --- updated-dependencies: - dependency-name: pydantic-settings dependency-version: 2.14.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps): bump pydantic from 2.13.3 to 2.13.4 in /pywry (#49) Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.13.3 to 2.13.4. - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/v2.13.4/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v2.13.3...v2.13.4) --- updated-dependencies: - dependency-name: pydantic dependency-version: 2.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps-dev): bump agent-client-protocol in /pywry (#50) Bumps [agent-client-protocol](https://github.com/agentclientprotocol/python-sdk) from 0.9.0 to 0.10.0. - [Release notes](https://github.com/agentclientprotocol/python-sdk/releases) - [Commits](https://github.com/agentclientprotocol/python-sdk/compare/0.9.0...0.10.0) --- updated-dependencies: - dependency-name: agent-client-protocol dependency-version: 0.10.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps): bump pydantic-settings from 2.14.0 to 2.14.1 in /pywry (#51) Bumps [pydantic-settings](https://github.com/pydantic/pydantic-settings) from 2.14.0 to 2.14.1. - [Release notes](https://github.com/pydantic/pydantic-settings/releases) - [Commits](https://github.com/pydantic/pydantic-settings/compare/v2.14.0...v2.14.1) --- updated-dependencies: - dependency-name: pydantic-settings dependency-version: 2.14.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps-dev): bump openai from 2.33.0 to 2.36.0 in /pywry (#52) Bumps [openai](https://github.com/openai/openai-python) from 2.33.0 to 2.36.0. - [Release notes](https://github.com/openai/openai-python/releases) - [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-python/compare/v2.33.0...v2.36.0) --- updated-dependencies: - dependency-name: openai dependency-version: 2.36.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps-dev): bump cryptography from 47.0.0 to 48.0.0 in /pywry (#53) Bumps [cryptography](https://github.com/pyca/cryptography) from 47.0.0 to 48.0.0. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/47.0.0...48.0.0) --- updated-dependencies: - dependency-name: cryptography dependency-version: 48.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * build(deps): bump urllib3 in /pywry in the uv group across 1 directory (#54) Bumps the uv group with 1 update in the /pywry directory: [urllib3](https://github.com/urllib3/urllib3). Updates `urllib3` from 2.6.3 to 2.7.0 - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.7.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com> * Bugfix/chat handler (#55) * fix chart handler getting swallowed * version bump * claude marketplace version * claude marketplace version * claude changelog --------- Co-authored-by: deeleeramone <> * chore(lockfiles): refresh uv.lock and package-lock.json --------- Signed-off-by: dependabot[bot] Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: deeleeramone <> --- claude/.claude-plugin/marketplace.json | 2 +- claude/desktop-extension/manifest.json | 2 +- .../pywry/.claude-plugin/marketplace.json | 2 +- .../plugins/pywry/.claude-plugin/plugin.json | 2 +- claude/plugins/pywry/CHANGELOG.md | 19 + pywry/docs/requirements.txt | 2 +- pywry/examples/pywry_demo_deepagent_nvidia.py | 55 ++- pywry/pyproject.toml | 2 +- pywry/pywry/frontend/src/chat-handlers.js | 12 +- pywry/pywry/frontend/src/main.js | 12 + pywry/pywry/frontend/src/system-events.js | 9 + pywry/pywry/templates.py | 6 + pywry/pywry/widget.py | 6 + pywry/uv.lock | 366 +++++++++--------- 14 files changed, 277 insertions(+), 220 deletions(-) diff --git a/claude/.claude-plugin/marketplace.json b/claude/.claude-plugin/marketplace.json index 4550ea9..5f832dd 100644 --- a/claude/.claude-plugin/marketplace.json +++ b/claude/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "pywry", "source": "./plugins/pywry/", "description": "Native Claude Code integration for PyWry — MCP tools for generating and rendering HTML components, chat artifacts, and building native, web, or Jupyter applications with live preview. Built-in support for AgGrid, Plotly, TradingView, and more.", - "version": "0.1.0", + "version": "0.1.1", "author": { "name": "PyWry", "email": "pywry2@gmail.com", diff --git a/claude/desktop-extension/manifest.json b/claude/desktop-extension/manifest.json index 7da9568..5ab7a54 100644 --- a/claude/desktop-extension/manifest.json +++ b/claude/desktop-extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": "0.4", "name": "pywry", "display_name": "PyWry", - "version": "0.1.0", + "version": "0.1.1", "description": "Native Claude Desktop integration for PyWry — MCP tools for generating and rendering HTML components, chat artifacts, and building native, web, or Jupyter applications with live preview. Built-in support for AgGrid, Plotly, TradingView, and more.", "long_description": "PyWry is a cross-platform rendering engine and desktop UI toolkit for Python. This Desktop Extension bundles the PyWry MCP server (66+ tools) so Claude Desktop can scaffold widgets, render Plotly charts, drive AG Grid tables, build TradingView lightweight charts, and produce streaming chat artifacts — all delivered as embedded HTML resources viewable directly in the artifact pane. The `uv` runtime resolves `pywry[mcp]` from PyPI on first launch; no manual `pip install` is required.", "author": { diff --git a/claude/plugins/pywry/.claude-plugin/marketplace.json b/claude/plugins/pywry/.claude-plugin/marketplace.json index b87a203..92f6821 100644 --- a/claude/plugins/pywry/.claude-plugin/marketplace.json +++ b/claude/plugins/pywry/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "pywry", "source": "./", "description": "Native Claude Code integration for PyWry — MCP tools for generating and rendering HTML components, chat artifacts, and building native, web, or Jupyter applications with live preview. Built-in support for AgGrid, Plotly, TradingView, and more.", - "version": "0.1.0", + "version": "0.1.1", "author": { "name": "PyWry", "email": "pywry2@gmail.com", diff --git a/claude/plugins/pywry/.claude-plugin/plugin.json b/claude/plugins/pywry/.claude-plugin/plugin.json index 79812f9..10bc786 100644 --- a/claude/plugins/pywry/.claude-plugin/plugin.json +++ b/claude/plugins/pywry/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "pywry", - "version": "0.1.0", + "version": "0.1.1", "description": "Native Claude Code integration for PyWry — MCP tools for generating and rendering HTML components, chat artifacts, and building native, web, or Jupyter applications with live preview. Built-in support for AgGrid, Plotly, TradingView, and more.", "author": { "name": "PyWry", diff --git a/claude/plugins/pywry/CHANGELOG.md b/claude/plugins/pywry/CHANGELOG.md index 63a4cd7..89a8a08 100644 --- a/claude/plugins/pywry/CHANGELOG.md +++ b/claude/plugins/pywry/CHANGELOG.md @@ -3,6 +3,25 @@ Versioning follows [semver](https://semver.org/). Format is a feature list per release — not a delta. +## 0.1.1 — chat-handler regression fix + +**Chat widget reliability.** Fixed a regression where the desktop chat +panel rendered empty (no welcome message, dead buttons) after a +`set_content` IPC swap. Root cause: `chat-handlers.js` contained a +literal `''` string inside its iframe meta-tag injection +helper. When inlined into the host document's ``, the desktop +subprocess's regex-based head-script extractor terminated early on +the stray tag, dropping the chat-handlers `