screenhand 0.1.1 → 0.3.0
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.
- package/README.md +193 -109
- package/bin/darwin-arm64/macos-bridge +0 -0
- package/dist/mcp-desktop.js +5876 -0
- package/dist/scripts/codex-monitor-daemon.js +335 -0
- package/dist/scripts/export-help-center.js +112 -0
- package/dist/scripts/marketing-loop.js +117 -0
- package/dist/scripts/observer-daemon.js +288 -0
- package/dist/scripts/orchestrator-daemon.js +399 -0
- package/dist/scripts/supervisor-daemon.js +272 -0
- package/dist/scripts/threads-campaign.js +208 -0
- package/dist/scripts/worker-daemon.js +228 -0
- package/dist/src/agent/cli.js +82 -0
- package/dist/src/agent/loop.js +274 -0
- package/dist/src/community/fetcher.js +109 -0
- package/dist/src/community/index.js +6 -0
- package/dist/src/community/publisher.js +191 -0
- package/dist/src/community/remote-api.js +121 -0
- package/dist/src/community/types.js +3 -0
- package/dist/src/community/validator.js +95 -0
- package/{src/config.ts → dist/src/config.js} +5 -10
- package/dist/src/context-tracker.js +489 -0
- package/{src/index.ts → dist/src/index.js} +32 -52
- package/dist/src/ingestion/coverage-auditor.js +233 -0
- package/dist/src/ingestion/doc-parser.js +164 -0
- package/dist/src/ingestion/index.js +8 -0
- package/dist/src/ingestion/menu-scanner.js +152 -0
- package/dist/src/ingestion/reference-merger.js +186 -0
- package/dist/src/ingestion/shortcut-extractor.js +180 -0
- package/dist/src/ingestion/tutorial-extractor.js +170 -0
- package/dist/src/ingestion/types.js +3 -0
- package/dist/src/jobs/manager.js +305 -0
- package/dist/src/jobs/runner.js +806 -0
- package/dist/src/jobs/store.js +102 -0
- package/dist/src/jobs/types.js +30 -0
- package/dist/src/jobs/worker.js +97 -0
- package/dist/src/learning/engine.js +356 -0
- package/dist/src/learning/index.js +9 -0
- package/dist/src/learning/locator-policy.js +120 -0
- package/dist/src/learning/pattern-policy.js +89 -0
- package/dist/src/learning/recovery-policy.js +116 -0
- package/dist/src/learning/sensor-policy.js +115 -0
- package/dist/src/learning/timing-model.js +204 -0
- package/dist/src/learning/topology-policy.js +90 -0
- package/dist/src/learning/types.js +9 -0
- package/dist/src/logging/timeline-logger.js +48 -0
- package/dist/src/mcp/mcp-stdio-server.js +464 -0
- package/dist/src/mcp/server.js +363 -0
- package/dist/src/mcp-entry.js +60 -0
- package/dist/src/memory/playbook-seeds.js +200 -0
- package/dist/src/memory/recall.js +222 -0
- package/dist/src/memory/research.js +104 -0
- package/dist/src/memory/seeds.js +101 -0
- package/dist/src/memory/service.js +446 -0
- package/dist/src/memory/session.js +169 -0
- package/dist/src/memory/store.js +451 -0
- package/{src/runtime/locator-cache.ts → dist/src/memory/types.js} +1 -17
- package/dist/src/monitor/codex-monitor.js +382 -0
- package/dist/src/monitor/task-queue.js +97 -0
- package/dist/src/monitor/types.js +62 -0
- package/dist/src/native/bridge-client.js +412 -0
- package/{src/native/macos-bridge-client.ts → dist/src/native/macos-bridge-client.js} +0 -1
- package/dist/src/observer/state.js +199 -0
- package/dist/src/observer/types.js +43 -0
- package/dist/src/orchestrator/state.js +68 -0
- package/dist/src/orchestrator/types.js +22 -0
- package/dist/src/perception/ax-source.js +162 -0
- package/dist/src/perception/cdp-source.js +162 -0
- package/dist/src/perception/coordinator.js +771 -0
- package/dist/src/perception/frame-differ.js +287 -0
- package/dist/src/perception/index.js +22 -0
- package/dist/src/perception/manager.js +199 -0
- package/dist/src/perception/types.js +47 -0
- package/dist/src/perception/vision-source.js +399 -0
- package/dist/src/planner/deterministic.js +298 -0
- package/dist/src/planner/executor.js +870 -0
- package/dist/src/planner/goal-store.js +92 -0
- package/dist/src/planner/index.js +21 -0
- package/dist/src/planner/planner.js +520 -0
- package/dist/src/planner/tool-registry.js +71 -0
- package/dist/src/planner/types.js +22 -0
- package/dist/src/platform/explorer.js +213 -0
- package/dist/src/platform/help-center-markdown.js +527 -0
- package/dist/src/platform/learner.js +257 -0
- package/dist/src/playbook/engine.js +486 -0
- package/dist/src/playbook/index.js +20 -0
- package/dist/src/playbook/mcp-recorder.js +204 -0
- package/dist/src/playbook/recorder.js +536 -0
- package/dist/src/playbook/runner.js +408 -0
- package/dist/src/playbook/store.js +312 -0
- package/dist/src/playbook/types.js +17 -0
- package/dist/src/recovery/detectors.js +156 -0
- package/dist/src/recovery/engine.js +327 -0
- package/dist/src/recovery/index.js +20 -0
- package/dist/src/recovery/strategies.js +274 -0
- package/dist/src/recovery/types.js +20 -0
- package/dist/src/runtime/accessibility-adapter.js +430 -0
- package/dist/src/runtime/app-adapter.js +64 -0
- package/dist/src/runtime/applescript-adapter.js +305 -0
- package/dist/src/runtime/ax-role-map.js +96 -0
- package/dist/src/runtime/browser-adapter.js +52 -0
- package/dist/src/runtime/cdp-chrome-adapter.js +521 -0
- package/dist/src/runtime/composite-adapter.js +221 -0
- package/dist/src/runtime/execution-contract.js +159 -0
- package/dist/src/runtime/executor.js +286 -0
- package/dist/src/runtime/locator-cache.js +50 -0
- package/dist/src/runtime/planning-loop.js +63 -0
- package/dist/src/runtime/service.js +432 -0
- package/dist/src/runtime/session-manager.js +63 -0
- package/dist/src/runtime/state-observer.js +121 -0
- package/dist/src/runtime/vision-adapter.js +225 -0
- package/dist/src/state/app-map-types.js +72 -0
- package/dist/src/state/app-map.js +1974 -0
- package/dist/src/state/entity-tracker.js +108 -0
- package/dist/src/state/fusion.js +96 -0
- package/dist/src/state/index.js +21 -0
- package/dist/src/state/ladder-generator.js +236 -0
- package/dist/src/state/persistence.js +156 -0
- package/dist/src/state/types.js +17 -0
- package/dist/src/state/world-model.js +1456 -0
- package/dist/src/supervisor/locks.js +186 -0
- package/dist/src/supervisor/supervisor.js +403 -0
- package/dist/src/supervisor/types.js +30 -0
- package/dist/src/test-mcp-protocol.js +154 -0
- package/dist/src/types.js +17 -0
- package/dist/src/util/atomic-write.js +133 -0
- package/dist/src/util/sanitize.js +146 -0
- package/dist-app-maps/com.figma.Desktop.json +959 -0
- package/dist-app-maps/com.hnc.Discord.json +1146 -0
- package/dist-app-maps/notion.id.json +2831 -0
- package/dist-playbooks/canva-screenhand-carousel.json +445 -0
- package/dist-playbooks/codex-desktop.json +76 -0
- package/dist-playbooks/competitor-research-stack.json +122 -0
- package/dist-playbooks/davinci-color-grade.json +153 -0
- package/dist-playbooks/davinci-edit-timeline.json +162 -0
- package/dist-playbooks/davinci-render.json +114 -0
- package/dist-playbooks/devto.json +52 -0
- package/dist-playbooks/discord.json +41 -0
- package/dist-playbooks/google-flow-create-project.json +59 -0
- package/dist-playbooks/google-flow-edit-image.json +90 -0
- package/dist-playbooks/google-flow-edit-video.json +90 -0
- package/dist-playbooks/google-flow-generate-image.json +68 -0
- package/dist-playbooks/google-flow-generate-video.json +191 -0
- package/dist-playbooks/google-flow-open-project.json +48 -0
- package/dist-playbooks/google-flow-open-scenebuilder.json +64 -0
- package/dist-playbooks/google-flow-search-assets.json +64 -0
- package/dist-playbooks/instagram.json +57 -0
- package/dist-playbooks/linkedin.json +52 -0
- package/dist-playbooks/n8n.json +43 -0
- package/dist-playbooks/reddit.json +52 -0
- package/dist-playbooks/threads.json +59 -0
- package/dist-playbooks/x-twitter.json +59 -0
- package/dist-playbooks/youtube.json +59 -0
- package/dist-references/canva.json +646 -0
- package/dist-references/codex-desktop.json +305 -0
- package/dist-references/davinci-resolve-keyboard.json +594 -0
- package/dist-references/davinci-resolve-menu-map.json +1139 -0
- package/dist-references/davinci-resolve-menus-batch1.json +116 -0
- package/dist-references/davinci-resolve-menus-batch2.json +372 -0
- package/dist-references/davinci-resolve-menus-batch3.json +330 -0
- package/dist-references/davinci-resolve-menus-batch4.json +297 -0
- package/dist-references/davinci-resolve-shortcuts.json +333 -0
- package/dist-references/devto.json +317 -0
- package/dist-references/discord.json +549 -0
- package/dist-references/figma.json +1186 -0
- package/dist-references/finder.json +146 -0
- package/dist-references/google-ads-transparency.json +95 -0
- package/dist-references/google-flow.json +649 -0
- package/dist-references/instagram.json +341 -0
- package/dist-references/linkedin.json +324 -0
- package/dist-references/meta-ad-library.json +86 -0
- package/dist-references/n8n.json +387 -0
- package/dist-references/notes.json +27 -0
- package/dist-references/notion.json +163 -0
- package/dist-references/reddit.json +341 -0
- package/dist-references/threads.json +337 -0
- package/dist-references/x-twitter.json +403 -0
- package/dist-references/youtube.json +373 -0
- package/native/macos-bridge/Package.swift +1 -0
- package/native/macos-bridge/Sources/AccessibilityBridge.swift +257 -36
- package/native/macos-bridge/Sources/AppManagement.swift +212 -2
- package/native/macos-bridge/Sources/CoreGraphicsBridge.swift +348 -53
- package/native/macos-bridge/Sources/StreamCapture.swift +136 -0
- package/native/macos-bridge/Sources/VisionBridge.swift +165 -7
- package/native/macos-bridge/Sources/main.swift +169 -16
- package/native/windows-bridge/Program.cs +5 -0
- package/native/windows-bridge/ScreenCapture.cs +124 -0
- package/package.json +29 -4
- package/scripts/postinstall.cjs +127 -0
- package/.claude/commands/automate.md +0 -28
- package/.claude/commands/debug-ui.md +0 -19
- package/.claude/commands/screenshot.md +0 -15
- package/.github/FUNDING.yml +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.mcp.json +0 -8
- package/DESKTOP_MCP_GUIDE.md +0 -92
- package/SECURITY.md +0 -44
- package/docs/architecture.md +0 -47
- package/install-skills.sh +0 -19
- package/mcp-bridge.ts +0 -271
- package/mcp-desktop.ts +0 -1221
- package/playbooks/instagram.json +0 -41
- package/playbooks/instagram_v2.json +0 -201
- package/playbooks/x_v1.json +0 -211
- package/scripts/devpost-live-loop.mjs +0 -421
- package/src/logging/timeline-logger.ts +0 -55
- package/src/mcp/server.ts +0 -449
- package/src/memory/recall.ts +0 -191
- package/src/memory/research.ts +0 -146
- package/src/memory/seeds.ts +0 -123
- package/src/memory/session.ts +0 -201
- package/src/memory/store.ts +0 -434
- package/src/memory/types.ts +0 -69
- package/src/native/bridge-client.ts +0 -239
- package/src/runtime/accessibility-adapter.ts +0 -487
- package/src/runtime/app-adapter.ts +0 -169
- package/src/runtime/applescript-adapter.ts +0 -376
- package/src/runtime/ax-role-map.ts +0 -102
- package/src/runtime/browser-adapter.ts +0 -129
- package/src/runtime/cdp-chrome-adapter.ts +0 -676
- package/src/runtime/composite-adapter.ts +0 -274
- package/src/runtime/executor.ts +0 -396
- package/src/runtime/planning-loop.ts +0 -81
- package/src/runtime/service.ts +0 -448
- package/src/runtime/session-manager.ts +0 -50
- package/src/runtime/state-observer.ts +0 -136
- package/src/runtime/vision-adapter.ts +0 -297
- package/src/types.ts +0 -297
- package/tests/bridge-client.test.ts +0 -176
- package/tests/browser-stealth.test.ts +0 -210
- package/tests/composite-adapter.test.ts +0 -64
- package/tests/mcp-server.test.ts +0 -151
- package/tests/memory-recall.test.ts +0 -339
- package/tests/memory-research.test.ts +0 -159
- package/tests/memory-seeds.test.ts +0 -120
- package/tests/memory-store.test.ts +0 -392
- package/tests/types.test.ts +0 -92
- package/tsconfig.check.json +0 -17
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -8
- /package/{playbooks → dist-references}/devpost.json +0 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
{
|
|
2
|
+
"global": {
|
|
3
|
+
"DaVinci Resolve/Hide DaVinci Resolve": "Cmd+H",
|
|
4
|
+
"DaVinci Resolve/Hide Others": "Cmd+Alt+H",
|
|
5
|
+
"DaVinci Resolve/Keyboard Customization…": "Cmd+Alt+K",
|
|
6
|
+
"DaVinci Resolve/Preferences…": "Cmd+,",
|
|
7
|
+
"DaVinci Resolve/Quit DaVinci Resolve": "Cmd+Q",
|
|
8
|
+
"File/Create Timeline Backup…": "Cmd+Alt+S",
|
|
9
|
+
"File/Export Project…": "Cmd+E",
|
|
10
|
+
"File/Export/Timeline…": "Cmd+Shift+O",
|
|
11
|
+
"File/Import/Media…": "Cmd+I",
|
|
12
|
+
"File/Import/Timeline…": "Cmd+Shift+I",
|
|
13
|
+
"File/New Bin": "Cmd+Shift+N",
|
|
14
|
+
"File/New Timeline…": "Cmd+N",
|
|
15
|
+
"File/Project Manager…": "Shift+1",
|
|
16
|
+
"File/Project Settings…": "Shift+9",
|
|
17
|
+
"File/Save Project": "Cmd+S",
|
|
18
|
+
"File/Save Project As…": "Cmd+Shift+S",
|
|
19
|
+
"Workspace/Active Panel Selection/Effects": "Cmd+6",
|
|
20
|
+
"Workspace/Active Panel Selection/Index": "Cmd+7",
|
|
21
|
+
"Workspace/Active Panel Selection/Inspector": "Cmd+9",
|
|
22
|
+
"Workspace/Active Panel Selection/Media Clips": "Cmd+2",
|
|
23
|
+
"Workspace/Active Panel Selection/Media Folders": "Cmd+1",
|
|
24
|
+
"Workspace/Active Panel Selection/Source Viewer": "Cmd+3",
|
|
25
|
+
"Workspace/Active Panel Selection/Timeline": "Cmd+4",
|
|
26
|
+
"Workspace/Active Panel Selection/Timeline Viewer": "Cmd+5",
|
|
27
|
+
"Workspace/Switch to Page/Color": "Shift+6",
|
|
28
|
+
"Workspace/Switch to Page/Cut": "Shift+3",
|
|
29
|
+
"Workspace/Switch to Page/Deliver": "Shift+8",
|
|
30
|
+
"Workspace/Switch to Page/Edit": "Shift+4",
|
|
31
|
+
"Workspace/Switch to Page/Fairlight": "Shift+7",
|
|
32
|
+
"Workspace/Switch to Page/Fusion": "Shift+5",
|
|
33
|
+
"Workspace/Switch to Page/Media": "Shift+2",
|
|
34
|
+
"Workspace/Video Scopes/On": "Cmd+Shift+W",
|
|
35
|
+
"Workspace/Viewer Mode/Cinema Viewer": "Cmd+F",
|
|
36
|
+
"Workspace/Viewer Mode/Enhanced Viewer": "Alt+F",
|
|
37
|
+
"Workspace/Viewer Mode/Full Page Viewer": "Shift+F"
|
|
38
|
+
},
|
|
39
|
+
"edit_page": {
|
|
40
|
+
"Edit/Append to End of Timeline": "Shift+F12",
|
|
41
|
+
"Edit/Copy": "Cmd+C",
|
|
42
|
+
"Edit/Cut": "Cmd+X",
|
|
43
|
+
"Edit/Delete Selected": "Delete",
|
|
44
|
+
"Edit/Deselect All": "Cmd+Shift+A",
|
|
45
|
+
"Edit/Edit Options/Switch to Timeline After Edit": "Shift+Alt+Q",
|
|
46
|
+
"Edit/Fit to Fill": "Shift+F11",
|
|
47
|
+
"Edit/Insert": "F9",
|
|
48
|
+
"Edit/Multicam/Audio Only": "Shift+Alt+\\",
|
|
49
|
+
"Edit/Multicam/Next Angle": "Cmd+Shift+Right",
|
|
50
|
+
"Edit/Multicam/Next Page": "Shift+Alt+Right",
|
|
51
|
+
"Edit/Multicam/Previous Angle": "Cmd+Shift+Left",
|
|
52
|
+
"Edit/Multicam/Previous Page": "Shift+Alt+Left",
|
|
53
|
+
"Edit/Multicam/Video and Audio": "Shift+Alt+[",
|
|
54
|
+
"Edit/Multicam/Video Only": "Shift+Alt+]",
|
|
55
|
+
"Edit/Overwrite": "F10",
|
|
56
|
+
"Edit/Paste": "Cmd+V",
|
|
57
|
+
"Edit/Paste Attributes…": "Alt+V",
|
|
58
|
+
"Edit/Paste Insert": "Cmd+Shift+V",
|
|
59
|
+
"Edit/Paste Value": "Shift+Alt+V",
|
|
60
|
+
"Edit/Place on Top": "F12",
|
|
61
|
+
"Edit/Redo": "Cmd+Shift+Z",
|
|
62
|
+
"Edit/Replace": "F11",
|
|
63
|
+
"Edit/Ripple Cut": "Cmd+Shift+X",
|
|
64
|
+
"Edit/Ripple Delete": "Shift+Delete",
|
|
65
|
+
"Edit/Ripple Overwrite": "Shift+F10",
|
|
66
|
+
"Edit/Select All": "Cmd+A",
|
|
67
|
+
"Edit/Select/Above": "Cmd+Up",
|
|
68
|
+
"Edit/Select/Below": "Cmd+Down",
|
|
69
|
+
"Edit/Select/Next": "Cmd+Right",
|
|
70
|
+
"Edit/Select/Previous": "Cmd+Left",
|
|
71
|
+
"Edit/Swap Clips Towards Left": "Cmd+Shift+,",
|
|
72
|
+
"Edit/Swap Clips Towards Right": "Cmd+Shift+.",
|
|
73
|
+
"Edit/Undo": "Cmd+Z",
|
|
74
|
+
"Mark/Add and Modify Marker…": "Cmd+M",
|
|
75
|
+
"Mark/Add Flag/Current Selected": "G",
|
|
76
|
+
"Mark/Add Keyframe": "Cmd+[",
|
|
77
|
+
"Mark/Add Marker/Current Selected": "M",
|
|
78
|
+
"Mark/Add Static Keyframe": "Cmd+]",
|
|
79
|
+
"Mark/Clear Audio In and Out": "Cmd+Alt+X",
|
|
80
|
+
"Mark/Clear In": "Alt+I",
|
|
81
|
+
"Mark/Clear In and Out": "Alt+X",
|
|
82
|
+
"Mark/Clear Out": "Alt+O",
|
|
83
|
+
"Mark/Clear Video In and Out": "Shift+Alt+X",
|
|
84
|
+
"Mark/Create Subclip": "Alt+B",
|
|
85
|
+
"Mark/Delete Keyframe": "Alt+]",
|
|
86
|
+
"Mark/Delete Marker": "Alt+M",
|
|
87
|
+
"Mark/Favorite Keywords/Clear Keywords": "Shift+Alt+0",
|
|
88
|
+
"Mark/Favorite Keywords/Unassigned": "Shift+Alt+1",
|
|
89
|
+
"Mark/Mark Audio In": "Cmd+Alt+I",
|
|
90
|
+
"Mark/Mark Audio Out": "Cmd+Alt+O",
|
|
91
|
+
"Mark/Mark Clip": "X",
|
|
92
|
+
"Mark/Mark In": "I",
|
|
93
|
+
"Mark/Mark Out": "O",
|
|
94
|
+
"Mark/Mark Selection": "Shift+A",
|
|
95
|
+
"Mark/Mark Video In": "Shift+Alt+I",
|
|
96
|
+
"Mark/Mark Video Out": "Shift+Alt+O",
|
|
97
|
+
"Mark/Modify Marker…": "Shift+M",
|
|
98
|
+
"Playback/Cintel Scanner/Slip Film Forward": "Cmd+Right",
|
|
99
|
+
"Playback/Cintel Scanner/Slip Film Reverse": "Cmd+Left",
|
|
100
|
+
"Playback/Cintel Scanner/Step One Perforation Forward": "Cmd+L",
|
|
101
|
+
"Playback/Cintel Scanner/Step One Perforation Reverse": "Cmd+J",
|
|
102
|
+
"Playback/Fast Forward": "Shift+L",
|
|
103
|
+
"Playback/Fast Reverse": "Shift+J",
|
|
104
|
+
"Playback/Go To/First Frame": ";",
|
|
105
|
+
"Playback/Go To/In": "Shift+I",
|
|
106
|
+
"Playback/Go To/Last Frame": "'",
|
|
107
|
+
"Playback/Go To/Mouse Pointer": "C",
|
|
108
|
+
"Playback/Go To/Out": "Shift+O",
|
|
109
|
+
"Playback/Go To/Timecode": "=",
|
|
110
|
+
"Playback/Go To/Timeline End": "End",
|
|
111
|
+
"Playback/Go To/Timeline Start": "Home",
|
|
112
|
+
"Playback/Jump Left": "Cmd+Alt+Left",
|
|
113
|
+
"Playback/Jump Right": "Cmd+Alt+Right",
|
|
114
|
+
"Playback/Loop/Unloop": "Cmd+/",
|
|
115
|
+
"Playback/Next/Clip": "Down",
|
|
116
|
+
"Playback/Next/Gap": "Cmd+Alt+'",
|
|
117
|
+
"Playback/Next/Keyframe": "]",
|
|
118
|
+
"Playback/Next/Marker": "Shift+Down",
|
|
119
|
+
"Playback/Pause/Start Playback": "Space",
|
|
120
|
+
"Playback/Play Again": "Alt+L",
|
|
121
|
+
"Playback/Play Around/To/Play Around Current Clip": "Shift+/",
|
|
122
|
+
"Playback/Play Around/To/Play Around Current Selection": "/",
|
|
123
|
+
"Playback/Play Around/To/Play In to Out": "Alt+/",
|
|
124
|
+
"Playback/Play Around/To/Play to Out": "Cmd+Alt+/",
|
|
125
|
+
"Playback/Play Forward": "L",
|
|
126
|
+
"Playback/Play Reverse": "J",
|
|
127
|
+
"Playback/Play Slow": "Shift+K",
|
|
128
|
+
"Playback/Previous/Clip": "Up",
|
|
129
|
+
"Playback/Previous/Gap": "Cmd+Alt+;",
|
|
130
|
+
"Playback/Previous/Keyframe": "[",
|
|
131
|
+
"Playback/Previous/Marker": "Shift+Up",
|
|
132
|
+
"Playback/Step One/Frame Forward": "Right",
|
|
133
|
+
"Playback/Step One/Frame Reverse": "Left",
|
|
134
|
+
"Playback/Step One/Second Forward": "Shift+Right",
|
|
135
|
+
"Playback/Step One/Second Reverse": "Shift+Left",
|
|
136
|
+
"Playback/Stop": "K",
|
|
137
|
+
"Playback/Timecode/Decrement Timecode": "-",
|
|
138
|
+
"Playback/Timecode/Increment Timecode": "+",
|
|
139
|
+
"Timeline/Add Transition": "Cmd+T",
|
|
140
|
+
"Timeline/Snapping": "N",
|
|
141
|
+
"Trim/Blade Edit Mode": "B",
|
|
142
|
+
"Trim/Normal Edit Mode": "A",
|
|
143
|
+
"Trim/Trim Mode": "T",
|
|
144
|
+
"View/Bypass Color and Fusion/Bypass All Grades": "Shift+D",
|
|
145
|
+
"View/Source Clip/Source Tape": "Shift+Q",
|
|
146
|
+
"View/Source/Timeline Viewer": "Q",
|
|
147
|
+
"View/Toggle Source Timeline": "Alt+Q",
|
|
148
|
+
"View/Viewer Overlay/Toggle On/Off": "Shift+`",
|
|
149
|
+
"View/Zoom/Zoom In": "Cmd+=",
|
|
150
|
+
"View/Zoom/Zoom Out": "Cmd+-",
|
|
151
|
+
"View/Zoom/Zoom to Fit": "Shift+Z",
|
|
152
|
+
"Workspace/Switch to Page/Edit": "Shift+4",
|
|
153
|
+
"Edit/Select Nearest Edit Point": "V",
|
|
154
|
+
"Edit/Select Nearest Video Edit Point": "Alt+E",
|
|
155
|
+
"Edit/Select Nearest Audio Edit Point": "Shift+E",
|
|
156
|
+
"Edit/Toggle Selected Edit Half": "U",
|
|
157
|
+
"Edit/Toggle Selected Edit A/V Scope": "Alt+U",
|
|
158
|
+
"Playback/Play Around/To/Play Around Out": "Shift+Space"
|
|
159
|
+
},
|
|
160
|
+
"color_page": {
|
|
161
|
+
"Color/Apply Grade from One Clip Prior": "Shift+=",
|
|
162
|
+
"Color/Apply Grade from Two Clips Prior": "Shift+-",
|
|
163
|
+
"Color/Auto Color": "Shift+Alt+C",
|
|
164
|
+
"Color/Full Printer Light/Blue -": "6",
|
|
165
|
+
"Color/Full Printer Light/Blue +": "9",
|
|
166
|
+
"Color/Full Printer Light/Cyan -": "-",
|
|
167
|
+
"Color/Full Printer Light/Cyan +": "1",
|
|
168
|
+
"Color/Full Printer Light/Green -": "5",
|
|
169
|
+
"Color/Full Printer Light/Green +": "8",
|
|
170
|
+
"Color/Full Printer Light/Magenta -": "0",
|
|
171
|
+
"Color/Full Printer Light/Magenta +": "2",
|
|
172
|
+
"Color/Full Printer Light/Master -": "Enter",
|
|
173
|
+
"Color/Full Printer Light/Master +": "+",
|
|
174
|
+
"Color/Full Printer Light/Red -": "4",
|
|
175
|
+
"Color/Full Printer Light/Red +": "7",
|
|
176
|
+
"Color/Full Printer Light/Yellow -": ".",
|
|
177
|
+
"Color/Full Printer Light/Yellow +": "3",
|
|
178
|
+
"Color/Grade Version/Add": "Cmd+Y",
|
|
179
|
+
"Color/Grade Version/Default": "Cmd+U",
|
|
180
|
+
"Color/Grade Version/Next": "Cmd+N",
|
|
181
|
+
"Color/Grade Version/Previous": "Cmd+B",
|
|
182
|
+
"Color/Memories/Save Memory A": "Alt+1",
|
|
183
|
+
"Color/Memories/Save Memory B": "Alt+2",
|
|
184
|
+
"Color/Memories/Save Memory C": "Alt+3",
|
|
185
|
+
"Color/Memories/Save Memory D": "Alt+4",
|
|
186
|
+
"Color/Memories/Save Memory E": "Alt+5",
|
|
187
|
+
"Color/Memories/Save Memory F": "Alt+6",
|
|
188
|
+
"Color/Memories/Save Memory G": "Alt+7",
|
|
189
|
+
"Color/Memories/Save Memory H": "Alt+8",
|
|
190
|
+
"Color/Nodes/Add Layer Node": "Alt+L",
|
|
191
|
+
"Color/Nodes/Add Outside Node": "Alt+O",
|
|
192
|
+
"Color/Nodes/Add Parallel Node": "Alt+P",
|
|
193
|
+
"Color/Nodes/Add Serial Before Current": "Shift+S",
|
|
194
|
+
"Color/Nodes/Add Serial Node": "Alt+S",
|
|
195
|
+
"Color/Nodes/Add Serial Node + CPW": "Alt+C",
|
|
196
|
+
"Color/Nodes/Add Serial Node + LPW": "Alt+Q",
|
|
197
|
+
"Color/Nodes/Add Serial Node + PCW": "Alt+B",
|
|
198
|
+
"Color/Nodes/Add Serial Node + PPW": "Alt+G",
|
|
199
|
+
"Color/Nodes/Add Splitter Combiner Node": "Alt+Y",
|
|
200
|
+
"Color/Nodes/Append a Node": "Alt+K",
|
|
201
|
+
"Color/Nodes/Enable/Disable All Nodes": "Alt+D",
|
|
202
|
+
"Color/Nodes/Enable/Disable Selected Nodes": "Cmd+D",
|
|
203
|
+
"Color/Nodes/Extract Current Node": "E",
|
|
204
|
+
"Color/Nodes/Next Node": "Shift+Alt+'",
|
|
205
|
+
"Color/Nodes/Previous Node": "Shift+Alt+;",
|
|
206
|
+
"Color/Original Memory": "Shift+Alt+O",
|
|
207
|
+
"Color/Preview Memory": "Shift+Alt+P",
|
|
208
|
+
"Color/Printer Light Hotkeys": "Cmd+Alt+`",
|
|
209
|
+
"Color/Quarter Printer Light/Blue -": "Cmd+6",
|
|
210
|
+
"Color/Quarter Printer Light/Blue +": "Cmd+9",
|
|
211
|
+
"Color/Quarter Printer Light/Cyan -": "Cmd+-",
|
|
212
|
+
"Color/Quarter Printer Light/Cyan +": "Cmd+1",
|
|
213
|
+
"Color/Quarter Printer Light/Green -": "Cmd+5",
|
|
214
|
+
"Color/Quarter Printer Light/Green +": "Cmd+8",
|
|
215
|
+
"Color/Quarter Printer Light/Magenta -": "Cmd+0",
|
|
216
|
+
"Color/Quarter Printer Light/Magenta +": "Cmd+2",
|
|
217
|
+
"Color/Quarter Printer Light/Master -": "Cmd+Enter",
|
|
218
|
+
"Color/Quarter Printer Light/Master +": "Cmd++",
|
|
219
|
+
"Color/Quarter Printer Light/Red -": "Cmd+4",
|
|
220
|
+
"Color/Quarter Printer Light/Red +": "Cmd+7",
|
|
221
|
+
"Color/Quarter Printer Light/Yellow -": "Cmd+.",
|
|
222
|
+
"Color/Quarter Printer Light/Yellow +": "Cmd+3",
|
|
223
|
+
"Color/Reset/All Grades and Nodes": "Cmd+Home",
|
|
224
|
+
"Color/Reset/Grades and Keep Nodes": "Cmd+Shift+Home",
|
|
225
|
+
"Color/Reset/Selected Node Grade": "Shift+Home",
|
|
226
|
+
"Color/Resolve Live/Freeze": "Cmd+Shift+R",
|
|
227
|
+
"Color/Resolve Live/On": "Cmd+R",
|
|
228
|
+
"Color/Resolve Live/Snapshot": "Cmd+Alt+R",
|
|
229
|
+
"Color/Step Timeline Wipe/One Frame Forward": "Cmd+Alt+Right",
|
|
230
|
+
"Color/Step Timeline Wipe/One Frame Reverse": "Cmd+Alt+Left",
|
|
231
|
+
"Color/Stills/Grab Still": "Cmd+Alt+G",
|
|
232
|
+
"Color/Stills/Next Still": "Cmd+Alt+N",
|
|
233
|
+
"Color/Stills/Play Still": "Cmd+Alt+F",
|
|
234
|
+
"Color/Stills/Previous Still": "Cmd+Alt+B",
|
|
235
|
+
"Color/Tracker/Forward": "Cmd+T",
|
|
236
|
+
"Color/Tracker/One Frame Forward": "Alt+Right",
|
|
237
|
+
"Color/Tracker/One Frame Reverse": "Alt+Left",
|
|
238
|
+
"Color/Tracker/Reverse": "Alt+T",
|
|
239
|
+
"Color/Tracker/Stop": "Cmd+Alt+T",
|
|
240
|
+
"Workspace/Switch to Page/Color": "Shift+6",
|
|
241
|
+
"Color/Primary Balance/Auto Color": "Shift+Alt+C",
|
|
242
|
+
"Color/Primary Balance/Enable Printer Light Hotkeys": "Cmd+Alt+`",
|
|
243
|
+
"Color/Nodes/Add Windowed Node (Circle)": "Alt+C",
|
|
244
|
+
"Color/Nodes/Add Windowed Node (Linear)": "Alt+Q",
|
|
245
|
+
"Color/Nodes/Add Windowed Node (Polygon)": "Alt+B",
|
|
246
|
+
"Color/Nodes/Add Windowed Node (Power Curve)": "Alt+G"
|
|
247
|
+
},
|
|
248
|
+
"fusion_page": {
|
|
249
|
+
"Fusion/Select Tool Dialog": "Shift+Space",
|
|
250
|
+
"Workspace/Switch to Page/Fusion": "Shift+5",
|
|
251
|
+
"Fusion/Viewer/Toggle Selected Node in Left Viewer": "1",
|
|
252
|
+
"Fusion/Viewer/Toggle Selected Node in Right Viewer": "2",
|
|
253
|
+
"Fusion/Viewer/Clear Both Viewers": "`",
|
|
254
|
+
"Fusion/Viewer/Display RGB": "C",
|
|
255
|
+
"Fusion/Viewer/Display Red Channel": "R",
|
|
256
|
+
"Fusion/Viewer/Display Green Channel": "G",
|
|
257
|
+
"Fusion/Viewer/Display Blue Channel": "B",
|
|
258
|
+
"Fusion/Viewer/Display Alpha Channel": "A",
|
|
259
|
+
"Fusion/Viewer/Display Z Channel": "Z",
|
|
260
|
+
"Fusion/Playback/Play or Stop": "Space",
|
|
261
|
+
"Fusion/Playback/Reverse Play": "Shift+Space",
|
|
262
|
+
"Fusion/Playback/Previous Frame": "Left",
|
|
263
|
+
"Fusion/Playback/Next Frame": "Right",
|
|
264
|
+
"Fusion/Playback/Back 10 Frames": "Shift+Left",
|
|
265
|
+
"Fusion/Playback/Forward 10 Frames": "Shift+Right",
|
|
266
|
+
"Fusion/Playback/First Frame": "Cmd+Left",
|
|
267
|
+
"Fusion/Playback/Last Frame": "Cmd+Right",
|
|
268
|
+
"Fusion/3D/Transform Position Mode": "Q",
|
|
269
|
+
"Fusion/3D/Transform Rotation Mode": "W",
|
|
270
|
+
"Fusion/3D/Transform Scale Mode": "E",
|
|
271
|
+
"Fusion/Nodes/Deselect All": "Cmd+Shift+A",
|
|
272
|
+
"Fusion/Nodes/Delete Selected": "Delete",
|
|
273
|
+
"Mark/Add Keyframe": "Cmd+["
|
|
274
|
+
},
|
|
275
|
+
"fairlight_page": {
|
|
276
|
+
"Workspace/Switch to Page/Fairlight": "Shift+7",
|
|
277
|
+
"Fairlight/Playback/Play or Stop": "Space",
|
|
278
|
+
"Fairlight/Playback/Reverse Play": "Shift+Space",
|
|
279
|
+
"Fairlight/Playback/Play Forward": "L",
|
|
280
|
+
"Fairlight/Playback/Play Reverse": "J",
|
|
281
|
+
"Fairlight/Playback/Stop": "K",
|
|
282
|
+
"Fairlight/Transport/Move Playhead Left by Clip or Marker": "Cmd+Alt+Left",
|
|
283
|
+
"Fairlight/Transport/Move Playhead Right by Clip or Marker": "Cmd+Alt+Right",
|
|
284
|
+
"Fairlight/Tracks/Select Track Above": "Cmd+Alt+Up",
|
|
285
|
+
"Fairlight/Tracks/Select Track Below": "Cmd+Alt+Down",
|
|
286
|
+
"Fairlight/Timeline/Zoom In": "Cmd+=",
|
|
287
|
+
"Fairlight/Timeline/Zoom Out": "Cmd+-",
|
|
288
|
+
"Mark/Mark In": "I",
|
|
289
|
+
"Mark/Mark Out": "O"
|
|
290
|
+
},
|
|
291
|
+
"deliver_page": {
|
|
292
|
+
"Workspace/Switch to Page/Deliver": "Shift+8",
|
|
293
|
+
"Mark/Mark In": "I",
|
|
294
|
+
"Mark/Mark Out": "O",
|
|
295
|
+
"Mark/Clear In and Out": "Alt+X",
|
|
296
|
+
"Playback/Pause/Start Playback": "Space",
|
|
297
|
+
"Playback/Play Reverse": "J",
|
|
298
|
+
"Playback/Stop": "K",
|
|
299
|
+
"Playback/Play Forward": "L",
|
|
300
|
+
"Playback/Go To/Timeline Start": "Home",
|
|
301
|
+
"Playback/Go To/Timeline End": "End",
|
|
302
|
+
"Playback/Step One/Frame Reverse": "Left",
|
|
303
|
+
"Playback/Step One/Frame Forward": "Right"
|
|
304
|
+
},
|
|
305
|
+
"cut_page": {
|
|
306
|
+
"Workspace/Switch to Page/Cut": "Shift+3",
|
|
307
|
+
"File/Import/Media…": "Cmd+I",
|
|
308
|
+
"File/New Timeline…": "Cmd+N",
|
|
309
|
+
"Workspace/Active Panel Selection/Media Clips": "Cmd+2",
|
|
310
|
+
"Workspace/Active Panel Selection/Timeline": "Cmd+4",
|
|
311
|
+
"Edit/Insert": "F9",
|
|
312
|
+
"Edit/Overwrite": "F10",
|
|
313
|
+
"Edit/Append to End of Timeline": "Shift+F12",
|
|
314
|
+
"Timeline/Add Transition": "Cmd+T",
|
|
315
|
+
"Trim/Blade Edit Mode": "B",
|
|
316
|
+
"Trim/Trim Mode": "T",
|
|
317
|
+
"Trim/Normal Edit Mode": "A",
|
|
318
|
+
"Timeline/Snapping": "N",
|
|
319
|
+
"Mark/Add Marker/Current Selected": "M",
|
|
320
|
+
"Mark/Modify Marker…": "Shift+M",
|
|
321
|
+
"Mark/Delete Marker": "Alt+M",
|
|
322
|
+
"Playback/Pause/Start Playback": "Space",
|
|
323
|
+
"Playback/Play Reverse": "J",
|
|
324
|
+
"Playback/Stop": "K",
|
|
325
|
+
"Playback/Play Forward": "L",
|
|
326
|
+
"Playback/Previous/Clip": "Up",
|
|
327
|
+
"Playback/Next/Clip": "Down",
|
|
328
|
+
"Playback/Step One/Frame Reverse": "Left",
|
|
329
|
+
"Playback/Step One/Frame Forward": "Right",
|
|
330
|
+
"Playback/Go To/Timeline Start": "Home",
|
|
331
|
+
"Playback/Go To/Timeline End": "End"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "devto",
|
|
3
|
+
"name": "Dev.to Automation",
|
|
4
|
+
"description": "Battle-tested playbook for Dev.to browser automation via CDP. Covers creating posts, liking, commenting, bookmarking, searching, and profile management. Dev.to uses standard HTML elements (textarea, button) with React — native value setter needed for controlled inputs.",
|
|
5
|
+
"platform": "devto",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"urlPatterns": [
|
|
8
|
+
"*dev.to*"
|
|
9
|
+
],
|
|
10
|
+
"tags": [
|
|
11
|
+
"devto",
|
|
12
|
+
"blog",
|
|
13
|
+
"developer",
|
|
14
|
+
"browser",
|
|
15
|
+
"cdp"
|
|
16
|
+
],
|
|
17
|
+
"successCount": 0,
|
|
18
|
+
"failCount": 0,
|
|
19
|
+
"urls": {
|
|
20
|
+
"home": "https://dev.to/",
|
|
21
|
+
"new_post": "https://dev.to/new",
|
|
22
|
+
"dashboard": "https://dev.to/dashboard",
|
|
23
|
+
"reading_list": "https://dev.to/readinglist",
|
|
24
|
+
"notifications": "https://dev.to/notifications",
|
|
25
|
+
"settings": "https://dev.to/settings",
|
|
26
|
+
"search": "https://dev.to/search?q={query}",
|
|
27
|
+
"profile": "https://dev.to/{username}",
|
|
28
|
+
"article": "https://dev.to/{username}/{slug}",
|
|
29
|
+
"tags": "https://dev.to/t/{tag}",
|
|
30
|
+
"top": "https://dev.to/top/{period}"
|
|
31
|
+
},
|
|
32
|
+
"selectors": {
|
|
33
|
+
"nav": {
|
|
34
|
+
"search_button": "button[aria-label='Search']",
|
|
35
|
+
"create_post": "a[href='/new']",
|
|
36
|
+
"notifications": "a[href='/notifications']",
|
|
37
|
+
"user_menu": "button#member-menu-button",
|
|
38
|
+
"dashboard": "a[href='/dashboard']",
|
|
39
|
+
"reading_list": "a[href='/readinglist']",
|
|
40
|
+
"settings": "a[href='/settings']",
|
|
41
|
+
"sign_out": "a[href='/signout_confirm']"
|
|
42
|
+
},
|
|
43
|
+
"post_editor": {
|
|
44
|
+
"title": "textarea#article-form-title",
|
|
45
|
+
"body": "textarea#article_body_markdown",
|
|
46
|
+
"tag_input": "input#tag-input",
|
|
47
|
+
"cover_image_input": "input#cover-image-input",
|
|
48
|
+
"publish_button": "button:has-text('Publish')",
|
|
49
|
+
"save_draft_button": "button:has-text('Save draft')",
|
|
50
|
+
"preview_button": "button:has-text('Preview')",
|
|
51
|
+
"edit_button": "button:has-text('Edit')",
|
|
52
|
+
"generate_image": "button:has-text('Generate Image')",
|
|
53
|
+
"cover_video_link": "button:has-text('Cover Video Link')"
|
|
54
|
+
},
|
|
55
|
+
"editor_toolbar": {
|
|
56
|
+
"bold": "button[aria-label='Bold']",
|
|
57
|
+
"italic": "button[aria-label='Italic']",
|
|
58
|
+
"link": "button[aria-label='Link']",
|
|
59
|
+
"ordered_list": "button[aria-label='Ordered list']",
|
|
60
|
+
"unordered_list": "button[aria-label='Unordered list']",
|
|
61
|
+
"heading": "button[aria-label='Heading']",
|
|
62
|
+
"quote": "button[aria-label='Quote']",
|
|
63
|
+
"upload_image": "button[aria-label='Upload image']",
|
|
64
|
+
"more_options": "button[aria-label='More options']"
|
|
65
|
+
},
|
|
66
|
+
"article_page": {
|
|
67
|
+
"reaction_trigger": "button#reaction-drawer-trigger",
|
|
68
|
+
"like_button": "[data-category='like']",
|
|
69
|
+
"jump_to_comments": "button#reaction-butt-comment",
|
|
70
|
+
"save_to_reading_list": "button#reaction-butt-readinglist",
|
|
71
|
+
"boost": "button#reaction-butt-boost",
|
|
72
|
+
"share_options": "button#article-show-more-button",
|
|
73
|
+
"comment_textarea": "textarea#text-area",
|
|
74
|
+
"comment_submit": "button:has-text('Submit')",
|
|
75
|
+
"comment_preview": "button:has-text('Preview')",
|
|
76
|
+
"sort_comments": "button#toggle-comments-sort-dropdown"
|
|
77
|
+
},
|
|
78
|
+
"feed": {
|
|
79
|
+
"article_card": "[class*='crayons-story']",
|
|
80
|
+
"article_link": "[class*='crayons-story'] a",
|
|
81
|
+
"article_title": "[class*='crayons-story__title']",
|
|
82
|
+
"article_tags": "[class*='crayons-tag']",
|
|
83
|
+
"article_user": "[class*='crayons-story'] [class*='profile-preview-card']"
|
|
84
|
+
},
|
|
85
|
+
"search": {
|
|
86
|
+
"search_input": "input#search-input",
|
|
87
|
+
"search_form": "form[action='/search']",
|
|
88
|
+
"search_results": "[class*='crayons-story']"
|
|
89
|
+
},
|
|
90
|
+
"profile": {
|
|
91
|
+
"follow_button": "button:has-text('Follow')",
|
|
92
|
+
"edit_profile": "button[aria-label='Edit profile']"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"detection": {
|
|
96
|
+
"is_logged_in": "!!document.querySelector('a[href=\"/new\"]')",
|
|
97
|
+
"is_home": "window.location.pathname === '/'",
|
|
98
|
+
"is_editor": "window.location.pathname === '/new' || window.location.pathname.includes('/edit')",
|
|
99
|
+
"is_article": "!!document.querySelector('#reaction-drawer-trigger')",
|
|
100
|
+
"is_dashboard": "window.location.pathname === '/dashboard'",
|
|
101
|
+
"is_search": "window.location.pathname === '/search'",
|
|
102
|
+
"is_profile": "!!document.querySelector('button[aria-label=\"Edit profile\"]')"
|
|
103
|
+
},
|
|
104
|
+
"flows": {
|
|
105
|
+
"create_post": {
|
|
106
|
+
"steps": [
|
|
107
|
+
"Navigate to dev.to/new",
|
|
108
|
+
"Wait 2s for editor to load",
|
|
109
|
+
"Set title via native value setter on textarea#article-form-title",
|
|
110
|
+
"Dispatch input event to update React state",
|
|
111
|
+
"Set body via native value setter on textarea#article_body_markdown",
|
|
112
|
+
"Dispatch input event",
|
|
113
|
+
"Add tags: click input#tag-input, type tag name via browser_fill_form, type comma to confirm each tag",
|
|
114
|
+
"Optionally upload cover image via input#cover-image-input",
|
|
115
|
+
"Click 'Publish' button or 'Save draft'",
|
|
116
|
+
"Wait 3s for redirect to published article"
|
|
117
|
+
],
|
|
118
|
+
"guards": [
|
|
119
|
+
"Must be logged in"
|
|
120
|
+
],
|
|
121
|
+
"why": "Dev.to uses React controlled textareas — .value setter doesn't update React state. Must use Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set.call(el, text) then dispatch input event. Tags are confirmed by typing comma after each tag name."
|
|
122
|
+
},
|
|
123
|
+
"like_article": {
|
|
124
|
+
"steps": [
|
|
125
|
+
"Navigate to article page",
|
|
126
|
+
"Find reaction drawer trigger: button#reaction-drawer-trigger",
|
|
127
|
+
"Click to expand reaction options",
|
|
128
|
+
"Click Like button: [data-category='like']",
|
|
129
|
+
"Verify reaction count increases"
|
|
130
|
+
],
|
|
131
|
+
"guards": [
|
|
132
|
+
"Must be logged in"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
"comment_on_article": {
|
|
136
|
+
"steps": [
|
|
137
|
+
"Navigate to article page",
|
|
138
|
+
"Scroll to comment section",
|
|
139
|
+
"Find comment textarea: textarea#text-area (placeholder: 'Add to the discussion')",
|
|
140
|
+
"Set comment text via native value setter + input event dispatch",
|
|
141
|
+
"Click Submit button",
|
|
142
|
+
"Wait 2s for comment to post"
|
|
143
|
+
],
|
|
144
|
+
"guards": [
|
|
145
|
+
"Must be logged in"
|
|
146
|
+
],
|
|
147
|
+
"why": "Comment textarea is also React-controlled. Use native value setter approach."
|
|
148
|
+
},
|
|
149
|
+
"save_to_reading_list": {
|
|
150
|
+
"steps": [
|
|
151
|
+
"Navigate to article page",
|
|
152
|
+
"Click Save button: button#reaction-butt-readinglist",
|
|
153
|
+
"Verify button state changes"
|
|
154
|
+
],
|
|
155
|
+
"guards": [
|
|
156
|
+
"Must be logged in"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"boost_article": {
|
|
160
|
+
"steps": [
|
|
161
|
+
"Navigate to article page",
|
|
162
|
+
"Click Boost button: button#reaction-butt-boost",
|
|
163
|
+
"Verify boost count increases"
|
|
164
|
+
],
|
|
165
|
+
"guards": [
|
|
166
|
+
"Must be logged in"
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
"search": {
|
|
170
|
+
"steps": [
|
|
171
|
+
"Navigate to dev.to/search?q={query}",
|
|
172
|
+
"Wait 2s for search results to load",
|
|
173
|
+
"Extract articles from [class*='crayons-story'] elements",
|
|
174
|
+
"Get title, author, tags from article cards"
|
|
175
|
+
],
|
|
176
|
+
"guards": [],
|
|
177
|
+
"why": "Direct URL navigation is more reliable than typing in search input."
|
|
178
|
+
},
|
|
179
|
+
"follow_user": {
|
|
180
|
+
"steps": [
|
|
181
|
+
"Navigate to dev.to/{username}",
|
|
182
|
+
"Wait 2s for profile to load",
|
|
183
|
+
"Find Follow button: button with text 'Follow'",
|
|
184
|
+
"Click Follow via browser_human_click",
|
|
185
|
+
"Verify button changes to 'Following'"
|
|
186
|
+
],
|
|
187
|
+
"guards": [
|
|
188
|
+
"Must be logged in",
|
|
189
|
+
"Must not already be following"
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
"browse_tags": {
|
|
193
|
+
"steps": [
|
|
194
|
+
"Navigate to dev.to/t/{tag}",
|
|
195
|
+
"Wait 2s for tag page to load",
|
|
196
|
+
"Extract articles from feed",
|
|
197
|
+
"Follow tag if desired"
|
|
198
|
+
],
|
|
199
|
+
"guards": []
|
|
200
|
+
},
|
|
201
|
+
"view_dashboard": {
|
|
202
|
+
"steps": [
|
|
203
|
+
"Navigate to dev.to/dashboard",
|
|
204
|
+
"Wait 2s for dashboard to load",
|
|
205
|
+
"View published posts, drafts, analytics",
|
|
206
|
+
"Click on post to edit"
|
|
207
|
+
],
|
|
208
|
+
"guards": [
|
|
209
|
+
"Must be logged in"
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
"scroll_and_extract_feed": {
|
|
213
|
+
"steps": [
|
|
214
|
+
"Navigate to dev.to",
|
|
215
|
+
"Wait 2s for feed to load",
|
|
216
|
+
"Extract articles from [class*='crayons-story'] elements",
|
|
217
|
+
"Get title from [class*='crayons-story__title'], tags, author",
|
|
218
|
+
"Scroll down for more articles",
|
|
219
|
+
"Wait 1s for lazy-loaded content"
|
|
220
|
+
],
|
|
221
|
+
"guards": []
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"errors": [
|
|
225
|
+
{
|
|
226
|
+
"error": "Login required",
|
|
227
|
+
"context": "Creating posts, liking, commenting, bookmarking",
|
|
228
|
+
"solution": "Log in manually. Dev.to supports GitHub, Twitter, Apple, Forem, and email login.",
|
|
229
|
+
"severity": "high"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"error": "React controlled textarea ignores direct .value assignment",
|
|
233
|
+
"context": "Title and body textareas don't update React state with simple value set",
|
|
234
|
+
"solution": "Use native value setter: Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set.call(textarea, text). Then dispatch new Event('input', {bubbles: true}).",
|
|
235
|
+
"severity": "high"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"error": "Tags not confirmed without comma/Enter",
|
|
239
|
+
"context": "Typing tag name in #tag-input doesn't add it until comma or Enter",
|
|
240
|
+
"solution": "Use browser_fill_form to type tag name followed by comma. Each comma confirms one tag. Up to 4 tags allowed.",
|
|
241
|
+
"severity": "medium"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"error": "browser_fill_form types into textarea but React state empty",
|
|
245
|
+
"context": "CDP key events update DOM value but not React's internal state",
|
|
246
|
+
"solution": "Use native value setter approach for title and body. browser_fill_form works for tag input since it uses comma-triggered events.",
|
|
247
|
+
"severity": "medium"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"error": "Preview mode hides textarea",
|
|
251
|
+
"context": "Clicking Preview button switches from Edit view",
|
|
252
|
+
"solution": "Click Edit button to switch back to edit mode before typing.",
|
|
253
|
+
"severity": "low"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"error": "Frontmost app switches to VS Code when approving tool calls",
|
|
257
|
+
"context": "AccessibilityAdapter attaches to frontmost app",
|
|
258
|
+
"solution": "Use CDP browser tools — they work regardless of which app is frontmost.",
|
|
259
|
+
"severity": "high"
|
|
260
|
+
}
|
|
261
|
+
],
|
|
262
|
+
"policyNotes": {
|
|
263
|
+
"rate_limits": [
|
|
264
|
+
"Posts: no strict limit but don't spam",
|
|
265
|
+
"Comments: ~30/day recommended",
|
|
266
|
+
"Reactions: no strict limit",
|
|
267
|
+
"Dev.to is lenient but will flag spam accounts"
|
|
268
|
+
],
|
|
269
|
+
"safety": [
|
|
270
|
+
"Never automate login",
|
|
271
|
+
"Add 2-5s delays between actions",
|
|
272
|
+
"Use browser_stealth before interacting",
|
|
273
|
+
"Follow community guidelines — no spam posts",
|
|
274
|
+
"Use native value setter for React controlled inputs",
|
|
275
|
+
"Markdown is supported in post body and comments"
|
|
276
|
+
],
|
|
277
|
+
"tool_preferences": [
|
|
278
|
+
"browser_js with native value setter — for title, body, and comment textareas (React controlled)",
|
|
279
|
+
"browser_fill_form — for tag input (comma-separated), search input",
|
|
280
|
+
"browser_human_click — for Publish, Like, Boost, Follow buttons",
|
|
281
|
+
"browser_navigate — for search (direct URL), profile, tag pages"
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
"steps": [
|
|
285
|
+
{
|
|
286
|
+
"action": "navigate",
|
|
287
|
+
"url": "https://dev.to/",
|
|
288
|
+
"description": "Open Dev.to home feed"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"action": "wait",
|
|
292
|
+
"ms": 2000,
|
|
293
|
+
"description": "Wait for feed to load"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"action": "extract",
|
|
297
|
+
"target": "[class*='crayons-story']",
|
|
298
|
+
"format": "text",
|
|
299
|
+
"description": "Extract article cards from feed"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"action": "scroll",
|
|
303
|
+
"direction": "down",
|
|
304
|
+
"amount": 5,
|
|
305
|
+
"description": "Scroll for more articles"
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"action": "wait",
|
|
309
|
+
"ms": 1000,
|
|
310
|
+
"description": "Wait for lazy-loaded articles"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"action": "screenshot",
|
|
314
|
+
"description": "Capture feed state"
|
|
315
|
+
}
|
|
316
|
+
]
|
|
317
|
+
}
|