From 14816289babd223a29845fe946fc7e1b4a947312 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Mon, 11 May 2026 18:55:50 -0400 Subject: [PATCH] feat: salvage windows desktop e2e skill Reintroduce the Windows desktop E2E testing skill from stale PR #1334 with current manifest wiring, package publish coverage, catalog counts, and sanitized environment-path guidance. --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- AGENTS.md | 4 +- README.md | 6 +- README.zh-CN.md | 2 +- docs/zh-CN/AGENTS.md | 4 +- docs/zh-CN/README.md | 6 +- manifests/install-components.json | 8 + manifests/install-modules.json | 3 +- package.json | 1 + skills/windows-desktop-e2e/SKILL.md | 788 ++++++++++++++++++++++++++++ tests/scripts/uninstall.test.js | 5 +- 12 files changed, 815 insertions(+), 16 deletions(-) create mode 100644 skills/windows-desktop-e2e/SKILL.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index d4d60630..5fe68641 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ { "name": "ecc", "source": "./", - "description": "The most comprehensive Claude Code plugin — 54 agents, 204 skills, 69 legacy command shims, selective install profiles, and production-ready hooks for TDD, security scanning, code review, and continuous learning", + "description": "The most comprehensive Claude Code plugin — 54 agents, 205 skills, 69 legacy command shims, selective install profiles, and production-ready hooks for TDD, security scanning, code review, and continuous learning", "version": "2.0.0-rc.1", "author": { "name": "Affaan Mustafa", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 13a904d4..e042dc4a 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ecc", "version": "2.0.0-rc.1", - "description": "Battle-tested Claude Code plugin for engineering teams — 54 agents, 204 skills, 69 legacy command shims, production-ready hooks, and selective install workflows evolved through continuous real-world use", + "description": "Battle-tested Claude Code plugin for engineering teams — 54 agents, 205 skills, 69 legacy command shims, production-ready hooks, and selective install workflows evolved through continuous real-world use", "author": { "name": "Affaan Mustafa", "url": "https://x.com/affaanmustafa" diff --git a/AGENTS.md b/AGENTS.md index d5d0af25..e4ff148b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # Everything Claude Code (ECC) — Agent Instructions -This is a **production-ready AI coding plugin** providing 54 specialized agents, 204 skills, 69 commands, and automated hook workflows for software development. +This is a **production-ready AI coding plugin** providing 54 specialized agents, 205 skills, 69 commands, and automated hook workflows for software development. **Version:** 2.0.0-rc.1 @@ -147,7 +147,7 @@ Troubleshoot failures: check test isolation → verify mocks → fix implementat ``` agents/ — 54 specialized subagents -skills/ — 204 workflow skills and domain knowledge +skills/ — 205 workflow skills and domain knowledge commands/ — 69 slash commands hooks/ — Trigger-based automations rules/ — Always-follow guidelines (common + per-language) diff --git a/README.md b/README.md index 105cc3ec..f86cfbd6 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ If you stacked methods, clean up in this order: /plugin list ecc@ecc ``` -**That's it!** You now have access to 54 agents, 204 skills, and 69 legacy command shims. +**That's it!** You now have access to 54 agents, 205 skills, and 69 legacy command shims. ### Dashboard GUI @@ -1351,7 +1351,7 @@ The configuration is automatically detected from `.opencode/opencode.json`. |---------|-------------|----------|--------| | Agents | PASS: 54 agents | PASS: 12 agents | **Claude Code leads** | | Commands | PASS: 69 commands | PASS: 31 commands | **Claude Code leads** | -| Skills | PASS: 204 skills | PASS: 37 skills | **Claude Code leads** | +| Skills | PASS: 205 skills | PASS: 37 skills | **Claude Code leads** | | Hooks | PASS: 8 event types | PASS: 11 events | **OpenCode has more!** | | Rules | PASS: 29 rules | PASS: 13 instructions | **Claude Code leads** | | MCP Servers | PASS: 14 servers | PASS: Full | **Full parity** | @@ -1456,7 +1456,7 @@ ECC is the **first plugin to maximize every major AI coding tool**. Here's how e |---------|------------|------------|-----------|----------| | **Agents** | 54 | Shared (AGENTS.md) | Shared (AGENTS.md) | 12 | | **Commands** | 69 | Shared | Instruction-based | 31 | -| **Skills** | 204 | Shared | 10 (native format) | 37 | +| **Skills** | 205 | Shared | 10 (native format) | 37 | | **Hook Events** | 8 types | 15 types | None yet | 11 types | | **Hook Scripts** | 20+ scripts | 16 scripts (DRY adapter) | N/A | Plugin hooks | | **Rules** | 34 (common + lang) | 34 (YAML frontmatter) | Instruction-based | 13 instructions | diff --git a/README.zh-CN.md b/README.zh-CN.md index 5bfc5983..0a46f081 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -160,7 +160,7 @@ Copy-Item -Recurse rules/typescript "$HOME/.claude/rules/" /plugin list ecc@ecc ``` -**完成!** 你现在可以使用 54 个代理、204 个技能和 69 个命令。 +**完成!** 你现在可以使用 54 个代理、205 个技能和 69 个命令。 ### multi-* 命令需要额外配置 diff --git a/docs/zh-CN/AGENTS.md b/docs/zh-CN/AGENTS.md index b39a8547..91dba17a 100644 --- a/docs/zh-CN/AGENTS.md +++ b/docs/zh-CN/AGENTS.md @@ -1,6 +1,6 @@ # Everything Claude Code (ECC) — 智能体指令 -这是一个**生产就绪的 AI 编码插件**,提供 54 个专业代理、204 项技能、69 条命令以及自动化钩子工作流,用于软件开发。 +这是一个**生产就绪的 AI 编码插件**,提供 54 个专业代理、205 项技能、69 条命令以及自动化钩子工作流,用于软件开发。 **版本:** 2.0.0-rc.1 @@ -147,7 +147,7 @@ ``` agents/ — 54 个专业子代理 -skills/ — 204 个工作流技能和领域知识 +skills/ — 205 个工作流技能和领域知识 commands/ — 69 个斜杠命令 hooks/ — 基于触发的自动化 rules/ — 始终遵循的指导方针(通用 + 每种语言) diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index 6b7eeb78..66909eb3 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -224,7 +224,7 @@ Copy-Item -Recurse rules/typescript "$HOME/.claude/rules/" /plugin list ecc@ecc ``` -**搞定!** 你现在可以使用 54 个智能体、204 项技能和 69 个命令了。 +**搞定!** 你现在可以使用 54 个智能体、205 项技能和 69 个命令了。 *** @@ -1134,7 +1134,7 @@ opencode |---------|-------------|----------|--------| | 智能体 | PASS: 54 个 | PASS: 12 个 | **Claude Code 领先** | | 命令 | PASS: 69 个 | PASS: 31 个 | **Claude Code 领先** | -| 技能 | PASS: 204 项 | PASS: 37 项 | **Claude Code 领先** | +| 技能 | PASS: 205 项 | PASS: 37 项 | **Claude Code 领先** | | 钩子 | PASS: 8 种事件类型 | PASS: 11 种事件 | **OpenCode 更多!** | | 规则 | PASS: 29 条 | PASS: 13 条指令 | **Claude Code 领先** | | MCP 服务器 | PASS: 14 个 | PASS: 完整 | **完全对等** | @@ -1242,7 +1242,7 @@ ECC 是**第一个最大化利用每个主要 AI 编码工具的插件**。以 |---------|------------|------------|-----------|----------| | **智能体** | 54 | 共享 (AGENTS.md) | 共享 (AGENTS.md) | 12 | | **命令** | 69 | 共享 | 基于指令 | 31 | -| **技能** | 204 | 共享 | 10 (原生格式) | 37 | +| **技能** | 205 | 共享 | 10 (原生格式) | 37 | | **钩子事件** | 8 种类型 | 15 种类型 | 暂无 | 11 种类型 | | **钩子脚本** | 20+ 个脚本 | 16 个脚本 (DRY 适配器) | N/A | 插件钩子 | | **规则** | 34 (通用 + 语言) | 34 (YAML 前页) | 基于指令 | 13 条指令 | diff --git a/manifests/install-components.json b/manifests/install-components.json index 6bb72950..02d8e58a 100644 --- a/manifests/install-components.json +++ b/manifests/install-components.json @@ -395,6 +395,14 @@ "workflow-quality" ] }, + { + "id": "skill:windows-desktop-e2e", + "family": "skill", + "description": "E2E testing for Windows native desktop apps with pywinauto and Windows UI Automation.", + "modules": [ + "workflow-quality" + ] + }, { "id": "skill:strategic-compact", "family": "skill", diff --git a/manifests/install-modules.json b/manifests/install-modules.json index 0178a873..7a878831 100644 --- a/manifests/install-modules.json +++ b/manifests/install-modules.json @@ -232,7 +232,8 @@ "skills/skill-stocktake", "skills/strategic-compact", "skills/tdd-workflow", - "skills/verification-loop" + "skills/verification-loop", + "skills/windows-desktop-e2e" ], "targets": [ "claude", diff --git a/package.json b/package.json index 1541fabb..a2b6c531 100644 --- a/package.json +++ b/package.json @@ -252,6 +252,7 @@ "skills/video-editing/", "skills/videodb/", "skills/visa-doc-translate/", + "skills/windows-desktop-e2e/", "skills/workspace-surface-audit/", "skills/x-api/", "the-security-guide.md" diff --git a/skills/windows-desktop-e2e/SKILL.md b/skills/windows-desktop-e2e/SKILL.md new file mode 100644 index 00000000..e9f0d3c7 --- /dev/null +++ b/skills/windows-desktop-e2e/SKILL.md @@ -0,0 +1,788 @@ +--- +name: windows-desktop-e2e +description: E2E testing for Windows native desktop apps (WPF, WinForms, Win32/MFC, Qt) using pywinauto and Windows UI Automation. +origin: ECC +--- + +# Windows Desktop E2E Testing + +End-to-end testing for Windows native desktop applications using **pywinauto** backed by Windows UI Automation (UIA). Covers WPF, WinForms, Win32/MFC, and Qt (5.x / 6.x) — with Qt-specific guidance as a dedicated section. + +## When to Activate + +- Writing or running E2E tests for a Windows native desktop application +- Setting up a desktop GUI test suite from scratch +- Diagnosing flaky or failing desktop automation tests +- Adding testability (AutomationId, accessible names) to an existing app +- Integrating desktop E2E into a CI/CD pipeline (GitHub Actions `windows-latest`) + +### When NOT to Use + +- Web applications → use `e2e-testing` skill (Playwright) +- Electron / CEF / WebView2 apps → the HTML layer needs browser automation, not UIA +- Mobile apps → use platform-specific tools (UIAutomator, XCUITest) +- Pure unit or integration tests that don't need a running GUI + +## Core Concepts + +All Windows desktop automation relies on **UI Automation (UIA)**, a Windows-built-in accessibility API. Every supported framework exposes a tree of UIA elements with properties Claude can read and act on: + +``` +Your test (Python) + └── pywinauto (UIA backend) + └── Windows UI Automation API ← built into Windows, framework-agnostic + └── App's UIA provider ← each framework ships its own + └── Running .exe +``` + +**UIA quality by framework:** + +| Framework | AutomationId | Reliability | Notes | +|-----------|-------------|-------------|-------| +| WPF | ★★★★★ | Excellent | `x:Name` maps directly to AutomationId | +| WinForms | ★★★★☆ | Good | `AccessibleName` = AutomationId | +| UWP / WinUI 3 | ★★★★★ | Excellent | Full Microsoft support | +| Qt 6.x | ★★★★★ | Excellent | Accessibility enabled by default; class names change to `Qt6*` | +| Qt 5.15+ | ★★★★☆ | Good | Improved Accessibility module | +| Qt 5.7–5.14 | ★★★☆☆ | Fair | Needs `QT_ACCESSIBILITY=1`; objectName manual | +| Win32 / MFC | ★★★☆☆ | Fair | Control IDs accessible; text matching common | + +## Setup & Prerequisites + +```bash +# Python 3.8+, Windows only +pip install pywinauto pytest pytest-html Pillow pytest-timeout +# Optional: screen recording +# Install ffmpeg and add to PATH: https://ffmpeg.org/download.html +``` + +Verify UIA is reachable: + +```python +from pywinauto import Desktop +Desktop(backend="uia").windows() # lists all top-level windows +``` + +Install **Accessibility Insights for Windows** (free, from Microsoft) — your DevTools equivalent for inspecting the UIA element tree before writing any test. + +## Testability Setup (by Framework) + +The single most impactful thing you can do is **give every interactive control a stable AutomationId** before writing tests. + +### WPF + +```xml + + + +