a11y-computer-use 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. a11y_computer_use-0.1.1/.editorconfig +22 -0
  2. a11y_computer_use-0.1.1/.github/CODEOWNERS +3 -0
  3. a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/app_compatibility.yml +154 -0
  4. a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +188 -0
  5. a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  6. a11y_computer_use-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +78 -0
  7. a11y_computer_use-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  8. a11y_computer_use-0.1.1/.github/dependabot.yml +23 -0
  9. a11y_computer_use-0.1.1/.github/workflows/ci.yml +274 -0
  10. a11y_computer_use-0.1.1/.github/workflows/release.yml +56 -0
  11. a11y_computer_use-0.1.1/.gitignore +27 -0
  12. a11y_computer_use-0.1.1/CHANGELOG.md +178 -0
  13. a11y_computer_use-0.1.1/CITATION.cff +11 -0
  14. a11y_computer_use-0.1.1/CODE_OF_CONDUCT.md +86 -0
  15. a11y_computer_use-0.1.1/CONTRIBUTING.md +300 -0
  16. a11y_computer_use-0.1.1/LICENSE +201 -0
  17. a11y_computer_use-0.1.1/NOTICE +6 -0
  18. a11y_computer_use-0.1.1/PKG-INFO +347 -0
  19. a11y_computer_use-0.1.1/README.md +104 -0
  20. a11y_computer_use-0.1.1/SECURITY.md +176 -0
  21. a11y_computer_use-0.1.1/a11y_computer_use/__init__.py +8 -0
  22. a11y_computer_use-0.1.1/a11y_computer_use/__main__.py +6 -0
  23. a11y_computer_use-0.1.1/a11y_computer_use/act.py +822 -0
  24. a11y_computer_use-0.1.1/a11y_computer_use/adapters/__init__.py +22 -0
  25. a11y_computer_use-0.1.1/a11y_computer_use/adapters/anthropic_computer.py +287 -0
  26. a11y_computer_use-0.1.1/a11y_computer_use/adapters/base.py +625 -0
  27. a11y_computer_use-0.1.1/a11y_computer_use/adapters/openai_computer.py +310 -0
  28. a11y_computer_use-0.1.1/a11y_computer_use/agent.py +396 -0
  29. a11y_computer_use-0.1.1/a11y_computer_use/arena.py +410 -0
  30. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/_cu.js +42 -0
  31. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/_style.css +15 -0
  32. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/checkboxes.html +39 -0
  33. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/checkboxes.json +9 -0
  34. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/copy_value.html +41 -0
  35. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/copy_value.json +9 -0
  36. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown.html +51 -0
  37. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown.json +14 -0
  38. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown_custom.html +73 -0
  39. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/dropdown_custom.json +10 -0
  40. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/form_fill.html +31 -0
  41. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/form_fill.json +9 -0
  42. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field.html +36 -0
  43. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field.json +10 -0
  44. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/iframe_field_inner.html +34 -0
  45. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/long_list.html +141 -0
  46. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/long_list.json +9 -0
  47. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/menu.html +86 -0
  48. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/menu.json +9 -0
  49. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/modal_confirm.html +60 -0
  50. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/modal_confirm.json +9 -0
  51. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/search_filter.html +52 -0
  52. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/search_filter.json +9 -0
  53. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/similar_buttons.html +38 -0
  54. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/similar_buttons.json +9 -0
  55. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/table_row.html +48 -0
  56. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/table_row.json +9 -0
  57. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/tabs.html +57 -0
  58. a11y_computer_use-0.1.1/a11y_computer_use/arena_tasks/tabs.json +9 -0
  59. a11y_computer_use-0.1.1/a11y_computer_use/bench.py +116 -0
  60. a11y_computer_use-0.1.1/a11y_computer_use/capture.py +388 -0
  61. a11y_computer_use-0.1.1/a11y_computer_use/cli.py +455 -0
  62. a11y_computer_use-0.1.1/a11y_computer_use/doctor.py +457 -0
  63. a11y_computer_use-0.1.1/a11y_computer_use/drivers/__init__.py +64 -0
  64. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_atspi.py +636 -0
  65. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_atspi_events.py +144 -0
  66. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_cdp.py +283 -0
  67. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_cdp_ax.py +292 -0
  68. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_linux_input.py +379 -0
  69. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_linux_system.py +351 -0
  70. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_uia.py +182 -0
  71. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_win_input.py +114 -0
  72. a11y_computer_use-0.1.1/a11y_computer_use/drivers/_win_system.py +72 -0
  73. a11y_computer_use-0.1.1/a11y_computer_use/drivers/base.py +157 -0
  74. a11y_computer_use-0.1.1/a11y_computer_use/drivers/browser.py +784 -0
  75. a11y_computer_use-0.1.1/a11y_computer_use/drivers/linux.py +504 -0
  76. a11y_computer_use-0.1.1/a11y_computer_use/drivers/macos.py +142 -0
  77. a11y_computer_use-0.1.1/a11y_computer_use/drivers/windows.py +258 -0
  78. a11y_computer_use-0.1.1/a11y_computer_use/h2h.py +775 -0
  79. a11y_computer_use-0.1.1/a11y_computer_use/marks.py +65 -0
  80. a11y_computer_use-0.1.1/a11y_computer_use/observe.py +1555 -0
  81. a11y_computer_use-0.1.1/a11y_computer_use/overlay.py +283 -0
  82. a11y_computer_use-0.1.1/a11y_computer_use/providers.py +681 -0
  83. a11y_computer_use-0.1.1/a11y_computer_use/safety.py +818 -0
  84. a11y_computer_use-0.1.1/a11y_computer_use/schema.py +528 -0
  85. a11y_computer_use-0.1.1/a11y_computer_use/server.py +1926 -0
  86. a11y_computer_use-0.1.1/docs/agent-loop.md +134 -0
  87. a11y_computer_use-0.1.1/docs/benchmark.md +172 -0
  88. a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02-superseded.json +852 -0
  89. a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02.json +4938 -0
  90. a11y_computer_use-0.1.1/docs/benchmarks/h2h-2026-09-02.md +195 -0
  91. a11y_computer_use-0.1.1/docs/benchmarks/production-2026-09-04.json +322 -0
  92. a11y_computer_use-0.1.1/docs/benchmarks/production-2026-09-04.md +88 -0
  93. a11y_computer_use-0.1.1/docs/box-testbed.md +282 -0
  94. a11y_computer_use-0.1.1/docs/browser-backend.md +120 -0
  95. a11y_computer_use-0.1.1/docs/ci.md +136 -0
  96. a11y_computer_use-0.1.1/docs/concurrency.md +109 -0
  97. a11y_computer_use-0.1.1/docs/decisions/confirmation-gate.md +50 -0
  98. a11y_computer_use-0.1.1/docs/decisions/demand-validation.md +180 -0
  99. a11y_computer_use-0.1.1/docs/decisions/language-boundary.md +51 -0
  100. a11y_computer_use-0.1.1/docs/decisions/phase-0-review.md +58 -0
  101. a11y_computer_use-0.1.1/docs/decisions/plan-2026-07.md +281 -0
  102. a11y_computer_use-0.1.1/docs/decisions/stories.json +380 -0
  103. a11y_computer_use-0.1.1/docs/linux-port.md +92 -0
  104. a11y_computer_use-0.1.1/docs/observation-cost.md +159 -0
  105. a11y_computer_use-0.1.1/docs/production.md +127 -0
  106. a11y_computer_use-0.1.1/docs/provider-adapters.md +234 -0
  107. a11y_computer_use-0.1.1/docs/windows-port.md +48 -0
  108. a11y_computer_use-0.1.1/examples/README.md +136 -0
  109. a11y_computer_use-0.1.1/examples/agent_task.py +52 -0
  110. a11y_computer_use-0.1.1/examples/anthropic_computer_use.py +114 -0
  111. a11y_computer_use-0.1.1/examples/inprocess_python.py +47 -0
  112. a11y_computer_use-0.1.1/examples/mcp_subprocess.mjs +46 -0
  113. a11y_computer_use-0.1.1/examples/openai_computer_use.py +116 -0
  114. a11y_computer_use-0.1.1/examples/web_a11y_demo.py +105 -0
  115. a11y_computer_use-0.1.1/pyproject.toml +93 -0
  116. a11y_computer_use-0.1.1/tests/__init__.py +0 -0
  117. a11y_computer_use-0.1.1/tests/conftest.py +190 -0
  118. a11y_computer_use-0.1.1/tests/e2e/__init__.py +0 -0
  119. a11y_computer_use-0.1.1/tests/e2e/test_live_smoke.py +174 -0
  120. a11y_computer_use-0.1.1/tests/e2e/test_mcp_stdio.py +121 -0
  121. a11y_computer_use-0.1.1/tests/fixtures/.gitkeep +0 -0
  122. a11y_computer_use-0.1.1/tests/fixtures/__init__.py +0 -0
  123. a11y_computer_use-0.1.1/tests/fixtures/trees.py +161 -0
  124. a11y_computer_use-0.1.1/tests/test_act.py +652 -0
  125. a11y_computer_use-0.1.1/tests/test_adapters.py +793 -0
  126. a11y_computer_use-0.1.1/tests/test_agent.py +570 -0
  127. a11y_computer_use-0.1.1/tests/test_arena.py +276 -0
  128. a11y_computer_use-0.1.1/tests/test_ax_press.py +188 -0
  129. a11y_computer_use-0.1.1/tests/test_bench.py +63 -0
  130. a11y_computer_use-0.1.1/tests/test_box_scripts.py +163 -0
  131. a11y_computer_use-0.1.1/tests/test_browser.py +761 -0
  132. a11y_computer_use-0.1.1/tests/test_capture.py +234 -0
  133. a11y_computer_use-0.1.1/tests/test_cdp_reliability.py +293 -0
  134. a11y_computer_use-0.1.1/tests/test_cli.py +252 -0
  135. a11y_computer_use-0.1.1/tests/test_doctor.py +304 -0
  136. a11y_computer_use-0.1.1/tests/test_drivers.py +99 -0
  137. a11y_computer_use-0.1.1/tests/test_h2h.py +608 -0
  138. a11y_computer_use-0.1.1/tests/test_linux_desktop_live.py +280 -0
  139. a11y_computer_use-0.1.1/tests/test_linux_focus_safety.py +155 -0
  140. a11y_computer_use-0.1.1/tests/test_linux_live.py +310 -0
  141. a11y_computer_use-0.1.1/tests/test_linux_synthetic.py +385 -0
  142. a11y_computer_use-0.1.1/tests/test_linux_system_synthetic.py +127 -0
  143. a11y_computer_use-0.1.1/tests/test_marks.py +59 -0
  144. a11y_computer_use-0.1.1/tests/test_observe.py +910 -0
  145. a11y_computer_use-0.1.1/tests/test_overlay.py +36 -0
  146. a11y_computer_use-0.1.1/tests/test_providers.py +438 -0
  147. a11y_computer_use-0.1.1/tests/test_runtime_concurrency.py +310 -0
  148. a11y_computer_use-0.1.1/tests/test_runtime_scroll_safety.py +136 -0
  149. a11y_computer_use-0.1.1/tests/test_safety.py +415 -0
  150. a11y_computer_use-0.1.1/tests/test_safety_hardening.py +836 -0
  151. a11y_computer_use-0.1.1/tests/test_safety_persistence.py +456 -0
  152. a11y_computer_use-0.1.1/tests/test_scaffold.py +91 -0
  153. a11y_computer_use-0.1.1/tests/test_server.py +1032 -0
  154. a11y_computer_use-0.1.1/tests/test_windows_live.py +137 -0
@@ -0,0 +1,22 @@
1
+ # EditorConfig: https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ end_of_line = lf
7
+ insert_final_newline = true
8
+ trim_trailing_whitespace = true
9
+
10
+ [*.py]
11
+ indent_style = space
12
+ indent_size = 4
13
+
14
+ [*.{yml,yaml,json,toml}]
15
+ indent_style = space
16
+ indent_size = 2
17
+
18
+ # Markdown: 2-space list indentation; keep trailing double-space line breaks.
19
+ [*.md]
20
+ indent_style = space
21
+ indent_size = 2
22
+ trim_trailing_whitespace = false
@@ -0,0 +1,3 @@
1
+ # Every pull request requests a review from the maintainer.
2
+ # Mukhsin0508 is the configured git user for this repository (git config user.name).
3
+ * @Mukhsin0508
@@ -0,0 +1,154 @@
1
+ name: App compatibility report
2
+ description: An app whose accessibility tree is missing, partial or hostile. Say which roles showed up and whether the vision fallback worked.
3
+ title: "[app-compat] <app> on <platform>"
4
+ labels: ["app-compat"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ This template builds the per-app coverage table. Two signals matter most: what `desktop_snapshot` returned (a full snapshot with no clickable or editable element ends with a line beginning `note: no interactive elements were found`), and whether `screenshot` plus coordinate `click` got the task done when refs could not.
10
+
11
+ Values in a snapshot can contain private text. Redact before you paste. Secure fields never carry a value.
12
+
13
+ - type: input
14
+ id: app_name
15
+ attributes:
16
+ label: App name and version
17
+ placeholder: Telegram 11.2 / Slack 4.40 / LibreOffice Writer 24.8
18
+ validations:
19
+ required: true
20
+
21
+ - type: input
22
+ id: app_id
23
+ attributes:
24
+ label: App identifier
25
+ description: What the permission gate keys on. macOS bundle id, Windows process image name, Linux process comm name, or the CDP target (tab) id of the bound tab for the browser backend (the `id` field of the target in `http://127.0.0.1:9222/json`; paste the page URL as well).
26
+ placeholder: ru.keepcoder.Telegram / slack.exe / soffice.bin / <CDP target id> (https://app.example.com)
27
+ validations:
28
+ required: true
29
+
30
+ - type: dropdown
31
+ id: backend
32
+ attributes:
33
+ label: Backend
34
+ options:
35
+ - macOS (AXUIElement)
36
+ - Windows (UI Automation)
37
+ - Linux X11 or XWayland (AT-SPI2)
38
+ - Linux native Wayland (AT-SPI2)
39
+ - Browser (Chromium over CDP)
40
+ validations:
41
+ required: true
42
+
43
+ - type: dropdown
44
+ id: toolkit
45
+ attributes:
46
+ label: UI toolkit, if you know it
47
+ options:
48
+ - Native (AppKit, SwiftUI, Win32, WinUI, GTK, Qt)
49
+ - Chromium or Electron
50
+ - Custom-drawn (game engine, Flutter, a canvas-drawn client)
51
+ - Java (Swing, JavaFX)
52
+ - Not sure
53
+
54
+ - type: dropdown
55
+ id: scope_tried
56
+ attributes:
57
+ label: Snapshot scopes tried
58
+ description: The handoff note suggests `scope="app"` when `scope="window"` came back empty.
59
+ options:
60
+ - window only
61
+ - app only
62
+ - both window and app
63
+ validations:
64
+ required: true
65
+
66
+ - type: dropdown
67
+ id: tree_state
68
+ attributes:
69
+ label: What did desktop_snapshot return?
70
+ options:
71
+ - Nothing actionable, the handoff note appeared (no clickable or editable element)
72
+ - A shell only (window and groups, no buttons or fields)
73
+ - Partial (some controls present, others missing)
74
+ - Controls present but untitled (no title, description or value, so refs are unusable)
75
+ - A full tree, but actions fail (press returns False, stale_ref, wrong bounds)
76
+ - The snapshot timed out or raised an error
77
+ validations:
78
+ required: true
79
+
80
+ - type: checkboxes
81
+ id: role_coverage
82
+ attributes:
83
+ label: Role coverage
84
+ description: Tick each kind of element that appears in the snapshot with a usable title or value. Role names are the snapshot's lowercase forms.
85
+ options:
86
+ - label: Buttons, menu items and links (button, menuitem, link) with titles
87
+ - label: Text inputs (textfield, textarea, searchfield) marked edit
88
+ - label: Password fields as securetextfield
89
+ - label: Toggles (checkbox, radiobutton) with a checked or unchecked flag
90
+ - label: Lists, tables and outlines (list, table, outline, grid, row, cell)
91
+ - label: Tab groups and toolbars
92
+ - label: Web content (webarea) with children
93
+ - label: Static text and images with titles
94
+
95
+ - type: textarea
96
+ id: snapshot
97
+ attributes:
98
+ label: Snapshot excerpt
99
+ description: The header line `[snap-N] <app> (<scope>)` and enough element lines to show what is missing. Include the trailing note if there was one.
100
+ render: text
101
+ validations:
102
+ required: true
103
+
104
+ - type: dropdown
105
+ id: web_a11y
106
+ attributes:
107
+ label: Chromium or Electron apps only, did the accessibility force-enable help?
108
+ description: On macOS a11y-computer-use sets `AXManualAccessibility` and `AXEnhancedUserInterface` on the app element once per process; on Linux it sets `org.a11y.Status` on the session bus. Set `A11Y_COMPUTER_USE_NO_WEB_A11Y=1` to compare with it off; `examples/web_a11y_demo.py` prints a before and after on macOS.
109
+ options:
110
+ - Not applicable, the app is not Chromium or Electron
111
+ - Yes, the tree populated after the first snapshot
112
+ - Partly, some web content appeared but not the whole page
113
+ - No, the tree stayed empty with the force-enable on
114
+ - Not compared
115
+
116
+ - type: dropdown
117
+ id: vision_fallback
118
+ attributes:
119
+ label: Did the vision fallback work?
120
+ description: The vision path is `screenshot` (downscaled to 1280 px on the long edge by default), `zoom` for a native-resolution crop, then `click` by x and y in display-qualified physical pixels. On macOS it needs the Screen Recording grant; on native Wayland it needs `grim`; on Windows `screenshot` and `zoom` are not implemented yet.
121
+ options:
122
+ - Yes, screenshot plus coordinate click completed the task
123
+ - Partly, the screenshot worked but coordinate clicks landed off target or the app ignored synthetic input
124
+ - No, screenshot failed (permission_denied_screen, unsupported, or NotImplementedError on Windows)
125
+ - Not tried
126
+ validations:
127
+ required: true
128
+
129
+ - type: textarea
130
+ id: actions
131
+ attributes:
132
+ label: Which actions worked and which did not
133
+ description: For example `click(ref)` through the a11y press versus a synthetic click with `A11Y_COMPUTER_USE_AX_CLICKS=0`, `set_value`, `type`, `scroll` with `into_view=true`. Paste the error strings.
134
+
135
+ - type: textarea
136
+ id: native_inspector
137
+ attributes:
138
+ label: What a native accessibility inspector shows
139
+ description: Accessibility Inspector (Xcode) on macOS, Accessibility Insights on Windows, Accerciser on Linux, `chrome://accessibility` for Chromium. Does the native inspector see more than a11y-computer-use did? A screenshot of the inspector helps.
140
+
141
+ - type: textarea
142
+ id: doctor
143
+ attributes:
144
+ label: Output of a11y-computer-use doctor
145
+ render: text
146
+
147
+ - type: checkboxes
148
+ id: checklist
149
+ attributes:
150
+ label: Checklist
151
+ options:
152
+ - label: The pastes above contain no passwords, tokens or private text.
153
+ required: true
154
+ - label: I searched the open and closed issues for this app.
@@ -0,0 +1,188 @@
1
+ name: Bug report
2
+ description: A tool call, CLI command or Runtime method did the wrong thing. Include the doctor report, the snapshot excerpt and the audit line.
3
+ title: "[bug] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for the report. Two things before you start.
10
+
11
+ Redact secrets. The audit log keeps typed text and key chords in the clear unless the field was secure; clipboard writes and secure fields are already written as `[REDACTED]`. Read every paste before you submit.
12
+
13
+ Known gaps are not bugs. Raw coordinate input (click, drag, scroll, key chords) returns `unsupported` on native Wayland by design; ref-based press, `set_value` and typing into a focused field still work there (docs/linux-port.md). A `NotImplementedError` raised from `a11y_computer_use/drivers/windows.py` names the native API that primitive will use and marks a known gap. `window` supports `list` and `raise` only, and `app quit` is not exposed; both raise `ValueError`. For any of these, open a feature request instead.
14
+
15
+ - type: dropdown
16
+ id: backend
17
+ attributes:
18
+ label: Backend
19
+ description: The driver the server ran on. The default is the current OS; `A11Y_COMPUTER_USE_DRIVER=browser` selects the browser backend explicitly.
20
+ options:
21
+ - macOS (AXUIElement, CGEvent)
22
+ - Windows (UI Automation, SendInput)
23
+ - Linux X11 or XWayland (AT-SPI2, XTEST)
24
+ - Linux native Wayland (AT-SPI2 only, WAYLAND_DISPLAY set and no DISPLAY)
25
+ - Browser (Chromium over CDP)
26
+ validations:
27
+ required: true
28
+
29
+ - type: input
30
+ id: os_version
31
+ attributes:
32
+ label: OS and version
33
+ description: For the browser backend, also give the Chromium version and whether it ran headless.
34
+ placeholder: macOS 15.5 / Windows 11 / Ubuntu 24.04 with GNOME on Wayland / Chrome 128 headless
35
+ validations:
36
+ required: true
37
+
38
+ - type: input
39
+ id: app
40
+ attributes:
41
+ label: App under control
42
+ description: The identifier the permission gate keys on. macOS uses the bundle id, Windows the process image name, Linux the process comm name, the browser backend the CDP tab id (paste the page URL as well).
43
+ placeholder: com.apple.finder / notepad.exe / gedit / https://example.com
44
+ validations:
45
+ required: true
46
+
47
+ - type: dropdown
48
+ id: tool
49
+ attributes:
50
+ label: Tool or command
51
+ description: The MCP tool, CLI subcommand or Python entry point that misbehaved.
52
+ options:
53
+ - desktop_snapshot
54
+ - find
55
+ - screenshot
56
+ - zoom
57
+ - click
58
+ - type
59
+ - key
60
+ - scroll
61
+ - drag
62
+ - wait_for
63
+ - act
64
+ - set_value
65
+ - scroll_to_find
66
+ - app
67
+ - window
68
+ - clipboard
69
+ - console (browser backend only)
70
+ - network (browser backend only)
71
+ - a11y-computer-use mcp (server startup or handshake)
72
+ - a11y-computer-use doctor
73
+ - a11y-computer-use snapshot
74
+ - a11y-computer-use run-once
75
+ - a11y-computer-use bench
76
+ - a11y-computer-use agent (the reference agent loop)
77
+ - Python API (server.Runtime, safety, drivers)
78
+ - Not sure
79
+ validations:
80
+ required: true
81
+
82
+ - type: dropdown
83
+ id: error_code
84
+ attributes:
85
+ label: Error code
86
+ description: >-
87
+ The code at the start of the error string, if there was one. Structured errors arrive as
88
+ `<code>: <message> | detail: {...} | hint: ...`; safety refusals as `<verdict>: <reason>`.
89
+ options:
90
+ - stale_ref
91
+ - permission_denied_accessibility
92
+ - permission_denied_screen
93
+ - secure_field
94
+ - focus_changed
95
+ - app_not_found
96
+ - timeout
97
+ - confirmation_declined
98
+ - unsupported
99
+ - needs_permission (a safety verdict, the app has no grant)
100
+ - deny (a safety verdict, deny list or insufficient tier)
101
+ - NotImplementedError
102
+ - ValueError
103
+ - Another traceback (paste it below)
104
+ - No error, the behaviour was wrong
105
+
106
+ - type: input
107
+ id: version
108
+ attributes:
109
+ label: a11y-computer-use version and commit
110
+ description: a11y-computer-use is not published on PyPI, so name the commit you installed from (`git rev-parse --short HEAD`) and the extras you installed.
111
+ placeholder: 0.0.1 at <short sha>, pip install -e '.[dev,browser]'
112
+ validations:
113
+ required: true
114
+
115
+ - type: textarea
116
+ id: doctor
117
+ attributes:
118
+ label: Output of a11y-computer-use doctor
119
+ description: Run `a11y-computer-use doctor` (from a clone, `.venv/bin/a11y-computer-use doctor`) in the same host context that runs the server. On macOS the grants attach to the responsible app, and the report names it. Paste the whole output. If doctor itself fails on your platform, paste that traceback instead.
120
+ render: text
121
+ validations:
122
+ required: true
123
+
124
+ - type: textarea
125
+ id: snapshot
126
+ attributes:
127
+ label: Snapshot excerpt
128
+ description: >-
129
+ The relevant lines of the `desktop_snapshot` or `find` output. Keep the header line
130
+ `[snap-N] <app> (<scope>)` and the element lines around the target ref. If the snapshot ended
131
+ with a line beginning `note: no interactive elements were found`, use the app compatibility
132
+ template instead.
133
+ render: text
134
+
135
+ - type: textarea
136
+ id: steps
137
+ attributes:
138
+ label: Steps to reproduce
139
+ description: The tool calls in order, with their arguments. For `act`, paste the steps list. For the CLI, paste the exact command line.
140
+ placeholder: |
141
+ 1. desktop_snapshot(app="com.apple.TextEdit", scope="window")
142
+ 2. click(ref="e7", verify=true)
143
+ validations:
144
+ required: true
145
+
146
+ - type: textarea
147
+ id: expected
148
+ attributes:
149
+ label: Expected behaviour
150
+ validations:
151
+ required: true
152
+
153
+ - type: textarea
154
+ id: actual
155
+ attributes:
156
+ label: Actual behaviour
157
+ description: Paste the full error string or traceback, and the `effect:` diff if you used `verify=true`.
158
+ render: text
159
+ validations:
160
+ required: true
161
+
162
+ - type: textarea
163
+ id: audit
164
+ attributes:
165
+ label: Audit log entry
166
+ description: The JSONL line(s) for the failing action. The log is at `~/.a11y-computer-use/audit/<YYYY-MM-DD>.jsonl`, one file per UTC day, and every gated call is written, including refusals. Redact `params.text` and `params.chord` if they contain anything private.
167
+ render: json
168
+
169
+ - type: textarea
170
+ id: environment
171
+ attributes:
172
+ label: Environment variables and host
173
+ description: Any `A11Y_COMPUTER_USE_*` variables in effect and the MCP host that started the server (Claude Code via `claude mcp add`, a Node client, an in-process `server.Runtime`, `a11y-computer-use run-once`, `a11y-computer-use agent`). `A11Y_COMPUTER_USE_AX_CLICKS` and `A11Y_COMPUTER_USE_CONFIRM` are read once when `a11y_computer_use.server` is imported, so they must be set in the host process before it spawns the server.
174
+ placeholder: |
175
+ A11Y_COMPUTER_USE_DRIVER=browser
176
+ A11Y_COMPUTER_USE_CDP_ENDPOINT=http://127.0.0.1:9222
177
+ host = Claude Code
178
+
179
+ - type: checkboxes
180
+ id: checklist
181
+ attributes:
182
+ label: Checklist
183
+ options:
184
+ - label: I searched the open and closed issues for this problem.
185
+ required: true
186
+ - label: The pastes above contain no passwords, tokens or private text.
187
+ required: true
188
+ - label: I reproduced this on the current head of the branch I installed from.
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Questions and ideas
4
+ url: https://github.com/Perception-Dynamics-Inc/a11y-computer-use/issues
5
+ about: Search existing issues first. Ask how to embed a11y-computer-use, share an integration, or discuss the roadmap by opening an issue that starts from PLAN.md.
6
+ - name: Security vulnerabilities
7
+ url: https://github.com/Perception-Dynamics-Inc/a11y-computer-use/security/policy
8
+ about: Do not open a public issue for a vulnerability. SECURITY.md describes how to report one privately.
@@ -0,0 +1,78 @@
1
+ name: Feature request
2
+ description: Propose a new tool, a driver primitive, a safety behavior or an integration surface.
3
+ title: "[feature] "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ a11y-computer-use is an embeddable Driver plus an MCP surface: pruned accessibility snapshots, element refs, and a safety layer. PLAN.md section 4 lists what the project deliberately does not build and section 9 lists the roadmap phases. Skim both first so the proposal lands in the right place.
10
+
11
+ - type: textarea
12
+ id: problem
13
+ attributes:
14
+ label: Problem
15
+ description: What are you trying to make an agent do that a11y-computer-use cannot do today? Name the app and the platform.
16
+ validations:
17
+ required: true
18
+
19
+ - type: dropdown
20
+ id: area
21
+ attributes:
22
+ label: Area
23
+ description: Pick every part this touches.
24
+ multiple: true
25
+ options:
26
+ - Observation (desktop_snapshot, find, diff mode, refs and re-resolution)
27
+ - Action (click, type, key, scroll, drag, act, set_value, scroll_to_find, wait_for)
28
+ - Vision path (screenshot, zoom, Set-of-Mark)
29
+ - Safety (tiers, grants, confirmation gate, audit log, secure fields)
30
+ - macOS driver
31
+ - Windows driver
32
+ - Linux driver (AT-SPI2, X11, Wayland)
33
+ - Browser driver (CDP, console, network)
34
+ - MCP surface and host integration
35
+ - CLI (mcp, doctor, snapshot, run-once, bench, agent)
36
+ - Python API (server.Runtime, safety, drivers)
37
+ - Docs and examples
38
+ - Packaging and release
39
+ - Something else
40
+ validations:
41
+ required: true
42
+
43
+ - type: textarea
44
+ id: proposal
45
+ attributes:
46
+ label: Proposed change
47
+ description: For a new MCP tool, give the signature and the safety tier you expect it to gate at (`read`, `click` or `full`). For a driver primitive, name the native API on each backend you know. For a safety change, say what the audit entry should record.
48
+ validations:
49
+ required: true
50
+
51
+ - type: textarea
52
+ id: workarounds
53
+ attributes:
54
+ label: Workarounds you tried
55
+ description: Which existing tools you combined (for example `find` followed by `act`, or `screenshot` followed by a coordinate `click`) and where they fell short.
56
+
57
+ - type: dropdown
58
+ id: backends
59
+ attributes:
60
+ label: Backends this should cover
61
+ multiple: true
62
+ options:
63
+ - macOS
64
+ - Windows
65
+ - Linux (X11 or XWayland)
66
+ - Linux (native Wayland)
67
+ - Browser (CDP)
68
+ - Platform-free core (observe, act, safety, server)
69
+
70
+ - type: checkboxes
71
+ id: checklist
72
+ attributes:
73
+ label: Checklist
74
+ options:
75
+ - label: I checked PLAN.md and the open issues for this idea.
76
+ required: true
77
+ - label: I can help implement it.
78
+ - label: I can test it on the backends selected above.
@@ -0,0 +1,50 @@
1
+ ## Summary
2
+
3
+ What changed and why. Link the issue if there is one.
4
+
5
+ ## Platforms touched
6
+
7
+ - [ ] Platform-free core (observe, act, safety, schema, server, cli)
8
+ - [ ] macOS driver (a11y_computer_use/drivers/macos.py and the observe, act, capture modules it delegates to)
9
+ - [ ] Windows driver (a11y_computer_use/drivers/windows.py, _uia, _win_input, _win_system)
10
+ - [ ] Linux driver (a11y_computer_use/drivers/linux.py, _atspi, _linux_input, _linux_system)
11
+ - [ ] Browser driver (a11y_computer_use/drivers/browser.py, _cdp, _cdp_ax)
12
+ - [ ] CI workflow (.github/workflows/ci.yml)
13
+ - [ ] Docs or examples only
14
+
15
+ ## Tests run
16
+
17
+ Paste the summary line of each run and name the skips you saw.
18
+
19
+ ```text
20
+ .venv/bin/pytest -q
21
+ <summary line, for example: N passed, M skipped>
22
+ ```
23
+
24
+ Live runs, where the change touches them:
25
+
26
+ - [ ] macOS live tests ran with the Accessibility and Screen Recording grants held by the test process. Without the grants they skip with "Accessibility TCC grant missing"; `a11y-computer-use doctor` shows the grant state.
27
+ - [ ] Windows live UIA tests: `pytest tests/test_windows_live.py -q -s` on Windows.
28
+ - [ ] Linux live AT-SPI2 tests: `pytest tests/test_linux_live.py` under `xvfb-run` and `dbus-run-session`, the way the linux job in ci.yml runs them.
29
+ - [ ] Browser live tests: `pytest tests/test_browser.py -k live` and `pytest tests/test_arena.py -k live` against a Chromium started with `--remote-debugging-port=9222`, with `A11Y_COMPUTER_USE_CDP_ENDPOINT` pointing at it.
30
+ - [ ] Not applicable, the change has no live path.
31
+
32
+ If a tool was added or removed: `tests/test_server.py` pins the tool list in `EXPECTED_TOOLS`, and `tests/test_browser.py` asserts that `console` and `network` exist only on the browser backend. Update both, and every doc that states the count.
33
+
34
+ ## Docs updated
35
+
36
+ - [ ] README.md
37
+ - [ ] docs/ (name the file)
38
+ - [ ] Docstrings and the MCP tool descriptions in a11y_computer_use/server.py
39
+ - [ ] docs/decisions/plan-2026-07.md, where the roadmap status changed
40
+ - [ ] No doc change needed (say why)
41
+
42
+ ## Claims
43
+
44
+ - [ ] Every sentence in this PR, its commits and the docs it touches states what is implemented and verified. Anything gated, unsupported, skipped in CI or tested only through a fake transport is labelled that way in the same sentence.
45
+ - [ ] Every number I wrote (tool counts, test counts, token figures, timings) was measured on this branch, and the command that produced it is in this description.
46
+
47
+ ## Commits
48
+
49
+ - [ ] Commit messages carry no `Co-Authored-By` or "Generated with" trailers. The message ends at the body.
50
+ - [ ] The branch is rebased on the target branch and CI is green, or the failing job is explained above.
@@ -0,0 +1,23 @@
1
+ # Dependabot keeps the Python dependencies declared in pyproject.toml and the
2
+ # actions used by .github/workflows current. Both ecosystems are checked weekly.
3
+ version: 2
4
+ updates:
5
+ - package-ecosystem: pip
6
+ directory: /
7
+ schedule:
8
+ interval: weekly
9
+ commit-message:
10
+ prefix: deps
11
+ ignore:
12
+ # a11y_computer_use/server.py imports FastMCP from mcp.server.fastmcp, which
13
+ # mcp 2.0 removed; pyproject.toml pins mcp<2 for that reason. Skip the
14
+ # major bump until the import is migrated.
15
+ - dependency-name: mcp
16
+ update-types: ["version-update:semver-major"]
17
+
18
+ - package-ecosystem: github-actions
19
+ directory: /
20
+ schedule:
21
+ interval: weekly
22
+ commit-message:
23
+ prefix: ci