screenhand 0.2.0 → 0.3.1

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 (212) hide show
  1. package/README.md +165 -446
  2. package/bin/darwin-arm64/macos-bridge +0 -0
  3. package/dist/mcp-desktop.js +3615 -400
  4. package/dist/scripts/export-help-center.js +112 -0
  5. package/dist/scripts/marketing-loop.js +117 -0
  6. package/dist/scripts/observer-daemon.js +288 -0
  7. package/dist/scripts/orchestrator-daemon.js +399 -0
  8. package/dist/scripts/threads-campaign.js +208 -0
  9. package/dist/src/community/fetcher.js +109 -0
  10. package/dist/src/community/index.js +6 -0
  11. package/dist/src/community/publisher.js +191 -0
  12. package/dist/src/community/remote-api.js +121 -0
  13. package/dist/src/community/types.js +3 -0
  14. package/dist/src/community/validator.js +95 -0
  15. package/dist/src/context-tracker.js +489 -0
  16. package/dist/src/ingestion/coverage-auditor.js +233 -0
  17. package/dist/src/ingestion/doc-parser.js +164 -0
  18. package/dist/src/ingestion/index.js +8 -0
  19. package/dist/src/ingestion/menu-scanner.js +152 -0
  20. package/dist/src/ingestion/reference-merger.js +186 -0
  21. package/dist/src/ingestion/shortcut-extractor.js +180 -0
  22. package/dist/src/ingestion/tutorial-extractor.js +170 -0
  23. package/dist/src/ingestion/types.js +3 -0
  24. package/dist/src/jobs/manager.js +82 -14
  25. package/dist/src/jobs/runner.js +138 -15
  26. package/dist/src/learning/engine.js +356 -0
  27. package/dist/src/learning/index.js +9 -0
  28. package/dist/src/learning/locator-policy.js +120 -0
  29. package/dist/src/learning/pattern-policy.js +89 -0
  30. package/dist/src/learning/recovery-policy.js +116 -0
  31. package/dist/src/learning/sensor-policy.js +115 -0
  32. package/dist/src/learning/timing-model.js +204 -0
  33. package/dist/src/learning/topology-policy.js +90 -0
  34. package/dist/src/learning/types.js +9 -0
  35. package/dist/src/logging/timeline-logger.js +4 -1
  36. package/dist/src/memory/playbook-seeds.js +200 -0
  37. package/dist/src/memory/recall.js +60 -8
  38. package/dist/src/memory/service.js +30 -5
  39. package/dist/src/memory/store.js +34 -5
  40. package/dist/src/native/bridge-client.js +253 -31
  41. package/dist/src/observer/state.js +199 -0
  42. package/dist/src/observer/types.js +43 -0
  43. package/dist/src/orchestrator/state.js +68 -0
  44. package/dist/src/orchestrator/types.js +22 -0
  45. package/dist/src/perception/ax-source.js +162 -0
  46. package/dist/src/perception/cdp-source.js +162 -0
  47. package/dist/src/perception/coordinator.js +771 -0
  48. package/dist/src/perception/frame-differ.js +287 -0
  49. package/dist/src/perception/index.js +22 -0
  50. package/dist/src/perception/manager.js +199 -0
  51. package/dist/src/perception/types.js +47 -0
  52. package/dist/src/perception/vision-source.js +399 -0
  53. package/dist/src/planner/deterministic.js +298 -0
  54. package/dist/src/planner/executor.js +870 -0
  55. package/dist/src/planner/goal-store.js +92 -0
  56. package/dist/src/planner/index.js +21 -0
  57. package/dist/src/planner/planner.js +520 -0
  58. package/dist/src/planner/tool-registry.js +71 -0
  59. package/dist/src/planner/types.js +22 -0
  60. package/dist/src/platform/explorer.js +213 -0
  61. package/dist/src/platform/help-center-markdown.js +527 -0
  62. package/dist/src/platform/learner.js +257 -0
  63. package/dist/src/playbook/engine.js +296 -11
  64. package/dist/src/playbook/mcp-recorder.js +204 -0
  65. package/dist/src/playbook/recorder.js +3 -2
  66. package/dist/src/playbook/runner.js +1 -1
  67. package/dist/src/playbook/store.js +139 -10
  68. package/dist/src/recovery/detectors.js +156 -0
  69. package/dist/src/recovery/engine.js +327 -0
  70. package/dist/src/recovery/index.js +20 -0
  71. package/dist/src/recovery/strategies.js +274 -0
  72. package/dist/src/recovery/types.js +20 -0
  73. package/dist/src/runtime/accessibility-adapter.js +55 -18
  74. package/dist/src/runtime/applescript-adapter.js +8 -2
  75. package/dist/src/runtime/cdp-chrome-adapter.js +1 -1
  76. package/dist/src/runtime/executor.js +23 -3
  77. package/dist/src/runtime/locator-cache.js +24 -2
  78. package/dist/src/runtime/service.js +59 -15
  79. package/dist/src/runtime/session-manager.js +4 -1
  80. package/dist/src/runtime/vision-adapter.js +2 -1
  81. package/dist/src/state/app-map-types.js +72 -0
  82. package/dist/src/state/app-map.js +1974 -0
  83. package/dist/src/state/entity-tracker.js +108 -0
  84. package/dist/src/state/fusion.js +96 -0
  85. package/dist/src/state/index.js +21 -0
  86. package/dist/src/state/ladder-generator.js +236 -0
  87. package/dist/src/state/persistence.js +156 -0
  88. package/dist/src/state/types.js +17 -0
  89. package/dist/src/state/world-model.js +1456 -0
  90. package/dist/src/util/atomic-write.js +19 -4
  91. package/dist/src/util/sanitize.js +146 -0
  92. package/dist-app-maps/com.figma.Desktop.json +959 -0
  93. package/dist-app-maps/com.hnc.Discord.json +1146 -0
  94. package/dist-app-maps/notion.id.json +2831 -0
  95. package/dist-playbooks/canva-screenhand-carousel.json +445 -0
  96. package/dist-playbooks/codex-desktop.json +76 -0
  97. package/dist-playbooks/competitor-research-stack.json +122 -0
  98. package/dist-playbooks/davinci-color-grade.json +153 -0
  99. package/dist-playbooks/davinci-edit-timeline.json +162 -0
  100. package/dist-playbooks/davinci-render.json +114 -0
  101. package/dist-playbooks/devto.json +52 -0
  102. package/dist-playbooks/discord.json +41 -0
  103. package/dist-playbooks/google-flow-create-project.json +59 -0
  104. package/dist-playbooks/google-flow-edit-image.json +90 -0
  105. package/dist-playbooks/google-flow-edit-video.json +90 -0
  106. package/dist-playbooks/google-flow-generate-image.json +68 -0
  107. package/dist-playbooks/google-flow-generate-video.json +191 -0
  108. package/dist-playbooks/google-flow-open-project.json +48 -0
  109. package/dist-playbooks/google-flow-open-scenebuilder.json +64 -0
  110. package/dist-playbooks/google-flow-search-assets.json +64 -0
  111. package/dist-playbooks/instagram.json +57 -0
  112. package/dist-playbooks/linkedin.json +52 -0
  113. package/dist-playbooks/n8n.json +43 -0
  114. package/dist-playbooks/reddit.json +52 -0
  115. package/dist-playbooks/threads.json +59 -0
  116. package/dist-playbooks/x-twitter.json +59 -0
  117. package/dist-playbooks/youtube.json +59 -0
  118. package/dist-references/canva.json +646 -0
  119. package/dist-references/codex-desktop.json +305 -0
  120. package/dist-references/davinci-resolve-keyboard.json +594 -0
  121. package/dist-references/davinci-resolve-menu-map.json +1139 -0
  122. package/dist-references/davinci-resolve-menus-batch1.json +116 -0
  123. package/dist-references/davinci-resolve-menus-batch2.json +372 -0
  124. package/dist-references/davinci-resolve-menus-batch3.json +330 -0
  125. package/dist-references/davinci-resolve-menus-batch4.json +297 -0
  126. package/dist-references/davinci-resolve-shortcuts.json +333 -0
  127. package/dist-references/devpost.json +186 -0
  128. package/dist-references/devto.json +317 -0
  129. package/dist-references/discord.json +549 -0
  130. package/dist-references/figma.json +1186 -0
  131. package/dist-references/finder.json +146 -0
  132. package/dist-references/google-ads-transparency.json +95 -0
  133. package/dist-references/google-flow.json +649 -0
  134. package/dist-references/instagram.json +341 -0
  135. package/dist-references/linkedin.json +324 -0
  136. package/dist-references/meta-ad-library.json +86 -0
  137. package/dist-references/n8n.json +387 -0
  138. package/dist-references/notes.json +27 -0
  139. package/dist-references/notion.json +163 -0
  140. package/dist-references/reddit.json +341 -0
  141. package/dist-references/threads.json +337 -0
  142. package/dist-references/x-twitter.json +403 -0
  143. package/dist-references/youtube.json +373 -0
  144. package/native/macos-bridge/Package.swift +22 -0
  145. package/native/macos-bridge/Sources/AccessibilityBridge.swift +482 -0
  146. package/native/macos-bridge/Sources/AppManagement.swift +339 -0
  147. package/native/macos-bridge/Sources/CoreGraphicsBridge.swift +537 -0
  148. package/native/macos-bridge/Sources/ObserverBridge.swift +120 -0
  149. package/native/macos-bridge/Sources/StreamCapture.swift +136 -0
  150. package/native/macos-bridge/Sources/VisionBridge.swift +238 -0
  151. package/native/macos-bridge/Sources/main.swift +498 -0
  152. package/native/windows-bridge/AppManagement.cs +234 -0
  153. package/native/windows-bridge/InputBridge.cs +436 -0
  154. package/native/windows-bridge/Program.cs +270 -0
  155. package/native/windows-bridge/ScreenCapture.cs +453 -0
  156. package/native/windows-bridge/UIAutomationBridge.cs +571 -0
  157. package/native/windows-bridge/WindowsBridge.csproj +17 -0
  158. package/package.json +12 -1
  159. package/scripts/postinstall.cjs +127 -0
  160. package/dist/.audit-log.jsonl +0 -55
  161. package/dist/.screenhand/memory/.lock +0 -1
  162. package/dist/.screenhand/memory/actions.jsonl +0 -85
  163. package/dist/.screenhand/memory/errors.jsonl +0 -5
  164. package/dist/.screenhand/memory/errors.jsonl.bak +0 -4
  165. package/dist/.screenhand/memory/state.json +0 -35
  166. package/dist/.screenhand/memory/state.json.bak +0 -35
  167. package/dist/.screenhand/memory/strategies.jsonl +0 -12
  168. package/dist/agent/cli.js +0 -73
  169. package/dist/agent/loop.js +0 -258
  170. package/dist/config.js +0 -9
  171. package/dist/index.js +0 -56
  172. package/dist/logging/timeline-logger.js +0 -29
  173. package/dist/mcp/mcp-stdio-server.js +0 -448
  174. package/dist/mcp/server.js +0 -347
  175. package/dist/mcp-entry.js +0 -59
  176. package/dist/memory/recall.js +0 -160
  177. package/dist/memory/research.js +0 -98
  178. package/dist/memory/seeds.js +0 -89
  179. package/dist/memory/session.js +0 -161
  180. package/dist/memory/store.js +0 -391
  181. package/dist/memory/types.js +0 -4
  182. package/dist/monitor/codex-monitor.js +0 -377
  183. package/dist/monitor/task-queue.js +0 -84
  184. package/dist/monitor/types.js +0 -49
  185. package/dist/native/bridge-client.js +0 -174
  186. package/dist/native/macos-bridge-client.js +0 -5
  187. package/dist/npm-publish-helper.js +0 -117
  188. package/dist/npm-token-cdp.js +0 -113
  189. package/dist/npm-token-create.js +0 -135
  190. package/dist/npm-token-finish.js +0 -126
  191. package/dist/playbook/engine.js +0 -193
  192. package/dist/playbook/index.js +0 -4
  193. package/dist/playbook/recorder.js +0 -519
  194. package/dist/playbook/runner.js +0 -392
  195. package/dist/playbook/store.js +0 -166
  196. package/dist/playbook/types.js +0 -4
  197. package/dist/runtime/accessibility-adapter.js +0 -377
  198. package/dist/runtime/app-adapter.js +0 -48
  199. package/dist/runtime/applescript-adapter.js +0 -283
  200. package/dist/runtime/ax-role-map.js +0 -80
  201. package/dist/runtime/browser-adapter.js +0 -36
  202. package/dist/runtime/cdp-chrome-adapter.js +0 -505
  203. package/dist/runtime/composite-adapter.js +0 -205
  204. package/dist/runtime/executor.js +0 -250
  205. package/dist/runtime/locator-cache.js +0 -12
  206. package/dist/runtime/planning-loop.js +0 -47
  207. package/dist/runtime/service.js +0 -372
  208. package/dist/runtime/session-manager.js +0 -28
  209. package/dist/runtime/state-observer.js +0 -105
  210. package/dist/runtime/vision-adapter.js +0 -208
  211. package/dist/test-mcp-protocol.js +0 -138
  212. package/dist/types.js +0 -1
@@ -0,0 +1,305 @@
1
+ {
2
+ "id": "codex-desktop",
3
+ "name": "Codex Desktop App Automation",
4
+ "description": "Battle-tested playbook for OpenAI Codex desktop app automation via CDP. Covers thread creation, prompt submission, result reading, sidebar navigation, and menu actions. Requires launching Codex with --remote-debugging-port flag.",
5
+ "platform": "codex-desktop",
6
+ "bundleId": "com.openai.codex",
7
+ "cdpPort": 9333,
8
+ "version": "2.0.0",
9
+ "urlPatterns": ["app://-/index.html*"],
10
+ "tags": ["codex", "openai", "desktop", "electron", "cdp", "ai-agent"],
11
+ "successCount": 18,
12
+ "failCount": 1,
13
+
14
+ "urls": {
15
+ "cdp_list": "http://127.0.0.1:9333/json/list",
16
+ "cdp_browser": "http://127.0.0.1:9333/json/version",
17
+ "app_page": "app://-/index.html?hostId=local"
18
+ },
19
+
20
+ "launch": {
21
+ "command": "/Applications/Codex.app/Contents/MacOS/Codex",
22
+ "args": ["--remote-debugging-port=9333"],
23
+ "alt_command": "open -a Codex",
24
+ "alt_args": ["--args", "--remote-debugging-port=9333"],
25
+ "bundleId": "com.openai.codex",
26
+ "startup_wait_ms": 5000,
27
+ "notes": "Must launch with --remote-debugging-port to enable CDP. Default port 9333 avoids conflict with Chrome on 9222."
28
+ },
29
+
30
+ "selectors": {
31
+ "prompt": {
32
+ "editor": ".ProseMirror",
33
+ "editor_contenteditable": ".ProseMirror[contenteditable='true']",
34
+ "placeholder_text": "Ask Codex anything, @ to add files, / for commands",
35
+ "file_input": "input[type='file']",
36
+ "hidden_textarea": "textarea"
37
+ },
38
+ "toolbar": {
39
+ "model_selector": "GPT-5.4",
40
+ "model_options": ["GPT-5.3-Codex", "GPT-5.4", "GPT-5.2-Codex", "GPT-5.1-Codex-Max", "GPT-5.2", "GPT-5.1-Codex-Mini"],
41
+ "effort_selector": "Extra High",
42
+ "effort_options": ["Low", "Medium", "High", "Extra High"],
43
+ "mode_local": "Local",
44
+ "mode_options": ["Local project", "New worktree", "Connect Codex web", "Send to cloud"],
45
+ "permissions": "Default permissions",
46
+ "permissions_options": ["Default permissions", "Full access"],
47
+ "branch_selector": "main",
48
+ "branch_actions": ["Create and checkout new branch…"],
49
+ "create_button": "Create"
50
+ },
51
+ "sidebar": {
52
+ "new_thread": "New thread",
53
+ "automations": "Automations",
54
+ "skills": "Skills",
55
+ "settings": "Settings",
56
+ "threads_section": "Threads",
57
+ "workspace_section": "Automator",
58
+ "show_more": "Show more"
59
+ },
60
+ "header": {
61
+ "new_thread_title": "New thread",
62
+ "open_button": "Open",
63
+ "commit_button": "Commit",
64
+ "handoff_button": "Hand off",
65
+ "diff_stats": "+N -N",
66
+ "notes": "Hand off only visible in completed threads. Commit has dropdown arrow."
67
+ },
68
+ "thread_result": {
69
+ "follow_up_input": "Ask for follow-up changes",
70
+ "worked_for": "Worked for"
71
+ }
72
+ },
73
+
74
+ "detection": {
75
+ "is_running": "lsof -i :9333 | grep LISTEN",
76
+ "is_ready": "curl -s http://127.0.0.1:9333/json/list | grep 'Codex'",
77
+ "get_page_id": "curl -s http://127.0.0.1:9333/json/list | python3 -c \"import sys,json; pages=[p for p in json.load(sys.stdin) if p['type']=='page']; print(pages[0]['id'] if pages else '')\"",
78
+ "has_prompt": "!!document.querySelector('.ProseMirror')",
79
+ "is_idle": "!!document.querySelector('.ProseMirror') && document.querySelector('.ProseMirror').textContent === ''"
80
+ },
81
+
82
+ "flows": {
83
+ "submit_prompt": {
84
+ "description": "Type a prompt and submit it to Codex",
85
+ "method": "cdp",
86
+ "steps": [
87
+ {
88
+ "action": "focus_editor",
89
+ "code": "document.querySelector('.ProseMirror').focus()"
90
+ },
91
+ {
92
+ "action": "clear_editor",
93
+ "code": "var pm = document.querySelector('.ProseMirror'); pm.innerHTML = '<p><br></p>'; pm.focus()"
94
+ },
95
+ {
96
+ "action": "type_text",
97
+ "code": "document.querySelector('.ProseMirror').focus(); document.execCommand('insertText', false, '{TEXT}')",
98
+ "notes": "execCommand is the ONLY reliable method. Direct value/innerHTML setting breaks ProseMirror state."
99
+ },
100
+ {
101
+ "action": "submit",
102
+ "method": "Input.dispatchKeyEvent",
103
+ "params": {
104
+ "type": "keyDown",
105
+ "key": "Enter",
106
+ "code": "Enter",
107
+ "modifiers": 4,
108
+ "windowsVirtualKeyCode": 13,
109
+ "nativeVirtualKeyCode": 13
110
+ },
111
+ "notes": "modifiers: 4 = Meta/Cmd key. Must send both keyDown and keyUp."
112
+ }
113
+ ]
114
+ },
115
+ "new_thread": {
116
+ "description": "Create a new thread",
117
+ "methods": [
118
+ {
119
+ "method": "menu_click",
120
+ "path": "File/New Thread",
121
+ "pid_required": true,
122
+ "notes": "Most reliable. Use menu_click(pid, 'File/New Thread')"
123
+ },
124
+ {
125
+ "method": "keyboard",
126
+ "shortcut": "cmd+n",
127
+ "notes": "Only works when Codex has keyboard focus"
128
+ },
129
+ {
130
+ "method": "click",
131
+ "target": "New thread sidebar button",
132
+ "notes": "Sidebar button, position varies"
133
+ }
134
+ ]
135
+ },
136
+ "read_result": {
137
+ "description": "Read the result of a completed task",
138
+ "code": "document.querySelector('.ProseMirror')?.closest('[class*=thread]')?.textContent || document.body.innerText.substring(0, 2000)"
139
+ },
140
+ "sidebar_navigate": {
141
+ "description": "Click a thread in the sidebar",
142
+ "method": "click_text",
143
+ "notes": "Use OCR-based click_text with the thread title, or CDP querySelectorAll on sidebar links"
144
+ }
145
+ },
146
+
147
+ "tool_preferences": {
148
+ "prompt_input": ["cdp_execCommand"],
149
+ "submit": ["cdp_Input.dispatchKeyEvent"],
150
+ "new_thread": ["menu_click", "keyboard_cmd+n"],
151
+ "focus_app": ["focus(bundleId)"],
152
+ "read_screen": ["screenshot", "ocr"],
153
+ "sidebar": ["click_text", "cdp_click"],
154
+ "NOT_WORKING": ["type_text (VS Code steals focus)", "applescript keystroke (Electron WebView blocks)", "DOM value setter (React/ProseMirror ignores)"]
155
+ },
156
+
157
+ "errors": [
158
+ {
159
+ "error": "VS Code steals keyboard focus during type_text",
160
+ "cause": "Claude Code outputs text in VS Code terminal between focus and type, bringing VS Code to front",
161
+ "fix": "Use CDP execCommand instead of type_text. CDP operates at browser level regardless of OS focus.",
162
+ "tool": "type_text"
163
+ },
164
+ {
165
+ "error": "AppleScript keystroke does not reach prompt",
166
+ "cause": "Codex is an Electron app. The prompt is a ProseMirror web component inside a WebView, not a native text field. System Events keystroke cannot target web components.",
167
+ "fix": "Use CDP with --remote-debugging-port=9333. Connect via WebSocket and use Runtime.evaluate + execCommand.",
168
+ "tool": "applescript"
169
+ },
170
+ {
171
+ "error": "DOM value setter does not update React state",
172
+ "cause": "Setting textarea.value or innerHTML directly bypasses React/ProseMirror state management. The visual display does not update.",
173
+ "fix": "Use document.execCommand('insertText', false, text) which triggers proper ProseMirror input handling.",
174
+ "tool": "browser_js"
175
+ },
176
+ {
177
+ "error": "No CDP port available",
178
+ "cause": "Codex was launched without --remote-debugging-port flag",
179
+ "fix": "Quit Codex and relaunch: /Applications/Codex.app/Contents/MacOS/Codex --remote-debugging-port=9333",
180
+ "tool": "cdp"
181
+ },
182
+ {
183
+ "error": "WebSocket connect ECONNREFUSED ::1:9333",
184
+ "cause": "Node.js WebSocket resolves localhost to IPv6 (::1) but Codex only listens on IPv4",
185
+ "fix": "Use ws://127.0.0.1:9333 instead of ws://localhost:9333",
186
+ "tool": "cdp"
187
+ },
188
+ {
189
+ "error": "Sidebar Settings click does not open Settings page",
190
+ "cause": "The sidebar 'Settings' is a collapsible section header containing Automations and Skills, not a navigation button to app settings",
191
+ "fix": "Use menu: Codex/Settings… via menu_click(pid, 'Codex/Settings…'). This opens the actual Settings panel with General, Configuration, MCP servers, Git, etc.",
192
+ "tool": "click_text"
193
+ },
194
+ {
195
+ "error": "Cmd+Enter does not submit (first attempt)",
196
+ "cause": "Clicked Create button at wrong coordinates or prompt not focused",
197
+ "fix": "Use CDP Input.dispatchKeyEvent with modifiers:4 (Meta) + Enter. Always focus .ProseMirror first.",
198
+ "tool": "key"
199
+ }
200
+ ],
201
+
202
+ "architecture": {
203
+ "framework": "Electron",
204
+ "renderer": "Chromium (CDP-compatible)",
205
+ "editor": "ProseMirror (contenteditable div)",
206
+ "state_management": "React",
207
+ "debug_port": 9333,
208
+ "native_elements": "AXGroup only (no AXTextField/AXTextArea for prompt)",
209
+ "accessibility_tree": "382 elements total, but main content is unlabeled AXGroup hierarchy",
210
+ "cdp_pages": "1 main page (type: page, title: Codex) + 3-4 workers"
211
+ },
212
+
213
+ "cdp_helper": {
214
+ "description": "Node.js helper to interact with Codex desktop app via CDP",
215
+ "connect": "new WebSocket('ws://127.0.0.1:9333/devtools/page/{PAGE_ID}')",
216
+ "get_page_id": "curl -s http://127.0.0.1:9333/json/list | jq '.[0].id'",
217
+ "example_submit_prompt": "const ws = new WebSocket('ws://127.0.0.1:9333/devtools/page/{PAGE_ID}');\nws.on('open', () => {\n // Type\n ws.send(JSON.stringify({id:1, method:'Runtime.evaluate', params:{expression: \"document.querySelector('.ProseMirror').focus(); document.execCommand('insertText', false, 'YOUR PROMPT HERE')\"}}));\n // Submit after 500ms\n setTimeout(() => {\n ws.send(JSON.stringify({id:2, method:'Input.dispatchKeyEvent', params:{type:'keyDown', key:'Enter', code:'Enter', modifiers:4, windowsVirtualKeyCode:13}}));\n setTimeout(() => {\n ws.send(JSON.stringify({id:3, method:'Input.dispatchKeyEvent', params:{type:'keyUp', key:'Enter', code:'Enter', modifiers:4, windowsVirtualKeyCode:13}}));\n }, 100);\n }, 500);\n});"
218
+ },
219
+
220
+ "settings": {
221
+ "access": "Menu: Codex/Settings… (sidebar 'Settings' is section label, not direct navigation)",
222
+ "sections": {
223
+ "General": {
224
+ "options": ["Default open destination (VS Code)", "Language (Auto Detect)", "Thread detail (Steps with code commands)", "Prevent sleep while running", "Require Cmd+Enter for long prompts", "Speed (Fast)", "Follow-up behavior (Queue/Steer)", "Appearance (Theme, fonts)", "Notifications"]
225
+ },
226
+ "Configuration": {
227
+ "options": ["config.toml editor", "Open source licenses", "Import external agent config (Claude skills → Codex skills)"]
228
+ },
229
+ "Personalization": {
230
+ "options": ["Personality (Pragmatic)", "Custom instructions"]
231
+ },
232
+ "MCP_servers": {
233
+ "installed": ["clazro-marketing", "sh (ScreenHand)", "supabase"],
234
+ "recommended": ["Linear", "Notion", "Figma", "Playwright"],
235
+ "actions": ["Add server", "Install", "Refresh"]
236
+ },
237
+ "Git": {
238
+ "options": ["Branch prefix", "Always force push (--force-with-lease)", "Commit instructions", "Pull request instructions"]
239
+ },
240
+ "Environments": {
241
+ "projects": ["Automator (manushi4)", "clazro-clazro_test (manushi4)"],
242
+ "actions": ["Add project"]
243
+ },
244
+ "Worktrees": {
245
+ "options": ["Auto-delete old worktrees", "Auto-delete limit"]
246
+ },
247
+ "Archived_threads": {}
248
+ }
249
+ },
250
+
251
+ "skills": {
252
+ "installed": ["Seo Geo", "Skill Creator", "Skill Installer", "Supabase Control"],
253
+ "recommended": ["Aspnet Core", "Chatgpt Apps", "Cloudflare Deploy", "Develop Web Game", "Doc", "Figma", "Figma Implement Design", "GH Address Comments", "GH Fix CI", "Imagegen", "Jupyter Notebook", "Linear", "Netlify Deploy", "Notion Knowledge Capture", "Notion Meeting Intelligence", "Notion Research Documentation", "Notion Spec to Implementation", "OpenAI Docs", "PDF", "Playwright", "Playwright Interactive", "Render Deploy", "Screenshot", "Security Best Practices", "Security Ownership Map", "Security Threat Model", "Sentry", "Slides", "Sora", "Speech", "Spreadsheet", "Transcribe", "Vercel Deploy", "Winui App", "Yeet"],
254
+ "actions": ["New skill", "Install"]
255
+ },
256
+
257
+ "automations": {
258
+ "description": "Beta feature — scheduled threads",
259
+ "templates": [
260
+ "Scan recent commits for bugs",
261
+ "Draft weekly release notes",
262
+ "Summarize git activity for standup",
263
+ "Summarize CI failures and flaky tests",
264
+ "Create a small classic game",
265
+ "Suggest next skills to deepen",
266
+ "Weekly update from PRs/rollouts/incidents",
267
+ "Flag performance regressions",
268
+ "Detect dependency drift",
269
+ "Add focused tests for untested paths",
270
+ "Pre-release verification checklist",
271
+ "Update AGENTS.md",
272
+ "Summarize PRs by teammate",
273
+ "Triage new issues",
274
+ "Check CI failures by root cause",
275
+ "Scan outdated dependencies",
276
+ "Audit performance regressions",
277
+ "Update changelog"
278
+ ],
279
+ "actions": ["New automation"]
280
+ },
281
+
282
+ "menu_structure": {
283
+ "File": ["New Thread", "Open Folder…", "Close Window", "Close All"],
284
+ "Edit": ["Undo", "Redo", "Cut", "Copy", "Paste", "Select All", "Writing Tools", "Emoji & Symbols"],
285
+ "View": ["Toggle Sidebar", "Toggle Terminal", "Toggle Diff Panel", "Find", "Previous Thread", "Next Thread", "Back", "Forward", "Zoom In", "Zoom Out", "Toggle Full Screen"],
286
+ "Window": ["Minimize", "Zoom", "Fill", "Center", "Full Screen Tile"],
287
+ "Help": ["Codex Documentation", "What's new", "Automations", "Local Environments", "Worktrees", "Skills", "Model Context Protocol", "Troubleshooting", "Keyboard Shortcuts"]
288
+ },
289
+
290
+ "_meta": {
291
+ "created": "2026-03-08",
292
+ "tested_on": "Codex Desktop (Electron), macOS arm64",
293
+ "tested_actions": ["launch", "focus", "new_thread", "type_prompt", "submit_prompt", "read_result", "menu_click", "screenshot", "ocr", "ui_tree", "settings_navigation", "model_selector", "effort_selector", "mode_selector", "permissions_selector", "branch_selector", "skills_page", "automations_page", "sidebar_thread_click", "workspace_selector", "mcp_servers_page", "git_settings", "environments", "worktrees"],
294
+ "battle_tested": true,
295
+ "key_discoveries": [
296
+ "ProseMirror editor + CDP execCommand + Input.dispatchKeyEvent Cmd+Enter is the only reliable flow for prompt input",
297
+ "Settings page accessible via menu Codex/Settings… NOT sidebar Settings button (which is a section label)",
298
+ "Sidebar Skills/Automations buttons require clicking the BUTTON element, not the text SPAN",
299
+ "Hand off button only appears in completed thread headers",
300
+ "click_text works for sidebar thread navigation",
301
+ "Cmd+N works for new thread when Codex has focus",
302
+ "MCP servers (including ScreenHand 'sh') visible and configurable in Settings"
303
+ ]
304
+ }
305
+ }