chrome-devtools-frontend 1.0.1668390 → 1.0.1669021

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 (192) hide show
  1. package/.agents/skills/devtools-ci/SKILL.md +65 -0
  2. package/.agents/skills/gerrit-cli/SKILL.md +59 -0
  3. package/.agents/skills/gerrit-cli/references/commands.md +93 -0
  4. package/.agents/skills/gerrit-cli/references/workflows.md +56 -0
  5. package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +47 -0
  6. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +230 -0
  7. package/docs/contributing/infrastructure.md +7 -1
  8. package/front_end/core/host/AidaClient.ts +66 -47
  9. package/front_end/core/host/GcaClient.ts +4 -6
  10. package/front_end/core/host/ResourceLoader.ts +4 -2
  11. package/front_end/core/root/Runtime.ts +0 -5
  12. package/front_end/core/sdk/ConsoleModel.ts +3 -2
  13. package/front_end/core/sdk/DebuggerModel.ts +14 -6
  14. package/front_end/core/sdk/SDKSettings.ts +19 -0
  15. package/front_end/core/sdk/sdk-meta.ts +0 -58
  16. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  17. package/front_end/generated/protocol.ts +11 -3
  18. package/front_end/models/ai_assistance/AiUtils.ts +67 -4
  19. package/front_end/models/ai_assistance/StorageItem.ts +26 -5
  20. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +2 -19
  21. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +2 -3
  22. package/front_end/models/trace/handlers/RendererHandler.ts +20 -4
  23. package/front_end/models/trace/types/File.ts +1 -0
  24. package/front_end/models/workspace/UISourceCode.ts +0 -10
  25. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +61 -182
  26. package/front_end/panels/ai_assistance/components/ChatInput.ts +25 -8
  27. package/front_end/panels/ai_assistance/components/ChatMessage.ts +13 -69
  28. package/front_end/panels/ai_assistance/components/ChatView.ts +14 -8
  29. package/front_end/panels/ai_assistance/components/chatMessage.css +2 -20
  30. package/front_end/panels/application/ApplicationPanelSidebar.ts +2 -2
  31. package/front_end/panels/application/ApplicationPanelTreeElement.ts +41 -3
  32. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +116 -79
  33. package/front_end/panels/application/ServiceWorkersView.ts +8 -8
  34. package/front_end/panels/application/application.ts +2 -0
  35. package/front_end/panels/application/components/AdsView.ts +10 -6
  36. package/front_end/panels/application/preloading/PreloadingView.ts +53 -45
  37. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +111 -119
  38. package/front_end/panels/application/preloading/components/preloadingDetailsReportView.css +21 -23
  39. package/front_end/panels/application/serviceWorkerUpdateCycleView.css +105 -102
  40. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +107 -96
  41. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +17 -19
  42. package/front_end/panels/common/AiCodeCompletionTeaser.ts +6 -6
  43. package/front_end/panels/common/AiCodeGenerationTeaser.ts +28 -26
  44. package/front_end/panels/common/common.ts +1 -1
  45. package/front_end/panels/console/ConsoleInsightTeaser.ts +3 -6
  46. package/front_end/panels/console/ConsoleView.ts +6 -4
  47. package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
  48. package/front_end/panels/console/console-meta.ts +28 -0
  49. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
  50. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  51. package/front_end/panels/emulation/DeviceModeWrapper.ts +18 -4
  52. package/front_end/panels/explain/components/ConsoleInsight.ts +4 -6
  53. package/front_end/panels/explain/explain-meta.ts +7 -49
  54. package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
  55. package/front_end/panels/network/NetworkLogView.ts +1 -0
  56. package/front_end/panels/network/OriginalResourceChunkView.ts +340 -0
  57. package/front_end/panels/network/ResourceChunkView.ts +72 -46
  58. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +3 -2
  59. package/front_end/panels/network/ResourceWebSocketFrameView.ts +3 -3
  60. package/front_end/panels/network/originalResourceChunkView.css +49 -0
  61. package/front_end/panels/screencast/ScreencastView.ts +401 -260
  62. package/front_end/panels/screencast/screencastView.css +113 -100
  63. package/front_end/panels/sensors/LocationsSettingsTab.ts +106 -122
  64. package/front_end/panels/sensors/locationsSettingsTab.css +4 -4
  65. package/front_end/panels/settings/AISettingsTab.ts +17 -100
  66. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +2 -2
  67. package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
  68. package/front_end/panels/sources/AddSourceMapURLDialog.ts +3 -3
  69. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +4 -3
  70. package/front_end/panels/sources/BreakpointEditDialog.ts +14 -14
  71. package/front_end/panels/sources/BreakpointsView.ts +14 -14
  72. package/front_end/panels/sources/CallStackSidebarPane.ts +6 -6
  73. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
  74. package/front_end/panels/sources/CoveragePlugin.ts +7 -7
  75. package/front_end/panels/sources/DebuggerPausedMessage.ts +23 -23
  76. package/front_end/panels/sources/DebuggerPlugin.ts +29 -29
  77. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +2 -2
  78. package/front_end/panels/sources/GoToLineQuickOpen.ts +10 -10
  79. package/front_end/panels/sources/NavigatorView.ts +34 -27
  80. package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
  81. package/front_end/panels/sources/PersistenceActions.ts +9 -9
  82. package/front_end/panels/sources/ProfilePlugin.ts +1 -1
  83. package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -5
  84. package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
  85. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  86. package/front_end/panels/sources/SourcesPanel.ts +26 -25
  87. package/front_end/panels/sources/SourcesView.ts +5 -6
  88. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
  89. package/front_end/panels/sources/ThreadsSidebarPane.ts +1 -1
  90. package/front_end/panels/sources/UISourceCodeFrame.ts +0 -2
  91. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +7 -7
  92. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  93. package/front_end/panels/sources/sources-meta.ts +109 -71
  94. package/front_end/panels/sources/sources.ts +0 -2
  95. package/front_end/panels/timeline/TimelineHistoryManager.ts +14 -3
  96. package/front_end/panels/timeline/TimelineLoader.ts +72 -42
  97. package/front_end/panels/timeline/TimelinePanel.ts +29 -4
  98. package/front_end/panels/timeline/timelineHistoryManager.css +4 -0
  99. package/front_end/third_party/chromium/README.chromium +1 -1
  100. package/front_end/third_party/puppeteer/README.chromium +2 -2
  101. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +187 -1
  102. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +91 -38
  103. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +145 -2
  104. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +0 -2
  106. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts +0 -2
  108. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +0 -2
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts +3 -2
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js +8 -2
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts +0 -2
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +0 -2
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +1 -3
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +0 -2
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts +0 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js +0 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts +5 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +12 -0
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +4 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +5 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +49 -0
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts +0 -6
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +0 -6
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js +3 -0
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +0 -3
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +0 -3
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.d.ts +2 -2
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.js +2 -2
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/types.d.ts +187 -1
  163. package/front_end/third_party/puppeteer/package/package.json +5 -5
  164. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +155 -2
  165. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +0 -2
  166. package/front_end/third_party/puppeteer/package/src/api/Dialog.ts +10 -2
  167. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +0 -2
  168. package/front_end/third_party/puppeteer/package/src/api/Page.ts +1 -3
  169. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +0 -1
  170. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +4 -2
  171. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +17 -0
  172. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +5 -4
  173. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +66 -0
  174. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +0 -6
  175. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  176. package/front_end/third_party/puppeteer/package/src/injected/util.ts +4 -1
  177. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +0 -3
  178. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  179. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  180. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  181. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +9 -7
  182. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +7 -8
  183. package/front_end/ui/legacy/Dialog.ts +12 -2
  184. package/front_end/ui/legacy/TabbedPane.ts +7 -2
  185. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +40 -24
  186. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -0
  187. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -4
  188. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +14 -7
  189. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -1
  190. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  191. package/package.json +1 -1
  192. package/front_end/panels/sources/AiWarningInfobarPlugin.ts +0 -78
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: devtools-ci
3
+ description: >-
4
+ Triage and analyze Chromium/DevTools LUCI build results and trybot failures,
5
+ including high-level builder status, compile errors, and detailed test
6
+ failures. Use this to inspect trybot buildbucket (bb) results for a patchset
7
+ overview or to query ResultDB directly for comprehensive, actionable information
8
+ about specific test regressions and infrastructure issues.
9
+ ---
10
+
11
+ # LUCI Build Triage & Analysis
12
+
13
+ This skill provides access to specialized triage tools maintained within the
14
+ `depot_tools` repository. These tools are used to inspect Buildbucket results
15
+ and ResultDB test failures.
16
+
17
+ ## Environment & Auth Discovery
18
+
19
+ - **Environment**: Always execute these scripts using **`vpython3`** instead
20
+ of `python3` to ensure all hermetic dependencies (like `httplib2`) are
21
+ satisfied.
22
+ - **Authentication**: Use `bb auth-info` to proactively check if you are
23
+ logged into Buildbucket. If not, inform the user they must run `bb auth-login`.
24
+
25
+ ## Locating the Tools
26
+
27
+ The triage scripts and their detailed documentation are located relative to
28
+ the `depot_tools` installation:
29
+
30
+ 1. **Locate Depot Tools**: Run `which gerrit_client.py` to find your local
31
+ `depot_tools` root.
32
+ 2. **Navigation**:
33
+ - **Buildbucket (`bb_wrapper.py`)**: Found in `<DEPOT_TOOLS_ROOT>/agents/skills/buildbucket/`
34
+ - *Strengths*: High-level Build info (is it failing? what steps failed?),
35
+ compile errors, and infra issues.
36
+ - **Test Results (`luci_triage.py`)**: Found in `<DEPOT_TOOLS_ROOT>/agents/skills/luci-test-results/`
37
+ - *Strengths*: Detailed Test info (specific test case failures in
38
+ ResultDB).
39
+
40
+ ## Troubleshooting
41
+
42
+ - **"No Artifacts Found"**: This usually occurs if:
43
+ 1. The build failed so early (e.g., bot setup) that no artifacts were produced.
44
+ 2. The build is too old and logs have been purged.
45
+ 3. There is an authentication issue.
46
+ - **Fallback**: Try `bb log <build_id> <step_name>` to see the raw output
47
+ for the failed step.
48
+
49
+ ## Available Skills in Depot Tools
50
+
51
+ Once you have located the `depot_tools` directory, read the following files
52
+ to understand how to use each tool:
53
+
54
+ - **`buildbucket`**: Used for high-level builder status and compile failures.
55
+ - Read: `<DEPOT_TOOLS_ROOT>/agents/skills/buildbucket/SKILL.md`
56
+ - **`luci-test-results`**: Used for detailed ResultDB test failure analysis.
57
+ - Read: `<DEPOT_TOOLS_ROOT>/agents/skills/luci-test-results/SKILL.md`
58
+
59
+ ## Usage at Runtime
60
+
61
+ When you need to triage a build:
62
+ 1. Locate `depot_tools` as described above.
63
+ 2. Read the relevant `SKILL.md` file from `depot_tools`.
64
+ 3. Follow the instructions in that file to execute the Python scripts (e.g.,
65
+ `bb_wrapper.py` or `luci_triage.py`) using their absolute paths.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: gerrit-cli
3
+ description: >-
4
+ Interacts with the public Gerrit Code Review platform using depot_tools'
5
+ gerrit_client.py. Use this skill when asked to query public CLs, retrieve
6
+ file revisions, add patchset comments, vote on review labels, submit changes,
7
+ or abandon/restore public CLs. Do not use this skill for Google-internal
8
+ attention set updates or internal AI-assisted code reviews (CRUAS) which are
9
+ unsupported by the public API.
10
+ ---
11
+
12
+ # Gerrit CLI Skill
13
+
14
+ Execute public Gerrit Code Review commands using `gerrit_client.py` from
15
+ depot_tools.
16
+
17
+ ## Prerequisites
18
+
19
+ - **Environment**: Always execute the wrapper script using **`vpython3`** instead of `python3` to ensure all internal dependencies are satisfied.
20
+
21
+ - Ensure `gerrit_client.py` is available in the system `PATH` (typically part of
22
+ `depot_tools`). If `gerrit_client.py` is not available in your environment,
23
+ stop execution immediately.
24
+ - Use the wrapper script directly instead of an environment variable.
25
+ Substitute:
26
+ `vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py`
27
+ as the executable command in all examples and invocations.
28
+
29
+ ## Just-in-Time (JiT) Loading Guidance
30
+
31
+ - Before running any Gerrit CLI command, read `references/commands.md`
32
+ to locate the required parameters and specific subcommand syntax.
33
+ - Before querying public CLs, adding comments, voting, or submitting changes,
34
+ read `references/workflows.md` for step-by-step procedures.
35
+
36
+ ## Global Flags
37
+
38
+ The wrapper script includes DevTools-specific defaults for `--host` and
39
+ `--project`. You do not need to provide them unless you are targeting a
40
+ different host or project.
41
+
42
+ - **Default Host**: `https://chromium-review.googlesource.com`
43
+ - **Default Project**: `devtools/devtools-frontend`
44
+ - **JSON Output**: Always use the `--json_file=<path>` flag when querying
45
+ changes or fetching metadata to obtain structured, machine-readable output.
46
+
47
+ > [!CAUTION]
48
+ > **NEVER** use this to add patchset comments to an existing comment thread that
49
+ > contains human reviewers in it. Using an agent to reply to a human is a
50
+ > violation of Chromium's code of conduct.
51
+ >
52
+ > If the user requests this or you encounter this scenario as part of your work,
53
+ > inform the user about which comment threads cannot be updated but otherwise
54
+ > continue work.
55
+
56
+
57
+ > [!NOTE]
58
+ > This skill was adapted from the [Chromium Gerrit CLI skill](https://chromium.googlesource.com/chromium/agents/+/main/skills/gerrit-cli/)
59
+ > (automatically rolled in from upstream).
@@ -0,0 +1,93 @@
1
+ # Gerrit CLI Common Commands & Usage (Public)
2
+
3
+ Run the tool directly using the wrapper script path with the `--help` flag:
4
+ - `vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py --help`
5
+ - `vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py changes --help`
6
+
7
+ ## Global Flags
8
+
9
+ Use the following global flags for all commands:
10
+
11
+ - `--host <url>` (e.g., `--host https://chromium-review.googlesource.com`).
12
+ - `--project <project_name>` (e.g., `--project chromium/src`).
13
+ - `--json_file <path>` (saves the structured response as a JSON file).
14
+
15
+ ______________________________________________________________________
16
+
17
+ ## Common Invocations
18
+
19
+ ### 1. Inspecting and Searching Changes
20
+
21
+ - **Query active changes:**
22
+ ```bash
23
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
24
+ changes \
25
+ --query "owner:self status:open"
26
+ ```
27
+ - **View the content of a specific file in a change:**
28
+ ```bash
29
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
30
+ content \
31
+ --json_file output.json \
32
+ --change <change_id> --revision <revision> --path <file_path>
33
+ ```
34
+ - **Get related changes:**
35
+ ```bash
36
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
37
+ relatedchanges \
38
+ --change <change_id> --revision <revision>
39
+ ```
40
+
41
+ ### 2. Reviewing and Voting
42
+
43
+ - **Add a patchset-level comment:**
44
+ ```bash
45
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
46
+ addpatchsetcomment \
47
+ --change <change_id> --revision <revision> \
48
+ --message "Review findings: <message>"
49
+ ```
50
+ - **Vote on a review label (e.g., Code-Review +1):**
51
+ ```bash
52
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
53
+ setlabel \
54
+ --change <change_id> \
55
+ --label Code-Review 1
56
+ ```
57
+
58
+ ### 3. Actions and Shepherding
59
+
60
+ - **Submit/Merge a change:**
61
+ ```bash
62
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
63
+ submitchange \
64
+ --change <change_id>
65
+ ```
66
+ - **Abandon a change:**
67
+ ```bash
68
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
69
+ abandon \
70
+ --change <change_id> \
71
+ --message "<reason>"
72
+ ```
73
+ - **Restore an abandoned change:**
74
+ ```bash
75
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
76
+ restore \
77
+ --change <change_id> \
78
+ --message "<reason>"
79
+ ```
80
+
81
+ ______________________________________________________________________
82
+
83
+ ## Just-in-Time Help
84
+
85
+ Explore the built-in CLI help for additional subcommands or advanced syntax:
86
+
87
+ - Display all top-level commands:
88
+ `vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py --help`
89
+ - Display help for a specific subcommand:
90
+ ```bash
91
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
92
+ help <command>
93
+ ```
@@ -0,0 +1,56 @@
1
+ # Gerrit CLI Workflows (Public)
2
+
3
+ ## 1. Change List Review Workflow
4
+
5
+ Execute these steps in chronological order to review a Change List (CL) when
6
+ provided with a link or ID:
7
+
8
+ 1. **Query CL Metadata**: Retrieve CL details and verify its current status:
9
+ ```bash
10
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
11
+ changes \
12
+ --query "change:<id>"
13
+ ```
14
+ 2. **Fetch File Contents**: Retrieve the content of specific files modified in
15
+ the CL:
16
+ ```bash
17
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
18
+ content \
19
+ --change <change_id> --revision current --path <file_path>
20
+ ```
21
+ 3. **Analyze Local Modifications**: Inspect the fetched contents and local diffs
22
+ for any logic or formatting issues.
23
+ 4. **Add Review Comment**: Post a patchset-level comment containing the review
24
+ findings:
25
+ ```bash
26
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
27
+ addpatchsetcomment \
28
+ --change <change_id> --revision current \
29
+ --message "Review findings: ..."
30
+ ```
31
+
32
+ ## 2. Shepherding & Submission Workflow
33
+
34
+ Execute these steps in chronological order to approve and merge a Change List:
35
+
36
+ 1. **Check Related Changes**: Retrieve the status of all related changes to
37
+ ensure there are no unresolved blockers:
38
+ ```bash
39
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
40
+ relatedchanges \
41
+ --change <change_id> --revision current
42
+ ```
43
+ 2. **Vote on Review Labels**: Apply the required Code-Review approval vote:
44
+ ```bash
45
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
46
+ setlabel \
47
+ --change <change_id> \
48
+ --label Code-Review 1
49
+ ```
50
+ 3. **Submit Change**: Merge the change once all CQ presubmits pass and all
51
+ approval requirements are satisfied:
52
+ ```bash
53
+ vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py \
54
+ submitchange \
55
+ --change <change_id>
56
+ ```
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright 2026 The Chromium Authors
3
+ # Use of this source code is governed by a BSD-style license that can be
4
+ # found in the LICENSE file.
5
+ """Helper wrapper script to run gerrit_client.py from PATH."""
6
+
7
+ import shutil
8
+ import subprocess
9
+ import sys
10
+
11
+
12
+ def main():
13
+ client = shutil.which('gerrit_client.py')
14
+ if not client:
15
+ print('gerrit_client.py not found. '
16
+ 'Is depot_tools available and added to PATH?')
17
+ sys.exit(1)
18
+
19
+ # DevTools specific defaults
20
+ default_args = [
21
+ '--host',
22
+ 'https://chromium-review.googlesource.com',
23
+ '--project',
24
+ 'devtools/devtools-frontend',
25
+ ]
26
+
27
+ # gerrit_client.py expects: <command> [options] [args]
28
+ # We need to extract the command from sys.argv and put it first.
29
+ user_args = sys.argv[1:]
30
+ command = []
31
+ other_args = []
32
+ for i, arg in enumerate(user_args):
33
+ if not arg.startswith('-'):
34
+ command = [arg]
35
+ other_args = user_args[:i] + user_args[i + 1:]
36
+ break
37
+ else:
38
+ other_args = user_args
39
+
40
+ full_args = command + default_args + other_args
41
+
42
+ rc = subprocess.call(['vpython3', client] + full_args)
43
+ sys.exit(rc)
44
+
45
+
46
+ if __name__ == '__main__':
47
+ main()
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright 2026 The Chromium Authors
3
+ # Use of this source code is governed by a BSD-style license that can be
4
+ # found in the LICENSE file.
5
+ """Imports the Gerrit CLI skill from upstream and applies DevTools revisions.
6
+
7
+ No external checkouts (like chromium/src) are required. The script downloads
8
+ the skill directly from the public Git repository.
9
+ """
10
+
11
+ import io
12
+ import re
13
+ import sys
14
+ import tarfile
15
+ import urllib.request
16
+ from pathlib import Path
17
+
18
+ UPSTREAM_URL = "https://chromium.googlesource.com/chromium/agents/+archive/refs/heads/main/skills/gerrit-cli.tar.gz"
19
+
20
+ DEVTOOLS_WRAPPER_LOGIC = """ # DevTools specific defaults
21
+ default_args = [
22
+ '--host', 'https://chromium-review.googlesource.com',
23
+ '--project', 'devtools/devtools-frontend',
24
+ ]
25
+
26
+ # gerrit_client.py expects: <command> [options] [args]
27
+ # We need to extract the command from sys.argv and put it first.
28
+ user_args = sys.argv[1:]
29
+ command = []
30
+ other_args = []
31
+ for i, arg in enumerate(user_args):
32
+ if not arg.startswith('-'):
33
+ command = [arg]
34
+ other_args = user_args[:i] + user_args[i + 1:]
35
+ break
36
+ else:
37
+ other_args = user_args
38
+
39
+ full_args = command + default_args + other_args
40
+
41
+ rc = subprocess.call(['vpython3', client] + full_args)"""
42
+
43
+ CAUTION_TEXT = """> [!CAUTION]
44
+ > **NEVER** use this to add patchset comments to an existing comment thread that
45
+ > contains human reviewers in it. Using an agent to reply to a human is a
46
+ > violation of Chromium's code of conduct.
47
+ >
48
+ > If the user requests this or you encounter this scenario as part of your work,
49
+ > inform the user about which comment threads cannot be updated but otherwise
50
+ > continue work.
51
+ """
52
+
53
+
54
+ def fetch_upstream_skill(target_dir: Path):
55
+ print(f"Downloading upstream skill from {UPSTREAM_URL}...")
56
+ try:
57
+ req = urllib.request.Request(UPSTREAM_URL,
58
+ headers={'User-Agent': 'Mozilla/5.0'})
59
+ with urllib.request.urlopen(req) as response:
60
+ tar_data = response.read()
61
+ except Exception as e:
62
+ print(f"Failed to download upstream skill: {e}")
63
+ sys.exit(1)
64
+
65
+ print(f"Extracting to {target_dir}...")
66
+ target_dir.mkdir(parents=True, exist_ok=True)
67
+ with tarfile.open(fileobj=io.BytesIO(tar_data), mode='r:gz') as tar:
68
+ tar.extractall(path=target_dir)
69
+
70
+
71
+ def apply_devtools_revisions(target_dir: Path):
72
+ print("Applying DevTools-specific adaptations...")
73
+
74
+ # 1. Update gerrit_client_wrapper.py
75
+ wrapper_path = target_dir / "scripts" / "gerrit_client_wrapper.py"
76
+ if wrapper_path.exists():
77
+ code = wrapper_path.read_text()
78
+ # Remove ". All rights reserved." from license header to satisfy DevTools presubmit
79
+ code = code.replace(". All rights reserved.", "")
80
+ target_line = " rc = subprocess.call(['vpython3', client] + sys.argv[1:])"
81
+ if target_line in code:
82
+ code = code.replace(target_line, DEVTOOLS_WRAPPER_LOGIC)
83
+ else:
84
+ # Fallback if upstream changed to python3
85
+ fallback_line = " rc = subprocess.call(['python3', client] + sys.argv[1:])"
86
+ code = code.replace(fallback_line, DEVTOOLS_WRAPPER_LOGIC)
87
+ wrapper_path.write_text(code)
88
+ print(" - Adapted gerrit_client_wrapper.py")
89
+
90
+ # 2. Update SKILL.md
91
+ skill_md_path = target_dir / "SKILL.md"
92
+ if skill_md_path.exists():
93
+ content = skill_md_path.read_text()
94
+
95
+ # Re-route wrapper script path & change python3 to vpython3
96
+ content = content.replace(
97
+ "python3 agents/shared/skills/gerrit-cli/scripts/gerrit_client_wrapper.py",
98
+ "vpython3 .agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py"
99
+ )
100
+
101
+ # Add vpython3 environment warning under Prerequisites
102
+ if "- **Environment**:" not in content:
103
+ prereq_note = "- **Environment**: Always execute the wrapper script using **`vpython3`** instead of `python3` to ensure all internal dependencies are satisfied.\n"
104
+ content = content.replace("## Prerequisites\n",
105
+ f"## Prerequisites\n\n{prereq_note}")
106
+
107
+ # Replace Gotchas section with DevTools defaults info
108
+ global_flags_section = """## Global Flags
109
+
110
+ The wrapper script includes DevTools-specific defaults for `--host` and
111
+ `--project`. You do not need to provide them unless you are targeting a
112
+ different host or project.
113
+
114
+ - **Default Host**: `https://chromium-review.googlesource.com`
115
+ - **Default Project**: `devtools/devtools-frontend`
116
+ - **JSON Output**: Always use the `--json_file=<path>` flag when querying
117
+ changes or fetching metadata to obtain structured, machine-readable output.
118
+ """
119
+ gotchas_pattern = r"## Gotchas & Environment Constraints\n\n(?:[^\n]+\n)+"
120
+ content = re.sub(gotchas_pattern, global_flags_section, content)
121
+
122
+ # Add attribution note at the bottom
123
+ attribution = """
124
+ > [!NOTE]
125
+ > This skill was adapted from the [Chromium Gerrit CLI skill](https://chromium.googlesource.com/chromium/agents/+/main/skills/gerrit-cli/)
126
+ > (automatically rolled in from upstream).
127
+ """
128
+ if "> [!NOTE]" not in content:
129
+ content += "\n" + attribution
130
+
131
+ skill_md_path.write_text(content)
132
+ print(" - Adapted SKILL.md")
133
+
134
+ # 3. Update references/commands.md and references/workflows.md
135
+ for filename in ["commands.md", "workflows.md"]:
136
+ ref_path = target_dir / "references" / filename
137
+ if ref_path.exists():
138
+ c = ref_path.read_text()
139
+
140
+ # Path & executable transformations
141
+ c = c.replace("python3 agents/shared/skills/gerrit-cli/",
142
+ "vpython3 .agents/skills/gerrit-cli/")
143
+
144
+ # Remove redundant host/project flags since our wrapper defaults them
145
+ # This matches the flag and any trailing backslash & newline to keep shell syntax valid
146
+ c = re.sub(r'^[ \t]+--(host|project)[ \t]+\S+[ \t]*(?:\\)?\n',
147
+ '',
148
+ c,
149
+ flags=re.M)
150
+
151
+ # Re-route positional arguments to flags for various commands.
152
+ # TODO(b/40292850): Simplify/remove these once CL lands upstream:
153
+ # https://chromium-review.googlesource.com/c/chromium/agents/+/8146436
154
+
155
+ # content
156
+ c = c.replace(
157
+ "<change_id> <revision> <file_path>",
158
+ "--change <change_id> --revision <revision> --path <file_path>"
159
+ )
160
+ c = c.replace(
161
+ "<change_id> current <file_path>",
162
+ "--change <change_id> --revision current --path <file_path>")
163
+
164
+ # changes (query flag is required)
165
+ c = c.replace('changes \\\n "owner:self status:open"',
166
+ 'changes \\\n --query "owner:self status:open"')
167
+ c = c.replace('changes \\\n "change:<id>"',
168
+ 'changes \\\n --query "change:<id>"')
169
+
170
+ # relatedchanges
171
+ c = c.replace(
172
+ "relatedchanges \\\n <change_id> <revision>",
173
+ "relatedchanges \\\n --change <change_id> --revision <revision>"
174
+ )
175
+ c = c.replace(
176
+ "relatedchanges \\\n <change_id> current",
177
+ "relatedchanges \\\n --change <change_id> --revision current"
178
+ )
179
+
180
+ # addpatchsetcomment
181
+ c = c.replace(
182
+ 'addpatchsetcomment \\\n --message "Review findings: <message>" \\\n <change_id> <revision>',
183
+ 'addpatchsetcomment \\\n --change <change_id> --revision <revision> \\\n --message "Review findings: <message>"'
184
+ )
185
+ c = c.replace(
186
+ 'addpatchsetcomment \\\n --message "Review findings: ..." \\\n <change_id> current',
187
+ 'addpatchsetcomment \\\n --change <change_id> --revision current \\\n --message "Review findings: ..."'
188
+ )
189
+
190
+ # setlabel
191
+ c = c.replace(
192
+ 'setlabel \\\n --label "Code-Review" \\\n --value 1 \\\n <change_id>',
193
+ 'setlabel \\\n --change <change_id> \\\n --label Code-Review 1'
194
+ )
195
+ c = c.replace(
196
+ 'setlabel \\\n --label "Code-Review" \\\n --value 1 \\\n <change_id>',
197
+ 'setlabel \\\n --change <change_id> \\\n --label Code-Review 1'
198
+ )
199
+
200
+ # submitchange
201
+ c = c.replace("submitchange \\\n <change_id>",
202
+ "submitchange \\\n --change <change_id>")
203
+ c = c.replace("submitchange \\\n <change_id>",
204
+ "submitchange \\\n --change <change_id>")
205
+
206
+ # abandon
207
+ c = c.replace(
208
+ 'abandon \\\n --message "<reason>" \\\n <change_id>',
209
+ 'abandon \\\n --change <change_id> \\\n --message "<reason>"'
210
+ )
211
+
212
+ # restore
213
+ c = c.replace(
214
+ 'restore \\\n --message "<reason>" \\\n <change_id>',
215
+ 'restore \\\n --change <change_id> \\\n --message "<reason>"'
216
+ )
217
+
218
+ ref_path.write_text(c)
219
+ print(f" - Adapted references/{filename}")
220
+
221
+
222
+ def main():
223
+ skill_dir = Path(__file__).parent.parent.resolve()
224
+ fetch_upstream_skill(skill_dir)
225
+ apply_devtools_revisions(skill_dir)
226
+ print("Upstream sync completed successfully!")
227
+
228
+
229
+ if __name__ == "__main__":
230
+ main()
@@ -257,7 +257,13 @@ because they picked up the test as it was being touched.
257
257
 
258
258
  You can skip Flake Detection for your tests by adding the `Skip-Flake-Detection`
259
259
  CL footer (see example [CL](https://crrev.com/c/6994031)). Make sure you use the
260
- full path to your test.
260
+ full path to your test. If you need to skip multiple tests, you can repeat the footer:
261
+ ```
262
+ Skip-Flake-Detection: test/e2e/foo.test.ts
263
+ Skip-Flake-Detection: test/e2e/bar.test.ts
264
+ ```
265
+
266
+ You can also skip Flake Detection for multiple tests using a glob pattern by adding the `Skip-Flake-Detection-Pattern` CL footer. For example: `Skip-Flake-Detection-Pattern: test/e2e/performance/*`.
261
267
 
262
268
  ### Common build failures
263
269