@tea-agent/loop-agent 0.13.0-beta.0 → 0.13.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.
Files changed (282) hide show
  1. package/AGENTS.md +157 -155
  2. package/CHANGELOG.md +301 -322
  3. package/README.md +335 -345
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/cursor-prompt.js +6 -6
  7. package/dist/commands/init.js +597 -528
  8. package/dist/commands/loop-benchmark.js +11 -11
  9. package/dist/commands/pi-reuse-benchmark.js +16 -16
  10. package/dist/executors/shell-executor.js +200 -21
  11. package/dist/infrastructure/evaluation/candidate-store.js +5 -1
  12. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  13. package/dist/task/runtime.js +27 -27
  14. package/dist/worker/observe/static/api.js +46 -46
  15. package/dist/worker/observe/static/app.js +150 -150
  16. package/dist/worker/observe/static/constants.js +148 -148
  17. package/dist/worker/observe/static/copy.js +67 -67
  18. package/dist/worker/observe/static/dag-helpers.js +172 -172
  19. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  20. package/dist/worker/observe/static/dag-layout.js +83 -83
  21. package/dist/worker/observe/static/dag-model.js +72 -72
  22. package/dist/worker/observe/static/dom.js +212 -53
  23. package/dist/worker/observe/static/format-pool.js +67 -67
  24. package/dist/worker/observe/static/format.js +292 -292
  25. package/dist/worker/observe/static/index.html +308 -308
  26. package/dist/worker/observe/static/kpi.js +94 -94
  27. package/dist/worker/observe/static/relations.js +133 -133
  28. package/dist/worker/observe/static/router.js +93 -93
  29. package/dist/worker/observe/static/run-processing.js +148 -148
  30. package/dist/worker/observe/static/shell-chrome.js +68 -68
  31. package/dist/worker/observe/static/state.js +267 -253
  32. package/dist/worker/observe/static/styles.css +1902 -1902
  33. package/dist/worker/observe/static/views/batch.js +227 -227
  34. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  35. package/dist/worker/observe/static/views/dag-inspector.js +627 -607
  36. package/dist/worker/observe/static/views/dag.js +371 -362
  37. package/dist/worker/observe/static/views/dashboard.js +509 -252
  38. package/dist/worker/observe/static/views/failures.js +143 -143
  39. package/dist/worker/observe/static/views/feature.js +492 -492
  40. package/dist/worker/observe/static/views/pool.js +350 -350
  41. package/dist/worker/observe/static/views/run.js +453 -453
  42. package/dist/worker/observe/static/views/session-timeline.js +219 -205
  43. package/dist/worker/observe/static/views/shell.js +7 -7
  44. package/dist/worker/observe/static/views/task.js +314 -314
  45. package/dist/worker/observe/static/views/timeline.js +163 -163
  46. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  47. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  48. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  49. package/dist/workflows/dag/canvas-observer.js +275 -275
  50. package/dist/workflows/dag/decision-envelope.js +57 -2
  51. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  52. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  53. package/dist/workflows/dag/frontend-repair.js +341 -0
  54. package/dist/workflows/dag/frontend-risk.js +161 -0
  55. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  56. package/dist/workflows/dag/init-hybrid.js +1020 -125
  57. package/dist/workflows/dag/repair-artifact.js +43 -3
  58. package/dist/workflows/dag/skill-instructions.js +4 -2
  59. package/dist/workflows/dag/types.js +29 -8
  60. package/docs/README.md +105 -104
  61. package/docs/agent-dag-recovery-playbook.md +195 -195
  62. package/docs/agent-dag-runner.md +67 -67
  63. package/docs/architecture/README.md +26 -26
  64. package/docs/architecture/dag-execution.md +140 -140
  65. package/docs/architecture/evolution.md +54 -54
  66. package/docs/architecture/facts-and-state.md +71 -71
  67. package/docs/architecture/runtime-boundaries.md +191 -191
  68. package/docs/architecture/system-overview.md +93 -93
  69. package/docs/architecture/worker-and-feature.md +85 -85
  70. package/docs/cursor-prompt-sidecar.md +36 -36
  71. package/docs/decisions/README.md +18 -18
  72. package/docs/design/README.md +167 -167
  73. package/docs/development-principles.md +73 -73
  74. package/docs/exec-plans/README.md +6 -6
  75. package/docs/exec-plans/active/README.md +1 -4
  76. package/docs/exec-plans/completed/README.md +106 -84
  77. package/docs/feature-workflow.md +414 -389
  78. package/docs/harness-methodology-debugging.md +153 -153
  79. package/docs/harness-methodology-tdd.md +130 -130
  80. package/docs/harness-methodology-verification.md +27 -27
  81. package/docs/init-surface.manifest.json +307 -289
  82. package/docs/loop-agent-harness.md +142 -142
  83. package/docs/production-readiness.md +96 -96
  84. package/docs/progress/README.md +76 -60
  85. package/docs/reports/README.md +150 -108
  86. package/docs/skills/README.md +7 -7
  87. package/docs/skills/vetted-skill-registry.md +29 -29
  88. package/docs/templates/adr.md +60 -60
  89. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  90. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  91. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  92. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  93. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  94. package/docs/templates/agent-dag-report.schema.json +473 -473
  95. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  96. package/docs/templates/agent-dag.base.json +190 -190
  97. package/docs/templates/agent-dag.final-verification.json +185 -185
  98. package/docs/templates/agent-dag.schema.json +411 -411
  99. package/docs/templates/agent-dag.supervised-implementation.json +620 -501
  100. package/docs/templates/backend-test-analysis.schema.json +44 -44
  101. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  102. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  103. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -202
  104. package/docs/templates/backend-test-dag.json +559 -311
  105. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -125
  106. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -81
  107. package/docs/templates/backend-test-execution.schema.json +133 -0
  108. package/docs/templates/backend-test-result.schema.json +99 -0
  109. package/docs/templates/branch-merge-report.md +93 -0
  110. package/docs/templates/exec-plan.md +64 -64
  111. package/docs/templates/feature-spec.md +53 -53
  112. package/docs/templates/frontend-design-contract.md +42 -42
  113. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  114. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  115. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  116. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  117. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  118. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  119. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  120. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  121. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  122. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  123. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  124. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  125. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  126. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  127. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  128. package/docs/templates/frontend-eval/metrics.md +138 -0
  129. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  130. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  131. package/docs/templates/frontend-task-constraints.md +35 -35
  132. package/docs/templates/frontend-task-requirement.md +70 -70
  133. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  134. package/docs/templates/frontend-test-dag.json +23 -23
  135. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  136. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  137. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  138. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  139. package/docs/templates/harness.schema.json +221 -221
  140. package/docs/templates/hybrid-dag.json +188 -188
  141. package/docs/templates/init-evolution-review.md +35 -35
  142. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  143. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  144. package/docs/templates/knowledge-sync-dag.json +178 -178
  145. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  146. package/docs/templates/product-line/AGENTS.md +8 -8
  147. package/docs/templates/product-line/README.md +9 -9
  148. package/docs/templates/product-line/acceptance.yaml +14 -14
  149. package/docs/templates/product-line/closeout.yaml +9 -9
  150. package/docs/templates/product-line/design.md +13 -13
  151. package/docs/templates/product-line/links.md +10 -10
  152. package/docs/templates/product-line/requirement.md +17 -17
  153. package/docs/templates/product-line/task-graph.yaml +15 -15
  154. package/docs/templates/product-line/task.yaml +64 -64
  155. package/docs/templates/product-line/test-plan.md +7 -7
  156. package/docs/templates/production-readiness-checklist.md +57 -57
  157. package/docs/templates/progress-log.md +17 -17
  158. package/docs/templates/project-start-checklist.md +9 -9
  159. package/docs/templates/qa-report.md +48 -48
  160. package/docs/templates/sprint-contract.md +29 -29
  161. package/docs/templates/worker-dogfood-evidence.md +80 -80
  162. package/docs/templates/worker-dogfood-setup.md +68 -68
  163. package/docs/verification-matrix.md +70 -70
  164. package/examples/decision-gate-agent-dag.json +177 -177
  165. package/examples/example-dag.json +46 -46
  166. package/examples/hybrid-loop-agent-dag.json +189 -189
  167. package/harness.json +66 -66
  168. package/package.json +52 -88
  169. package/scripts/check-product-line-docs.sh +29 -29
  170. package/scripts/check-task-pool-root.sh +32 -32
  171. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  172. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  173. package/scripts/kb-graph-incremental-prepare.sh +5 -5
  174. package/scripts/kb-graph-materialize.mjs +105 -105
  175. package/scripts/kb-graph-materialize.sh +4 -4
  176. package/scripts/kb-graph-promote.mjs +164 -164
  177. package/scripts/kb-graph-promote.sh +4 -4
  178. package/scripts/kb-query.mjs +554 -554
  179. package/scripts/kb-query.sh +5 -5
  180. package/skills/agent-worker/SKILL.md +39 -39
  181. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  182. package/skills/ai-engineering-context/SKILL.md +48 -48
  183. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  184. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  185. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  186. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  187. package/skills/analyze-product-dependencies/references/example.md +76 -76
  188. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  189. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  190. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  191. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  192. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  193. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  194. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  195. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  196. package/skills/analyze-product-requirements/SKILL.md +90 -90
  197. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  198. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  199. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  200. package/skills/analyze-product-requirements/references/example.md +86 -86
  201. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  202. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  203. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  204. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  205. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  206. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  207. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  208. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  209. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  210. package/skills/browser-tools/SKILL.md +196 -0
  211. package/skills/browser-tools/browser-content.js +103 -0
  212. package/skills/browser-tools/browser-cookies.js +35 -0
  213. package/skills/browser-tools/browser-eval.js +53 -0
  214. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  215. package/skills/browser-tools/browser-nav.js +44 -0
  216. package/skills/browser-tools/browser-pick.js +162 -0
  217. package/skills/browser-tools/browser-screenshot.js +34 -0
  218. package/skills/browser-tools/browser-start.js +86 -0
  219. package/skills/browser-tools/package-lock.json +2556 -0
  220. package/skills/browser-tools/package.json +19 -0
  221. package/skills/code-review-core/SKILL.md +20 -20
  222. package/skills/codebase-scout/SKILL.md +19 -19
  223. package/skills/frontend-design-review/SKILL.md +66 -66
  224. package/skills/frontend-design-review/references/review-checklist.md +58 -58
  225. package/skills/frontend-implementation/SKILL.md +49 -47
  226. package/skills/frontend-implementation/references/code-standards.md +32 -32
  227. package/skills/frontend-implementation/references/design-spec.md +46 -46
  228. package/skills/frontend-implementation/references/node-contracts.md +27 -76
  229. package/skills/frontend-review/SKILL.md +59 -59
  230. package/skills/frontend-review/references/review-findings.md +47 -47
  231. package/skills/frontend-verification/SKILL.md +53 -53
  232. package/skills/frontend-verification/references/verification-checklist.md +68 -68
  233. package/skills/grill-me/SKILL.md +10 -10
  234. package/skills/grill-with-docs/SKILL.md +88 -88
  235. package/skills/grill-with-docs/adr-format.md +47 -47
  236. package/skills/grill-with-docs/context-format.md +60 -60
  237. package/skills/init-capability-evolution/SKILL.md +70 -70
  238. package/skills/loop-agent/SKILL.md +151 -151
  239. package/skills/loop-agent/references/README.md +67 -67
  240. package/skills/loop-agent/references/command-reference.md +527 -505
  241. package/skills/loop-agent/references/docs-converge.md +126 -126
  242. package/skills/loop-agent/references/harness-policy.md +263 -263
  243. package/skills/loop-agent/references/hybrid-dag.md +243 -238
  244. package/skills/loop-agent/references/learned/README.md +21 -21
  245. package/skills/loop-agent/references/long-running-loop.md +57 -57
  246. package/skills/loop-agent/references/model-routing.md +36 -36
  247. package/skills/loop-agent/references/multi-worktree.md +54 -54
  248. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  249. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  250. package/skills/loop-agent/references/pi-prompt.md +23 -23
  251. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  252. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  253. package/skills/loop-agent/references/task-workflow.md +89 -89
  254. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -139
  255. package/skills/playwright-cli/SKILL.md +420 -420
  256. package/skills/playwright-cli/references/element-attributes.md +23 -23
  257. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  258. package/skills/playwright-cli/references/request-mocking.md +87 -87
  259. package/skills/playwright-cli/references/running-code.md +241 -241
  260. package/skills/playwright-cli/references/session-management.md +225 -225
  261. package/skills/playwright-cli/references/storage-state.md +275 -275
  262. package/skills/playwright-cli/references/test-generation.md +433 -433
  263. package/skills/playwright-cli/references/tracing.md +139 -139
  264. package/skills/playwright-cli/references/video-recording.md +143 -143
  265. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  266. package/skills/requesting-code-review/SKILL.md +101 -101
  267. package/skills/requesting-code-review/code-reviewer.md +168 -168
  268. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  269. package/skills/systematic-debugging/SKILL.md +296 -296
  270. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  271. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  272. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  273. package/skills/systematic-debugging/find-polluter.sh +63 -63
  274. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  275. package/skills/systematic-debugging/test-academic.md +14 -14
  276. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  277. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  278. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  279. package/skills/test-driven-development/SKILL.md +20 -20
  280. package/skills/using-git-worktrees/SKILL.md +215 -215
  281. package/skills/verification-before-completion/SKILL.md +154 -154
  282. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,241 +1,241 @@
1
- # Running Custom Playwright Code
2
-
3
- Use `run-code` to execute arbitrary Playwright code for advanced scenarios not covered by CLI commands.
4
-
5
- ## Syntax
6
-
7
- ```bash
8
- playwright-cli run-code "async page => {
9
- // Your Playwright code here
10
- // Access page.context() for browser context operations
11
- }"
12
- ```
13
-
14
- You can also load the function from a file:
15
-
16
- ```bash
17
- playwright-cli run-code --filename=./my-script.js
18
- ```
19
-
20
-
21
- The code must be a single function expression, it is wrapped in `(...)` and evaluated.
22
- import/export/require syntax is not supported.
23
-
24
- ## Geolocation
25
-
26
- ```bash
27
- # Grant geolocation permission and set location
28
- playwright-cli run-code "async page => {
29
- await page.context().grantPermissions(['geolocation']);
30
- await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
31
- }"
32
-
33
- # Set location to London
34
- playwright-cli run-code "async page => {
35
- await page.context().grantPermissions(['geolocation']);
36
- await page.context().setGeolocation({ latitude: 51.5074, longitude: -0.1278 });
37
- }"
38
-
39
- # Clear geolocation override
40
- playwright-cli run-code "async page => {
41
- await page.context().clearPermissions();
42
- }"
43
- ```
44
-
45
- ## Permissions
46
-
47
- ```bash
48
- # Grant multiple permissions
49
- playwright-cli run-code "async page => {
50
- await page.context().grantPermissions([
51
- 'geolocation',
52
- 'notifications',
53
- 'camera',
54
- 'microphone'
55
- ]);
56
- }"
57
-
58
- # Grant permissions for specific origin
59
- playwright-cli run-code "async page => {
60
- await page.context().grantPermissions(['clipboard-read'], {
61
- origin: 'https://example.com'
62
- });
63
- }"
64
- ```
65
-
66
- ## Media Emulation
67
-
68
- ```bash
69
- # Emulate dark color scheme
70
- playwright-cli run-code "async page => {
71
- await page.emulateMedia({ colorScheme: 'dark' });
72
- }"
73
-
74
- # Emulate light color scheme
75
- playwright-cli run-code "async page => {
76
- await page.emulateMedia({ colorScheme: 'light' });
77
- }"
78
-
79
- # Emulate reduced motion
80
- playwright-cli run-code "async page => {
81
- await page.emulateMedia({ reducedMotion: 'reduce' });
82
- }"
83
-
84
- # Emulate print media
85
- playwright-cli run-code "async page => {
86
- await page.emulateMedia({ media: 'print' });
87
- }"
88
- ```
89
-
90
- ## Wait Strategies
91
-
92
- ```bash
93
- # Wait for network idle
94
- playwright-cli run-code "async page => {
95
- await page.waitForLoadState('networkidle');
96
- }"
97
-
98
- # Wait for specific element
99
- playwright-cli run-code "async page => {
100
- await page.locator('.loading').waitFor({ state: 'hidden' });
101
- }"
102
-
103
- # Wait for function to return true
104
- playwright-cli run-code "async page => {
105
- await page.waitForFunction(() => window.appReady === true);
106
- }"
107
-
108
- # Wait with timeout
109
- playwright-cli run-code "async page => {
110
- await page.locator('.result').waitFor({ timeout: 10000 });
111
- }"
112
- ```
113
-
114
- ## Frames and Iframes
115
-
116
- ```bash
117
- # Work with iframe
118
- playwright-cli run-code "async page => {
119
- const frame = page.locator('iframe#my-iframe').contentFrame();
120
- await frame.locator('button').click();
121
- }"
122
-
123
- # Get all frames
124
- playwright-cli run-code "async page => {
125
- const frames = page.frames();
126
- return frames.map(f => f.url());
127
- }"
128
- ```
129
-
130
- ## File Downloads
131
-
132
- ```bash
133
- # Handle file download
134
- playwright-cli run-code "async page => {
135
- const downloadPromise = page.waitForEvent('download');
136
- await page.getByRole('link', { name: 'Download' }).click();
137
- const download = await downloadPromise;
138
- await download.saveAs('./downloaded-file.pdf');
139
- return download.suggestedFilename();
140
- }"
141
- ```
142
-
143
- ## Clipboard
144
-
145
- ```bash
146
- # Read clipboard (requires permission)
147
- playwright-cli run-code "async page => {
148
- await page.context().grantPermissions(['clipboard-read']);
149
- return await page.evaluate(() => navigator.clipboard.readText());
150
- }"
151
-
152
- # Write to clipboard
153
- playwright-cli run-code "async page => {
154
- await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello clipboard!');
155
- }"
156
- ```
157
-
158
- ## Page Information
159
-
160
- ```bash
161
- # Get page title
162
- playwright-cli run-code "async page => {
163
- return await page.title();
164
- }"
165
-
166
- # Get current URL
167
- playwright-cli run-code "async page => {
168
- return page.url();
169
- }"
170
-
171
- # Get page content
172
- playwright-cli run-code "async page => {
173
- return await page.content();
174
- }"
175
-
176
- # Get viewport size
177
- playwright-cli run-code "async page => {
178
- return page.viewportSize();
179
- }"
180
- ```
181
-
182
- ## JavaScript Execution
183
-
184
- ```bash
185
- # Execute JavaScript and return result
186
- playwright-cli run-code "async page => {
187
- return await page.evaluate(() => {
188
- return {
189
- userAgent: navigator.userAgent,
190
- language: navigator.language,
191
- cookiesEnabled: navigator.cookieEnabled
192
- };
193
- });
194
- }"
195
-
196
- # Pass arguments to evaluate
197
- playwright-cli run-code "async page => {
198
- const multiplier = 5;
199
- return await page.evaluate(m => document.querySelectorAll('li').length * m, multiplier);
200
- }"
201
- ```
202
-
203
- ## Error Handling
204
-
205
- ```bash
206
- # Try-catch in run-code
207
- playwright-cli run-code "async page => {
208
- try {
209
- await page.getByRole('button', { name: 'Submit' }).click({ timeout: 1000 });
210
- return 'clicked';
211
- } catch (e) {
212
- return 'element not found';
213
- }
214
- }"
215
- ```
216
-
217
- ## Complex Workflows
218
-
219
- ```bash
220
- # Login and save state
221
- playwright-cli run-code "async page => {
222
- await page.goto('https://example.com/login');
223
- await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com');
224
- await page.getByRole('textbox', { name: 'Password' }).fill('secret');
225
- await page.getByRole('button', { name: 'Sign in' }).click();
226
- await page.waitForURL('**/dashboard');
227
- await page.context().storageState({ path: 'auth.json' });
228
- return 'Login successful';
229
- }"
230
-
231
- # Scrape data from multiple pages
232
- playwright-cli run-code "async page => {
233
- const results = [];
234
- for (let i = 1; i <= 3; i++) {
235
- await page.goto(\`https://example.com/page/\${i}\`);
236
- const items = await page.locator('.item').allTextContents();
237
- results.push(...items);
238
- }
239
- return results;
240
- }"
241
- ```
1
+ # Running Custom Playwright Code
2
+
3
+ Use `run-code` to execute arbitrary Playwright code for advanced scenarios not covered by CLI commands.
4
+
5
+ ## Syntax
6
+
7
+ ```bash
8
+ playwright-cli run-code "async page => {
9
+ // Your Playwright code here
10
+ // Access page.context() for browser context operations
11
+ }"
12
+ ```
13
+
14
+ You can also load the function from a file:
15
+
16
+ ```bash
17
+ playwright-cli run-code --filename=./my-script.js
18
+ ```
19
+
20
+
21
+ The code must be a single function expression, it is wrapped in `(...)` and evaluated.
22
+ import/export/require syntax is not supported.
23
+
24
+ ## Geolocation
25
+
26
+ ```bash
27
+ # Grant geolocation permission and set location
28
+ playwright-cli run-code "async page => {
29
+ await page.context().grantPermissions(['geolocation']);
30
+ await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
31
+ }"
32
+
33
+ # Set location to London
34
+ playwright-cli run-code "async page => {
35
+ await page.context().grantPermissions(['geolocation']);
36
+ await page.context().setGeolocation({ latitude: 51.5074, longitude: -0.1278 });
37
+ }"
38
+
39
+ # Clear geolocation override
40
+ playwright-cli run-code "async page => {
41
+ await page.context().clearPermissions();
42
+ }"
43
+ ```
44
+
45
+ ## Permissions
46
+
47
+ ```bash
48
+ # Grant multiple permissions
49
+ playwright-cli run-code "async page => {
50
+ await page.context().grantPermissions([
51
+ 'geolocation',
52
+ 'notifications',
53
+ 'camera',
54
+ 'microphone'
55
+ ]);
56
+ }"
57
+
58
+ # Grant permissions for specific origin
59
+ playwright-cli run-code "async page => {
60
+ await page.context().grantPermissions(['clipboard-read'], {
61
+ origin: 'https://example.com'
62
+ });
63
+ }"
64
+ ```
65
+
66
+ ## Media Emulation
67
+
68
+ ```bash
69
+ # Emulate dark color scheme
70
+ playwright-cli run-code "async page => {
71
+ await page.emulateMedia({ colorScheme: 'dark' });
72
+ }"
73
+
74
+ # Emulate light color scheme
75
+ playwright-cli run-code "async page => {
76
+ await page.emulateMedia({ colorScheme: 'light' });
77
+ }"
78
+
79
+ # Emulate reduced motion
80
+ playwright-cli run-code "async page => {
81
+ await page.emulateMedia({ reducedMotion: 'reduce' });
82
+ }"
83
+
84
+ # Emulate print media
85
+ playwright-cli run-code "async page => {
86
+ await page.emulateMedia({ media: 'print' });
87
+ }"
88
+ ```
89
+
90
+ ## Wait Strategies
91
+
92
+ ```bash
93
+ # Wait for network idle
94
+ playwright-cli run-code "async page => {
95
+ await page.waitForLoadState('networkidle');
96
+ }"
97
+
98
+ # Wait for specific element
99
+ playwright-cli run-code "async page => {
100
+ await page.locator('.loading').waitFor({ state: 'hidden' });
101
+ }"
102
+
103
+ # Wait for function to return true
104
+ playwright-cli run-code "async page => {
105
+ await page.waitForFunction(() => window.appReady === true);
106
+ }"
107
+
108
+ # Wait with timeout
109
+ playwright-cli run-code "async page => {
110
+ await page.locator('.result').waitFor({ timeout: 10000 });
111
+ }"
112
+ ```
113
+
114
+ ## Frames and Iframes
115
+
116
+ ```bash
117
+ # Work with iframe
118
+ playwright-cli run-code "async page => {
119
+ const frame = page.locator('iframe#my-iframe').contentFrame();
120
+ await frame.locator('button').click();
121
+ }"
122
+
123
+ # Get all frames
124
+ playwright-cli run-code "async page => {
125
+ const frames = page.frames();
126
+ return frames.map(f => f.url());
127
+ }"
128
+ ```
129
+
130
+ ## File Downloads
131
+
132
+ ```bash
133
+ # Handle file download
134
+ playwright-cli run-code "async page => {
135
+ const downloadPromise = page.waitForEvent('download');
136
+ await page.getByRole('link', { name: 'Download' }).click();
137
+ const download = await downloadPromise;
138
+ await download.saveAs('./downloaded-file.pdf');
139
+ return download.suggestedFilename();
140
+ }"
141
+ ```
142
+
143
+ ## Clipboard
144
+
145
+ ```bash
146
+ # Read clipboard (requires permission)
147
+ playwright-cli run-code "async page => {
148
+ await page.context().grantPermissions(['clipboard-read']);
149
+ return await page.evaluate(() => navigator.clipboard.readText());
150
+ }"
151
+
152
+ # Write to clipboard
153
+ playwright-cli run-code "async page => {
154
+ await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello clipboard!');
155
+ }"
156
+ ```
157
+
158
+ ## Page Information
159
+
160
+ ```bash
161
+ # Get page title
162
+ playwright-cli run-code "async page => {
163
+ return await page.title();
164
+ }"
165
+
166
+ # Get current URL
167
+ playwright-cli run-code "async page => {
168
+ return page.url();
169
+ }"
170
+
171
+ # Get page content
172
+ playwright-cli run-code "async page => {
173
+ return await page.content();
174
+ }"
175
+
176
+ # Get viewport size
177
+ playwright-cli run-code "async page => {
178
+ return page.viewportSize();
179
+ }"
180
+ ```
181
+
182
+ ## JavaScript Execution
183
+
184
+ ```bash
185
+ # Execute JavaScript and return result
186
+ playwright-cli run-code "async page => {
187
+ return await page.evaluate(() => {
188
+ return {
189
+ userAgent: navigator.userAgent,
190
+ language: navigator.language,
191
+ cookiesEnabled: navigator.cookieEnabled
192
+ };
193
+ });
194
+ }"
195
+
196
+ # Pass arguments to evaluate
197
+ playwright-cli run-code "async page => {
198
+ const multiplier = 5;
199
+ return await page.evaluate(m => document.querySelectorAll('li').length * m, multiplier);
200
+ }"
201
+ ```
202
+
203
+ ## Error Handling
204
+
205
+ ```bash
206
+ # Try-catch in run-code
207
+ playwright-cli run-code "async page => {
208
+ try {
209
+ await page.getByRole('button', { name: 'Submit' }).click({ timeout: 1000 });
210
+ return 'clicked';
211
+ } catch (e) {
212
+ return 'element not found';
213
+ }
214
+ }"
215
+ ```
216
+
217
+ ## Complex Workflows
218
+
219
+ ```bash
220
+ # Login and save state
221
+ playwright-cli run-code "async page => {
222
+ await page.goto('https://example.com/login');
223
+ await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com');
224
+ await page.getByRole('textbox', { name: 'Password' }).fill('secret');
225
+ await page.getByRole('button', { name: 'Sign in' }).click();
226
+ await page.waitForURL('**/dashboard');
227
+ await page.context().storageState({ path: 'auth.json' });
228
+ return 'Login successful';
229
+ }"
230
+
231
+ # Scrape data from multiple pages
232
+ playwright-cli run-code "async page => {
233
+ const results = [];
234
+ for (let i = 1; i <= 3; i++) {
235
+ await page.goto(\`https://example.com/page/\${i}\`);
236
+ const items = await page.locator('.item').allTextContents();
237
+ results.push(...items);
238
+ }
239
+ return results;
240
+ }"
241
+ ```