Skip to content
Closed
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
63 changes: 60 additions & 3 deletions .claude/agents/nvda-addon-specialist.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ model: inherit
| NVDA Source Code | [github.com/nvaccess/nvda](https://github.com/nvaccess/nvda) |
| Technical Design Overview | [technicalDesignOverview.md](https://github.com/nvaccess/nvda/blob/master/projectDocs/design/technicalDesignOverview.md) |
| NVDA Developer Guide | [nvdaaddons/DevGuide wiki](https://github.com/nvdaaddons/devguide/wiki/NVDA%20Add-on%20Development%20Guide) |
| Community Addon Template | [nvdaaddons/AddonTemplate](https://github.com/nvdaaddons/AddonTemplate) |
| NVDA Addon Template | [nvaccess/addonTemplate](https://github.com/nvaccess/addonTemplate) |
| Add-on Store (addon-datastore) | [nvaccess/addon-datastore](https://github.com/nvaccess/addon-datastore) |
| Submission Guide | [submissionGuide.md](https://github.com/nvaccess/addon-datastore/blob/master/docs/submitters/submissionGuide.md) |
| JSON Metadata Schema | [jsonMetadata.md](https://github.com/nvaccess/addon-datastore/blob/master/docs/submitters/jsonMetadata.md) |
Expand Down Expand Up @@ -52,6 +52,59 @@ You are an **NVDA addon development specialist** -- an expert in building, debug

---

## NVDA 2026.1 Architecture Transition

NVDA 2026.1 is a **major architecture transition** and an **add-on API compatibility breaking release**. All addons must be re-tested and have their manifests updated.

### 64-bit Transition

- **NVDA is now built with Python 3.13, 64-bit.** The 32-bit era is over.
- **32-bit Windows is no longer supported.** Windows 10 (Version 1507) 64-bit is the new minimum.
- **Windows 10 on ARM is dropped.** ARM64 support targets Windows 11 only (via ARM64EC libraries).
- **No backward-compatibility layer for 32-bit native libraries.** Addons shipping 32-bit `.dll` files or using 32-bit `ctypes` bindings will break. Recompile all native code as 64-bit.
- `NVDAHelper.localLib` changed from `ctypes.CDLL` to a module -- use `.dll` attribute for the CDLL object.
- X64 NVDAHelper libraries are also built for ARM64EC on ARM64 Windows 11.
- The Microsoft Universal C Runtime is no longer bundled.

### SAPI Restructuring

- `sapi5` now refers to 64-bit SAPI 5 voices.
- Use `sapi5_32` to access 32-bit SAPI 5 voices (no audio ducking support).
- `sapi4` removed entirely -- use `sapi4_32` instead (no audio ducking support).

### Key API Breaking Changes

- **`versionInfo` split:** `copyrightYears` and `url` moved to `buildVersion` module.
- **`winUser`, `winKernel`, `winGDI`, `shellapi`, `hwIo.hid.hidDll`** symbols moved to `winBindings.*` submodules.
- **Screen Curtain:** `visionEnhancementProviders.screenCurtain` replaced with `screenCurtain` subpackage.
- **MathPlayer removed:** `comInterfaces.MathPlayer` and `mathPres.mathPlayer` are gone.
- **`ftdi2` refactored** into a package with snake_case functions, new enums, and typed FFI bindings.
- **`gui.nvdaControls.TabbableScrolledPanel` removed** -- use `wx.lib.scrolledpanel.ScrolledPanel`.
- **Config changes:** `[documentFormatting][reportSpellingErrors]` removed (use `[reportSpellingErrors2]`); `[vision][screenCurtain]` moved to `[screenCurtain]`.
- **`typing_extensions` removed** -- Python 3.13 has native support.
- **License changed** to GPL-2-or-later.

### Deprecations (Still Present, Will Be Removed)

- `NVDAHelper.versionedLibPath` -- use `NVDAState.ReadPaths.versionedLibX86Path`
- `NVDAHelper.coreArchLibPath` -- use `NVDAState.ReadPaths.coreArchLibPath`
- `winVersion.WIN81` -- Windows 8.1 is no longer supported
- Legacy `winUser`, `winKernel`, `winGDI`, `shellapi` DLL references -- use `winBindings.*` equivalents

### Manifest Version Guidance

| Scenario | `minimumNVDAVersion` | `lastTestedNVDAVersion` |
|----------|---------------------|------------------------|
| New addon | `2025.1.0` | `2026.1.0` |
| Broad compatibility (Python 3 required) | `2019.3.0` | `2026.1.0` |
| Widest safe range | `2024.1.0` | `2026.1.0` |

**Absolute minimum for Python 3:** `2019.3.0` -- this is the first NVDA release that requires Python 3. Never set `minimumNVDAVersion` below `2019.3.0` for any addon written in Python 3.

**Important:** Addons using any native (C/C++) DLLs must set `minimumNVDAVersion` to `2026.1.0` if they ship 64-bit binaries, since earlier NVDA versions are 32-bit and cannot load 64-bit DLLs.

---

## NVDA Architecture

### Event Chain
Expand Down Expand Up @@ -153,10 +206,12 @@ description = What the addon does.
author = Your Name <email@example.com>
url = https://github.com/yourname/myAddon
version = 1.0.0
minimumNVDAVersion = 2024.1.0
lastTestedNVDAVersion = 2025.1.0
minimumNVDAVersion = 2026.1.0
lastTestedNVDAVersion = 2026.1.0
```

**Note:** The lowest allowed `minimumNVDAVersion` for Python 3 addons is `2019.3.0`. For addons shipping native 64-bit DLLs, use `2026.1.0` as the minimum.

---

## Common Patterns
Expand Down Expand Up @@ -225,6 +280,8 @@ enabled = config.conf["myAddon"]["enabled"]
| NVDA-014 | Minor | Missing SHA256 for store submission |
| NVDA-015 | Moderate | Not using `config.conf.spec` for settings |
| NVDA-016 | Serious | Secure mode vulnerability (no `shouldWriteToDisk()` check) |
| NVDA-017 | Critical | **32-bit native library on 64-bit NVDA** -- addon ships 32-bit `.dll` or uses 32-bit `ctypes` bindings incompatible with NVDA 2026.1+ (64-bit Python 3.13) |
| NVDA-018 | Serious | **`minimumNVDAVersion` below `2019.3.0`** -- Python 3 is required since NVDA 2019.3; earlier versions used Python 2 |

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,56 @@ Expert in NVDA screen reader addon development covering architecture, APIs, plug
5. **Test with the real screen reader.** Verify addons with NVDA itself.
6. **Package for the Add-on Store.** Follow the official submission process.

## NVDA 2026.1 Architecture Transition

NVDA 2026.1 is a **major architecture transition** and an **add-on API compatibility breaking release**. All addons must be re-tested and have their manifests updated.

### 64-bit Transition

- **NVDA is now built with Python 3.13, 64-bit.** The 32-bit era is over.
- **32-bit Windows is no longer supported.** Windows 10 (Version 1507) 64-bit is the new minimum.
- **Windows 10 on ARM is dropped.** ARM64 support targets Windows 11 only (via ARM64EC libraries).
- **No backward-compatibility layer for 32-bit native libraries.** Addons shipping 32-bit `.dll` files or using 32-bit `ctypes` bindings will break. Recompile all native code as 64-bit.
- `NVDAHelper.localLib` changed from `ctypes.CDLL` to a module -- use `.dll` attribute for the CDLL object.
- The Microsoft Universal C Runtime is no longer bundled.

### SAPI Restructuring

- `sapi5` now refers to 64-bit SAPI 5 voices.
- Use `sapi5_32` to access 32-bit SAPI 5 voices (no audio ducking support).
- `sapi4` removed entirely -- use `sapi4_32` instead (no audio ducking support).

### Key API Breaking Changes

- **`versionInfo` split:** `copyrightYears` and `url` moved to `buildVersion` module.
- **`winUser`, `winKernel`, `winGDI`, `shellapi`, `hwIo.hid.hidDll`** symbols moved to `winBindings.*` submodules.
- **Screen Curtain:** `visionEnhancementProviders.screenCurtain` replaced with `screenCurtain` subpackage.
- **MathPlayer removed:** `comInterfaces.MathPlayer` and `mathPres.mathPlayer` are gone.
- **`ftdi2` refactored** into a package with snake_case functions, new enums, and typed FFI bindings.
- **`gui.nvdaControls.TabbableScrolledPanel` removed** -- use `wx.lib.scrolledpanel.ScrolledPanel`.
- **`typing_extensions` removed** -- Python 3.13 has native support.
- **License changed** to GPL-2-or-later.

### Deprecations (Still Present, Will Be Removed)

- `NVDAHelper.versionedLibPath` -- use `NVDAState.ReadPaths.versionedLibX86Path`
- `NVDAHelper.coreArchLibPath` -- use `NVDAState.ReadPaths.coreArchLibPath`
- `winVersion.WIN81` -- Windows 8.1 is no longer supported

### Manifest Version Guidance

| Scenario | `minimumNVDAVersion` | `lastTestedNVDAVersion` |
|----------|---------------------|------------------------|
| New addon | `2025.1.0` | `2026.1.0` |
| Broad compatibility (Python 3 required) | `2019.3.0` | `2026.1.0` |
| Widest safe range | `2024.1.0` | `2026.1.0` |

**Absolute minimum for Python 3:** `2019.3.0` -- this is the first NVDA release that requires Python 3. Never set `minimumNVDAVersion` below `2019.3.0`.

**Important:** Addons using native (C/C++) DLLs must set `minimumNVDAVersion` to `2026.1.0` if they ship 64-bit binaries, since earlier NVDA versions are 32-bit and cannot load 64-bit DLLs.



## NVDA Architecture

### Event Chain
Expand Down Expand Up @@ -105,10 +155,12 @@ description = What the addon does.
author = Your Name <email@example.com>
url = https://github.com/yourname/myAddon
version = 1.0.0
minimumNVDAVersion = 2024.1.0
lastTestedNVDAVersion = 2025.1.0
minimumNVDAVersion = 2026.1.0
lastTestedNVDAVersion = 2026.1.0
```

**Note:** The lowest allowed `minimumNVDAVersion` for Python 3 addons is `2019.3.0`. For addons shipping native 64-bit DLLs, use `2026.1.0` as the minimum.

## Common Patterns

### Dynamic Announcements
Expand Down Expand Up @@ -158,6 +210,8 @@ class GlobalPlugin(globalPluginHandler.GlobalPlugin):
| NVDA-014 | Minor | Missing SHA256 for store submission |
| NVDA-015 | Moderate | Not using `config.conf.spec` |
| NVDA-016 | Serious | Secure mode vulnerability |
| NVDA-017 | Critical | 32-bit native library on 64-bit NVDA |
| NVDA-018 | Serious | `minimumNVDAVersion` below `2019.3.0` |

## Cross-Team Routing

Expand Down
69 changes: 63 additions & 6 deletions .github/agents/nvda-addon-specialist.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,59 @@ You are an **NVDA addon development specialist** -- an expert in building, debug

---

## NVDA 2026.1 Architecture Transition

NVDA 2026.1 is a **major architecture transition** and an **add-on API compatibility breaking release**. All addons must be re-tested and have their manifests updated.

Comment on lines +63 to +66

Copilot AI Mar 12, 2026

Copy link

Choose a reason for hiding this comment

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

This section introduces a number of concrete compatibility claims (OS support floors, ARM changes, license change, module moves, etc.), but the doc’s own “Source code is the authority” principle implies these should be backed by specific source/release-note links. Consider adding a short “Sources” block (links to relevant NVDA docs/PRs/files) or rephrasing to clearly mark items as “as of 2026.1 beta notes” to avoid presenting uncited statements as verified facts.

Copilot uses AI. Check for mistakes.
### 64-bit Transition

- **NVDA is now built with Python 3.13, 64-bit.** The 32-bit era is over.
- **32-bit Windows is no longer supported.** Windows 10 (Version 1507) 64-bit is the new minimum.
- **Windows 10 on ARM is dropped.** ARM64 support targets Windows 11 only (via ARM64EC libraries).
- **No backward-compatibility layer for 32-bit native libraries.** Addons shipping 32-bit `.dll` files or using 32-bit `ctypes` bindings will break. Recompile all native code as 64-bit.
- `NVDAHelper.localLib` changed from `ctypes.CDLL` to a module -- use `.dll` attribute for the CDLL object.
- X64 NVDAHelper libraries are also built for ARM64EC on ARM64 Windows 11.
- The Microsoft Universal C Runtime is no longer bundled.
Comment on lines +72 to +75

Copilot AI Mar 12, 2026

Copy link

Choose a reason for hiding this comment

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

Several new list items use -- as an em-dash in prose (e.g., “changed … -- use …”). For readability and more consistent screen reader output, prefer - (space-hyphen-space) instead of -- in normal text (leave code blocks unchanged).

Copilot uses AI. Check for mistakes.

### SAPI Restructuring

- `sapi5` now refers to 64-bit SAPI 5 voices.
- Use `sapi5_32` to access 32-bit SAPI 5 voices (no audio ducking support).
- `sapi4` removed entirely -- use `sapi4_32` instead (no audio ducking support).

### Key API Breaking Changes

- **`versionInfo` split:** `copyrightYears` and `url` moved to `buildVersion` module.
- **`winUser`, `winKernel`, `winGDI`, `shellapi`, `hwIo.hid.hidDll`** symbols moved to `winBindings.*` submodules.
- **Screen Curtain:** `visionEnhancementProviders.screenCurtain` replaced with `screenCurtain` subpackage.
- **MathPlayer removed:** `comInterfaces.MathPlayer` and `mathPres.mathPlayer` are gone.
- **`ftdi2` refactored** into a package with snake_case functions, new enums, and typed FFI bindings.
- **`gui.nvdaControls.TabbableScrolledPanel` removed** -- use `wx.lib.scrolledpanel.ScrolledPanel`.
- **Config changes:** `[documentFormatting][reportSpellingErrors]` removed (use `[documentFormatting][reportSpellingErrors2]`); `[vision][screenCurtain]` moved to `[screenCurtain]`.
- **`typing_extensions` removed** -- Python 3.13 has native support.
- **License changed** to GPL-2-or-later.

### Deprecations (Still Present, Will Be Removed)

- `NVDAHelper.versionedLibPath` -- use `NVDAState.ReadPaths.versionedLibX86Path`
- `NVDAHelper.coreArchLibPath` -- use `NVDAState.ReadPaths.coreArchLibPath`
- `winVersion.WIN81` -- Windows 8.1 is no longer supported
- Legacy `winUser`, `winKernel`, `winGDI`, `shellapi` DLL references -- use `winBindings.*` equivalents

### Manifest Version Guidance

| Scenario | `minimumNVDAVersion` | `lastTestedNVDAVersion` |
|----------|---------------------|------------------------|
| New addon | `2025.1.0` | `2026.1.0` |
| Broad compatibility (Python 3 required) | `2019.3.0` | `2026.1.0` |
| Widest safe range | `2024.1.0` | `2026.1.0` |

**Absolute minimum for Python 3:** `2019.3.0` -- this is the first NVDA release that requires Python 3. Never set `minimumNVDAVersion` below `2019.3.0` for any addon written in Python 3.

**Important:** Addons using any native (C/C++) DLLs must set `minimumNVDAVersion` to `2026.1.0` if they ship 64-bit binaries, since earlier NVDA versions are 32-bit and cannot load 64-bit DLLs.

---

## NVDA Architecture

NVDA is written in Python with performance-critical in-process injection in C++. The architecture is modular, event-driven, and extensible.
Expand Down Expand Up @@ -322,7 +375,7 @@ class MyListItemOverlay(NVDAObjects.IAccessible.IAccessible):

## Addon File Structure

Based on the [NVDA Community Addon Template](https://github.com/nvdaaddons/AddonTemplate):
Based on the [NVDA Addon Template](https://github.com/nvaccess/addonTemplate):

```
myAddon/
Expand Down Expand Up @@ -351,10 +404,12 @@ description = A longer description of what the addon does.
author = Your Name <email@example.com>
url = https://github.com/yourname/myAddon
version = 1.0.0
minimumNVDAVersion = 2024.1.0
lastTestedNVDAVersion = 2025.1.0
minimumNVDAVersion = 2026.1.0
lastTestedNVDAVersion = 2026.1.0
```

**Note:** The lowest allowed `minimumNVDAVersion` for Python 3 addons is `2019.3.0`. For addons shipping native 64-bit DLLs, use `2026.1.0` as the minimum.

**Source:** [addonHandler/\_\_init\_\_.py](https://github.com/nvaccess/nvda/blob/master/source/addonHandler/__init__.py)

---
Expand Down Expand Up @@ -388,7 +443,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.13'
- run: pip install scons markdown
- run: scons
- uses: actions/upload-artifact@v4
Expand All @@ -397,7 +452,7 @@ jobs:
path: '*.nvda-addon'
```

**Source:** [AddonTemplate sconstruct](https://github.com/nvdaaddons/AddonTemplate/blob/master/sconstruct)
**Source:** [addonTemplate sconstruct](https://github.com/nvaccess/addonTemplate/blob/master/sconstruct)

---

Expand Down Expand Up @@ -650,6 +705,8 @@ NVDA's secure mode (Windows lock screen, UAC prompts) restricts addon behavior:
| NVDA-014 | Minor | **Missing SHA256 for store submission** -- required for Add-on Store integrity verification |
| NVDA-015 | Moderate | **Not using `config.conf.spec`** -- stores settings by writing files directly, bypassing profiles and validation |
| NVDA-016 | Serious | **Secure mode vulnerability** -- accesses file system or network without checking `NVDAState.shouldWriteToDisk()` |
| NVDA-017 | Critical | **32-bit native library on 64-bit NVDA** -- addon ships 32-bit `.dll` or uses 32-bit `ctypes` bindings incompatible with NVDA 2026.1+ (64-bit Python 3.13) |
| NVDA-018 | Serious | **`minimumNVDAVersion` below `2019.3.0`** -- Python 3 is required since NVDA 2019.3; earlier versions used Python 2 |

### Report Format

Expand All @@ -664,7 +721,7 @@ Reports include: addon name, date, NVDA version tested, severity summary table,
| NVDA Source Code | [github.com/nvaccess/nvda](https://github.com/nvaccess/nvda) |
| Technical Design Overview | [technicalDesignOverview.md](https://github.com/nvaccess/nvda/blob/master/projectDocs/design/technicalDesignOverview.md) |
| NVDA Developer Guide | [nvdaaddons/DevGuide wiki](https://github.com/nvdaaddons/devguide/wiki/NVDA%20Add-on%20Development%20Guide) |
| Community Addon Template | [nvdaaddons/AddonTemplate](https://github.com/nvdaaddons/AddonTemplate) |
| NVDA Addon Template | [nvaccess/addonTemplate](https://github.com/nvaccess/addonTemplate) |
| Add-on Store (addon-datastore) | [nvaccess/addon-datastore](https://github.com/nvaccess/addon-datastore) |
| Submission Guide | [submissionGuide.md](https://github.com/nvaccess/addon-datastore/blob/master/docs/submitters/submissionGuide.md) |
| JSON Metadata Schema | [jsonMetadata.md](https://github.com/nvaccess/addon-datastore/blob/master/docs/submitters/jsonMetadata.md) |
Expand Down
4 changes: 2 additions & 2 deletions .github/prompts/nvda-addon-specialist.prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Ask the user:
3. **Target application** (appModule only) -- The executable name (e.g., `notepad`, `chrome`)
4. **Summary** -- One-line description for the manifest
5. **Author name and URL** -- For manifest metadata
6. **Minimum NVDA version** -- Default: `2024.1`
7. **Last tested NVDA version** -- Default: `2025.1`
6. **Minimum NVDA version** -- Default: `2026.1`. The absolute floor is `2019.3` (first Python 3 release). If the addon ships native 64-bit DLLs, minimum must be `2026.1`.
7. **Last tested NVDA version** -- Default: `2026.1`
Comment on lines +35 to +36

Copilot AI Mar 12, 2026

Copy link

Choose a reason for hiding this comment

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

The prompt defaults minimumNVDAVersion to 2026.1, but this conflicts with the PR description (“new addon minimum version to 2025.1”) and with the guidance table elsewhere in the docs that says “New addon: 2025.1.0”. Please align these defaults (e.g., default to 2025.1 for pure-Python addons and call out 2026.1 only for addons shipping native 64-bit DLLs), or update the written guidance/PR description to match the intended policy.

Copilot uses AI. Check for mistakes.

### Step 2: Create Project Structure

Expand Down
Loading
Loading