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.
- package/.agents/skills/devtools-ci/SKILL.md +65 -0
- package/.agents/skills/gerrit-cli/SKILL.md +59 -0
- package/.agents/skills/gerrit-cli/references/commands.md +93 -0
- package/.agents/skills/gerrit-cli/references/workflows.md +56 -0
- package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +47 -0
- package/.agents/skills/gerrit-cli/scripts/import_upstream.py +230 -0
- package/docs/contributing/infrastructure.md +7 -1
- package/front_end/core/host/AidaClient.ts +66 -47
- package/front_end/core/host/GcaClient.ts +4 -6
- package/front_end/core/host/ResourceLoader.ts +4 -2
- package/front_end/core/root/Runtime.ts +0 -5
- package/front_end/core/sdk/ConsoleModel.ts +3 -2
- package/front_end/core/sdk/DebuggerModel.ts +14 -6
- package/front_end/core/sdk/SDKSettings.ts +19 -0
- package/front_end/core/sdk/sdk-meta.ts +0 -58
- package/front_end/generated/InspectorBackendCommands.ts +2 -2
- package/front_end/generated/protocol.ts +11 -3
- package/front_end/models/ai_assistance/AiUtils.ts +67 -4
- package/front_end/models/ai_assistance/StorageItem.ts +26 -5
- package/front_end/models/ai_code_completion/AiCodeCompletion.ts +2 -19
- package/front_end/models/ai_code_generation/AiCodeGeneration.ts +2 -3
- package/front_end/models/trace/handlers/RendererHandler.ts +20 -4
- package/front_end/models/trace/types/File.ts +1 -0
- package/front_end/models/workspace/UISourceCode.ts +0 -10
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +61 -182
- package/front_end/panels/ai_assistance/components/ChatInput.ts +25 -8
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +13 -69
- package/front_end/panels/ai_assistance/components/ChatView.ts +14 -8
- package/front_end/panels/ai_assistance/components/chatMessage.css +2 -20
- package/front_end/panels/application/ApplicationPanelSidebar.ts +2 -2
- package/front_end/panels/application/ApplicationPanelTreeElement.ts +41 -3
- package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +116 -79
- package/front_end/panels/application/ServiceWorkersView.ts +8 -8
- package/front_end/panels/application/application.ts +2 -0
- package/front_end/panels/application/components/AdsView.ts +10 -6
- package/front_end/panels/application/preloading/PreloadingView.ts +53 -45
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +111 -119
- package/front_end/panels/application/preloading/components/preloadingDetailsReportView.css +21 -23
- package/front_end/panels/application/serviceWorkerUpdateCycleView.css +105 -102
- package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +107 -96
- package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +17 -19
- package/front_end/panels/common/AiCodeCompletionTeaser.ts +6 -6
- package/front_end/panels/common/AiCodeGenerationTeaser.ts +28 -26
- package/front_end/panels/common/common.ts +1 -1
- package/front_end/panels/console/ConsoleInsightTeaser.ts +3 -6
- package/front_end/panels/console/ConsoleView.ts +6 -4
- package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
- package/front_end/panels/console/console-meta.ts +28 -0
- package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
- package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
- package/front_end/panels/emulation/DeviceModeWrapper.ts +18 -4
- package/front_end/panels/explain/components/ConsoleInsight.ts +4 -6
- package/front_end/panels/explain/explain-meta.ts +7 -49
- package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
- package/front_end/panels/network/NetworkLogView.ts +1 -0
- package/front_end/panels/network/OriginalResourceChunkView.ts +340 -0
- package/front_end/panels/network/ResourceChunkView.ts +72 -46
- package/front_end/panels/network/ResourceDirectSocketChunkView.ts +3 -2
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +3 -3
- package/front_end/panels/network/originalResourceChunkView.css +49 -0
- package/front_end/panels/screencast/ScreencastView.ts +401 -260
- package/front_end/panels/screencast/screencastView.css +113 -100
- package/front_end/panels/sensors/LocationsSettingsTab.ts +106 -122
- package/front_end/panels/sensors/locationsSettingsTab.css +4 -4
- package/front_end/panels/settings/AISettingsTab.ts +17 -100
- package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +2 -2
- package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
- package/front_end/panels/sources/AddSourceMapURLDialog.ts +3 -3
- package/front_end/panels/sources/AiCodeCompletionPlugin.ts +4 -3
- package/front_end/panels/sources/BreakpointEditDialog.ts +14 -14
- package/front_end/panels/sources/BreakpointsView.ts +14 -14
- package/front_end/panels/sources/CallStackSidebarPane.ts +6 -6
- package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
- package/front_end/panels/sources/CoveragePlugin.ts +7 -7
- package/front_end/panels/sources/DebuggerPausedMessage.ts +23 -23
- package/front_end/panels/sources/DebuggerPlugin.ts +29 -29
- package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +2 -2
- package/front_end/panels/sources/GoToLineQuickOpen.ts +10 -10
- package/front_end/panels/sources/NavigatorView.ts +34 -27
- package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
- package/front_end/panels/sources/PersistenceActions.ts +9 -9
- package/front_end/panels/sources/ProfilePlugin.ts +1 -1
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -5
- package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
- package/front_end/panels/sources/SourcesNavigator.ts +20 -18
- package/front_end/panels/sources/SourcesPanel.ts +26 -25
- package/front_end/panels/sources/SourcesView.ts +5 -6
- package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
- package/front_end/panels/sources/ThreadsSidebarPane.ts +1 -1
- package/front_end/panels/sources/UISourceCodeFrame.ts +0 -2
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +7 -7
- package/front_end/panels/sources/components/HeadersView.ts +2 -2
- package/front_end/panels/sources/sources-meta.ts +109 -71
- package/front_end/panels/sources/sources.ts +0 -2
- package/front_end/panels/timeline/TimelineHistoryManager.ts +14 -3
- package/front_end/panels/timeline/TimelineLoader.ts +72 -42
- package/front_end/panels/timeline/TimelinePanel.ts +29 -4
- package/front_end/panels/timeline/timelineHistoryManager.css +4 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +187 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +91 -38
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +145 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts +3 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js +8 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +1 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +0 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts +0 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js +0 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +12 -0
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +4 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +49 -0
- package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts +0 -6
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +0 -6
- package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js +3 -0
- package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +0 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +0 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +187 -1
- package/front_end/third_party/puppeteer/package/package.json +5 -5
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +155 -2
- package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +0 -2
- package/front_end/third_party/puppeteer/package/src/api/Dialog.ts +10 -2
- package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +0 -2
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +1 -3
- package/front_end/third_party/puppeteer/package/src/api/Realm.ts +0 -1
- package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +4 -2
- package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +17 -0
- package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +5 -4
- package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +66 -0
- package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +0 -6
- package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/injected/util.ts +4 -1
- package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +0 -3
- package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
- package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +9 -7
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +7 -8
- package/front_end/ui/legacy/Dialog.ts +12 -2
- package/front_end/ui/legacy/TabbedPane.ts +7 -2
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +40 -24
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -4
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +14 -7
- package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -1
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
- package/package.json +1 -1
- 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
|
|