mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-08-02 13:11:03 -07:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9bd58c8ec3 | |||
| e4cdad0d55 |
@@ -1,89 +0,0 @@
|
|||||||
# --- STAGE 1: Base Runtime ---
|
|
||||||
FROM docker.io/library/node:20-slim AS base
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
python3 \
|
|
||||||
python3-pip \
|
|
||||||
python3-venv \
|
|
||||||
curl \
|
|
||||||
dnsutils \
|
|
||||||
less \
|
|
||||||
jq \
|
|
||||||
ca-certificates \
|
|
||||||
git \
|
|
||||||
&& apt-get clean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# --- STAGE 2: Builder (Compile Main) ---
|
|
||||||
FROM base AS builder
|
|
||||||
WORKDIR /build
|
|
||||||
COPY . .
|
|
||||||
RUN npm ci --ignore-scripts
|
|
||||||
RUN npm run bundle
|
|
||||||
# Run the official release preparation script to move the bundle and assets into packages/cli
|
|
||||||
RUN node scripts/prepare-npm-release.js
|
|
||||||
|
|
||||||
# --- STAGE 3: Development Environment ---
|
|
||||||
FROM base AS development
|
|
||||||
|
|
||||||
WORKDIR /home/node/dev/main
|
|
||||||
|
|
||||||
# Set up npm global package folder
|
|
||||||
RUN mkdir -p /usr/local/share/npm-global \
|
|
||||||
&& chown -R node:node /usr/local/share/npm-global
|
|
||||||
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
|
|
||||||
ENV PATH=$PATH:/usr/local/share/npm-global/bin
|
|
||||||
|
|
||||||
# Copy package.json to extract versions for global tools
|
|
||||||
COPY package.json /tmp/package.json
|
|
||||||
|
|
||||||
# Install Build Tools, Global Dev Tools (pinned), and Linters
|
|
||||||
ARG ACTIONLINT_VER=1.7.7
|
|
||||||
ARG SHELLCHECK_VER=0.11.0
|
|
||||||
ARG YAMLLINT_VER=1.35.1
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
make \
|
|
||||||
g++ \
|
|
||||||
gh \
|
|
||||||
git \
|
|
||||||
unzip \
|
|
||||||
rsync \
|
|
||||||
ripgrep \
|
|
||||||
procps \
|
|
||||||
psmisc \
|
|
||||||
lsof \
|
|
||||||
socat \
|
|
||||||
tmux \
|
|
||||||
docker.io \
|
|
||||||
build-essential \
|
|
||||||
libsecret-1-dev \
|
|
||||||
libkrb5-dev \
|
|
||||||
file \
|
|
||||||
&& curl -sSLo /tmp/actionlint.tar.gz https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VER}/actionlint_${ACTIONLINT_VER}_linux_amd64.tar.gz \
|
|
||||||
&& tar -xzf /tmp/actionlint.tar.gz -C /usr/local/bin actionlint \
|
|
||||||
&& curl -sSLo /tmp/shellcheck.tar.xz https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VER}/shellcheck-v${SHELLCHECK_VER}.linux.x86_64.tar.xz \
|
|
||||||
&& tar -xf /tmp/shellcheck.tar.xz -C /usr/local/bin --strip-components=1 shellcheck-v${SHELLCHECK_VER}/shellcheck \
|
|
||||||
&& pip3 install --break-system-packages yamllint==${YAMLLINT_VER} \
|
|
||||||
&& export TSX_VER=$(node -p "require('/tmp/package.json').devDependencies.tsx") \
|
|
||||||
&& export VITEST_VER=$(node -p "require('/tmp/package.json').devDependencies.vitest") \
|
|
||||||
&& export PRETTIER_VER=$(node -p "require('/tmp/package.json').devDependencies.prettier") \
|
|
||||||
&& export ESLINT_VER=$(node -p "require('/tmp/package.json').devDependencies.eslint") \
|
|
||||||
&& export CROSS_ENV_VER=$(node -p "require('/tmp/package.json').devDependencies['cross-env']") \
|
|
||||||
&& npm install -g tsx@$TSX_VER vitest@$VITEST_VER prettier@$PRETTIER_VER eslint@$ESLINT_VER cross-env@$CROSS_ENV_VER typescript@5.3.3 \
|
|
||||||
&& npm install -g @google/gemini-cli@nightly && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-nightly \
|
|
||||||
&& npm install -g @google/gemini-cli@preview && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-preview \
|
|
||||||
&& npm install -g @google/gemini-cli@latest && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-stable \
|
|
||||||
&& apt-get purge -y build-essential libsecret-1-dev libkrb5-dev \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& apt-get clean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* /tmp/* /root/.npm
|
|
||||||
|
|
||||||
# Copy the bundled CLI package to a permanent location and install it
|
|
||||||
# We MUST not delete this source folder as 'npm install -g <folder>'
|
|
||||||
# often symlinks to it for local folder installs.
|
|
||||||
COPY --from=builder /build/packages/cli /usr/local/lib/gemini-cli
|
|
||||||
RUN npm install -g /usr/local/lib/gemini-cli
|
|
||||||
|
|
||||||
USER node
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
node_modules
|
|
||||||
.git
|
|
||||||
.gemini/workspaces
|
|
||||||
dist
|
|
||||||
!packages/*/dist/*.tgz
|
|
||||||
bundle
|
|
||||||
out
|
|
||||||
*.log
|
|
||||||
.env
|
|
||||||
.DS_Store
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
substitutions:
|
|
||||||
_IMAGE_NAME: 'development'
|
|
||||||
_ARTIFACT_REGISTRY_REPO: 'us-docker.pkg.dev/gemini-code-dev/gemini-cli'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
# Step 1: Install root dependencies
|
|
||||||
- name: 'us-west1-docker.pkg.dev/gemini-code-dev/gemini-code-containers/gemini-code-builder'
|
|
||||||
id: 'Install Dependencies'
|
|
||||||
entrypoint: 'npm'
|
|
||||||
args: ['install']
|
|
||||||
|
|
||||||
# Step 2: Authenticate for Docker
|
|
||||||
- name: 'us-west1-docker.pkg.dev/gemini-code-dev/gemini-code-containers/gemini-code-builder'
|
|
||||||
id: 'Authenticate docker'
|
|
||||||
entrypoint: 'npm'
|
|
||||||
args: ['run', 'auth']
|
|
||||||
|
|
||||||
# Step 3: Build workspace packages
|
|
||||||
- name: 'us-west1-docker.pkg.dev/gemini-code-dev/gemini-code-containers/gemini-code-builder'
|
|
||||||
id: 'Build packages'
|
|
||||||
entrypoint: 'npm'
|
|
||||||
args: ['run', 'build:packages']
|
|
||||||
|
|
||||||
# Step 4: Build Development Image
|
|
||||||
- name: 'us-west1-docker.pkg.dev/gemini-code-dev/gemini-code-containers/gemini-code-builder'
|
|
||||||
id: 'Build Development Image'
|
|
||||||
entrypoint: 'bash'
|
|
||||||
env:
|
|
||||||
- 'RAW_BRANCH_VALUE=${BRANCH_NAME}'
|
|
||||||
args:
|
|
||||||
- '-c'
|
|
||||||
- |-
|
|
||||||
IMAGE_BASE="${_ARTIFACT_REGISTRY_REPO}/${_IMAGE_NAME}"
|
|
||||||
|
|
||||||
# Determine the primary tag (branch name or 'latest' for main)
|
|
||||||
# Use $$ for shell variables to avoid Cloud Build attempting premature substitution
|
|
||||||
RAW_BRANCH="$$RAW_BRANCH_VALUE"
|
|
||||||
if [ "$${RAW_BRANCH}" == "main" ]; then
|
|
||||||
TAG_PRIMARY="latest"
|
|
||||||
else
|
|
||||||
TAG_PRIMARY=$$(echo "$${RAW_BRANCH}" | sed 's/[^a-zA-Z0-9]/-/g' | tr '[:upper:]' '[:lower:]')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use SHORT_SHA if available (Cloud Build) or fallback to latest-dev
|
|
||||||
TAG_SHA="$${SHORT_SHA:-latest-dev}"
|
|
||||||
|
|
||||||
echo "📦 Building Development Image for: $${RAW_BRANCH} -> $${TAG_PRIMARY} ($${TAG_SHA})"
|
|
||||||
|
|
||||||
docker build -f .gcp/Dockerfile.development \
|
|
||||||
-t "$${IMAGE_BASE}:$${TAG_SHA}" \
|
|
||||||
-t "$${IMAGE_BASE}:$${TAG_PRIMARY}" .
|
|
||||||
|
|
||||||
docker push "$${IMAGE_BASE}:$${TAG_SHA}"
|
|
||||||
docker push "$${IMAGE_BASE}:$${TAG_PRIMARY}"
|
|
||||||
|
|
||||||
options:
|
|
||||||
defaultLogsBucketBehavior: 'REGIONAL_USER_OWNED_BUCKET'
|
|
||||||
dynamicSubstitutions: true
|
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
description = "Check status of nightly evals, fix failures for key models, and re-run."
|
||||||
|
prompt = """
|
||||||
|
You are an expert at fixing behavioral evaluations.
|
||||||
|
|
||||||
|
1. **Investigate**:
|
||||||
|
- Use 'gh' cli to fetch the results from the latest run from the main branch: https://github.com/google-gemini/gemini-cli/actions/workflows/evals-nightly.yml.
|
||||||
|
- DO NOT push any changes or start any runs. The rest of your evaluation will be local.
|
||||||
|
- Evals are in evals/ directory and are documented by evals/README.md.
|
||||||
|
- The test case trajectory logs will be logged to evals/logs.
|
||||||
|
- You should also enable and review the verbose agent logs by setting the GEMINI_DEBUG_LOG_FILE environment variable.
|
||||||
|
- Identify the relevant test. Confine your investigation and validation to just this test.
|
||||||
|
- Proactively add logging that will aid in gathering information or validating your hypotheses.
|
||||||
|
|
||||||
|
2. **Fix**:
|
||||||
|
- If a relevant test is failing, locate the test file and the corresponding prompt/code.
|
||||||
|
- It's often helpful to make an extreme, brute force change to see if you are changing the right place to make an improvement and then scope it back iteratively.
|
||||||
|
- Your **final** change should be **minimal and targeted**.
|
||||||
|
- Keep in mind the following:
|
||||||
|
- The prompt has multiple configurations and pieces. Take care that your changes
|
||||||
|
end up in the final prompt for the selected model and configuration.
|
||||||
|
- The prompt chosen for the eval is intentional. It's often vague or indirect
|
||||||
|
to see how the agent performs with ambiguous instructions. Changing it should
|
||||||
|
be a last resort.
|
||||||
|
- When changing the test prompt, carefully consider whether the prompt still tests
|
||||||
|
the same scenario. We don't want to lose test fidelity by making the prompts too
|
||||||
|
direct (i.e.: easy).
|
||||||
|
- Your primary mechanism for improving the agent's behavior is to make changes to
|
||||||
|
tool instructions, system prompt (snippets.ts), and/or modules that contribute to the prompt.
|
||||||
|
- If prompt and description changes are unsuccessful, use logs and debugging to
|
||||||
|
confirm that everything is working as expected.
|
||||||
|
- If unable to fix the test, you can make recommendations for architecture changes
|
||||||
|
that might help stablize the test. Be sure to THINK DEEPLY if offering architecture guidance.
|
||||||
|
Some facts that might help with this are:
|
||||||
|
- Agents may be composed of one or more agent loops.
|
||||||
|
- AgentLoop == 'context + toolset + prompt'. Subagents are one type of agent loop.
|
||||||
|
- Agent loops perform better when:
|
||||||
|
- They have direct, unambiguous, and non-contradictory prompts.
|
||||||
|
- They have fewer irrelevant tools.
|
||||||
|
- They have fewer goals or steps to perform.
|
||||||
|
- They have less low value or irrelevant context.
|
||||||
|
- You may suggest compositions of existing primitives, like subagents, or
|
||||||
|
propose a new one.
|
||||||
|
- These recommendations should be high confidence and should be grounded
|
||||||
|
in observed deficient behaviors rather than just parroting the facts above.
|
||||||
|
Investigate as needed to ground your recommendations.
|
||||||
|
|
||||||
|
3. **Verify**:
|
||||||
|
- Run just that one test if needed to validate that it is fixed. Be sure to run vitest in non-interactive mode.
|
||||||
|
- Running the tests can take a long time, so consider whether you can diagnose via other means or log diagnostics before committing the time. You must minimize the number of test runs needed to diagnose the failure.
|
||||||
|
- After the test completes, check whether it seems to have improved.
|
||||||
|
- You will need to run the test 3 times for Gemini 3.0, Gemini 3 flash, and Gemini 2.5 pro to ensure that it is truly stable. Run these runs in parallel, using scripts if needed.
|
||||||
|
- Some flakiness is expected; if it looks like a transient issue or the test is inherently unstable but passes 2/3 times, you might decide it cannot be improved.
|
||||||
|
|
||||||
|
4. **Report**:
|
||||||
|
- Provide a summary of the test success rate for each of the tested models.
|
||||||
|
- Success rate is calculated based on 3 runs per model (e.g., 3/3 = 100%).
|
||||||
|
- If you couldn't fix it due to persistent flakiness, explain why.
|
||||||
|
|
||||||
|
{{args}}
|
||||||
|
"""
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
description = "Promote behavioral evals that have a 100% success rate over the last 7 nightly runs."
|
||||||
|
prompt = """
|
||||||
|
You are an expert at analyzing and promoting behavioral evaluations.
|
||||||
|
|
||||||
|
1. **Investigate**:
|
||||||
|
- Use 'gh' cli to fetch the results from the most recent run from the main branch: https://github.com/google-gemini/gemini-cli/actions/workflows/evals-nightly.yml.
|
||||||
|
- DO NOT push any changes or start any runs. The rest of your evaluation will be local.
|
||||||
|
- Evals are in evals/ directory and are documented by evals/README.md.
|
||||||
|
- Identify tests that have passed 100% of the time for ALL enabled models across the past 7 runs in a row.
|
||||||
|
- NOTE: the results summary from the most recent run contains the last 7 runs test results. 100% means the test passed 3/3 times for that model and run.
|
||||||
|
- If a test meets this criteria, it is a candidate for promotion.
|
||||||
|
|
||||||
|
2. **Promote**:
|
||||||
|
- For each candidate test, locate the test file in the evals/ directory.
|
||||||
|
- Promote the test according to the project's standard promotion process (e.g., moving it to a stable suite, updating its tags, or removing skip/flaky annotations).
|
||||||
|
- Ensure you follow any guidelines in evals/README.md for stable tests.
|
||||||
|
- Your **final** change should be **minimal and targeted** to just promoting the test status.
|
||||||
|
|
||||||
|
3. **Verify**:
|
||||||
|
- Run the promoted tests locally to validate that they still execute correctly. Be sure to run vitest in non-interactive mode.
|
||||||
|
- Check that the test is now part of the expected standard or stable test suites.
|
||||||
|
|
||||||
|
4. **Report**:
|
||||||
|
- Provide a summary of the tests that were promoted.
|
||||||
|
- Include the success rate evidence (7/7 runs passed for all models) for each promoted test.
|
||||||
|
- If no tests met the criteria for promotion, clearly state that and summarize the closest candidates.
|
||||||
|
|
||||||
|
{{args}}
|
||||||
|
"""
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"experimental": {
|
"experimental": {
|
||||||
|
"plan": true,
|
||||||
"extensionReloading": true,
|
"extensionReloading": true,
|
||||||
"modelSteering": true,
|
"modelSteering": true
|
||||||
"topicUpdateNarration": true
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"devtools": true
|
"devtools": true
|
||||||
|
|||||||
@@ -1,194 +1,190 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
notify() {
|
notify() {
|
||||||
local title="${1}"
|
local title="$1"
|
||||||
local message="${2}"
|
local message="$2"
|
||||||
local pr="${3}"
|
local pr="$3"
|
||||||
# Terminal escape sequence
|
# Terminal escape sequence
|
||||||
printf "\e]9;%s | PR #%s | %s\a" "${title}" "${pr}" "${message}"
|
printf "\e]9;%s | PR #%s | %s\a" "$title" "$pr" "$message"
|
||||||
# Native macOS notification
|
# Native macOS notification
|
||||||
os_type="$(uname || true)"
|
if [[ "$(uname)" == "Darwin" ]]; then
|
||||||
if [[ "${os_type}" == "Darwin" ]]; then
|
osascript -e "display notification \"$message\" with title \"$title\" subtitle \"PR #$pr\""
|
||||||
osascript -e "display notification \"${message}\" with title \"${title}\" subtitle \"PR #${pr}\""
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_number="${1}"
|
pr_number=$1
|
||||||
if [[ -z "${pr_number}" ]]; then
|
if [[ -z "$pr_number" ]]; then
|
||||||
echo "Usage: async-review <pr_number>"
|
echo "Usage: async-review <pr_number>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
base_dir="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
base_dir=$(git rev-parse --show-toplevel 2>/dev/null)
|
||||||
if [[ -z "${base_dir}" ]]; then
|
if [[ -z "$base_dir" ]]; then
|
||||||
echo "❌ Must be run from within a git repository."
|
echo "❌ Must be run from within a git repository."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Use the repository's local .gemini/tmp directory for ephemeral worktrees and logs
|
# Use the repository's local .gemini/tmp directory for ephemeral worktrees and logs
|
||||||
pr_dir="${base_dir}/.gemini/tmp/async-reviews/pr-${pr_number}"
|
pr_dir="$base_dir/.gemini/tmp/async-reviews/pr-$pr_number"
|
||||||
target_dir="${pr_dir}/worktree"
|
target_dir="$pr_dir/worktree"
|
||||||
log_dir="${pr_dir}/logs"
|
log_dir="$pr_dir/logs"
|
||||||
|
|
||||||
cd "${base_dir}" || exit 1
|
cd "$base_dir" || exit 1
|
||||||
|
|
||||||
mkdir -p "${log_dir}"
|
mkdir -p "$log_dir"
|
||||||
rm -f "${log_dir}/setup.exit" "${log_dir}/final-assessment.exit" "${log_dir}/final-assessment.md"
|
rm -f "$log_dir/setup.exit" "$log_dir/final-assessment.exit" "$log_dir/final-assessment.md"
|
||||||
|
|
||||||
echo "🧹 Cleaning up previous worktree if it exists..." | tee -a "${log_dir}/setup.log"
|
echo "🧹 Cleaning up previous worktree if it exists..." | tee -a "$log_dir/setup.log"
|
||||||
git worktree remove -f "${target_dir}" >> "${log_dir}/setup.log" 2>&1 || true
|
git worktree remove -f "$target_dir" >> "$log_dir/setup.log" 2>&1 || true
|
||||||
git branch -D "gemini-async-pr-${pr_number}" >> "${log_dir}/setup.log" 2>&1 || true
|
git branch -D "gemini-async-pr-$pr_number" >> "$log_dir/setup.log" 2>&1 || true
|
||||||
git worktree prune >> "${log_dir}/setup.log" 2>&1 || true
|
git worktree prune >> "$log_dir/setup.log" 2>&1 || true
|
||||||
|
|
||||||
echo "📡 Fetching PR #${pr_number}..." | tee -a "${log_dir}/setup.log"
|
echo "📡 Fetching PR #$pr_number..." | tee -a "$log_dir/setup.log"
|
||||||
if ! git fetch origin -f "pull/${pr_number}/head:gemini-async-pr-${pr_number}" >> "${log_dir}/setup.log" 2>&1; then
|
if ! git fetch origin -f "pull/$pr_number/head:gemini-async-pr-$pr_number" >> "$log_dir/setup.log" 2>&1; then
|
||||||
echo 1 > "${log_dir}/setup.exit"
|
echo 1 > "$log_dir/setup.exit"
|
||||||
echo "❌ Fetch failed. Check ${log_dir}/setup.log"
|
echo "❌ Fetch failed. Check $log_dir/setup.log"
|
||||||
notify "Async Review Failed" "Fetch failed." "${pr_number}"
|
notify "Async Review Failed" "Fetch failed." "$pr_number"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -d "${target_dir}" ]]; then
|
if [[ ! -d "$target_dir" ]]; then
|
||||||
echo "🧹 Pruning missing worktrees..." | tee -a "${log_dir}/setup.log"
|
echo "🧹 Pruning missing worktrees..." | tee -a "$log_dir/setup.log"
|
||||||
git worktree prune >> "${log_dir}/setup.log" 2>&1
|
git worktree prune >> "$log_dir/setup.log" 2>&1
|
||||||
echo "🌿 Creating worktree in ${target_dir}..." | tee -a "${log_dir}/setup.log"
|
echo "🌿 Creating worktree in $target_dir..." | tee -a "$log_dir/setup.log"
|
||||||
if ! git worktree add "${target_dir}" "gemini-async-pr-${pr_number}" >> "${log_dir}/setup.log" 2>&1; then
|
if ! git worktree add "$target_dir" "gemini-async-pr-$pr_number" >> "$log_dir/setup.log" 2>&1; then
|
||||||
echo 1 > "${log_dir}/setup.exit"
|
echo 1 > "$log_dir/setup.exit"
|
||||||
echo "❌ Worktree creation failed. Check ${log_dir}/setup.log"
|
echo "❌ Worktree creation failed. Check $log_dir/setup.log"
|
||||||
notify "Async Review Failed" "Worktree creation failed." "${pr_number}"
|
notify "Async Review Failed" "Worktree creation failed." "$pr_number"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "🌿 Worktree already exists." | tee -a "${log_dir}/setup.log"
|
echo "🌿 Worktree already exists." | tee -a "$log_dir/setup.log"
|
||||||
fi
|
fi
|
||||||
echo 0 > "${log_dir}/setup.exit"
|
echo 0 > "$log_dir/setup.exit"
|
||||||
|
|
||||||
cd "${target_dir}" || exit 1
|
cd "$target_dir" || exit 1
|
||||||
|
|
||||||
echo "🚀 Launching background tasks. Logs saving to: ${log_dir}"
|
echo "🚀 Launching background tasks. Logs saving to: $log_dir"
|
||||||
|
|
||||||
echo " ↳ [1/5] Grabbing PR diff..."
|
echo " ↳ [1/5] Grabbing PR diff..."
|
||||||
rm -f "${log_dir}/pr-diff.exit"
|
rm -f "$log_dir/pr-diff.exit"
|
||||||
{ gh pr diff "${pr_number}" > "${log_dir}/pr-diff.diff" 2>&1; echo $? > "${log_dir}/pr-diff.exit"; } &
|
{ gh pr diff "$pr_number" > "$log_dir/pr-diff.diff" 2>&1; echo $? > "$log_dir/pr-diff.exit"; } &
|
||||||
|
|
||||||
echo " ↳ [2/5] Starting build and lint..."
|
echo " ↳ [2/5] Starting build and lint..."
|
||||||
rm -f "${log_dir}/build-and-lint.exit"
|
rm -f "$log_dir/build-and-lint.exit"
|
||||||
{ { npm run clean && npm ci && npm run format && npm run build && npm run lint:ci && npm run typecheck; } > "${log_dir}/build-and-lint.log" 2>&1; echo $? > "${log_dir}/build-and-lint.exit"; } &
|
{ { npm run clean && npm ci && npm run format && npm run build && npm run lint:ci && npm run typecheck; } > "$log_dir/build-and-lint.log" 2>&1; echo $? > "$log_dir/build-and-lint.exit"; } &
|
||||||
|
|
||||||
# Dynamically resolve gemini binary (fallback to your nightly path)
|
# Dynamically resolve gemini binary (fallback to your nightly path)
|
||||||
GEMINI_CMD="$(command -v gemini || echo "${HOME}/.gcli/nightly/node_modules/.bin/gemini")"
|
GEMINI_CMD=$(which gemini || echo "$HOME/.gcli/nightly/node_modules/.bin/gemini")
|
||||||
# shellcheck disable=SC2312
|
|
||||||
POLICY_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/policy.toml"
|
POLICY_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/policy.toml"
|
||||||
|
|
||||||
echo " ↳ [3/5] Starting Gemini code review..."
|
echo " ↳ [3/5] Starting Gemini code review..."
|
||||||
rm -f "${log_dir}/review.exit"
|
rm -f "$log_dir/review.exit"
|
||||||
{ "${GEMINI_CMD}" --policy "${POLICY_PATH}" -p "/review-frontend ${pr_number}" > "${log_dir}/review.md" 2>&1; echo $? > "${log_dir}/review.exit"; } &
|
{ "$GEMINI_CMD" --policy "$POLICY_PATH" -p "/review-frontend $pr_number" > "$log_dir/review.md" 2>&1; echo $? > "$log_dir/review.exit"; } &
|
||||||
|
|
||||||
echo " ↳ [4/5] Starting automated tests (waiting for build and lint)..."
|
echo " ↳ [4/5] Starting automated tests (waiting for build and lint)..."
|
||||||
rm -f "${log_dir}/npm-test.exit"
|
rm -f "$log_dir/npm-test.exit"
|
||||||
{
|
{
|
||||||
while [[ ! -f "${log_dir}/build-and-lint.exit" ]]; do sleep 1; done
|
while [ ! -f "$log_dir/build-and-lint.exit" ]; do sleep 1; done
|
||||||
read -r build_exit < "${log_dir}/build-and-lint.exit" || build_exit=""
|
if [ "$(cat "$log_dir/build-and-lint.exit")" == "0" ]; then
|
||||||
if [[ "${build_exit}" == "0" ]]; then
|
gh pr checks "$pr_number" > "$log_dir/ci-checks.log" 2>&1
|
||||||
gh pr checks "${pr_number}" > "${log_dir}/ci-checks.log" 2>&1
|
|
||||||
ci_status=$?
|
ci_status=$?
|
||||||
|
|
||||||
if [[ "${ci_status}" -eq 0 ]]; then
|
if [ "$ci_status" -eq 0 ]; then
|
||||||
echo "CI checks passed. Skipping local npm tests." > "${log_dir}/npm-test.log"
|
echo "CI checks passed. Skipping local npm tests." > "$log_dir/npm-test.log"
|
||||||
echo 0 > "${log_dir}/npm-test.exit"
|
echo 0 > "$log_dir/npm-test.exit"
|
||||||
elif [[ "${ci_status}" -eq 8 ]]; then
|
elif [ "$ci_status" -eq 8 ]; then
|
||||||
echo "CI checks are still pending. Skipping local npm tests to avoid duplicate work. Please check GitHub for final results." > "${log_dir}/npm-test.log"
|
echo "CI checks are still pending. Skipping local npm tests to avoid duplicate work. Please check GitHub for final results." > "$log_dir/npm-test.log"
|
||||||
echo 0 > "${log_dir}/npm-test.exit"
|
echo 0 > "$log_dir/npm-test.exit"
|
||||||
else
|
else
|
||||||
echo "CI checks failed. Failing checks:" > "${log_dir}/npm-test.log"
|
echo "CI checks failed. Failing checks:" > "$log_dir/npm-test.log"
|
||||||
gh pr checks "${pr_number}" --json name,bucket -q '.[] | select(.bucket=="fail") | .name' >> "${log_dir}/npm-test.log" 2>&1
|
gh pr checks "$pr_number" --json name,bucket -q '.[] | select(.bucket=="fail") | .name' >> "$log_dir/npm-test.log" 2>&1
|
||||||
|
|
||||||
echo "Attempting to extract failing test files from CI logs..." >> "${log_dir}/npm-test.log"
|
echo "Attempting to extract failing test files from CI logs..." >> "$log_dir/npm-test.log"
|
||||||
pr_branch="$(gh pr view "${pr_number}" --json headRefName -q '.headRefName' 2>/dev/null || true)"
|
pr_branch=$(gh pr view "$pr_number" --json headRefName -q '.headRefName' 2>/dev/null)
|
||||||
run_id="$(gh run list --branch "${pr_branch}" --workflow ci.yml --json databaseId -q '.[0].databaseId' 2>/dev/null || true)"
|
run_id=$(gh run list --branch "$pr_branch" --workflow ci.yml --json databaseId -q '.[0].databaseId' 2>/dev/null)
|
||||||
|
|
||||||
failed_files=""
|
failed_files=""
|
||||||
if [[ -n "${run_id}" ]]; then
|
if [[ -n "$run_id" ]]; then
|
||||||
failed_files="$(gh run view "${run_id}" --log-failed 2>/dev/null | grep -o -E '(packages/[a-zA-Z0-9_-]+|integration-tests|evals)/[a-zA-Z0-9_/-]+\.test\.ts(x)?' | sort | uniq || true)"
|
failed_files=$(gh run view "$run_id" --log-failed 2>/dev/null | grep -o -E '(packages/[a-zA-Z0-9_-]+|integration-tests|evals)/[a-zA-Z0-9_/-]+\.test\.ts(x)?' | sort | uniq)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${failed_files}" ]]; then
|
if [[ -n "$failed_files" ]]; then
|
||||||
echo "Found failing test files from CI:" >> "${log_dir}/npm-test.log"
|
echo "Found failing test files from CI:" >> "$log_dir/npm-test.log"
|
||||||
for f in ${failed_files}; do echo " - ${f}" >> "${log_dir}/npm-test.log"; done
|
for f in $failed_files; do echo " - $f" >> "$log_dir/npm-test.log"; done
|
||||||
echo "Running ONLY failing tests locally..." >> "${log_dir}/npm-test.log"
|
echo "Running ONLY failing tests locally..." >> "$log_dir/npm-test.log"
|
||||||
|
|
||||||
exit_code=0
|
exit_code=0
|
||||||
for file in ${failed_files}; do
|
for file in $failed_files; do
|
||||||
if [[ "${file}" == packages/* ]]; then
|
if [[ "$file" == packages/* ]]; then
|
||||||
ws_dir="$(echo "${file}" | cut -d'/' -f1,2)"
|
ws_dir=$(echo "$file" | cut -d'/' -f1,2)
|
||||||
else
|
else
|
||||||
ws_dir="$(echo "${file}" | cut -d'/' -f1)"
|
ws_dir=$(echo "$file" | cut -d'/' -f1)
|
||||||
fi
|
fi
|
||||||
rel_file="${file#"${ws_dir}"/}"
|
rel_file=${file#$ws_dir/}
|
||||||
|
|
||||||
echo "--- Running ${rel_file} in workspace ${ws_dir} ---" >> "${log_dir}/npm-test.log"
|
echo "--- Running $rel_file in workspace $ws_dir ---" >> "$log_dir/npm-test.log"
|
||||||
if ! npm run test:ci -w "${ws_dir}" -- "${rel_file}" >> "${log_dir}/npm-test.log" 2>&1; then
|
if ! npm run test:ci -w "$ws_dir" -- "$rel_file" >> "$log_dir/npm-test.log" 2>&1; then
|
||||||
exit_code=1
|
exit_code=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "${exit_code}" > "${log_dir}/npm-test.exit"
|
echo $exit_code > "$log_dir/npm-test.exit"
|
||||||
else
|
else
|
||||||
echo "Could not extract specific failing files. Skipping full local test suite as it takes too long. Please check CI logs manually." >> "${log_dir}/npm-test.log"
|
echo "Could not extract specific failing files. Skipping full local test suite as it takes too long. Please check CI logs manually." >> "$log_dir/npm-test.log"
|
||||||
echo 1 > "${log_dir}/npm-test.exit"
|
echo 1 > "$log_dir/npm-test.exit"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Skipped due to build-and-lint failure" > "${log_dir}/npm-test.log"
|
echo "Skipped due to build-and-lint failure" > "$log_dir/npm-test.log"
|
||||||
echo 1 > "${log_dir}/npm-test.exit"
|
echo 1 > "$log_dir/npm-test.exit"
|
||||||
fi
|
fi
|
||||||
} &
|
} &
|
||||||
|
|
||||||
echo " ↳ [5/5] Starting Gemini test execution (waiting for build and lint)..."
|
echo " ↳ [5/5] Starting Gemini test execution (waiting for build and lint)..."
|
||||||
rm -f "${log_dir}/test-execution.exit"
|
rm -f "$log_dir/test-execution.exit"
|
||||||
{
|
{
|
||||||
while [[ ! -f "${log_dir}/build-and-lint.exit" ]]; do sleep 1; done
|
while [ ! -f "$log_dir/build-and-lint.exit" ]; do sleep 1; done
|
||||||
read -r build_exit < "${log_dir}/build-and-lint.exit" || build_exit=""
|
if [ "$(cat "$log_dir/build-and-lint.exit")" == "0" ]; then
|
||||||
if [[ "${build_exit}" == "0" ]]; then
|
"$GEMINI_CMD" --policy "$POLICY_PATH" -p "Analyze the diff for PR $pr_number using 'gh pr diff $pr_number'. Instead of running the project's automated test suite (like 'npm test'), physically exercise the newly changed code in the terminal (e.g., by writing a temporary script to call the new functions, or testing the CLI command directly). Verify the feature's behavior works as expected. IMPORTANT: Do NOT modify any source code to fix errors. Just exercise the code and log the results, reporting any failures clearly. Do not ask for user confirmation." > "$log_dir/test-execution.log" 2>&1; echo $? > "$log_dir/test-execution.exit"
|
||||||
"${GEMINI_CMD}" --policy "${POLICY_PATH}" -p "Analyze the diff for PR ${pr_number} using 'gh pr diff ${pr_number}'. Instead of running the project's automated test suite (like 'npm test'), physically exercise the newly changed code in the terminal (e.g., by writing a temporary script to call the new functions, or testing the CLI command directly). Verify the feature's behavior works as expected. IMPORTANT: Do NOT modify any source code to fix errors. Just exercise the code and log the results, reporting any failures clearly. Do not ask for user confirmation." > "${log_dir}/test-execution.log" 2>&1; echo $? > "${log_dir}/test-execution.exit"
|
|
||||||
else
|
else
|
||||||
echo "Skipped due to build-and-lint failure" > "${log_dir}/test-execution.log"
|
echo "Skipped due to build-and-lint failure" > "$log_dir/test-execution.log"
|
||||||
echo 1 > "${log_dir}/test-execution.exit"
|
echo 1 > "$log_dir/test-execution.exit"
|
||||||
fi
|
fi
|
||||||
} &
|
} &
|
||||||
|
|
||||||
echo "✅ All tasks dispatched!"
|
echo "✅ All tasks dispatched!"
|
||||||
echo "You can monitor progress with: tail -f ${log_dir}/*.log"
|
echo "You can monitor progress with: tail -f $log_dir/*.log"
|
||||||
echo "Read your review later at: ${log_dir}/review.md"
|
echo "Read your review later at: $log_dir/review.md"
|
||||||
|
|
||||||
# Polling loop to wait for all background tasks to finish
|
# Polling loop to wait for all background tasks to finish
|
||||||
tasks=("pr-diff" "build-and-lint" "review" "npm-test" "test-execution")
|
tasks=("pr-diff" "build-and-lint" "review" "npm-test" "test-execution")
|
||||||
log_files=("pr-diff.diff" "build-and-lint.log" "review.md" "npm-test.log" "test-execution.log")
|
log_files=("pr-diff.diff" "build-and-lint.log" "review.md" "npm-test.log" "test-execution.log")
|
||||||
|
|
||||||
declare -A task_done
|
declare -A task_done
|
||||||
for t in "${tasks[@]}"; do task_done[${t}]=0; done
|
for t in "${tasks[@]}"; do task_done[$t]=0; done
|
||||||
|
|
||||||
all_done=0
|
all_done=0
|
||||||
while [[ "${all_done}" -eq 0 ]]; do
|
while [[ $all_done -eq 0 ]]; do
|
||||||
clear
|
clear
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo "🚀 Async PR Review Status for PR #${pr_number}"
|
echo "🚀 Async PR Review Status for PR #$pr_number"
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
all_done=1
|
all_done=1
|
||||||
for i in "${!tasks[@]}"; do
|
for i in "${!tasks[@]}"; do
|
||||||
t="${tasks[${i}]}"
|
t="${tasks[$i]}"
|
||||||
|
|
||||||
if [[ -f "${log_dir}/${t}.exit" ]]; then
|
if [[ -f "$log_dir/$t.exit" ]]; then
|
||||||
read -r task_exit < "${log_dir}/${t}.exit" || task_exit=""
|
exit_code=$(cat "$log_dir/$t.exit")
|
||||||
if [[ "${task_exit}" == "0" ]]; then
|
if [[ "$exit_code" == "0" ]]; then
|
||||||
echo " ✅ ${t}: SUCCESS"
|
echo " ✅ $t: SUCCESS"
|
||||||
else
|
else
|
||||||
echo " ❌ ${t}: FAILED (exit code ${task_exit})"
|
echo " ❌ $t: FAILED (exit code $exit_code)"
|
||||||
fi
|
fi
|
||||||
task_done[${t}]=1
|
task_done[$t]=1
|
||||||
else
|
else
|
||||||
echo " ⏳ ${t}: RUNNING"
|
echo " ⏳ $t: RUNNING"
|
||||||
all_done=0
|
all_done=0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -199,47 +195,47 @@ while [[ "${all_done}" -eq 0 ]]; do
|
|||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
|
|
||||||
for i in "${!tasks[@]}"; do
|
for i in "${!tasks[@]}"; do
|
||||||
t="${tasks[${i}]}"
|
t="${tasks[$i]}"
|
||||||
log_file="${log_files[${i}]}"
|
log_file="${log_files[$i]}"
|
||||||
|
|
||||||
if [[ "${task_done[${t}]}" -eq 0 ]]; then
|
if [[ ${task_done[$t]} -eq 0 ]]; then
|
||||||
if [[ -f "${log_dir}/${log_file}" ]]; then
|
if [[ -f "$log_dir/$log_file" ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "--- ${t} ---"
|
echo "--- $t ---"
|
||||||
tail -n 5 "${log_dir}/${log_file}"
|
tail -n 5 "$log_dir/$log_file"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ "${all_done}" -eq 0 ]]; then
|
if [[ $all_done -eq 0 ]]; then
|
||||||
sleep 3
|
sleep 3
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo "🚀 Async PR Review Status for PR #${pr_number}"
|
echo "🚀 Async PR Review Status for PR #$pr_number"
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo ""
|
echo ""
|
||||||
for t in "${tasks[@]}"; do
|
for t in "${tasks[@]}"; do
|
||||||
read -r task_exit < "${log_dir}/${t}.exit" || task_exit=""
|
exit_code=$(cat "$log_dir/$t.exit")
|
||||||
if [[ "${task_exit}" == "0" ]]; then
|
if [[ "$exit_code" == "0" ]]; then
|
||||||
echo " ✅ ${t}: SUCCESS"
|
echo " ✅ $t: SUCCESS"
|
||||||
else
|
else
|
||||||
echo " ❌ ${t}: FAILED (exit code ${task_exit})"
|
echo " ❌ $t: FAILED (exit code $exit_code)"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo "⏳ Tasks complete! Synthesizing final assessment..."
|
echo "⏳ Tasks complete! Synthesizing final assessment..."
|
||||||
if ! "${GEMINI_CMD}" --policy "${POLICY_PATH}" -p "Read the review at ${log_dir}/review.md, the automated test logs at ${log_dir}/npm-test.log, and the manual test execution logs at ${log_dir}/test-execution.log. Summarize the results, state whether the build and tests passed based on ${log_dir}/build-and-lint.exit and ${log_dir}/npm-test.exit, and give a final recommendation for PR ${pr_number}." > "${log_dir}/final-assessment.md" 2>&1; then
|
if ! "$GEMINI_CMD" --policy "$POLICY_PATH" -p "Read the review at $log_dir/review.md, the automated test logs at $log_dir/npm-test.log, and the manual test execution logs at $log_dir/test-execution.log. Summarize the results, state whether the build and tests passed based on $log_dir/build-and-lint.exit and $log_dir/npm-test.exit, and give a final recommendation for PR $pr_number." > "$log_dir/final-assessment.md" 2>&1; then
|
||||||
echo $? > "${log_dir}/final-assessment.exit"
|
echo $? > "$log_dir/final-assessment.exit"
|
||||||
echo "❌ Final assessment synthesis failed!"
|
echo "❌ Final assessment synthesis failed!"
|
||||||
echo "Check ${log_dir}/final-assessment.md for details."
|
echo "Check $log_dir/final-assessment.md for details."
|
||||||
notify "Async Review Failed" "Final assessment synthesis failed." "${pr_number}"
|
notify "Async Review Failed" "Final assessment synthesis failed." "$pr_number"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo 0 > "${log_dir}/final-assessment.exit"
|
echo 0 > "$log_dir/final-assessment.exit"
|
||||||
echo "✅ Final assessment complete! Check ${log_dir}/final-assessment.md"
|
echo "✅ Final assessment complete! Check $log_dir/final-assessment.md"
|
||||||
notify "Async Review Complete" "Review and test execution finished successfully." "${pr_number}"
|
notify "Async Review Complete" "Review and test execution finished successfully." "$pr_number"
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
pr_number="${1}"
|
pr_number=$1
|
||||||
|
|
||||||
if [[ -z "${pr_number}" ]]; then
|
if [[ -z "$pr_number" ]]; then
|
||||||
echo "Usage: check-async-review <pr_number>"
|
echo "Usage: check-async-review <pr_number>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
base_dir="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
base_dir=$(git rev-parse --show-toplevel 2>/dev/null)
|
||||||
if [[ -z "${base_dir}" ]]; then
|
if [[ -z "$base_dir" ]]; then
|
||||||
echo "❌ Must be run from within a git repository."
|
echo "❌ Must be run from within a git repository."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_dir="${base_dir}/.gemini/tmp/async-reviews/pr-${pr_number}/logs"
|
log_dir="$base_dir/.gemini/tmp/async-reviews/pr-$pr_number/logs"
|
||||||
|
|
||||||
if [[ ! -d "${log_dir}" ]]; then
|
if [[ ! -d "$log_dir" ]]; then
|
||||||
echo "STATUS: NOT_FOUND"
|
echo "STATUS: NOT_FOUND"
|
||||||
echo "❌ No logs found for PR #${pr_number} in ${log_dir}"
|
echo "❌ No logs found for PR #$pr_number in $log_dir"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -34,32 +34,32 @@ all_done=true
|
|||||||
echo "STATUS: CHECKING"
|
echo "STATUS: CHECKING"
|
||||||
|
|
||||||
for task_info in "${tasks[@]}"; do
|
for task_info in "${tasks[@]}"; do
|
||||||
IFS="|" read -r task_name log_file <<< "${task_info}"
|
IFS="|" read -r task_name log_file <<< "$task_info"
|
||||||
|
|
||||||
file_path="${log_dir}/${log_file}"
|
file_path="$log_dir/$log_file"
|
||||||
exit_file="${log_dir}/${task_name}.exit"
|
exit_file="$log_dir/$task_name.exit"
|
||||||
|
|
||||||
if [[ -f "${exit_file}" ]]; then
|
if [[ -f "$exit_file" ]]; then
|
||||||
read -r exit_code < "${exit_file}" || exit_code=""
|
exit_code=$(cat "$exit_file")
|
||||||
if [[ "${exit_code}" == "0" ]]; then
|
if [[ "$exit_code" == "0" ]]; then
|
||||||
echo "✅ ${task_name}: SUCCESS"
|
echo "✅ $task_name: SUCCESS"
|
||||||
else
|
else
|
||||||
echo "❌ ${task_name}: FAILED (exit code ${exit_code})"
|
echo "❌ $task_name: FAILED (exit code $exit_code)"
|
||||||
echo " Last lines of ${file_path}:"
|
echo " Last lines of $file_path:"
|
||||||
tail -n 3 "${file_path}" | sed 's/^/ /' || true
|
tail -n 3 "$file_path" | sed 's/^/ /'
|
||||||
fi
|
fi
|
||||||
elif [[ -f "${file_path}" ]]; then
|
elif [[ -f "$file_path" ]]; then
|
||||||
echo "⏳ ${task_name}: RUNNING"
|
echo "⏳ $task_name: RUNNING"
|
||||||
all_done=false
|
all_done=false
|
||||||
else
|
else
|
||||||
echo "➖ ${task_name}: NOT STARTED"
|
echo "➖ $task_name: NOT STARTED"
|
||||||
all_done=false
|
all_done=false
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ "${all_done}" == "true" ]]; then
|
if $all_done; then
|
||||||
echo "STATUS: COMPLETE"
|
echo "STATUS: COMPLETE"
|
||||||
echo "LOG_DIR: ${log_dir}"
|
echo "LOG_DIR: $log_dir"
|
||||||
else
|
else
|
||||||
echo "STATUS: IN_PROGRESS"
|
echo "STATUS: IN_PROGRESS"
|
||||||
fi
|
fi
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
---
|
|
||||||
name: behavioral-evals
|
|
||||||
description: Guidance for creating, running, fixing, and promoting behavioral evaluations. Use when verifying agent decision logic, debugging failures, debugging prompt steering, or adding workspace regression tests.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Behavioral Evals
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Behavioral evaluations (evals) are tests that validate the **agent's decision-making** (e.g., tool choice) rather than pure functionality. They are critical for verifying prompt changes, debugging steerability, and preventing regressions.
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> **Single Source of Truth**: For core concepts, policies, running tests, and general best practices, always refer to **[evals/README.md](file:///Users/abhipatel/code/gemini-cli/docs/evals/README.md)**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Workflow Decision Tree
|
|
||||||
|
|
||||||
1. **Does a prompt/tool change need validation?**
|
|
||||||
* *No* -> Normal integration tests.
|
|
||||||
* *Yes* -> Continue below.
|
|
||||||
2. **Is it UI/Interaction heavy?**
|
|
||||||
* *Yes* -> Use `appEvalTest` (`AppRig`). See **[creating.md](references/creating.md)**.
|
|
||||||
* *No* -> Use `evalTest` (`TestRig`). See **[creating.md](references/creating.md)**.
|
|
||||||
3. **Is it a new test?**
|
|
||||||
* *Yes* -> Set policy to `USUALLY_PASSES`.
|
|
||||||
* *No* -> `ALWAYS_PASSES` (locks in regression).
|
|
||||||
4. **Are you fixing a failure or promoting a test?**
|
|
||||||
* *Fixing* -> See **[fixing.md](references/fixing.md)**.
|
|
||||||
* *Promoting* -> See **[promoting.md](references/promoting.md)**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Quick Checklist
|
|
||||||
|
|
||||||
### 1. Setup Workspace
|
|
||||||
Seed the workspace with necessary files using the `files` object to simulate a realistic scenario (e.g., NodeJS project with `package.json`).
|
|
||||||
* *Details in **[creating.md](references/creating.md)***
|
|
||||||
|
|
||||||
### 2. Write Assertions
|
|
||||||
Audit agent decisions using `rig.setBreakpoint()` (AppRig only) or index verification on `rig.readToolLogs()`.
|
|
||||||
* *Details in **[creating.md](references/creating.md)***
|
|
||||||
|
|
||||||
### 3. Verify
|
|
||||||
Run single tests locally with Vitest. Confirm stability locally before relying on CI workflows.
|
|
||||||
* *See **[evals/README.md](file:///Users/abhipatel/code/gemini-cli/docs/evals/README.md)** for running commands.*
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Bundled Resources
|
|
||||||
|
|
||||||
Detailed procedural guides:
|
|
||||||
* **[creating.md](references/creating.md)**: Assertion strategies, Rig selection, Mock MCPs.
|
|
||||||
* **[fixing.md](references/fixing.md)**: Step-by-step automated investigation, architecture diagnosis guidelines.
|
|
||||||
* **[promoting.md](references/promoting.md)**: Candidate identification criteria and threshold guidelines.
|
|
||||||
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import { describe, expect } from 'vitest';
|
|
||||||
import { appEvalTest } from './app-test-helper.js';
|
|
||||||
|
|
||||||
describe('interactive_feature', () => {
|
|
||||||
// New tests MUST start as USUALLY_PASSES
|
|
||||||
appEvalTest('USUALLY_PASSES', {
|
|
||||||
name: 'should pause for user confirmation',
|
|
||||||
files: {
|
|
||||||
'package.json': JSON.stringify({ name: 'app' })
|
|
||||||
},
|
|
||||||
prompt: 'Task description here requiring approval',
|
|
||||||
timeout: 60000,
|
|
||||||
setup: async (rig) => {
|
|
||||||
// ⚠️ Breakpoints are ONLY safe in appEvalTest
|
|
||||||
rig.setBreakpoint(['ask_user']);
|
|
||||||
},
|
|
||||||
assert: async (rig) => {
|
|
||||||
// 1. Wait for the breakpoint to trigger
|
|
||||||
const confirmation = await rig.waitForPendingConfirmation('ask_user');
|
|
||||||
expect(confirmation).toBeDefined();
|
|
||||||
|
|
||||||
// 2. Resolve it so the test can finish
|
|
||||||
await rig.resolveTool(confirmation);
|
|
||||||
await rig.waitForIdle();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { describe, expect } from 'vitest';
|
|
||||||
import { evalTest } from './test-helper.js';
|
|
||||||
|
|
||||||
describe('core_feature', () => {
|
|
||||||
// New tests MUST start as USUALLY_PASSES
|
|
||||||
evalTest('USUALLY_PASSES', {
|
|
||||||
name: 'should perform expected agent action',
|
|
||||||
setup: async (rig) => {
|
|
||||||
// For mocking offline MCP:
|
|
||||||
// rig.addMockMcpServer('workspace-server', 'google-workspace');
|
|
||||||
},
|
|
||||||
files: {
|
|
||||||
'src/app.ts': '// some code',
|
|
||||||
},
|
|
||||||
prompt: 'Task description here',
|
|
||||||
timeout: 60000, // 1 minute safety limit
|
|
||||||
assert: async (rig, result) => {
|
|
||||||
// 1. Audit the trajectory (Safe for standard evalTest)
|
|
||||||
const logs = rig.readToolLogs();
|
|
||||||
const hasTool = logs.some((l) => l.toolRequest.name === 'read_file');
|
|
||||||
expect(hasTool, 'Agent should have read the file').toBe(true);
|
|
||||||
|
|
||||||
// 2. Assert efficiency (Cost/Turn)
|
|
||||||
expect(logs.length).toBeLessThan(5);
|
|
||||||
|
|
||||||
// 3. Assert final output
|
|
||||||
expect(result).toContain('Expected Keyword');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
# Creating Behavioral Evals
|
|
||||||
|
|
||||||
## 🔬 Rig Selection
|
|
||||||
|
|
||||||
| Rig Type | Import From | Architecture | Use When |
|
|
||||||
| :---------------- | :--------------------- | :------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------- |
|
|
||||||
| **`evalTest`** | `./test-helper.js` | **Subprocess**. Runs the CLI in a separate process + waits for exit. | Standard workspace tests. **Do not use `setBreakpoint`**; auditing history (`readToolLogs`) is safer. |
|
|
||||||
| **`appEvalTest`** | `./app-test-helper.js` | **In-Process**. Runs directly inside the runner loop. | UI/Ink rendering. Safe for `setBreakpoint` triggers. |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏗️ Scenario Design
|
|
||||||
|
|
||||||
Evals must simulate realistic agent environments to effectively test
|
|
||||||
decision-making.
|
|
||||||
|
|
||||||
- **Workspace State**: Seed with standard project anchors if testing general
|
|
||||||
capabilities:
|
|
||||||
- `package.json` for NodeJS environments.
|
|
||||||
- Minimal configuration files (`tsconfig.json`, `GEMINI.md`).
|
|
||||||
- **Structural Complexity**: Provide enough files to force the agent to _search_
|
|
||||||
or _navigate_, rather than giving the answer directly. Avoid trivial one-file
|
|
||||||
tests unless testing exact prompt steering.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ❌ Fail First Principle
|
|
||||||
|
|
||||||
Before asserting a new capability or locking in a fix, **verify that the test
|
|
||||||
fails first**.
|
|
||||||
|
|
||||||
- It is easy to accidentally write an eval that asserts behaviors that are
|
|
||||||
already met or pass by default.
|
|
||||||
- **Process**: reproduce failure with test -> apply fix (prompt/tool) -> verify
|
|
||||||
test passes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✋ Testing Patterns
|
|
||||||
|
|
||||||
### 1. Breakpoints
|
|
||||||
|
|
||||||
Verifies the agent _intends_ to use a tool BEFORE executing it. Useful for
|
|
||||||
interactive prompts or safety checks.
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// ⚠️ Only works with appEvalTest (AppRig)
|
|
||||||
setup: async (rig) => {
|
|
||||||
rig.setBreakpoint(['ask_user']);
|
|
||||||
},
|
|
||||||
assert: async (rig) => {
|
|
||||||
const confirmation = await rig.waitForPendingConfirmation('ask_user');
|
|
||||||
expect(confirmation).toBeDefined();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Tool Confirmation Race
|
|
||||||
|
|
||||||
When asserting multiple triggers (e.g., "enters plan mode then asks question"):
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
assert: async (rig) => {
|
|
||||||
let confirmation = await rig.waitForPendingConfirmation([
|
|
||||||
'enter_plan_mode',
|
|
||||||
'ask_user',
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (confirmation?.name === 'enter_plan_mode') {
|
|
||||||
rig.acceptConfirmation('enter_plan_mode');
|
|
||||||
confirmation = await rig.waitForPendingConfirmation('ask_user');
|
|
||||||
}
|
|
||||||
expect(confirmation?.toolName).toBe('ask_user');
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Audit Tool Logs
|
|
||||||
|
|
||||||
Audit exact operations to ensure efficiency (e.g., no redundant reads).
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
assert: async (rig, result) => {
|
|
||||||
await rig.waitForTelemetryReady();
|
|
||||||
const toolLogs = rig.readToolLogs();
|
|
||||||
|
|
||||||
const writeCall = toolLogs.find(
|
|
||||||
(log) => log.toolRequest.name === 'write_file',
|
|
||||||
);
|
|
||||||
expect(writeCall).toBeDefined();
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Mock MCP Facades
|
|
||||||
|
|
||||||
To evaluate tools connected via MCP without hitting live endpoints, load a mock
|
|
||||||
server configuration in the `setup` hook.
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
setup: async (rig) => {
|
|
||||||
rig.addMockMcpServer('workspace-server', 'google-workspace');
|
|
||||||
},
|
|
||||||
assert: async (rig) => {
|
|
||||||
await rig.waitForTelemetryReady();
|
|
||||||
const toolLogs = rig.readToolLogs();
|
|
||||||
const workspaceCall = toolLogs.find(
|
|
||||||
(log) => log.toolRequest.name === 'mcp_workspace-server_docs.getText'
|
|
||||||
);
|
|
||||||
expect(workspaceCall).toBeDefined();
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⚠️ Safety & Efficiency Guardrails
|
|
||||||
|
|
||||||
### 1. Breakpoint Deadlocks
|
|
||||||
|
|
||||||
Breakpoints (`setBreakpoint`) pause execution. In standard `evalTest`,
|
|
||||||
`rig.run()` waits for the process to exit _before_ assertions run. **This will
|
|
||||||
hang indefinitely.**
|
|
||||||
|
|
||||||
- **Use Breakpoints** for `appEvalTest` or interactive simulations.
|
|
||||||
- **Use Audit Tool Logs** (above) for standard trajectory tests.
|
|
||||||
|
|
||||||
### 2. Runaway Timeout
|
|
||||||
|
|
||||||
Always set a budget boundary in the `EvalCase` to prevent runaway loops on
|
|
||||||
quota:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
evalTest('USUALLY_PASSES', {
|
|
||||||
name: '...',
|
|
||||||
timeout: 60000, // 1 minute safety limit
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Efficiency Assertion (Turn limits)
|
|
||||||
|
|
||||||
Check if a tool is called _early_ using index checks:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
assert: async (rig) => {
|
|
||||||
const toolLogs = rig.readToolLogs();
|
|
||||||
const toolCallIndex = toolLogs.findIndex(
|
|
||||||
(log) => log.toolRequest.name === 'cli_help',
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(toolCallIndex).toBeGreaterThan(-1);
|
|
||||||
expect(toolCallIndex).toBeLessThan(5); // Called within first 5 turns
|
|
||||||
};
|
|
||||||
```
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
# Fixing Behavioral Evals
|
|
||||||
|
|
||||||
Use this guide when asked to debug, troubleshoot, or fix a failing behavioral
|
|
||||||
evaluation.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 🔍 Investigate
|
|
||||||
|
|
||||||
1. **Fetch Nightly Results**: Use the `gh` CLI to inspect the latest run from
|
|
||||||
`evals-nightly.yml` if applicable.
|
|
||||||
- _Example view URL_:
|
|
||||||
`https://github.com/google-gemini/gemini-cli/actions/workflows/evals-nightly.yml`
|
|
||||||
2. **Isolate**: DO NOT push changes or start remote runs. Confine investigation
|
|
||||||
to the local workspace.
|
|
||||||
3. **Read Logs**:
|
|
||||||
- Eval logs live in `evals/logs/<test_name>.log`.
|
|
||||||
- Enable verbose debugging via `export GEMINI_DEBUG_LOG_FILE="debug.log"`.
|
|
||||||
4. **Diagnose**: Audit tool logs and telemetry. Note if due to setup/assert.
|
|
||||||
- **Tip**: Proactively add custom logging/diagnostics to check hypotheses.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 🛠️ Fix Strategy
|
|
||||||
|
|
||||||
1. **Targeted Location**: Locate the test case and the corresponding
|
|
||||||
prompt/code.
|
|
||||||
2. **Iterative Scope**: Make extreme change first to verify scope, then refine
|
|
||||||
to a minimal, targeted change.
|
|
||||||
3. **Assertion Fidelity**:
|
|
||||||
- Changing the test prompt is a **last resort** (prompts are often vague by
|
|
||||||
design).
|
|
||||||
- **Warning**: Do not lose test fidelity by making prompts too direct/easy.
|
|
||||||
- **Primary Fix Trigger**: Adjust tool descriptions, system prompts
|
|
||||||
(`snippets.ts`), or **modules that contribute to the prompt template**.
|
|
||||||
- Fixes should generally try to improve the prompt
|
|
||||||
`@packages/core/src/prompts/snippets.ts` first.
|
|
||||||
- **Instructional Generality**: Changes to the system prompt should aim to
|
|
||||||
be as general as possible while still accomplishing the goal. Specificity
|
|
||||||
should be added only as needed.
|
|
||||||
- **Principle**: Instead of creating "forbidden lists" for specific syntax
|
|
||||||
(e.g., "Don't use `Object.create()`"), formulate a broader engineering
|
|
||||||
principle that covers the underlying issue (e.g., "Prioritize explicit
|
|
||||||
composition over hidden prototype manipulation"). This improves
|
|
||||||
steerability across a wider range of similar scenarios.
|
|
||||||
- _Low Specificity_: "Follow ecosystem best practices"
|
|
||||||
- _Medium Specificity_: "Utilize OOP and functional best practices, as
|
|
||||||
applicable"
|
|
||||||
- _High Specificity_: Provide ecosystem-specific hints as examples of a
|
|
||||||
broader principle rather than direct instructions. e.g., "NEVER use
|
|
||||||
hacks like bypassing the type system or employing 'hidden' logic (e.g.:
|
|
||||||
reflection, prototype manipulation). Instead, use explicit and idiomatic
|
|
||||||
language features (e.g.: type guards, explicit class instantiation, or
|
|
||||||
object spread) that maintain structural integrity."
|
|
||||||
- **Prompt Simplification**: Once the test is passing, use `ask_user` to
|
|
||||||
determine if prompt simplification is desired.
|
|
||||||
- **Criteria**: Simplification should be attempted only if there are
|
|
||||||
related clauses that can be de-duplicated or reparented under a single
|
|
||||||
heading.
|
|
||||||
- **Verification**: As part of simplification, you MUST identify and run
|
|
||||||
any behavioral eval tests that might be affected by the changes to
|
|
||||||
ensure no regressions are introduced.
|
|
||||||
- Test fixes should not "cheat" by changing a test's `GEMINI.md` file or by
|
|
||||||
updating the test's prompt to instruct it to not repro the bug.
|
|
||||||
- **Warning**: Prompts have multiple configurations; ensure your fix targets
|
|
||||||
the correct config for the model in question.
|
|
||||||
4. **Architecture Options**: If prompt or instruction tuning triggers no
|
|
||||||
improvement, analyze loop composition.
|
|
||||||
- **AgentLoop**: Defined by `context + toolset + prompt`.
|
|
||||||
- **Enhancements**: Loops perform best with direct prompts, fewer irrelevant
|
|
||||||
tools, low goal density, and minimal low-value/irrelevant context.
|
|
||||||
- **Modifications**: Compose subagents or isolate tools. Ground in observed
|
|
||||||
traces.
|
|
||||||
- **Warning**: Think deeply before offering recommendations; avoid parroting
|
|
||||||
abstract design guidelines.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. ✅ Verify
|
|
||||||
|
|
||||||
1. **Run Local**: Run Vitest in non-interactive mode on just the file.
|
|
||||||
2. **Log Audit**: Prioritize diagnosing failures via log comparison before
|
|
||||||
triggering heavy test runs.
|
|
||||||
3. **Stability Limit**: Run the test **3 times** locally on key models (can use
|
|
||||||
scripts to run in parallel for speed):
|
|
||||||
- **Gemini 3.0**
|
|
||||||
- **Gemini 3 Flash**
|
|
||||||
- **Gemini 2.5 Pro**
|
|
||||||
4. **Flakiness Rule**: If it passes 2/3 times, it may be inherent noise
|
|
||||||
difficult to improve without a structural split.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 📊 Report
|
|
||||||
|
|
||||||
Provide a summary of:
|
|
||||||
|
|
||||||
- Test success rate for each tested model (e.g., 3/3 = 100%).
|
|
||||||
- Root cause identification and fix explanation.
|
|
||||||
- If unfixed, provide high-confidence architecture recommendations.
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Promoting Behavioral Evals
|
|
||||||
|
|
||||||
Use this guide when asked to analyze nightly results and promote incubated tests
|
|
||||||
to stable suites.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 🔍 Investigate candidates
|
|
||||||
|
|
||||||
1. **Audit Nightly Logs**: Use the `gh` CLI to fetch results from
|
|
||||||
`evals-nightly.yml` (Direct URL:
|
|
||||||
`https://github.com/google-gemini/gemini-cli/actions/workflows/evals-nightly.yml`).
|
|
||||||
- **Tip**: The aggregate summary from the most recent run integrates the
|
|
||||||
last 7 runs of history automatically.
|
|
||||||
- **Safety**: DO NOT push changes or start remote runs. All verification is
|
|
||||||
local.
|
|
||||||
2. **Assess Stability**: Identify tests that pass **100% of the time** across
|
|
||||||
ALL enabled models over the **last 7 nightly runs** in a row.
|
|
||||||
- _100% means the test passed 3/3 times for every model and run._
|
|
||||||
3. **Promotion Targets**: Tests meeting this criteria are candidates for
|
|
||||||
promotion from `USUALLY_PASSES` to `ALWAYS_PASSES`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 🚥 Promotion Steps
|
|
||||||
|
|
||||||
1. **Locate File**: Locate the eval file in the `evals/` directory.
|
|
||||||
2. **Update Policy**: Modify the policy argument to `ALWAYS_PASSES`.
|
|
||||||
```typescript
|
|
||||||
evalTest('ALWAYS_PASSES', { ... })
|
|
||||||
```
|
|
||||||
3. **Targeting**: Follow guidelines in `evals/README.md` regarding stable suite
|
|
||||||
organization.
|
|
||||||
4. **Constraint**: Your final change must be **minimal and targeted** strictly
|
|
||||||
to promoting the test status. Do not refactor the test or setup fixtures.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. ✅ Verify
|
|
||||||
|
|
||||||
1. **Run Prompted Tests**: Run the promoted test locally using non-interactive
|
|
||||||
Vitest to confirm structure validity.
|
|
||||||
2. **Verify Suite Inclusion**: Check that the test is successfully picked up by
|
|
||||||
standard runnable ranges.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 📊 Report
|
|
||||||
|
|
||||||
Provide a summary of:
|
|
||||||
|
|
||||||
- Which tests were promoted.
|
|
||||||
- Provide the success rate evidence (e.g., 7/7 runs passed for all models).
|
|
||||||
- If no candidates qualified, list the next closest candidates and their current
|
|
||||||
pass rate.
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
# Running & Promoting Evals
|
|
||||||
|
|
||||||
## 🛠️ Prerequisites
|
|
||||||
|
|
||||||
Behavioral evals run against the compiled binary. You **must** build and bundle
|
|
||||||
the project first after making changes:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run build && npm run bundle
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏃♂️ Running Tests
|
|
||||||
|
|
||||||
### 1. Configure Environment Variables
|
|
||||||
|
|
||||||
Evals require a standard API key. If your `.env` file has multiple keys or
|
|
||||||
comments, use this precise extraction setup:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export GEMINI_API_KEY=$(grep '^GEMINI_API_KEY=' .env | cut -d '=' -f2) && RUN_EVALS=1 npx vitest run --config evals/vitest.config.ts <file_name>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Commands
|
|
||||||
|
|
||||||
| Command | Scope | Description |
|
|
||||||
| :---------------------------------- | :-------------- | :------------------------------------------------- |
|
|
||||||
| `npm run test:always_passing_evals` | `ALWAYS_PASSES` | Fast feedback, runs in CI. |
|
|
||||||
| `npm run test:all_evals` | All | Runs nightly incubation tests. Sets `RUN_EVALS=1`. |
|
|
||||||
|
|
||||||
### Target Specific File
|
|
||||||
|
|
||||||
_Note: `RUN_EVALS=1` is required for incubated (`USUALLY_PASSES`) tests._
|
|
||||||
|
|
||||||
```bash
|
|
||||||
RUN_EVALS=1 npx vitest run --config evals/vitest.config.ts my_feature.eval.ts
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐞 Debugging and Logs
|
|
||||||
|
|
||||||
If a test fails, verify:
|
|
||||||
|
|
||||||
- **Tool Trajectory Logs**:序列 of calls in `evals/logs/<test_name>.log`.
|
|
||||||
- **Verbose Reasoning**: Capture raw buffer traces by setting
|
|
||||||
`GEMINI_DEBUG_LOG_FILE`:
|
|
||||||
```bash
|
|
||||||
export GEMINI_DEBUG_LOG_FILE="debug.log"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🎯 Verify Model Targeting
|
|
||||||
|
|
||||||
- **Tip:** Standard evals benchmark against model variations. If a test passes
|
|
||||||
on Flash but fails on Pro (or vice versa), the issue is usually in the **tool
|
|
||||||
description**, not the prompt definition. Flash is sensitive to "instruction
|
|
||||||
bloat," while Pro is sensitive to "ambiguous intent."
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚥 deflaking & Promotion
|
|
||||||
|
|
||||||
To maintain CI stability, all new evals follow a strict incubation period.
|
|
||||||
|
|
||||||
### 1. Incubation (`USUALLY_PASSES`)
|
|
||||||
|
|
||||||
New tests must be created with the `USUALLY_PASSES` policy.
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
evalTest('USUALLY_PASSES', { ... })
|
|
||||||
```
|
|
||||||
|
|
||||||
They run in **Evals: Nightly** workflows and do not block PR merges.
|
|
||||||
|
|
||||||
### 2. Investigate Failures
|
|
||||||
|
|
||||||
If a nightly eval regresses, investigate via agent:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini /fix-behavioral-eval [optional-run-uri]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Promotion (`ALWAYS_PASSES`)
|
|
||||||
|
|
||||||
Once a test scores 100% consistency over multiple nightly cycles:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini /promote-behavioral-eval
|
|
||||||
```
|
|
||||||
|
|
||||||
_Do not promote manually._ The command verifies trajectory logs before updating
|
|
||||||
the file policy.
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
name: ci
|
|
||||||
description:
|
|
||||||
A specialized skill for Gemini CLI that provides high-performance, fail-fast
|
|
||||||
monitoring of GitHub Actions workflows and automated local verification of CI
|
|
||||||
failures. It handles run discovery automatically—simply provide the branch name.
|
|
||||||
---
|
|
||||||
|
|
||||||
# CI Replicate & Status
|
|
||||||
|
|
||||||
This skill enables the agent to efficiently monitor GitHub Actions, triage
|
|
||||||
failures, and bridge remote CI errors to local development. It defaults to
|
|
||||||
**automatic replication** of failures to streamline the fix cycle.
|
|
||||||
|
|
||||||
## Core Capabilities
|
|
||||||
|
|
||||||
- **Automatic Replication**: Automatically monitors CI and immediately executes
|
|
||||||
suggested test or lint commands locally upon failure.
|
|
||||||
- **Real-time Monitoring**: Aggregated status line for all concurrent workflows
|
|
||||||
on the current branch.
|
|
||||||
- **Fail-Fast Triage**: Immediately stops on the first job failure to provide a
|
|
||||||
structured report.
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
### 1. CI Replicate (`replicate`) - DEFAULT
|
|
||||||
Use this as the primary path to monitor CI and **automatically** replicate
|
|
||||||
failures locally for immediate triage and fixing.
|
|
||||||
- **Behavior**: When this workflow is triggered, the agent will monitor the CI
|
|
||||||
and **immediately and automatically execute** all suggested test or lint
|
|
||||||
commands (marked with 🚀) as soon as a failure is detected.
|
|
||||||
- **Tool**: `node .gemini/skills/ci/scripts/ci.mjs [branch]`
|
|
||||||
- **Discovery**: The script **automatically** finds the latest active or recent
|
|
||||||
run for the branch. Do NOT manually search for run IDs.
|
|
||||||
- **Goal**: Reproduce the failure locally without manual intervention, then
|
|
||||||
proceed to analyze and fix the code.
|
|
||||||
|
|
||||||
### 1. CI Status (`status`)
|
|
||||||
Use this when you have pushed changes and need to monitor the CI and reproduce
|
|
||||||
any failures locally.
|
|
||||||
- **Tool**: `node .gemini/skills/ci/scripts/ci.mjs [branch] [run_id]`
|
|
||||||
- **Discovery**: The script **automatically** finds the latest active or recent
|
|
||||||
run for the branch. You should NOT manually search for \`run_id\` using \`gh run list\`
|
|
||||||
unless a specific historical run is requested. Simply provide the branch name.
|
|
||||||
- **Step 1 (Monitor)**: Execute the tool with the branch name.
|
|
||||||
- **Step 2 (Extract)**: Extract suggested \`npm test\` or \`npm run lint\` commands
|
|
||||||
from the output (marked with 🚀).
|
|
||||||
- **Step 3 (Reproduce)**: Execute those commands locally to confirm the failure.
|
|
||||||
- **Behavior**: It will poll every 15 seconds. If it detects a failure, it will
|
|
||||||
exit with a structured report and provide the exact commands to run locally.
|
|
||||||
|
|
||||||
## Failure Categories & Actions
|
|
||||||
|
|
||||||
- **Test Failures**: Agent should run the specific `npm test -w <pkg> -- <path>`
|
|
||||||
command suggested.
|
|
||||||
- **Lint Errors**: Agent should run `npm run lint:all` or the specific package
|
|
||||||
lint command.
|
|
||||||
- **Build Errors**: Agent should check `tsc` output or build logs to resolve
|
|
||||||
compilation issues.
|
|
||||||
- **Job Errors**: Investigate `gh run view --job <job_id> --log` for
|
|
||||||
infrastructure or setup failures.
|
|
||||||
|
|
||||||
## Noise Filtering
|
|
||||||
The underlying scripts automatically filter noise (Git logs, NPM warnings, stack
|
|
||||||
trace overhead). The agent should focus on the "Structured Failure Report"
|
|
||||||
provided by the tool.
|
|
||||||
@@ -1,281 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2026 Google LLC
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { execSync } from 'node:child_process';
|
|
||||||
|
|
||||||
const BRANCH =
|
|
||||||
process.argv[2] || execSync('git branch --show-current').toString().trim();
|
|
||||||
const RUN_ID_OVERRIDE = process.argv[3];
|
|
||||||
|
|
||||||
let REPO;
|
|
||||||
try {
|
|
||||||
const remoteUrl = execSync('git remote get-url origin').toString().trim();
|
|
||||||
REPO = remoteUrl
|
|
||||||
.replace(/.*github\.com[\/:]/, '')
|
|
||||||
.replace(/\.git$/, '')
|
|
||||||
.trim();
|
|
||||||
} catch (e) {
|
|
||||||
REPO = 'google-gemini/gemini-cli';
|
|
||||||
}
|
|
||||||
|
|
||||||
const FAILED_FILES = new Set();
|
|
||||||
|
|
||||||
function runGh(args) {
|
|
||||||
try {
|
|
||||||
return execSync(`gh ${args}`, {
|
|
||||||
stdio: ['ignore', 'pipe', 'ignore'],
|
|
||||||
}).toString();
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function fetchFailuresViaApi(jobId) {
|
|
||||||
try {
|
|
||||||
const cmd = `gh api repos/${REPO}/actions/jobs/${jobId}/logs | grep -iE " FAIL |❌|ERROR|Lint failed|Build failed|Exception|failed with exit code"`;
|
|
||||||
return execSync(cmd, {
|
|
||||||
stdio: ['ignore', 'pipe', 'ignore'],
|
|
||||||
maxBuffer: 10 * 1024 * 1024,
|
|
||||||
}).toString();
|
|
||||||
} catch (e) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isNoise(line) {
|
|
||||||
const lower = line.toLowerCase();
|
|
||||||
return (
|
|
||||||
lower.includes('* [new branch]') ||
|
|
||||||
lower.includes('npm warn') ||
|
|
||||||
lower.includes('fetching updates') ||
|
|
||||||
lower.includes('node:internal/errors') ||
|
|
||||||
lower.includes('at ') || // Stack traces
|
|
||||||
lower.includes('checkexecsyncerror') ||
|
|
||||||
lower.includes('node_modules')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractTestFile(failureText) {
|
|
||||||
const cleanLine = failureText
|
|
||||||
.replace(/[|#\[\]()]/g, ' ')
|
|
||||||
.replace(/<[^>]*>/g, ' ')
|
|
||||||
.trim();
|
|
||||||
const fileMatch = cleanLine.match(/([\w\/._-]+\.test\.[jt]sx?)/);
|
|
||||||
if (fileMatch) return fileMatch[1];
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateTestCommand(failedFilesMap) {
|
|
||||||
const workspaceToFiles = new Map();
|
|
||||||
for (const [file, info] of failedFilesMap.entries()) {
|
|
||||||
if (
|
|
||||||
['Job Error', 'Unknown File', 'Build Error', 'Lint Error'].includes(file)
|
|
||||||
)
|
|
||||||
continue;
|
|
||||||
let workspace = '@google/gemini-cli';
|
|
||||||
let relPath = file;
|
|
||||||
if (file.startsWith('packages/core/')) {
|
|
||||||
workspace = '@google/gemini-cli-core';
|
|
||||||
relPath = file.replace('packages/core/', '');
|
|
||||||
} else if (file.startsWith('packages/cli/')) {
|
|
||||||
workspace = '@google/gemini-cli';
|
|
||||||
relPath = file.replace('packages/cli/', '');
|
|
||||||
}
|
|
||||||
relPath = relPath.replace(/^.*packages\/[^\/]+\//, '');
|
|
||||||
if (!workspaceToFiles.has(workspace))
|
|
||||||
workspaceToFiles.set(workspace, new Set());
|
|
||||||
workspaceToFiles.get(workspace).add(relPath);
|
|
||||||
}
|
|
||||||
const commands = [];
|
|
||||||
for (const [workspace, files] of workspaceToFiles.entries()) {
|
|
||||||
commands.push(`npm test -w ${workspace} -- ${Array.from(files).join(' ')}`);
|
|
||||||
}
|
|
||||||
return commands.join(' && ');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function monitor() {
|
|
||||||
let targetRunIds = [];
|
|
||||||
if (RUN_ID_OVERRIDE) {
|
|
||||||
targetRunIds = [RUN_ID_OVERRIDE];
|
|
||||||
} else {
|
|
||||||
// 1. Get runs directly associated with the branch
|
|
||||||
const runListOutput = runGh(
|
|
||||||
`run list --branch "${BRANCH}" --limit 10 --json databaseId,status,workflowName,createdAt`,
|
|
||||||
);
|
|
||||||
if (runListOutput) {
|
|
||||||
const runs = JSON.parse(runListOutput);
|
|
||||||
const activeRuns = runs.filter((r) => r.status !== 'completed');
|
|
||||||
if (activeRuns.length > 0) {
|
|
||||||
targetRunIds = activeRuns.map((r) => r.databaseId);
|
|
||||||
} else if (runs.length > 0) {
|
|
||||||
const latestTime = new Date(runs[0].createdAt).getTime();
|
|
||||||
targetRunIds = runs
|
|
||||||
.filter((r) => latestTime - new Date(r.createdAt).getTime() < 60000)
|
|
||||||
.map((r) => r.databaseId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Get runs associated with commit statuses (handles chained/indirect runs)
|
|
||||||
try {
|
|
||||||
const headSha = execSync(`git rev-parse "${BRANCH}"`).toString().trim();
|
|
||||||
const statusOutput = runGh(
|
|
||||||
`api repos/${REPO}/commits/${headSha}/status -q '.statuses[] | select(.target_url | contains("actions/runs/")) | .target_url'`,
|
|
||||||
);
|
|
||||||
if (statusOutput) {
|
|
||||||
const statusRunIds = statusOutput
|
|
||||||
.split('\n')
|
|
||||||
.filter(Boolean)
|
|
||||||
.map((url) => {
|
|
||||||
const match = url.match(/actions\/runs\/(\d+)/);
|
|
||||||
return match ? parseInt(match[1], 10) : null;
|
|
||||||
})
|
|
||||||
.filter(Boolean);
|
|
||||||
|
|
||||||
for (const runId of statusRunIds) {
|
|
||||||
if (!targetRunIds.includes(runId)) {
|
|
||||||
targetRunIds.push(runId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Ignore if branch/SHA not found or API fails
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetRunIds.length > 0) {
|
|
||||||
const runNames = [];
|
|
||||||
for (const runId of targetRunIds) {
|
|
||||||
const runInfo = runGh(`run view "${runId}" --json workflowName`);
|
|
||||||
if (runInfo) {
|
|
||||||
runNames.push(JSON.parse(runInfo).workflowName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(`Monitoring workflows: ${[...new Set(runNames)].join(', ')}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetRunIds.length === 0) {
|
|
||||||
console.log(`No runs found for branch ${BRANCH}.`);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
let allPassed = 0,
|
|
||||||
allFailed = 0,
|
|
||||||
allRunning = 0,
|
|
||||||
allQueued = 0,
|
|
||||||
totalJobs = 0;
|
|
||||||
let anyRunInProgress = false;
|
|
||||||
const fileToTests = new Map();
|
|
||||||
let failuresFoundInLoop = false;
|
|
||||||
|
|
||||||
for (const runId of targetRunIds) {
|
|
||||||
const runOutput = runGh(
|
|
||||||
`run view "${runId}" --json databaseId,status,conclusion,workflowName`,
|
|
||||||
);
|
|
||||||
if (!runOutput) continue;
|
|
||||||
const run = JSON.parse(runOutput);
|
|
||||||
if (run.status !== 'completed') anyRunInProgress = true;
|
|
||||||
|
|
||||||
const jobsOutput = runGh(`run view "${runId}" --json jobs`);
|
|
||||||
if (jobsOutput) {
|
|
||||||
const { jobs } = JSON.parse(jobsOutput);
|
|
||||||
totalJobs += jobs.length;
|
|
||||||
const failedJobs = jobs.filter((j) => j.conclusion === 'failure');
|
|
||||||
if (failedJobs.length > 0) {
|
|
||||||
failuresFoundInLoop = true;
|
|
||||||
for (const job of failedJobs) {
|
|
||||||
const failures = fetchFailuresViaApi(job.databaseId);
|
|
||||||
if (failures.trim()) {
|
|
||||||
failures.split('\n').forEach((line) => {
|
|
||||||
if (!line.trim() || isNoise(line)) return;
|
|
||||||
const file = extractTestFile(line);
|
|
||||||
const filePath =
|
|
||||||
file ||
|
|
||||||
(line.toLowerCase().includes('lint')
|
|
||||||
? 'Lint Error'
|
|
||||||
: line.toLowerCase().includes('build')
|
|
||||||
? 'Build Error'
|
|
||||||
: 'Unknown File');
|
|
||||||
let testName = line;
|
|
||||||
if (line.includes(' > ')) {
|
|
||||||
testName = line.split(' > ').slice(1).join(' > ').trim();
|
|
||||||
}
|
|
||||||
if (!fileToTests.has(filePath))
|
|
||||||
fileToTests.set(filePath, new Set());
|
|
||||||
fileToTests.get(filePath).add(testName);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const step =
|
|
||||||
job.steps?.find((s) => s.conclusion === 'failure')?.name ||
|
|
||||||
'unknown';
|
|
||||||
const category = step.toLowerCase().includes('lint')
|
|
||||||
? 'Lint Error'
|
|
||||||
: step.toLowerCase().includes('build')
|
|
||||||
? 'Build Error'
|
|
||||||
: 'Job Error';
|
|
||||||
if (!fileToTests.has(category))
|
|
||||||
fileToTests.set(category, new Set());
|
|
||||||
fileToTests
|
|
||||||
.get(category)
|
|
||||||
.add(`${job.name}: Failed at step "${step}"`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const job of jobs) {
|
|
||||||
if (job.status === 'in_progress') allRunning++;
|
|
||||||
else if (job.status === 'queued') allQueued++;
|
|
||||||
else if (job.conclusion === 'success') allPassed++;
|
|
||||||
else if (job.conclusion === 'failure') allFailed++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (failuresFoundInLoop) {
|
|
||||||
console.log(
|
|
||||||
`\n\n❌ Failures detected across ${allFailed} job(s). Stopping monitor...`,
|
|
||||||
);
|
|
||||||
console.log('\n--- Structured Failure Report (Noise Filtered) ---');
|
|
||||||
for (const [file, tests] of fileToTests.entries()) {
|
|
||||||
console.log(`\nCategory/File: ${file}`);
|
|
||||||
// Limit output per file if it's too large
|
|
||||||
const testsArr = Array.from(tests).map((t) =>
|
|
||||||
t.length > 500 ? t.substring(0, 500) + '... [TRUNCATED]' : t,
|
|
||||||
);
|
|
||||||
testsArr.slice(0, 10).forEach((t) => console.log(` - ${t}`));
|
|
||||||
if (testsArr.length > 10)
|
|
||||||
console.log(` ... and ${testsArr.length - 10} more`);
|
|
||||||
}
|
|
||||||
const testCmd = generateTestCommand(fileToTests);
|
|
||||||
if (testCmd) {
|
|
||||||
console.log('\n🚀 Run this to verify fixes:');
|
|
||||||
console.log(testCmd);
|
|
||||||
} else if (
|
|
||||||
Array.from(fileToTests.keys()).some((k) => k.includes('Lint'))
|
|
||||||
) {
|
|
||||||
console.log('\n🚀 Run this to verify lint fixes:\nnpm run lint:all');
|
|
||||||
}
|
|
||||||
console.log('---------------------------------');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const completed = allPassed + allFailed;
|
|
||||||
process.stdout.write(
|
|
||||||
`\r⏳ Monitoring ${targetRunIds.length} runs... ${completed}/${totalJobs} jobs (${allPassed} passed, ${allFailed} failed, ${allRunning} running, ${allQueued} queued) `,
|
|
||||||
);
|
|
||||||
if (!anyRunInProgress) {
|
|
||||||
console.log('\n✅ All workflows passed!');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
await new Promise((r) => setTimeout(r, 15000));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor().catch((err) => {
|
|
||||||
console.error('\nMonitor error:', err.message);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
@@ -65,60 +65,18 @@ accessible.
|
|||||||
- **UI and code:** Use **bold** for UI elements and `code font` for filenames,
|
- **UI and code:** Use **bold** for UI elements and `code font` for filenames,
|
||||||
snippets, commands, and API elements. Focus on the task when discussing
|
snippets, commands, and API elements. Focus on the task when discussing
|
||||||
interaction.
|
interaction.
|
||||||
|
- **Links:** Use descriptive anchor text; avoid "click here." Ensure the link
|
||||||
|
makes sense out of context.
|
||||||
- **Accessibility:** Use semantic HTML elements correctly (headings, lists,
|
- **Accessibility:** Use semantic HTML elements correctly (headings, lists,
|
||||||
tables).
|
tables).
|
||||||
- **Media:** Use lowercase hyphenated filenames. Provide descriptive alt text
|
- **Media:** Use lowercase hyphenated filenames. Provide descriptive alt text
|
||||||
for all images.
|
for all images.
|
||||||
- **Details section:** Use the `<details>` tag to create a collapsible section.
|
|
||||||
This is useful for supplementary or data-heavy information that isn't critical
|
|
||||||
to the main flow.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Title</summary>
|
|
||||||
|
|
||||||
- First entry
|
|
||||||
- Second entry
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
- **Callouts**: Use GitHub-flavored markdown alerts to highlight important
|
|
||||||
information. To ensure the formatting is preserved by `npm run format`, place
|
|
||||||
an empty line, then the `<!-- prettier-ignore -->` comment directly before
|
|
||||||
the callout block. The callout type (`[!TYPE]`) should be on the first line,
|
|
||||||
followed by a newline, and then the content, with each subsequent line of
|
|
||||||
content starting with `>`. Available types are `NOTE`, `TIP`, `IMPORTANT`,
|
|
||||||
`WARNING`, and `CAUTION`.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!NOTE]
|
|
||||||
> This is an example of a multi-line note that will be preserved
|
|
||||||
> by Prettier.
|
|
||||||
|
|
||||||
### Links
|
|
||||||
- **Accessibility:** Use descriptive anchor text; avoid "click here." Ensure the
|
|
||||||
link makes sense out of context, such as when being read by a screen reader.
|
|
||||||
- **Use relative links in docs:** Use relative links in documentation (`/docs/`)
|
|
||||||
to ensure portability. Use paths relative to the current file's directory
|
|
||||||
(for example, `../tools/` from `docs/cli/`). Do not include the `/docs/`
|
|
||||||
section of a path, but do verify that the resulting relative link exists. This
|
|
||||||
does not apply to meta files such as README.MD and CONTRIBUTING.MD.
|
|
||||||
- **When changing headings, check for deep links:** If a user is changing a
|
|
||||||
heading, check for deep links to that heading in other pages and update
|
|
||||||
accordingly.
|
|
||||||
|
|
||||||
### Structure
|
### Structure
|
||||||
- **BLUF:** Start with an introduction explaining what to expect.
|
- **BLUF:** Start with an introduction explaining what to expect.
|
||||||
- **Experimental features:** If a feature is clearly noted as experimental,
|
- **Experimental features:** If a feature is clearly noted as experimental,
|
||||||
add the following note immediately after the introductory paragraph:
|
add the following note immediately after the introductory paragraph:
|
||||||
|
`> **Note:** This is a preview feature currently under active development.`
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!NOTE]
|
|
||||||
> This is an experimental feature currently under active development.
|
|
||||||
|
|
||||||
- **Headings:** Use hierarchical headings to support the user journey.
|
- **Headings:** Use hierarchical headings to support the user journey.
|
||||||
- **Procedures:**
|
- **Procedures:**
|
||||||
- Introduce lists of steps with a complete sentence.
|
- Introduce lists of steps with a complete sentence.
|
||||||
@@ -127,7 +85,8 @@ accessible.
|
|||||||
- Put conditions before instructions (e.g., "On the Settings page, click...").
|
- Put conditions before instructions (e.g., "On the Settings page, click...").
|
||||||
- Provide clear context for where the action takes place.
|
- Provide clear context for where the action takes place.
|
||||||
- Indicate optional steps clearly (e.g., "Optional: ...").
|
- Indicate optional steps clearly (e.g., "Optional: ...").
|
||||||
- **Elements:** Use bullet lists, tables, details, and callouts.
|
- **Elements:** Use bullet lists, tables, notes (`> **Note:**`), and warnings
|
||||||
|
(`> **Warning:**`).
|
||||||
- **Avoid using a table of contents:** If a table of contents is present, remove
|
- **Avoid using a table of contents:** If a table of contents is present, remove
|
||||||
it.
|
it.
|
||||||
- **Next steps:** Conclude with a "Next steps" section if applicable.
|
- **Next steps:** Conclude with a "Next steps" section if applicable.
|
||||||
@@ -167,6 +126,7 @@ documentation.
|
|||||||
- **Consistency:** Check for consistent terminology and style across all edited
|
- **Consistency:** Check for consistent terminology and style across all edited
|
||||||
documents.
|
documents.
|
||||||
|
|
||||||
|
|
||||||
## Phase 4: Verification and finalization
|
## Phase 4: Verification and finalization
|
||||||
Perform a final quality check to ensure that all changes are correctly formatted
|
Perform a final quality check to ensure that all changes are correctly formatted
|
||||||
and that all links are functional.
|
and that all links are functional.
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
name: review-duplication
|
|
||||||
description: Use this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Review Duplication
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
This skill provides a structured workflow for investigating a codebase during a code review to identify duplicated logic, reinvented utilities, and missed opportunities to reuse established patterns. By executing this workflow, you ensure that new code integrates seamlessly with the existing project architecture.
|
|
||||||
|
|
||||||
## Workflow: Investigating for Duplication
|
|
||||||
|
|
||||||
When reviewing code, perform the following steps before finalizing your review:
|
|
||||||
|
|
||||||
### 1. Extract Core Logic
|
|
||||||
Analyze the new code to identify the core algorithms, utility functions, generic data structures, or UI components being introduced. Look beyond the specific business logic to see the underlying mechanics.
|
|
||||||
|
|
||||||
### 2. Hypothesize Existing Locations & Trace Dependencies
|
|
||||||
Think about where this type of code *would* live if it already existed in the project. Provide absolute paths from the repo root to disambiguate.
|
|
||||||
- **Utilities:** `packages/core/src/utils/`, `packages/cli/src/utils/`
|
|
||||||
- **UI Components:** `packages/cli/src/ui/components/`, `packages/cli/src/ui/`
|
|
||||||
- **Services:** `packages/core/src/services/`, `packages/cli/src/services/`
|
|
||||||
- **Configuration:** `packages/core/src/config/`, `packages/cli/src/config/`
|
|
||||||
- **Core Logic:** Call out `packages/core/` if functionality does not appear React UI specific.
|
|
||||||
|
|
||||||
**Trace Third-Party Dependencies:** If the PR introduces a new import for a utility library (e.g., `lodash.merge`, `date-fns`), trace how and where the project currently uses that library. There is likely an existing wrapper or shared utility.
|
|
||||||
|
|
||||||
**Check Package Files:** Before flagging a custom implementation of a complex algorithm, check `package.json` to see if a standard library (like `lodash` or `uuid`) is already installed that provides this functionality.
|
|
||||||
|
|
||||||
### 3. Investigate the Codebase (Sub-Agent Delegation)
|
|
||||||
Delegate the heavy lifting of codebase investigation to specialized sub-agents. They are optimized to perform deep searches and semantic mapping without bloating your session history.
|
|
||||||
|
|
||||||
To ensure a comprehensive review, you MUST formulate highly specific objectives for the sub-agents, providing them with the "scents" you discovered in Step 1.
|
|
||||||
|
|
||||||
- **Codebase Investigator:** Use the `codebase_investigator` as your primary researcher. When delegating, formulate an objective that asks specific, investigative questions about the codebase, explicitly including these search vectors:
|
|
||||||
- **Structural Similarity:** Ask if existing code uses the same underlying APIs (e.g., "Does any existing code use `Intl.DateTimeFormat` or `setTimeout` for similar purposes?").
|
|
||||||
- **Naming Conventions:** Ask if there are existing symbols with similar naming patterns (e.g., "Are there existing symbols with naming patterns like `*Format*` or `*Debounce*`?").
|
|
||||||
- **Comments & Documentation:** Ask if keywords from the PR's comments or JSDoc exist in describing similar behavior elsewhere.
|
|
||||||
- **Architectural Fit:** Ask where this type of logic is currently centralized (e.g., "Where is centralized date formatting logic located?").
|
|
||||||
- **Refactoring Guidance:** Crucially, ask the sub-agent to explain *how* the new code could be refactored to use any existing logic it finds.
|
|
||||||
- **Generalist Agent:** Use the `generalist` for detailed, turn-intensive comparisons. For example: "Review the implementation of `MyNewComponent` in the PR and compare it semantically against all components in `packages/ui/src`. Are there any existing components that could be extended or used instead?"
|
|
||||||
- **Retain Fast Path for Simple Searches:** For extremely simple, unambiguous checks (e.g., "Does `package.json` include `lodash`?"), perform a direct search to save time. Default to delegation for any open-ended "investigations."
|
|
||||||
|
|
||||||
### 4. Evaluate Best Practices
|
|
||||||
Check if the new code aligns with the project's established conventions.
|
|
||||||
- **Error Handling:** Does it use the project's standard error classes or logging mechanisms?
|
|
||||||
- **State Management:** Does it bypass established stores or contexts?
|
|
||||||
- **Styling:** Does it hardcode colors or spacing instead of using theme variables?
|
|
||||||
If the PR introduces a new pattern, compare it against the documented standards and explicitly confirm if an existing project pattern should have been used instead.
|
|
||||||
|
|
||||||
### 5. Formulate Constructive Feedback
|
|
||||||
If you discover that the PR duplicates existing functionality or ignores a best practice:
|
|
||||||
- Provide a clear review comment.
|
|
||||||
- **Identify the Source:** Explicitly mention the absolute or project-relative file path and the specific symbol (function, component, class) that should be reused.
|
|
||||||
- **Implementation Guidance:** Provide a brief code snippet or a clear explanation showing **how** to integrate the existing code to fulfill the task's requirements.
|
|
||||||
- **Explain the Value:** Briefly explain why reusing the existing code is beneficial (e.g., maintainability, consistency, built-in edge case handling).
|
|
||||||
|
|
||||||
Example comment:
|
|
||||||
> "It looks like this PR introduces a new `formatDate` utility. We already have a robust, tested `formatDate` function in `src/utils/dateHelpers.ts`.
|
|
||||||
>
|
|
||||||
> You can replace your implementation by importing it like this:
|
|
||||||
> ```typescript
|
|
||||||
> import { formatDate } from '../utils/dateHelpers';
|
|
||||||
>
|
|
||||||
> // Then use it here:
|
|
||||||
> const displayDate = formatDate(userDate, 'MMM Do, YYYY');
|
|
||||||
> ```
|
|
||||||
> Reusing this ensures that the date formatting remains consistent with the rest of the application and handles timezone conversions correctly."
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
packages/core/src/services/scripts/*.exe
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
name: 'Website issue'
|
name: 'Website issue'
|
||||||
description: 'Report an issue with the Gemini CLI Website and Gemini CLI Extensions Gallery'
|
description: 'Report an issue with the Gemini CLI Website and Gemini CLI Extensions Gallery'
|
||||||
title: 'GeminiCLI.com Feedback: [ISSUE]'
|
|
||||||
labels:
|
labels:
|
||||||
- 'area/extensions'
|
- 'area/extensions'
|
||||||
- 'area/documentation'
|
|
||||||
body:
|
body:
|
||||||
- type: 'markdown'
|
- type: 'markdown'
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
@@ -175,9 +175,7 @@ runs:
|
|||||||
--dry-run="${INPUTS_DRY_RUN}" \
|
--dry-run="${INPUTS_DRY_RUN}" \
|
||||||
--workspace="${INPUTS_CORE_PACKAGE_NAME}" \
|
--workspace="${INPUTS_CORE_PACKAGE_NAME}" \
|
||||||
--no-tag
|
--no-tag
|
||||||
if [[ "${INPUTS_DRY_RUN}" == "false" ]]; then
|
npm dist-tag rm ${INPUTS_CORE_PACKAGE_NAME} false --silent
|
||||||
npm dist-tag rm ${INPUTS_CORE_PACKAGE_NAME} false
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: '🔗 Install latest core package'
|
- name: '🔗 Install latest core package'
|
||||||
working-directory: '${{ inputs.working-directory }}'
|
working-directory: '${{ inputs.working-directory }}'
|
||||||
@@ -195,7 +193,7 @@ runs:
|
|||||||
INPUTS_A2A_PACKAGE_NAME: '${{ inputs.a2a-package-name }}'
|
INPUTS_A2A_PACKAGE_NAME: '${{ inputs.a2a-package-name }}'
|
||||||
|
|
||||||
- name: '📦 Prepare bundled CLI for npm release'
|
- name: '📦 Prepare bundled CLI for npm release'
|
||||||
if: "inputs.npm-registry-url != 'https://npm.pkg.github.com/'"
|
if: "inputs.npm-registry-url != 'https://npm.pkg.github.com/' && inputs.npm-tag != 'latest'"
|
||||||
working-directory: '${{ inputs.working-directory }}'
|
working-directory: '${{ inputs.working-directory }}'
|
||||||
shell: 'bash'
|
shell: 'bash'
|
||||||
run: |
|
run: |
|
||||||
@@ -223,9 +221,7 @@ runs:
|
|||||||
--dry-run="${INPUTS_DRY_RUN}" \
|
--dry-run="${INPUTS_DRY_RUN}" \
|
||||||
--workspace="${INPUTS_CLI_PACKAGE_NAME}" \
|
--workspace="${INPUTS_CLI_PACKAGE_NAME}" \
|
||||||
--no-tag
|
--no-tag
|
||||||
if [[ "${INPUTS_DRY_RUN}" == "false" ]]; then
|
npm dist-tag rm ${INPUTS_CLI_PACKAGE_NAME} false --silent
|
||||||
npm dist-tag rm ${INPUTS_CLI_PACKAGE_NAME} false
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 'Get a2a-server Token'
|
- name: 'Get a2a-server Token'
|
||||||
uses: './.github/actions/npm-auth-token'
|
uses: './.github/actions/npm-auth-token'
|
||||||
@@ -250,9 +246,7 @@ runs:
|
|||||||
--dry-run="${INPUTS_DRY_RUN}" \
|
--dry-run="${INPUTS_DRY_RUN}" \
|
||||||
--workspace="${INPUTS_A2A_PACKAGE_NAME}" \
|
--workspace="${INPUTS_A2A_PACKAGE_NAME}" \
|
||||||
--no-tag
|
--no-tag
|
||||||
if [[ "${INPUTS_DRY_RUN}" == "false" ]]; then
|
npm dist-tag rm ${INPUTS_A2A_PACKAGE_NAME} false --silent
|
||||||
npm dist-tag rm ${INPUTS_A2A_PACKAGE_NAME} false
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: '🔬 Verify NPM release by version'
|
- name: '🔬 Verify NPM release by version'
|
||||||
uses: './.github/actions/verify-release'
|
uses: './.github/actions/verify-release'
|
||||||
@@ -291,25 +285,8 @@ runs:
|
|||||||
INPUTS_PREVIOUS_TAG: '${{ inputs.previous-tag }}'
|
INPUTS_PREVIOUS_TAG: '${{ inputs.previous-tag }}'
|
||||||
shell: 'bash'
|
shell: 'bash'
|
||||||
run: |
|
run: |
|
||||||
rm -f gemini-cli-bundle.zip
|
|
||||||
(cd bundle && chmod +x gemini.js && zip -r ../gemini-cli-bundle.zip .)
|
|
||||||
|
|
||||||
echo "Testing the generated bundle archive..."
|
|
||||||
rm -rf test-bundle
|
|
||||||
mkdir -p test-bundle
|
|
||||||
unzip -q gemini-cli-bundle.zip -d test-bundle
|
|
||||||
|
|
||||||
# Verify it runs and outputs a version
|
|
||||||
BUNDLE_VERSION=$(node test-bundle/gemini.js --version | xargs)
|
|
||||||
echo "Bundle version output: ${BUNDLE_VERSION}"
|
|
||||||
if [[ -z "${BUNDLE_VERSION}" ]]; then
|
|
||||||
echo "Error: Bundle failed to execute or return version."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
rm -rf test-bundle
|
|
||||||
|
|
||||||
gh release create "${INPUTS_RELEASE_TAG}" \
|
gh release create "${INPUTS_RELEASE_TAG}" \
|
||||||
gemini-cli-bundle.zip \
|
bundle/gemini.js \
|
||||||
--target "${STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME}" \
|
--target "${STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME}" \
|
||||||
--title "Release ${INPUTS_RELEASE_TAG}" \
|
--title "Release ${INPUTS_RELEASE_TAG}" \
|
||||||
--notes-start-tag "${INPUTS_PREVIOUS_TAG}" \
|
--notes-start-tag "${INPUTS_PREVIOUS_TAG}" \
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ runs:
|
|||||||
JSON_INPUTS: '${{ toJSON(inputs) }}'
|
JSON_INPUTS: '${{ toJSON(inputs) }}'
|
||||||
run: 'echo "$JSON_INPUTS"'
|
run: 'echo "$JSON_INPUTS"'
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
with:
|
with:
|
||||||
ref: '${{ inputs.github-sha }}'
|
ref: '${{ inputs.github-sha }}'
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -45,11 +45,11 @@ runs:
|
|||||||
shell: 'bash'
|
shell: 'bash'
|
||||||
run: 'npm run build'
|
run: 'npm run build'
|
||||||
- name: 'Set up QEMU'
|
- name: 'Set up QEMU'
|
||||||
uses: 'docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130' # ratchet:docker/setup-qemu-action@v3
|
uses: 'docker/setup-qemu-action@v3'
|
||||||
- name: 'Set up Docker Buildx'
|
- name: 'Set up Docker Buildx'
|
||||||
uses: 'docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f' # ratchet:docker/setup-buildx-action@v3
|
uses: 'docker/setup-buildx-action@v3'
|
||||||
- name: 'Log in to GitHub Container Registry'
|
- name: 'Log in to GitHub Container Registry'
|
||||||
uses: 'docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9' # ratchet:docker/login-action@v3
|
uses: 'docker/login-action@v3'
|
||||||
with:
|
with:
|
||||||
registry: 'docker.io'
|
registry: 'docker.io'
|
||||||
username: '${{ inputs.dockerhub-username }}'
|
username: '${{ inputs.dockerhub-username }}'
|
||||||
|
|||||||
@@ -18,13 +18,6 @@ runs:
|
|||||||
env:
|
env:
|
||||||
JSON_INPUTS: '${{ toJSON(inputs) }}'
|
JSON_INPUTS: '${{ toJSON(inputs) }}'
|
||||||
run: 'echo "$JSON_INPUTS"'
|
run: 'echo "$JSON_INPUTS"'
|
||||||
- name: 'Install system dependencies'
|
|
||||||
if: "runner.os == 'Linux'"
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq bubblewrap
|
|
||||||
# Ubuntu 24.04+ requires this to allow bwrap to function in CI
|
|
||||||
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 || true
|
|
||||||
shell: 'bash'
|
|
||||||
- name: 'Run Tests'
|
- name: 'Run Tests'
|
||||||
env:
|
env:
|
||||||
GEMINI_API_KEY: '${{ inputs.gemini_api_key }}'
|
GEMINI_API_KEY: '${{ inputs.gemini_api_key }}'
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ runs:
|
|||||||
run: 'echo "$JSON_INPUTS"'
|
run: 'echo "$JSON_INPUTS"'
|
||||||
|
|
||||||
- name: 'setup node'
|
- name: 'setup node'
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
uses: 'actions/setup-node@v4'
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
|
|
||||||
|
|||||||
@@ -334,22 +334,8 @@ jobs:
|
|||||||
if: "${{ steps.check_evals.outputs.should_run == 'true' }}"
|
if: "${{ steps.check_evals.outputs.should_run == 'true' }}"
|
||||||
env:
|
env:
|
||||||
GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}'
|
GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}'
|
||||||
GEMINI_MODEL: 'gemini-3-pro-preview'
|
|
||||||
# Only run always passes behavioral tests.
|
|
||||||
EVAL_SUITE_TYPE: 'behavioral'
|
|
||||||
# Disable Vitest internal retries to avoid double-retrying;
|
|
||||||
# custom retry logic is handled in evals/test-helper.ts
|
|
||||||
VITEST_RETRY: 0
|
|
||||||
run: 'npm run test:always_passing_evals'
|
run: 'npm run test:always_passing_evals'
|
||||||
|
|
||||||
- name: 'Upload Reliability Logs'
|
|
||||||
if: "always() && steps.check_evals.outputs.should_run == 'true'"
|
|
||||||
uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # ratchet:actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: 'eval-logs-${{ github.run_id }}-${{ github.run_attempt }}'
|
|
||||||
path: 'evals/logs/api-reliability.jsonl'
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
name: 'E2E'
|
name: 'E2E'
|
||||||
if: |
|
if: |
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: 'Cache Linters'
|
- name: 'Cache Linters'
|
||||||
uses: 'actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830' # ratchet:actions/cache@v4
|
uses: 'actions/cache@v4'
|
||||||
with:
|
with:
|
||||||
path: '${{ env.GEMINI_LINT_TEMP_DIR }}'
|
path: '${{ env.GEMINI_LINT_TEMP_DIR }}'
|
||||||
key: "${{ runner.os }}-${{ runner.arch }}-linters-${{ hashFiles('scripts/lint.js') }}"
|
key: "${{ runner.os }}-${{ runner.arch }}-linters-${{ hashFiles('scripts/lint.js') }}"
|
||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
run: 'npm ci'
|
run: 'npm ci'
|
||||||
|
|
||||||
- name: 'Cache ESLint'
|
- name: 'Cache ESLint'
|
||||||
uses: 'actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830' # ratchet:actions/cache@v4
|
uses: 'actions/cache@v4'
|
||||||
with:
|
with:
|
||||||
path: '.eslintcache'
|
path: '.eslintcache'
|
||||||
key: "${{ runner.os }}-eslint-${{ hashFiles('package-lock.json', 'eslint.config.js') }}"
|
key: "${{ runner.os }}-eslint-${{ hashFiles('package-lock.json', 'eslint.config.js') }}"
|
||||||
@@ -114,9 +114,6 @@ jobs:
|
|||||||
- name: 'Run sensitive keyword linter'
|
- name: 'Run sensitive keyword linter'
|
||||||
run: 'node scripts/lint.js --sensitive-keywords'
|
run: 'node scripts/lint.js --sensitive-keywords'
|
||||||
|
|
||||||
- name: 'Run GitHub Actions pinning linter'
|
|
||||||
run: 'node scripts/lint.js --check-github-actions-pinning'
|
|
||||||
|
|
||||||
link_checker:
|
link_checker:
|
||||||
name: 'Link Checker'
|
name: 'Link Checker'
|
||||||
runs-on: 'ubuntu-latest'
|
runs-on: 'ubuntu-latest'
|
||||||
@@ -161,12 +158,6 @@ jobs:
|
|||||||
- name: 'Build project'
|
- name: 'Build project'
|
||||||
run: 'npm run build'
|
run: 'npm run build'
|
||||||
|
|
||||||
- name: 'Install system dependencies'
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq bubblewrap
|
|
||||||
# Ubuntu 24.04+ requires this to allow bwrap to function in CI
|
|
||||||
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 || true
|
|
||||||
|
|
||||||
- name: 'Install dependencies for testing'
|
- name: 'Install dependencies for testing'
|
||||||
run: 'npm ci'
|
run: 'npm ci'
|
||||||
|
|
||||||
@@ -175,10 +166,10 @@ jobs:
|
|||||||
NO_COLOR: true
|
NO_COLOR: true
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ matrix.shard }}" == "cli" ]]; then
|
if [[ "${{ matrix.shard }}" == "cli" ]]; then
|
||||||
npm run test:ci --workspace "@google/gemini-cli"
|
npm run test:ci --workspace @google/gemini-cli
|
||||||
else
|
else
|
||||||
# Explicitly list non-cli packages to ensure they are sharded correctly
|
# Explicitly list non-cli packages to ensure they are sharded correctly
|
||||||
npm run test:ci --workspace "@google/gemini-cli-core" --workspace "@google/gemini-cli-a2a-server" --workspace "gemini-cli-vscode-ide-companion" --workspace "@google/gemini-cli-test-utils" --if-present -- --coverage.enabled=false
|
npm run test:ci --workspace @google/gemini-cli-core --workspace @google/gemini-cli-a2a-server --workspace gemini-cli-vscode-ide-companion --workspace @google/gemini-cli-test-utils --if-present -- --coverage.enabled=false
|
||||||
npm run test:scripts
|
npm run test:scripts
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -263,10 +254,10 @@ jobs:
|
|||||||
NO_COLOR: true
|
NO_COLOR: true
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ matrix.shard }}" == "cli" ]]; then
|
if [[ "${{ matrix.shard }}" == "cli" ]]; then
|
||||||
npm run test:ci --workspace "@google/gemini-cli" -- --coverage.enabled=false
|
npm run test:ci --workspace @google/gemini-cli -- --coverage.enabled=false
|
||||||
else
|
else
|
||||||
# Explicitly list non-cli packages to ensure they are sharded correctly
|
# Explicitly list non-cli packages to ensure they are sharded correctly
|
||||||
npm run test:ci --workspace "@google/gemini-cli-core" --workspace "@google/gemini-cli-a2a-server" --workspace "gemini-cli-vscode-ide-companion" --workspace "@google/gemini-cli-test-utils" --if-present -- --coverage.enabled=false
|
npm run test:ci --workspace @google/gemini-cli-core --workspace @google/gemini-cli-a2a-server --workspace gemini-cli-vscode-ide-companion --workspace @google/gemini-cli-test-utils --if-present -- --coverage.enabled=false
|
||||||
npm run test:scripts
|
npm run test:scripts
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -429,14 +420,11 @@ jobs:
|
|||||||
NODE_ENV: 'test'
|
NODE_ENV: 'test'
|
||||||
run: |
|
run: |
|
||||||
if ("${{ matrix.shard }}" -eq "cli") {
|
if ("${{ matrix.shard }}" -eq "cli") {
|
||||||
npm run test:ci --workspace "@google/gemini-cli" -- --coverage.enabled=false
|
npm run test:ci --workspace @google/gemini-cli -- --coverage.enabled=false
|
||||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
||||||
} else {
|
} else {
|
||||||
# Explicitly list non-cli packages to ensure they are sharded correctly
|
# Explicitly list non-cli packages to ensure they are sharded correctly
|
||||||
npm run test:ci --workspace "@google/gemini-cli-core" --workspace "@google/gemini-cli-a2a-server" --workspace "gemini-cli-vscode-ide-companion" --workspace "@google/gemini-cli-test-utils" --if-present -- --coverage.enabled=false
|
npm run test:ci --workspace @google/gemini-cli-core --workspace @google/gemini-cli-a2a-server --workspace gemini-cli-vscode-ide-companion --workspace @google/gemini-cli-test-utils --if-present -- --coverage.enabled=false
|
||||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
||||||
npm run test:scripts
|
npm run test:scripts
|
||||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
||||||
}
|
}
|
||||||
shell: 'pwsh'
|
shell: 'pwsh'
|
||||||
|
|
||||||
|
|||||||
@@ -1,209 +0,0 @@
|
|||||||
name: 'Evals: PR Evaluation & Regression'
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: ['opened', 'synchronize', 'reopened', 'ready_for_review']
|
|
||||||
paths:
|
|
||||||
- 'packages/core/src/prompts/**'
|
|
||||||
- 'packages/core/src/tools/**'
|
|
||||||
- 'packages/core/src/agents/**'
|
|
||||||
- 'evals/**'
|
|
||||||
- '!**/*.test.ts'
|
|
||||||
- '!**/*.test.tsx'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
# Prevents multiple runs for the same PR simultaneously (saves tokens)
|
|
||||||
concurrency:
|
|
||||||
group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}'
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: 'write'
|
|
||||||
contents: 'read'
|
|
||||||
actions: 'read'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
detect-changes:
|
|
||||||
name: 'Detect Steering Changes'
|
|
||||||
runs-on: 'gemini-cli-ubuntu-16-core'
|
|
||||||
# Security: pull_request_target allows secrets, so we must gate carefully.
|
|
||||||
# Detection should not run code from the fork.
|
|
||||||
if: "github.repository == 'google-gemini/gemini-cli' && github.event.pull_request.draft == false"
|
|
||||||
outputs:
|
|
||||||
SHOULD_RUN: '${{ steps.detect.outputs.SHOULD_RUN }}'
|
|
||||||
STEERING_DETECTED: '${{ steps.detect.outputs.STEERING_DETECTED }}'
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout'
|
|
||||||
uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5
|
|
||||||
with:
|
|
||||||
# Check out the trusted code from main for detection
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 'Detect Steering Changes'
|
|
||||||
id: 'detect'
|
|
||||||
env:
|
|
||||||
# Use the PR's head SHA for comparison without checking it out
|
|
||||||
PR_HEAD_SHA: '${{ github.event.pull_request.head.sha }}'
|
|
||||||
run: |
|
|
||||||
# Fetch the fork's PR branch for analysis
|
|
||||||
git fetch origin pull/${{ github.event.pull_request.number }}/head:pr-head
|
|
||||||
|
|
||||||
# Run the trusted script from main
|
|
||||||
SHOULD_RUN=$(node scripts/changed_prompt.js)
|
|
||||||
STEERING_DETECTED=$(node scripts/changed_prompt.js --steering-only)
|
|
||||||
echo "SHOULD_RUN=$SHOULD_RUN" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "STEERING_DETECTED=$STEERING_DETECTED" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: 'Notify Approval Required'
|
|
||||||
if: "steps.detect.outputs.SHOULD_RUN == 'true'"
|
|
||||||
env:
|
|
||||||
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
run: |
|
|
||||||
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
||||||
COMMENT_BODY="### 🛑 Action Required: Evaluation Approval
|
|
||||||
|
|
||||||
Steering changes have been detected in this PR. To prevent regressions, a maintainer must approve the evaluation run before this PR can be merged.
|
|
||||||
|
|
||||||
**Maintainers:**
|
|
||||||
1. Go to the [**Workflow Run Summary**]($RUN_URL).
|
|
||||||
2. Click the yellow **'Review deployments'** button.
|
|
||||||
3. Select the **'eval-gate'** environment and click **'Approve'**.
|
|
||||||
|
|
||||||
Once approved, the evaluation results will be posted here automatically.
|
|
||||||
|
|
||||||
<!-- eval-approval-notification -->"
|
|
||||||
|
|
||||||
# Check if comment already exists to avoid spamming
|
|
||||||
COMMENT_ID=$(gh pr view ${{ github.event.pull_request.number }} --json comments --jq '.comments[] | select(.body | contains("<!-- eval-approval-notification -->")) | .url' | grep -oE "[0-9]+$" | head -n 1)
|
|
||||||
|
|
||||||
if [ -z "$COMMENT_ID" ]; then
|
|
||||||
gh pr comment ${{ github.event.pull_request.number }} --body "$COMMENT_BODY"
|
|
||||||
else
|
|
||||||
echo "Updating existing notification comment $COMMENT_ID..."
|
|
||||||
gh api -X PATCH "repos/${{ github.repository }}/issues/comments/$COMMENT_ID" -F body="$COMMENT_BODY"
|
|
||||||
fi
|
|
||||||
|
|
||||||
pr-evaluation:
|
|
||||||
name: 'Evaluate Steering & Regressions'
|
|
||||||
needs: 'detect-changes'
|
|
||||||
if: "needs.detect-changes.outputs.SHOULD_RUN == 'true'"
|
|
||||||
# Manual approval gate via environment
|
|
||||||
environment: 'eval-gate'
|
|
||||||
runs-on: 'gemini-cli-ubuntu-16-core'
|
|
||||||
env:
|
|
||||||
# CENTRALIZED MODEL LIST
|
|
||||||
MODEL_LIST: 'gemini-3-flash-preview'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout'
|
|
||||||
uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5
|
|
||||||
with:
|
|
||||||
# Check out the fork's PR code for the actual evaluation
|
|
||||||
# This only runs AFTER manual approval
|
|
||||||
ref: '${{ github.event.pull_request.head.sha }}'
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 'Remove Approval Notification'
|
|
||||||
# Run even if other steps fail, to ensure we clean up the "Action Required" message
|
|
||||||
if: 'always()'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
PR_NUMBER: '${{ github.event.pull_request.number }}'
|
|
||||||
run: |
|
|
||||||
echo "Debug: PR_NUMBER is '$PR_NUMBER'"
|
|
||||||
# Search for the notification comment by its hidden tag
|
|
||||||
COMMENT_ID=$(gh pr view "$PR_NUMBER" --json comments --jq '.comments[] | select(.body | contains("<!-- eval-approval-notification -->")) | .url' | grep -oE "[0-9]+$" | head -n 1)
|
|
||||||
if [ -n "$COMMENT_ID" ]; then
|
|
||||||
echo "Removing notification comment $COMMENT_ID now that run is approved..."
|
|
||||||
gh api -X DELETE "repos/${{ github.repository }}/issues/comments/$COMMENT_ID"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 'Set up Node.js'
|
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: 'Install dependencies'
|
|
||||||
run: 'npm ci'
|
|
||||||
|
|
||||||
- name: 'Build project'
|
|
||||||
run: 'npm run build'
|
|
||||||
|
|
||||||
- name: 'Analyze PR Content (Guidance)'
|
|
||||||
if: "needs.detect-changes.outputs.STEERING_DETECTED == 'true'"
|
|
||||||
id: 'analysis'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
run: |
|
|
||||||
# Check for behavioral eval changes
|
|
||||||
EVAL_CHANGES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | grep "^evals/" || true)
|
|
||||||
if [ -z "$EVAL_CHANGES" ]; then
|
|
||||||
echo "MISSING_EVALS=true" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if user is a maintainer
|
|
||||||
USER_PERMISSION=$(gh api repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission --jq '.permission')
|
|
||||||
if [[ "$USER_PERMISSION" == "admin" || "$USER_PERMISSION" == "write" ]]; then
|
|
||||||
echo "IS_MAINTAINER=true" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 'Execute Regression Check'
|
|
||||||
env:
|
|
||||||
GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}'
|
|
||||||
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
MODEL_LIST: '${{ env.MODEL_LIST }}'
|
|
||||||
run: |
|
|
||||||
# Run the regression check loop. The script saves the report to a file.
|
|
||||||
node scripts/run_eval_regression.js
|
|
||||||
|
|
||||||
# Use the generated report file if it exists
|
|
||||||
if [[ -f eval_regression_report.md ]]; then
|
|
||||||
echo "REPORT_FILE=eval_regression_report.md" >> "$GITHUB_ENV"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 'Post or Update PR Comment'
|
|
||||||
if: "always() && (needs.detect-changes.outputs.STEERING_DETECTED == 'true' || env.REPORT_FILE != '')"
|
|
||||||
env:
|
|
||||||
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
||||||
run: |
|
|
||||||
# 1. Build the full comment body
|
|
||||||
{
|
|
||||||
if [[ -f eval_regression_report.md ]]; then
|
|
||||||
cat eval_regression_report.md
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${{ needs.detect-changes.outputs.STEERING_DETECTED }}" == "true" ]]; then
|
|
||||||
echo "### 🧠 Model Steering Guidance"
|
|
||||||
echo ""
|
|
||||||
echo "This PR modifies files that affect the model's behavior (prompts, tools, or instructions)."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
if [[ "${{ steps.analysis.outputs.MISSING_EVALS }}" == "true" ]]; then
|
|
||||||
echo "- ⚠️ **Consider adding Evals:** No behavioral evaluations (\`evals/*.eval.ts\`) were added or updated in this PR. Consider [adding a test case](https://github.com/google-gemini/gemini-cli/blob/main/evals/README.md#creating-an-evaluation) to verify the new behavior and prevent regressions."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${{ steps.analysis.outputs.IS_MAINTAINER }}" == "true" ]]; then
|
|
||||||
echo "- 🚀 **Maintainer Reminder:** Please ensure that these changes do not regress results on benchmark evals before merging."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "---"
|
|
||||||
echo "*This is an automated guidance message triggered by steering logic signatures.*"
|
|
||||||
echo "<!-- eval-pr-report -->"
|
|
||||||
} > full_comment.md
|
|
||||||
|
|
||||||
# 2. Find if a comment with our unique tag already exists
|
|
||||||
# We extract the numeric ID from the URL to ensure compatibility with the REST API
|
|
||||||
COMMENT_ID=$(gh pr view ${{ github.event.pull_request.number }} --json comments --jq '.comments[] | select(.body | contains("<!-- eval-pr-report -->")) | .url' | grep -oE "[0-9]+$" | head -n 1)
|
|
||||||
|
|
||||||
# 3. Update or Create the comment
|
|
||||||
if [ -n "$COMMENT_ID" ]; then
|
|
||||||
echo "Updating existing comment $COMMENT_ID via API..."
|
|
||||||
gh api -X PATCH "repos/${{ github.repository }}/issues/comments/$COMMENT_ID" -F body=@full_comment.md
|
|
||||||
else
|
|
||||||
echo "Creating new PR comment..."
|
|
||||||
gh pr comment ${{ github.event.pull_request.number }} --body-file full_comment.md
|
|
||||||
fi
|
|
||||||
@@ -5,18 +5,10 @@ on:
|
|||||||
- cron: '0 1 * * *' # Runs at 1 AM every day
|
- cron: '0 1 * * *' # Runs at 1 AM every day
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
suite_type:
|
run_all:
|
||||||
description: 'Suite type to run'
|
description: 'Run all evaluations (including usually passing)'
|
||||||
type: 'choice'
|
type: 'boolean'
|
||||||
options:
|
default: true
|
||||||
- 'behavioral'
|
|
||||||
- 'component-level'
|
|
||||||
- 'hero-scenario'
|
|
||||||
default: 'behavioral'
|
|
||||||
suite_name:
|
|
||||||
description: 'Specific suite name to run'
|
|
||||||
required: false
|
|
||||||
type: 'string'
|
|
||||||
test_name_pattern:
|
test_name_pattern:
|
||||||
description: 'Test name pattern or file name'
|
description: 'Test name pattern or file name'
|
||||||
required: false
|
required: false
|
||||||
@@ -67,13 +59,8 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}'
|
GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}'
|
||||||
GEMINI_MODEL: '${{ matrix.model }}'
|
GEMINI_MODEL: '${{ matrix.model }}'
|
||||||
RUN_EVALS: 'true'
|
RUN_EVALS: "${{ github.event.inputs.run_all != 'false' }}"
|
||||||
EVAL_SUITE_TYPE: "${{ github.event.inputs.suite_type || 'behavioral' }}"
|
|
||||||
EVAL_SUITE_NAME: '${{ github.event.inputs.suite_name }}'
|
|
||||||
TEST_NAME_PATTERN: '${{ github.event.inputs.test_name_pattern }}'
|
TEST_NAME_PATTERN: '${{ github.event.inputs.test_name_pattern }}'
|
||||||
# Disable Vitest internal retries to avoid double-retrying;
|
|
||||||
# custom retry logic is handled in evals/test-helper.ts
|
|
||||||
VITEST_RETRY: 0
|
|
||||||
run: |
|
run: |
|
||||||
CMD="npm run test:all_evals"
|
CMD="npm run test:all_evals"
|
||||||
PATTERN="${TEST_NAME_PATTERN}"
|
PATTERN="${TEST_NAME_PATTERN}"
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: 'Generate GitHub App Token'
|
- name: 'Generate GitHub App Token'
|
||||||
id: 'generate_token'
|
id: 'generate_token'
|
||||||
uses: 'actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349' # ratchet:actions/create-github-app-token@v2
|
uses: 'actions/create-github-app-token@v2'
|
||||||
with:
|
with:
|
||||||
app-id: '${{ secrets.APP_ID }}'
|
app-id: '${{ secrets.APP_ID }}'
|
||||||
private-key: '${{ secrets.PRIVATE_KEY }}'
|
private-key: '${{ secrets.PRIVATE_KEY }}'
|
||||||
permission-issues: 'write'
|
permission-issues: 'write'
|
||||||
|
|
||||||
- name: 'Process Stale Issues'
|
- name: 'Process Stale Issues'
|
||||||
uses: 'actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b' # ratchet:actions/github-script@v7
|
uses: 'actions/github-script@v7'
|
||||||
env:
|
env:
|
||||||
DRY_RUN: '${{ inputs.dry_run }}'
|
DRY_RUN: '${{ inputs.dry_run }}'
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -27,13 +27,13 @@ jobs:
|
|||||||
APP_ID: '${{ secrets.APP_ID }}'
|
APP_ID: '${{ secrets.APP_ID }}'
|
||||||
if: |-
|
if: |-
|
||||||
${{ env.APP_ID != '' }}
|
${{ env.APP_ID != '' }}
|
||||||
uses: 'actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349' # ratchet:actions/create-github-app-token@v2
|
uses: 'actions/create-github-app-token@v2'
|
||||||
with:
|
with:
|
||||||
app-id: '${{ secrets.APP_ID }}'
|
app-id: '${{ secrets.APP_ID }}'
|
||||||
private-key: '${{ secrets.PRIVATE_KEY }}'
|
private-key: '${{ secrets.PRIVATE_KEY }}'
|
||||||
|
|
||||||
- name: 'Process Stale PRs'
|
- name: 'Process Stale PRs'
|
||||||
uses: 'actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b' # ratchet:actions/github-script@v7
|
uses: 'actions/github-script@v7'
|
||||||
env:
|
env:
|
||||||
DRY_RUN: '${{ inputs.dry_run }}'
|
DRY_RUN: '${{ inputs.dry_run }}'
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ jobs:
|
|||||||
runs-on: 'ubuntu-latest'
|
runs-on: 'ubuntu-latest'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
|
|
||||||
- name: 'Setup Node.js'
|
- name: 'Setup Node.js'
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
uses: 'actions/setup-node@v4'
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
@@ -40,10 +40,10 @@ jobs:
|
|||||||
runs-on: 'ubuntu-latest'
|
runs-on: 'ubuntu-latest'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
|
|
||||||
- name: 'Setup Node.js'
|
- name: 'Setup Node.js'
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
uses: 'actions/setup-node@v4'
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
issues: 'write'
|
issues: 'write'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Check for Parent Workstream and Apply Label'
|
- name: 'Check for Parent Workstream and Apply Label'
|
||||||
uses: 'actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b' # ratchet:actions/github-script@v7
|
uses: 'actions/github-script@v7'
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const labelToAdd = 'workstream-rollup';
|
const labelToAdd = 'workstream-rollup';
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
name: 'Memory Tests: Nightly'
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *' # Runs at 2 AM every day
|
|
||||||
workflow_dispatch: # Allow manual trigger
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: 'read'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
memory-test:
|
|
||||||
name: 'Run Memory Usage Tests'
|
|
||||||
runs-on: 'gemini-cli-ubuntu-16-core'
|
|
||||||
if: "github.repository == 'google-gemini/gemini-cli'"
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout'
|
|
||||||
uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8' # ratchet:actions/checkout@v5
|
|
||||||
|
|
||||||
- name: 'Set up Node.js'
|
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: 'Install dependencies'
|
|
||||||
run: 'npm ci'
|
|
||||||
|
|
||||||
- name: 'Build project'
|
|
||||||
run: 'npm run build'
|
|
||||||
|
|
||||||
- name: 'Run Memory Tests'
|
|
||||||
run: 'npm run test:memory'
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
name: 'Performance Tests: Nightly'
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 3 * * *' # Runs at 3 AM every day
|
|
||||||
workflow_dispatch: # Allow manual trigger
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: 'read'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
perf-test:
|
|
||||||
name: 'Run Performance Usage Tests'
|
|
||||||
runs-on: 'gemini-cli-ubuntu-16-core'
|
|
||||||
if: "github.repository == 'google-gemini/gemini-cli'"
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout'
|
|
||||||
uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8' # ratchet:actions/checkout@v5
|
|
||||||
|
|
||||||
- name: 'Set up Node.js'
|
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: 'Install dependencies'
|
|
||||||
run: 'npm ci'
|
|
||||||
|
|
||||||
- name: 'Build project'
|
|
||||||
run: 'npm run build'
|
|
||||||
|
|
||||||
- name: 'Run Performance Tests'
|
|
||||||
run: 'npm run test:perf'
|
|
||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
APP_ID: '${{ secrets.APP_ID }}'
|
APP_ID: '${{ secrets.APP_ID }}'
|
||||||
if: |-
|
if: |-
|
||||||
${{ env.APP_ID != '' }}
|
${{ env.APP_ID != '' }}
|
||||||
uses: 'actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349' # ratchet:actions/create-github-app-token@v2
|
uses: 'actions/create-github-app-token@v2'
|
||||||
with:
|
with:
|
||||||
app-id: '${{ secrets.APP_ID }}'
|
app-id: '${{ secrets.APP_ID }}'
|
||||||
private-key: '${{ secrets.PRIVATE_KEY }}'
|
private-key: '${{ secrets.PRIVATE_KEY }}'
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
issues: 'write'
|
issues: 'write'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout repository'
|
- name: 'Checkout repository'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
with:
|
with:
|
||||||
ref: '${{ github.ref }}'
|
ref: '${{ github.ref }}'
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|||||||
@@ -29,14 +29,14 @@ jobs:
|
|||||||
pull-requests: 'write'
|
pull-requests: 'write'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout repository'
|
- name: 'Checkout repository'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
with:
|
with:
|
||||||
# The user-level skills need to be available to the workflow
|
# The user-level skills need to be available to the workflow
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: 'main'
|
ref: 'main'
|
||||||
|
|
||||||
- name: 'Set up Node.js'
|
- name: 'Set up Node.js'
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
uses: 'actions/setup-node@v4'
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ jobs:
|
|||||||
|
|
||||||
- name: 'Create Pull Request'
|
- name: 'Create Pull Request'
|
||||||
if: "steps.validate_version.outputs.CONTINUE == 'true'"
|
if: "steps.validate_version.outputs.CONTINUE == 'true'"
|
||||||
uses: 'peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c' # ratchet:peter-evans/create-pull-request@v6
|
uses: 'peter-evans/create-pull-request@v6'
|
||||||
with:
|
with:
|
||||||
token: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}'
|
token: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}'
|
||||||
commit-message: 'docs(changelog): update for ${{ steps.release_info.outputs.VERSION }}'
|
commit-message: 'docs(changelog): update for ${{ steps.release_info.outputs.VERSION }}'
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: 'actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5' # ratchet:actions/checkout@v4
|
uses: 'actions/checkout@v4'
|
||||||
|
|
||||||
- name: 'Optimize Windows Performance'
|
- name: 'Optimize Windows Performance'
|
||||||
if: "matrix.os == 'windows-latest'"
|
if: "matrix.os == 'windows-latest'"
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
shell: 'powershell'
|
shell: 'powershell'
|
||||||
|
|
||||||
- name: 'Set up Node.js'
|
- name: 'Set up Node.js'
|
||||||
uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
|
uses: 'actions/setup-node@v4'
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
architecture: '${{ matrix.arch }}'
|
architecture: '${{ matrix.arch }}'
|
||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
|
|
||||||
- name: 'Setup Windows SDK (Windows)'
|
- name: 'Setup Windows SDK (Windows)'
|
||||||
if: "matrix.os == 'windows-latest'"
|
if: "matrix.os == 'windows-latest'"
|
||||||
uses: 'microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce' # ratchet:microsoft/setup-msbuild@v2
|
uses: 'microsoft/setup-msbuild@v2'
|
||||||
|
|
||||||
- name: 'Add Signtool to Path (Windows)'
|
- name: 'Add Signtool to Path (Windows)'
|
||||||
if: "matrix.os == 'windows-latest'"
|
if: "matrix.os == 'windows-latest'"
|
||||||
@@ -153,7 +153,7 @@ jobs:
|
|||||||
npm run test:integration:sandbox:none -- --testTimeout=600000
|
npm run test:integration:sandbox:none -- --testTimeout=600000
|
||||||
|
|
||||||
- name: 'Upload Artifact'
|
- name: 'Upload Artifact'
|
||||||
uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # ratchet:actions/upload-artifact@v4
|
uses: 'actions/upload-artifact@v4'
|
||||||
with:
|
with:
|
||||||
name: 'gemini-cli-${{ matrix.platform_name }}'
|
name: 'gemini-cli-${{ matrix.platform_name }}'
|
||||||
path: 'dist/${{ matrix.platform_name }}/'
|
path: 'dist/${{ matrix.platform_name }}/'
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: 'Generate GitHub App Token'
|
- name: 'Generate GitHub App Token'
|
||||||
id: 'generate_token'
|
id: 'generate_token'
|
||||||
uses: 'actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349' # ratchet:actions/create-github-app-token@v2
|
uses: 'actions/create-github-app-token@v2'
|
||||||
with:
|
with:
|
||||||
app-id: '${{ secrets.APP_ID }}'
|
app-id: '${{ secrets.APP_ID }}'
|
||||||
private-key: '${{ secrets.PRIVATE_KEY }}'
|
private-key: '${{ secrets.PRIVATE_KEY }}'
|
||||||
|
|
||||||
- name: 'Unassign inactive assignees'
|
- name: 'Unassign inactive assignees'
|
||||||
uses: 'actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b' # ratchet:actions/github-script@v7
|
uses: 'actions/github-script@v7'
|
||||||
env:
|
env:
|
||||||
DRY_RUN: '${{ inputs.dry_run }}'
|
DRY_RUN: '${{ inputs.dry_run }}'
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ packages/cli/src/generated/
|
|||||||
packages/core/src/generated/
|
packages/core/src/generated/
|
||||||
packages/devtools/src/_client-assets.ts
|
packages/devtools/src/_client-assets.ts
|
||||||
.integration-tests/
|
.integration-tests/
|
||||||
.perf-tests/
|
|
||||||
packages/vscode-ide-companion/*.vsix
|
packages/vscode-ide-companion/*.vsix
|
||||||
packages/cli/download-ripgrep*/
|
packages/cli/download-ripgrep*/
|
||||||
|
|
||||||
@@ -65,6 +64,3 @@ gemini-debug.log
|
|||||||
evals/logs/
|
evals/logs/
|
||||||
|
|
||||||
temp_agents/
|
temp_agents/
|
||||||
|
|
||||||
# conductor extension and planning directories
|
|
||||||
conductor/
|
|
||||||
|
|||||||
+7
-10
@@ -323,8 +323,8 @@ fi
|
|||||||
|
|
||||||
#### Formatting
|
#### Formatting
|
||||||
|
|
||||||
To separately format the code in this project, run the following command from
|
To separately format the code in this project by running the following command
|
||||||
the root directory:
|
from the root directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run format
|
npm run format
|
||||||
@@ -346,11 +346,9 @@ npm run lint
|
|||||||
|
|
||||||
- Please adhere to the coding style, patterns, and conventions used throughout
|
- Please adhere to the coding style, patterns, and conventions used throughout
|
||||||
the existing codebase.
|
the existing codebase.
|
||||||
- Consult
|
- Consult [GEMINI.md](../GEMINI.md) (typically found in the project root) for
|
||||||
[GEMINI.md](https://github.com/google-gemini/gemini-cli/blob/main/GEMINI.md)
|
specific instructions related to AI-assisted development, including
|
||||||
(typically found in the project root) for specific instructions related to
|
conventions for React, comments, and Git usage.
|
||||||
AI-assisted development, including conventions for React, comments, and Git
|
|
||||||
usage.
|
|
||||||
- **Imports:** Pay special attention to import paths. The project uses ESLint to
|
- **Imports:** Pay special attention to import paths. The project uses ESLint to
|
||||||
enforce restrictions on relative imports between packages.
|
enforce restrictions on relative imports between packages.
|
||||||
|
|
||||||
@@ -507,9 +505,8 @@ code.
|
|||||||
|
|
||||||
### Documentation structure
|
### Documentation structure
|
||||||
|
|
||||||
Our documentation is organized using
|
Our documentation is organized using [sidebar.json](/docs/sidebar.json) as the
|
||||||
[sidebar.json](https://github.com/google-gemini/gemini-cli/blob/main/docs/sidebar.json)
|
table of contents. When adding new documentation:
|
||||||
as the table of contents. When adding new documentation:
|
|
||||||
|
|
||||||
1. Create your markdown file **in the appropriate directory** under `/docs`.
|
1. Create your markdown file **in the appropriate directory** under `/docs`.
|
||||||
2. Add an entry to `sidebar.json` in the relevant section.
|
2. Add an entry to `sidebar.json` in the relevant section.
|
||||||
|
|||||||
@@ -44,13 +44,6 @@ powerful tool for developers.
|
|||||||
- **Test Commands:**
|
- **Test Commands:**
|
||||||
- **Unit (All):** `npm run test`
|
- **Unit (All):** `npm run test`
|
||||||
- **Integration (E2E):** `npm run test:e2e`
|
- **Integration (E2E):** `npm run test:e2e`
|
||||||
- > **NOTE**: Please run the memory and perf tests locally **only if** you are
|
|
||||||
> implementing changes related to those test areas. Otherwise skip these
|
|
||||||
> tests locally and rely on CI to run them on nightly builds.
|
|
||||||
- **Memory (Nightly):** `npm run test:memory` (Runs memory regression tests
|
|
||||||
against baselines. Excluded from `preflight`, run nightly.)
|
|
||||||
- **Performance (Nightly):** `npm run test:perf` (Runs CPU performance
|
|
||||||
regression tests against baselines. Excluded from `preflight`, run nightly.)
|
|
||||||
- **Workspace-Specific:** `npm test -w <pkg> -- <path>` (Note: `<path>` must
|
- **Workspace-Specific:** `npm test -w <pkg> -- <path>` (Note: `<path>` must
|
||||||
be relative to the workspace root, e.g.,
|
be relative to the workspace root, e.g.,
|
||||||
`-w @google/gemini-cli-core -- src/routing/modelRouterService.test.ts`)
|
`-w @google/gemini-cli-core -- src/routing/modelRouterService.test.ts`)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ Learn all about Gemini CLI in our [documentation](https://geminicli.com/docs/).
|
|||||||
## 📦 Installation
|
## 📦 Installation
|
||||||
|
|
||||||
See
|
See
|
||||||
[Gemini CLI installation, execution, and releases](https://www.geminicli.com/docs/get-started/installation)
|
[Gemini CLI installation, execution, and releases](./docs/get-started/installation.md)
|
||||||
for recommended system specifications and a detailed installation guide.
|
for recommended system specifications and a detailed installation guide.
|
||||||
|
|
||||||
### Quick Install
|
### Quick Install
|
||||||
@@ -71,9 +71,9 @@ conda activate gemini_env
|
|||||||
npm install -g @google/gemini-cli
|
npm install -g @google/gemini-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
## Release Channels
|
## Release Cadence and Tags
|
||||||
|
|
||||||
See [Releases](https://www.geminicli.com/docs/changelogs) for more details.
|
See [Releases](./docs/releases.md) for more details.
|
||||||
|
|
||||||
### Preview
|
### Preview
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ gemini
|
|||||||
```
|
```
|
||||||
|
|
||||||
For Google Workspace accounts and other authentication methods, see the
|
For Google Workspace accounts and other authentication methods, see the
|
||||||
[authentication guide](https://www.geminicli.com/docs/get-started/authentication).
|
[authentication guide](./docs/get-started/authentication.md).
|
||||||
|
|
||||||
## 🚀 Getting Started
|
## 🚀 Getting Started
|
||||||
|
|
||||||
@@ -278,64 +278,59 @@ gemini
|
|||||||
|
|
||||||
### Getting Started
|
### Getting Started
|
||||||
|
|
||||||
- [**Quickstart Guide**](https://www.geminicli.com/docs/get-started) - Get up
|
- [**Quickstart Guide**](./docs/get-started/index.md) - Get up and running
|
||||||
and running quickly.
|
quickly.
|
||||||
- [**Authentication Setup**](https://www.geminicli.com/docs/get-started/authentication) -
|
- [**Authentication Setup**](./docs/get-started/authentication.md) - Detailed
|
||||||
Detailed auth configuration.
|
auth configuration.
|
||||||
- [**Configuration Guide**](https://www.geminicli.com/docs/reference/configuration) -
|
- [**Configuration Guide**](./docs/reference/configuration.md) - Settings and
|
||||||
Settings and customization.
|
customization.
|
||||||
- [**Keyboard Shortcuts**](https://www.geminicli.com/docs/reference/keyboard-shortcuts) -
|
- [**Keyboard Shortcuts**](./docs/reference/keyboard-shortcuts.md) -
|
||||||
Productivity tips.
|
Productivity tips.
|
||||||
|
|
||||||
### Core Features
|
### Core Features
|
||||||
|
|
||||||
- [**Commands Reference**](https://www.geminicli.com/docs/reference/commands) -
|
- [**Commands Reference**](./docs/reference/commands.md) - All slash commands
|
||||||
All slash commands (`/help`, `/chat`, etc).
|
(`/help`, `/chat`, etc).
|
||||||
- [**Custom Commands**](https://www.geminicli.com/docs/cli/custom-commands) -
|
- [**Custom Commands**](./docs/cli/custom-commands.md) - Create your own
|
||||||
Create your own reusable commands.
|
reusable commands.
|
||||||
- [**Context Files (GEMINI.md)**](https://www.geminicli.com/docs/cli/gemini-md) -
|
- [**Context Files (GEMINI.md)**](./docs/cli/gemini-md.md) - Provide persistent
|
||||||
Provide persistent context to Gemini CLI.
|
context to Gemini CLI.
|
||||||
- [**Checkpointing**](https://www.geminicli.com/docs/cli/checkpointing) - Save
|
- [**Checkpointing**](./docs/cli/checkpointing.md) - Save and resume
|
||||||
and resume conversations.
|
conversations.
|
||||||
- [**Token Caching**](https://www.geminicli.com/docs/cli/token-caching) -
|
- [**Token Caching**](./docs/cli/token-caching.md) - Optimize token usage.
|
||||||
Optimize token usage.
|
|
||||||
|
|
||||||
### Tools & Extensions
|
### Tools & Extensions
|
||||||
|
|
||||||
- [**Built-in Tools Overview**](https://www.geminicli.com/docs/reference/tools)
|
- [**Built-in Tools Overview**](./docs/reference/tools.md)
|
||||||
- [File System Operations](https://www.geminicli.com/docs/tools/file-system)
|
- [File System Operations](./docs/tools/file-system.md)
|
||||||
- [Shell Commands](https://www.geminicli.com/docs/tools/shell)
|
- [Shell Commands](./docs/tools/shell.md)
|
||||||
- [Web Fetch & Search](https://www.geminicli.com/docs/tools/web-fetch)
|
- [Web Fetch & Search](./docs/tools/web-fetch.md)
|
||||||
- [**MCP Server Integration**](https://www.geminicli.com/docs/tools/mcp-server) -
|
- [**MCP Server Integration**](./docs/tools/mcp-server.md) - Extend with custom
|
||||||
Extend with custom tools.
|
tools.
|
||||||
- [**Custom Extensions**](https://geminicli.com/docs/extensions/writing-extensions) -
|
- [**Custom Extensions**](./docs/extensions/index.md) - Build and share your own
|
||||||
Build and share your own commands.
|
commands.
|
||||||
|
|
||||||
### Advanced Topics
|
### Advanced Topics
|
||||||
|
|
||||||
- [**Headless Mode (Scripting)**](https://www.geminicli.com/docs/cli/headless) -
|
- [**Headless Mode (Scripting)**](./docs/cli/headless.md) - Use Gemini CLI in
|
||||||
Use Gemini CLI in automated workflows.
|
automated workflows.
|
||||||
- [**IDE Integration**](https://www.geminicli.com/docs/ide-integration) - VS
|
- [**IDE Integration**](./docs/ide-integration/index.md) - VS Code companion.
|
||||||
Code companion.
|
- [**Sandboxing & Security**](./docs/cli/sandbox.md) - Safe execution
|
||||||
- [**Sandboxing & Security**](https://www.geminicli.com/docs/cli/sandbox) - Safe
|
environments.
|
||||||
execution environments.
|
- [**Trusted Folders**](./docs/cli/trusted-folders.md) - Control execution
|
||||||
- [**Trusted Folders**](https://www.geminicli.com/docs/cli/trusted-folders) -
|
policies by folder.
|
||||||
Control execution policies by folder.
|
- [**Enterprise Guide**](./docs/cli/enterprise.md) - Deploy and manage in a
|
||||||
- [**Enterprise Guide**](https://www.geminicli.com/docs/cli/enterprise) - Deploy
|
corporate environment.
|
||||||
and manage in a corporate environment.
|
- [**Telemetry & Monitoring**](./docs/cli/telemetry.md) - Usage tracking.
|
||||||
- [**Telemetry & Monitoring**](https://www.geminicli.com/docs/cli/telemetry) -
|
- [**Tools reference**](./docs/reference/tools.md) - Built-in tools overview.
|
||||||
Usage tracking.
|
- [**Local development**](./docs/local-development.md) - Local development
|
||||||
- [**Tools reference**](https://www.geminicli.com/docs/reference/tools) -
|
tooling.
|
||||||
Built-in tools overview.
|
|
||||||
- [**Local development**](https://www.geminicli.com/docs/local-development) -
|
|
||||||
Local development tooling.
|
|
||||||
|
|
||||||
### Troubleshooting & Support
|
### Troubleshooting & Support
|
||||||
|
|
||||||
- [**Troubleshooting Guide**](https://www.geminicli.com/docs/resources/troubleshooting) -
|
- [**Troubleshooting Guide**](./docs/resources/troubleshooting.md) - Common
|
||||||
Common issues and solutions.
|
issues and solutions.
|
||||||
- [**FAQ**](https://www.geminicli.com/docs/resources/faq) - Frequently asked
|
- [**FAQ**](./docs/resources/faq.md) - Frequently asked questions.
|
||||||
questions.
|
|
||||||
- Use `/bug` command to report issues directly from the CLI.
|
- Use `/bug` command to report issues directly from the CLI.
|
||||||
|
|
||||||
### Using MCP Servers
|
### Using MCP Servers
|
||||||
@@ -349,9 +344,8 @@ custom tools:
|
|||||||
> @database Run a query to find inactive users
|
> @database Run a query to find inactive users
|
||||||
```
|
```
|
||||||
|
|
||||||
See the
|
See the [MCP Server Integration guide](./docs/tools/mcp-server.md) for setup
|
||||||
[MCP Server Integration guide](https://www.geminicli.com/docs/tools/mcp-server)
|
instructions.
|
||||||
for setup instructions.
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
## 🤝 Contributing
|
||||||
|
|
||||||
@@ -372,8 +366,7 @@ for planned features and priorities.
|
|||||||
## 📖 Resources
|
## 📖 Resources
|
||||||
|
|
||||||
- **[Official Roadmap](./ROADMAP.md)** - See what's coming next.
|
- **[Official Roadmap](./ROADMAP.md)** - See what's coming next.
|
||||||
- **[Changelog](https://www.geminicli.com/docs/changelogs)** - See recent
|
- **[Changelog](./docs/changelogs/index.md)** - See recent notable updates.
|
||||||
notable updates.
|
|
||||||
- **[NPM Package](https://www.npmjs.com/package/@google/gemini-cli)** - Package
|
- **[NPM Package](https://www.npmjs.com/package/@google/gemini-cli)** - Package
|
||||||
registry.
|
registry.
|
||||||
- **[GitHub Issues](https://github.com/google-gemini/gemini-cli/issues)** -
|
- **[GitHub Issues](https://github.com/google-gemini/gemini-cli/issues)** -
|
||||||
@@ -383,14 +376,13 @@ for planned features and priorities.
|
|||||||
|
|
||||||
### Uninstall
|
### Uninstall
|
||||||
|
|
||||||
See the [Uninstall Guide](https://www.geminicli.com/docs/resources/uninstall)
|
See the [Uninstall Guide](./docs/resources/uninstall.md) for removal
|
||||||
for removal instructions.
|
instructions.
|
||||||
|
|
||||||
## 📄 Legal
|
## 📄 Legal
|
||||||
|
|
||||||
- **License**: [Apache License 2.0](LICENSE)
|
- **License**: [Apache License 2.0](LICENSE)
|
||||||
- **Terms of Service**:
|
- **Terms of Service**: [Terms & Privacy](./docs/resources/tos-privacy.md)
|
||||||
[Terms & Privacy](https://www.geminicli.com/docs/resources/tos-privacy)
|
|
||||||
- **Security**: [Security Policy](SECURITY.md)
|
- **Security**: [Security Policy](SECURITY.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -106,67 +106,6 @@ organization.
|
|||||||
ensures users maintain final control over which permitted servers are actually
|
ensures users maintain final control over which permitted servers are actually
|
||||||
active in their environment.
|
active in their environment.
|
||||||
|
|
||||||
#### Required MCP Servers (preview)
|
|
||||||
|
|
||||||
**Default**: empty
|
|
||||||
|
|
||||||
Allows administrators to define MCP servers that are **always injected** into
|
|
||||||
the user's environment. Unlike the allowlist (which filters user-configured
|
|
||||||
servers), required servers are automatically added regardless of the user's
|
|
||||||
local configuration.
|
|
||||||
|
|
||||||
**Required Servers Format:**
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"requiredMcpServers": {
|
|
||||||
"corp-compliance-tool": {
|
|
||||||
"url": "https://mcp.corp/compliance",
|
|
||||||
"type": "http",
|
|
||||||
"trust": true,
|
|
||||||
"description": "Corporate compliance tool"
|
|
||||||
},
|
|
||||||
"internal-registry": {
|
|
||||||
"url": "https://registry.corp/mcp",
|
|
||||||
"type": "sse",
|
|
||||||
"authProviderType": "google_credentials",
|
|
||||||
"oauth": {
|
|
||||||
"scopes": ["https://www.googleapis.com/auth/scope"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Supported Fields:**
|
|
||||||
|
|
||||||
- `url`: (Required) The full URL of the MCP server endpoint.
|
|
||||||
- `type`: (Required) The connection type (`sse` or `http`).
|
|
||||||
- `trust`: (Optional) If set to `true`, tool execution will not require user
|
|
||||||
approval. Defaults to `true` for required servers.
|
|
||||||
- `description`: (Optional) Human-readable description of the server.
|
|
||||||
- `authProviderType`: (Optional) Authentication provider (`dynamic_discovery`,
|
|
||||||
`google_credentials`, or `service_account_impersonation`).
|
|
||||||
- `oauth`: (Optional) OAuth configuration including `scopes`, `clientId`, and
|
|
||||||
`clientSecret`.
|
|
||||||
- `targetAudience`: (Optional) OAuth target audience for service-to-service
|
|
||||||
auth.
|
|
||||||
- `targetServiceAccount`: (Optional) Service account email to impersonate.
|
|
||||||
- `headers`: (Optional) Additional HTTP headers to send with requests.
|
|
||||||
- `includeTools` / `excludeTools`: (Optional) Tool filtering lists.
|
|
||||||
- `timeout`: (Optional) Timeout in milliseconds for MCP requests.
|
|
||||||
|
|
||||||
**Client Enforcement Logic:**
|
|
||||||
|
|
||||||
- Required servers are injected **after** allowlist filtering, so they are
|
|
||||||
always available even if the allowlist is active.
|
|
||||||
- If a required server has the **same name** as a locally configured server, the
|
|
||||||
admin configuration **completely overrides** the local one.
|
|
||||||
- Required servers only support remote transports (`sse`, `http`). Local
|
|
||||||
execution fields (`command`, `args`, `env`, `cwd`) are not supported.
|
|
||||||
- Required servers can coexist with allowlisted servers — both features work
|
|
||||||
independently.
|
|
||||||
|
|
||||||
### Unmanaged Capabilities
|
### Unmanaged Capabilities
|
||||||
|
|
||||||
**Enabled/Disabled** | Default: disabled
|
**Enabled/Disabled** | Default: disabled
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 54 KiB |
@@ -18,76 +18,6 @@ on GitHub.
|
|||||||
| [Preview](preview.md) | Experimental features ready for early feedback. |
|
| [Preview](preview.md) | Experimental features ready for early feedback. |
|
||||||
| [Stable](latest.md) | Stable, recommended for general use. |
|
| [Stable](latest.md) | Stable, recommended for general use. |
|
||||||
|
|
||||||
## Announcements: v0.37.0 - 2026-04-08
|
|
||||||
|
|
||||||
- **Dynamic Sandbox Expansion:** Implemented dynamic sandbox expansion and
|
|
||||||
worktree support for Linux and Windows, improving developer workflows in
|
|
||||||
isolated environments
|
|
||||||
([#23692](https://github.com/google-gemini/gemini-cli/pull/23692) by @galz10,
|
|
||||||
[#23691](https://github.com/google-gemini/gemini-cli/pull/23691) by
|
|
||||||
@scidomino).
|
|
||||||
- **Chapters Narrative Flow:** Introduced tool-based topic grouping ("Chapters")
|
|
||||||
to provide better session structure and narrative continuity
|
|
||||||
([#23150](https://github.com/google-gemini/gemini-cli/pull/23150) by
|
|
||||||
@Abhijit-2592,
|
|
||||||
[#24079](https://github.com/google-gemini/gemini-cli/pull/24079) by
|
|
||||||
@gundermanc).
|
|
||||||
- **Advanced Browser Capabilities:** Enhanced the browser agent with persistent
|
|
||||||
sessions and dynamic tool discovery
|
|
||||||
([#21306](https://github.com/google-gemini/gemini-cli/pull/21306) by
|
|
||||||
@kunal-10-cloud,
|
|
||||||
[#23805](https://github.com/google-gemini/gemini-cli/pull/23805) by
|
|
||||||
@cynthialong0-0).
|
|
||||||
|
|
||||||
## Announcements: v0.36.0 - 2026-04-01
|
|
||||||
|
|
||||||
- **Multi-Registry Architecture and Sandboxing:** Introduced a multi-registry
|
|
||||||
architecture and implemented native macOS Seatbelt and Windows sandboxing for
|
|
||||||
enhanced subagent security
|
|
||||||
([#22712](https://github.com/google-gemini/gemini-cli/pull/22712),
|
|
||||||
[#22718](https://github.com/google-gemini/gemini-cli/pull/22718) by @akh64bit,
|
|
||||||
[#22832](https://github.com/google-gemini/gemini-cli/pull/22832) by @ehedlund,
|
|
||||||
[#21807](https://github.com/google-gemini/gemini-cli/pull/21807) by
|
|
||||||
@mattKorwel).
|
|
||||||
- **Refreshed Composer UX:** Implemented a refreshed user experience for the
|
|
||||||
Composer layout and improved terminal interaction robustness
|
|
||||||
([#21212](https://github.com/google-gemini/gemini-cli/pull/21212),
|
|
||||||
[#23286](https://github.com/google-gemini/gemini-cli/pull/23286) by
|
|
||||||
@jwhelangoog).
|
|
||||||
- **Git Worktree Support:** Added native support for Git worktrees, allowing for
|
|
||||||
isolated parallel sessions
|
|
||||||
([#22973](https://github.com/google-gemini/gemini-cli/pull/22973),
|
|
||||||
[#23265](https://github.com/google-gemini/gemini-cli/pull/23265) by @jerop).
|
|
||||||
- **Subagent Context and Feedback:** Enhanced subagents with JIT context
|
|
||||||
injection and resilient tool rejection with contextual feedback
|
|
||||||
([#23032](https://github.com/google-gemini/gemini-cli/pull/23032),
|
|
||||||
[#22951](https://github.com/google-gemini/gemini-cli/pull/22951) by
|
|
||||||
@abhipatel12).
|
|
||||||
|
|
||||||
## Announcements: v0.35.0 - 2026-03-24
|
|
||||||
|
|
||||||
- **Customizable Keyboard Shortcuts:** Users can now customize their keyboard
|
|
||||||
shortcuts, including support for literal character keybindings and the
|
|
||||||
extended Kitty protocol
|
|
||||||
([#21945](https://github.com/google-gemini/gemini-cli/pull/21945),
|
|
||||||
[#21972](https://github.com/google-gemini/gemini-cli/pull/21972) by
|
|
||||||
@scidomino).
|
|
||||||
- **Vim Mode Improvements:** Added missing motions (X, ~, r, f/F/t/T) and
|
|
||||||
yank/paste support with the unnamed register
|
|
||||||
([#21932](https://github.com/google-gemini/gemini-cli/pull/21932),
|
|
||||||
[#22026](https://github.com/google-gemini/gemini-cli/pull/22026) by @aanari).
|
|
||||||
- **Tool Isolation and Sandboxing:** Introduced `SandboxManager` to isolate
|
|
||||||
process-spawning tools and added Linux bubblewrap/seccomp sandboxing support
|
|
||||||
([#21774](https://github.com/google-gemini/gemini-cli/pull/21774),
|
|
||||||
[#22231](https://github.com/google-gemini/gemini-cli/pull/22231) by @galz10,
|
|
||||||
[#22680](https://github.com/google-gemini/gemini-cli/pull/22680) by
|
|
||||||
@DavidAPierce).
|
|
||||||
- **JIT Context Discovery:** Implemented Just-In-Time context discovery for file
|
|
||||||
system tools to improve model performance and accuracy
|
|
||||||
([#22082](https://github.com/google-gemini/gemini-cli/pull/22082),
|
|
||||||
[#22736](https://github.com/google-gemini/gemini-cli/pull/22736) by
|
|
||||||
@SandyTao520).
|
|
||||||
|
|
||||||
## Announcements: v0.34.0 - 2026-03-17
|
## Announcements: v0.34.0 - 2026-03-17
|
||||||
|
|
||||||
- **Plan Mode Enabled by Default:** Plan Mode is now enabled by default to help
|
- **Plan Mode Enabled by Default:** Plan Mode is now enabled by default to help
|
||||||
|
|||||||
+462
-397
@@ -1,6 +1,6 @@
|
|||||||
# Latest stable release: v0.37.0
|
# Latest stable release: v0.34.0
|
||||||
|
|
||||||
Released: April 08, 2026
|
Released: March 17, 2026
|
||||||
|
|
||||||
For most users, our latest stable release is the recommended release. Install
|
For most users, our latest stable release is the recommended release. Install
|
||||||
the latest stable version with:
|
the latest stable version with:
|
||||||
@@ -11,409 +11,474 @@ npm install -g @google/gemini-cli
|
|||||||
|
|
||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
- **Dynamic Sandbox Expansion:** Implemented dynamic sandbox expansion and
|
- **Plan Mode Enabled by Default**: The comprehensive planning capability is now
|
||||||
worktree support for both Linux and Windows, enhancing development flexibility
|
enabled by default, allowing for better structured task management and
|
||||||
in restricted environments.
|
execution.
|
||||||
- **Tool-Based Topic Grouping (Chapters):** Introduced "Chapters" to logically
|
- **Enhanced Sandboxing Capabilities**: Added support for native gVisor (runsc)
|
||||||
group agent interactions based on tool usage and intent, providing a clearer
|
sandboxing as well as experimental LXC container sandboxing to provide more
|
||||||
narrative flow in long sessions.
|
robust and isolated execution environments.
|
||||||
- **Enhanced Browser Agent:** Added persistent session management, dynamic
|
- **Improved Loop Detection & Recovery**: Implemented iterative loop detection
|
||||||
read-only tool discovery, and sandbox-aware initialization for the browser
|
and model feedback mechanisms to prevent the CLI from getting stuck in
|
||||||
agent.
|
repetitive actions.
|
||||||
- **Security & Permission Hardening:** Implemented secret visibility lockdown
|
- **Customizable UI Elements**: You can now configure a custom footer using the
|
||||||
for environment files and integrated integrity controls for Windows
|
new `/footer` command, and enjoy standardized semantic focus colors for better
|
||||||
sandboxing.
|
history visibility.
|
||||||
|
- **Extensive Subagent Updates**: Refinements across the tracker visualization
|
||||||
|
tools, background process logging, and broader fallback support for models in
|
||||||
|
tool execution scenarios.
|
||||||
|
|
||||||
## What's Changed
|
## What's Changed
|
||||||
|
|
||||||
- feat(evals): centralize test agents into test-utils for reuse by @Samee24 in
|
- feat(cli): add chat resume footer on session quit by @lordshashank in
|
||||||
[#23616](https://github.com/google-gemini/gemini-cli/pull/23616)
|
[#20667](https://github.com/google-gemini/gemini-cli/pull/20667)
|
||||||
- revert: chore(config): disable agents by default by @abhipatel12 in
|
- Support bold and other styles in svg snapshots by @jacob314 in
|
||||||
[#23672](https://github.com/google-gemini/gemini-cli/pull/23672)
|
[#20937](https://github.com/google-gemini/gemini-cli/pull/20937)
|
||||||
- fix(plan): update telemetry attribute keys and add timestamp by @Adib234 in
|
- fix(core): increase A2A agent timeout to 30 minutes by @adamfweidman in
|
||||||
[#23685](https://github.com/google-gemini/gemini-cli/pull/23685)
|
[#21028](https://github.com/google-gemini/gemini-cli/pull/21028)
|
||||||
- fix(core): prevent premature MCP discovery completion by @jackwotherspoon in
|
- Cleanup old branches. by @jacob314 in
|
||||||
[#23637](https://github.com/google-gemini/gemini-cli/pull/23637)
|
[#19354](https://github.com/google-gemini/gemini-cli/pull/19354)
|
||||||
- feat(browser): add maxActionsPerTask for browser agent setting by
|
- chore(release): bump version to 0.34.0-nightly.20260303.34f0c1538 by
|
||||||
@cynthialong0-0 in
|
@gemini-cli-robot in
|
||||||
[#23216](https://github.com/google-gemini/gemini-cli/pull/23216)
|
[#21034](https://github.com/google-gemini/gemini-cli/pull/21034)
|
||||||
- fix(core): improve agent loader error formatting for empty paths by
|
- feat(ui): standardize semantic focus colors and enhance history visibility by
|
||||||
@adamfweidman in
|
|
||||||
[#23690](https://github.com/google-gemini/gemini-cli/pull/23690)
|
|
||||||
- fix(cli): only show updating spinner when auto-update is in progress by
|
|
||||||
@scidomino in [#23709](https://github.com/google-gemini/gemini-cli/pull/23709)
|
|
||||||
- Refine onboarding metrics to log the duration explicitly and use the tier
|
|
||||||
name. by @yunaseoul in
|
|
||||||
[#23678](https://github.com/google-gemini/gemini-cli/pull/23678)
|
|
||||||
- chore(tools): add toJSON to tools and invocations to reduce logging verbosity
|
|
||||||
by @alisa-alisa in
|
|
||||||
[#22899](https://github.com/google-gemini/gemini-cli/pull/22899)
|
|
||||||
- fix(cli): stabilize copy mode to prevent flickering and cursor resets by
|
|
||||||
@mattKorwel in
|
|
||||||
[#22584](https://github.com/google-gemini/gemini-cli/pull/22584)
|
|
||||||
- fix(test): move flaky ctrl-c-exit test to non-blocking suite by @mattKorwel in
|
|
||||||
[#23732](https://github.com/google-gemini/gemini-cli/pull/23732)
|
|
||||||
- feat(skills): add ci skill for automated failure replication by @mattKorwel in
|
|
||||||
[#23720](https://github.com/google-gemini/gemini-cli/pull/23720)
|
|
||||||
- feat(sandbox): implement forbiddenPaths for OS-specific sandbox managers by
|
|
||||||
@ehedlund in [#23282](https://github.com/google-gemini/gemini-cli/pull/23282)
|
|
||||||
- fix(core): conditionally expose additional_permissions in shell tool by
|
|
||||||
@galz10 in [#23729](https://github.com/google-gemini/gemini-cli/pull/23729)
|
|
||||||
- refactor(core): standardize OS-specific sandbox tests and extract linux helper
|
|
||||||
methods by @ehedlund in
|
|
||||||
[#23715](https://github.com/google-gemini/gemini-cli/pull/23715)
|
|
||||||
- format recently added script by @scidomino in
|
|
||||||
[#23739](https://github.com/google-gemini/gemini-cli/pull/23739)
|
|
||||||
- fix(ui): prevent over-eager slash subcommand completion by @keithguerin in
|
|
||||||
[#20136](https://github.com/google-gemini/gemini-cli/pull/20136)
|
|
||||||
- Fix dynamic model routing for gemini 3.1 pro to customtools model by
|
|
||||||
@kevinjwang1 in
|
|
||||||
[#23641](https://github.com/google-gemini/gemini-cli/pull/23641)
|
|
||||||
- feat(core): support inline agentCardJson for remote agents by @adamfweidman in
|
|
||||||
[#23743](https://github.com/google-gemini/gemini-cli/pull/23743)
|
|
||||||
- fix(cli): skip console log/info in headless mode by @cynthialong0-0 in
|
|
||||||
[#22739](https://github.com/google-gemini/gemini-cli/pull/22739)
|
|
||||||
- test(core): install bubblewrap on Linux CI for sandbox integration tests by
|
|
||||||
@ehedlund in [#23583](https://github.com/google-gemini/gemini-cli/pull/23583)
|
|
||||||
- docs(reference): split tools table into category sections by @sheikhlimon in
|
|
||||||
[#21516](https://github.com/google-gemini/gemini-cli/pull/21516)
|
|
||||||
- fix(browser): detect embedded URLs in query params to prevent allowedDomains
|
|
||||||
bypass by @tony-shi in
|
|
||||||
[#23225](https://github.com/google-gemini/gemini-cli/pull/23225)
|
|
||||||
- fix(browser): add proxy bypass constraint to domain restriction system prompt
|
|
||||||
by @tony-shi in
|
|
||||||
[#23229](https://github.com/google-gemini/gemini-cli/pull/23229)
|
|
||||||
- fix(policy): relax write_file argsPattern in plan mode to allow paths without
|
|
||||||
session ID by @Adib234 in
|
|
||||||
[#23695](https://github.com/google-gemini/gemini-cli/pull/23695)
|
|
||||||
- docs: fix grammar in CONTRIBUTING and numbering in sandbox docs by
|
|
||||||
@splint-disk-8i in
|
|
||||||
[#23448](https://github.com/google-gemini/gemini-cli/pull/23448)
|
|
||||||
- fix(acp): allow attachments by adding a permission prompt by @sripasg in
|
|
||||||
[#23680](https://github.com/google-gemini/gemini-cli/pull/23680)
|
|
||||||
- fix(core): thread AbortSignal to chat compression requests (#20405) by
|
|
||||||
@SH20RAJ in [#20778](https://github.com/google-gemini/gemini-cli/pull/20778)
|
|
||||||
- feat(core): implement Windows sandbox dynamic expansion Phase 1 and 2.1 by
|
|
||||||
@scidomino in [#23691](https://github.com/google-gemini/gemini-cli/pull/23691)
|
|
||||||
- Add note about root privileges in sandbox docs by @diodesign in
|
|
||||||
[#23314](https://github.com/google-gemini/gemini-cli/pull/23314)
|
|
||||||
- docs(core): document agent_card_json string literal options for remote agents
|
|
||||||
by @adamfweidman in
|
|
||||||
[#23797](https://github.com/google-gemini/gemini-cli/pull/23797)
|
|
||||||
- fix(cli): resolve TTY hang on headless environments by unconditionally
|
|
||||||
resuming process.stdin before React Ink launch by @cocosheng-g in
|
|
||||||
[#23673](https://github.com/google-gemini/gemini-cli/pull/23673)
|
|
||||||
- fix(ui): cleanup estimated string length hacks in composer by @keithguerin in
|
|
||||||
[#23694](https://github.com/google-gemini/gemini-cli/pull/23694)
|
|
||||||
- feat(browser): dynamically discover read-only tools by @cynthialong0-0 in
|
|
||||||
[#23805](https://github.com/google-gemini/gemini-cli/pull/23805)
|
|
||||||
- docs: clarify policy requirement for `general.plan.directory` in settings
|
|
||||||
schema by @jerop in
|
|
||||||
[#23784](https://github.com/google-gemini/gemini-cli/pull/23784)
|
|
||||||
- Revert "perf(cli): optimize --version startup time (#23671)" by @scidomino in
|
|
||||||
[#23812](https://github.com/google-gemini/gemini-cli/pull/23812)
|
|
||||||
- don't silence errors from wombat by @scidomino in
|
|
||||||
[#23822](https://github.com/google-gemini/gemini-cli/pull/23822)
|
|
||||||
- fix(ui): prevent escape key from cancelling requests in shell mode by
|
|
||||||
@PrasannaPal21 in
|
|
||||||
[#21245](https://github.com/google-gemini/gemini-cli/pull/21245)
|
|
||||||
- Changelog for v0.36.0-preview.0 by @gemini-cli-robot in
|
|
||||||
[#23702](https://github.com/google-gemini/gemini-cli/pull/23702)
|
|
||||||
- feat(core,ui): Add experiment-gated support for gemini flash 3.1 lite by
|
|
||||||
@chrstnb in [#23794](https://github.com/google-gemini/gemini-cli/pull/23794)
|
|
||||||
- Changelog for v0.36.0-preview.3 by @gemini-cli-robot in
|
|
||||||
[#23827](https://github.com/google-gemini/gemini-cli/pull/23827)
|
|
||||||
- new linting check: github-actions-pinning by @alisa-alisa in
|
|
||||||
[#23808](https://github.com/google-gemini/gemini-cli/pull/23808)
|
|
||||||
- fix(cli): show helpful guidance when no skills are available by @Niralisj in
|
|
||||||
[#23785](https://github.com/google-gemini/gemini-cli/pull/23785)
|
|
||||||
- fix: Chat logs and errors handle tail tool calls correctly by @googlestrobe in
|
|
||||||
[#22460](https://github.com/google-gemini/gemini-cli/pull/22460)
|
|
||||||
- Don't try removing a tag from a non-existent release. by @scidomino in
|
|
||||||
[#23830](https://github.com/google-gemini/gemini-cli/pull/23830)
|
|
||||||
- fix(cli): allow ask question dialog to take full window height by @jacob314 in
|
|
||||||
[#23693](https://github.com/google-gemini/gemini-cli/pull/23693)
|
|
||||||
- fix(core): strip leading underscores from error types in telemetry by
|
|
||||||
@yunaseoul in [#23824](https://github.com/google-gemini/gemini-cli/pull/23824)
|
|
||||||
- Changelog for v0.35.0 by @gemini-cli-robot in
|
|
||||||
[#23819](https://github.com/google-gemini/gemini-cli/pull/23819)
|
|
||||||
- feat(evals): add reliability harvester and 500/503 retry support by
|
|
||||||
@alisa-alisa in
|
|
||||||
[#23626](https://github.com/google-gemini/gemini-cli/pull/23626)
|
|
||||||
- feat(sandbox): dynamic Linux sandbox expansion and worktree support by @galz10
|
|
||||||
in [#23692](https://github.com/google-gemini/gemini-cli/pull/23692)
|
|
||||||
- Merge examples of use into quickstart documentation by @diodesign in
|
|
||||||
[#23319](https://github.com/google-gemini/gemini-cli/pull/23319)
|
|
||||||
- fix(cli): prioritize primary name matches in slash command search by @sehoon38
|
|
||||||
in [#23850](https://github.com/google-gemini/gemini-cli/pull/23850)
|
|
||||||
- Changelog for v0.35.1 by @gemini-cli-robot in
|
|
||||||
[#23840](https://github.com/google-gemini/gemini-cli/pull/23840)
|
|
||||||
- fix(browser): keep input blocker active across navigations by @kunal-10-cloud
|
|
||||||
in [#22562](https://github.com/google-gemini/gemini-cli/pull/22562)
|
|
||||||
- feat(core): new skill to look for duplicated code while reviewing PRs by
|
|
||||||
@devr0306 in [#23704](https://github.com/google-gemini/gemini-cli/pull/23704)
|
|
||||||
- fix(core): replace hardcoded non-interactive ASK_USER denial with explicit
|
|
||||||
policy rules by @ruomengz in
|
|
||||||
[#23668](https://github.com/google-gemini/gemini-cli/pull/23668)
|
|
||||||
- fix(plan): after exiting plan mode switches model to a flash model by @Adib234
|
|
||||||
in [#23885](https://github.com/google-gemini/gemini-cli/pull/23885)
|
|
||||||
- feat(gcp): add development worker infrastructure by @mattKorwel in
|
|
||||||
[#23814](https://github.com/google-gemini/gemini-cli/pull/23814)
|
|
||||||
- fix(a2a-server): A2A server should execute ask policies in interactive mode by
|
|
||||||
@kschaab in [#23831](https://github.com/google-gemini/gemini-cli/pull/23831)
|
|
||||||
- feat(core): define TrajectoryProvider interface by @sehoon38 in
|
|
||||||
[#23050](https://github.com/google-gemini/gemini-cli/pull/23050)
|
|
||||||
- Docs: Update quotas and pricing by @jkcinouye in
|
|
||||||
[#23835](https://github.com/google-gemini/gemini-cli/pull/23835)
|
|
||||||
- fix(core): allow disabling environment variable redaction by @galz10 in
|
|
||||||
[#23927](https://github.com/google-gemini/gemini-cli/pull/23927)
|
|
||||||
- feat(cli): enable notifications cross-platform via terminal bell fallback by
|
|
||||||
@genneth in [#21618](https://github.com/google-gemini/gemini-cli/pull/21618)
|
|
||||||
- feat(sandbox): implement secret visibility lockdown for env files by
|
|
||||||
@DavidAPierce in
|
|
||||||
[#23712](https://github.com/google-gemini/gemini-cli/pull/23712)
|
|
||||||
- fix(core): remove shell outputChunks buffer caching to prevent memory bloat
|
|
||||||
and sanitize prompt input by @spencer426 in
|
|
||||||
[#23751](https://github.com/google-gemini/gemini-cli/pull/23751)
|
|
||||||
- feat(core): implement persistent browser session management by @kunal-10-cloud
|
|
||||||
in [#21306](https://github.com/google-gemini/gemini-cli/pull/21306)
|
|
||||||
- refactor(core): delegate sandbox denial parsing to SandboxManager by
|
|
||||||
@scidomino in [#23928](https://github.com/google-gemini/gemini-cli/pull/23928)
|
|
||||||
- dep(update) Update Ink version to 6.5.0 by @jacob314 in
|
|
||||||
[#23843](https://github.com/google-gemini/gemini-cli/pull/23843)
|
|
||||||
- Docs: Update 'docs-writer' skill for relative links by @jkcinouye in
|
|
||||||
[#21463](https://github.com/google-gemini/gemini-cli/pull/21463)
|
|
||||||
- Changelog for v0.36.0-preview.4 by @gemini-cli-robot in
|
|
||||||
[#23935](https://github.com/google-gemini/gemini-cli/pull/23935)
|
|
||||||
- fix(acp): Update allow approval policy flow for ACP clients to fix config
|
|
||||||
persistence and compatible with TUI by @sripasg in
|
|
||||||
[#23818](https://github.com/google-gemini/gemini-cli/pull/23818)
|
|
||||||
- Changelog for v0.35.2 by @gemini-cli-robot in
|
|
||||||
[#23960](https://github.com/google-gemini/gemini-cli/pull/23960)
|
|
||||||
- ACP integration documents by @g-samroberts in
|
|
||||||
[#22254](https://github.com/google-gemini/gemini-cli/pull/22254)
|
|
||||||
- fix(core): explicitly set error names to avoid bundling renaming issues by
|
|
||||||
@yunaseoul in [#23913](https://github.com/google-gemini/gemini-cli/pull/23913)
|
|
||||||
- feat(core): subagent isolation and cleanup hardening by @abhipatel12 in
|
|
||||||
[#23903](https://github.com/google-gemini/gemini-cli/pull/23903)
|
|
||||||
- disable extension-reload test by @scidomino in
|
|
||||||
[#24018](https://github.com/google-gemini/gemini-cli/pull/24018)
|
|
||||||
- feat(core): add forbiddenPaths to GlobalSandboxOptions and refactor
|
|
||||||
createSandboxManager by @ehedlund in
|
|
||||||
[#23936](https://github.com/google-gemini/gemini-cli/pull/23936)
|
|
||||||
- refactor(core): improve ignore resolution and fix directory-matching bug by
|
|
||||||
@ehedlund in [#23816](https://github.com/google-gemini/gemini-cli/pull/23816)
|
|
||||||
- revert(core): support custom base URL via env vars by @spencer426 in
|
|
||||||
[#23976](https://github.com/google-gemini/gemini-cli/pull/23976)
|
|
||||||
- Increase memory limited for eslint. by @jacob314 in
|
|
||||||
[#24022](https://github.com/google-gemini/gemini-cli/pull/24022)
|
|
||||||
- fix(acp): prevent crash on empty response in ACP mode by @sripasg in
|
|
||||||
[#23952](https://github.com/google-gemini/gemini-cli/pull/23952)
|
|
||||||
- feat(core): Land `AgentHistoryProvider`. by @joshualitt in
|
|
||||||
[#23978](https://github.com/google-gemini/gemini-cli/pull/23978)
|
|
||||||
- fix(core): switch to subshells for shell tool wrapping to fix heredocs and
|
|
||||||
edge cases by @abhipatel12 in
|
|
||||||
[#24024](https://github.com/google-gemini/gemini-cli/pull/24024)
|
|
||||||
- Debug command. by @jacob314 in
|
|
||||||
[#23851](https://github.com/google-gemini/gemini-cli/pull/23851)
|
|
||||||
- Changelog for v0.36.0-preview.5 by @gemini-cli-robot in
|
|
||||||
[#24046](https://github.com/google-gemini/gemini-cli/pull/24046)
|
|
||||||
- Fix test flakes by globally mocking ink-spinner by @jacob314 in
|
|
||||||
[#24044](https://github.com/google-gemini/gemini-cli/pull/24044)
|
|
||||||
- Enable network access in sandbox configuration by @galz10 in
|
|
||||||
[#24055](https://github.com/google-gemini/gemini-cli/pull/24055)
|
|
||||||
- feat(context): add configurable memoryBoundaryMarkers setting by @SandyTao520
|
|
||||||
in [#24020](https://github.com/google-gemini/gemini-cli/pull/24020)
|
|
||||||
- feat(core): implement windows sandbox expansion and denial detection by
|
|
||||||
@scidomino in [#24027](https://github.com/google-gemini/gemini-cli/pull/24027)
|
|
||||||
- fix(core): resolve ACP Operation Aborted Errors in grep_search by @ivanporty
|
|
||||||
in [#23821](https://github.com/google-gemini/gemini-cli/pull/23821)
|
|
||||||
- fix(hooks): prevent SessionEnd from firing twice in non-interactive mode by
|
|
||||||
@krishdef7 in [#22139](https://github.com/google-gemini/gemini-cli/pull/22139)
|
|
||||||
- Re-word intro to Gemini 3 page. by @g-samroberts in
|
|
||||||
[#24069](https://github.com/google-gemini/gemini-cli/pull/24069)
|
|
||||||
- fix(cli): resolve layout contention and flashing loop in StatusRow by
|
|
||||||
@keithguerin in
|
@keithguerin in
|
||||||
[#24065](https://github.com/google-gemini/gemini-cli/pull/24065)
|
[#20745](https://github.com/google-gemini/gemini-cli/pull/20745)
|
||||||
- fix(sandbox): implement Windows Mandatory Integrity Control for GeminiSandbox
|
- fix: merge duplicate imports in packages/core (3/4) by @Nixxx19 in
|
||||||
by @galz10 in [#24057](https://github.com/google-gemini/gemini-cli/pull/24057)
|
[#20928](https://github.com/google-gemini/gemini-cli/pull/20928)
|
||||||
- feat(core): implement tool-based topic grouping (Chapters) by @Abhijit-2592 in
|
- Add extra safety checks for proto pollution by @jacob314 in
|
||||||
[#23150](https://github.com/google-gemini/gemini-cli/pull/23150)
|
[#20396](https://github.com/google-gemini/gemini-cli/pull/20396)
|
||||||
- feat(cli): support 'tab to queue' for messages while generating by @gundermanc
|
- feat(core): Add tracker CRUD tools & visualization by @anj-s in
|
||||||
in [#24052](https://github.com/google-gemini/gemini-cli/pull/24052)
|
[#19489](https://github.com/google-gemini/gemini-cli/pull/19489)
|
||||||
- feat(core): agnostic background task UI with CompletionBehavior by
|
- Revert "fix(ui): persist expansion in AskUser dialog when navigating options"
|
||||||
@adamfweidman in
|
by @jacob314 in
|
||||||
[#22740](https://github.com/google-gemini/gemini-cli/pull/22740)
|
[#21042](https://github.com/google-gemini/gemini-cli/pull/21042)
|
||||||
- UX for topic narration tool by @gundermanc in
|
- Changelog for v0.33.0-preview.0 by @gemini-cli-robot in
|
||||||
[#24079](https://github.com/google-gemini/gemini-cli/pull/24079)
|
[#21030](https://github.com/google-gemini/gemini-cli/pull/21030)
|
||||||
- fix: shellcheck warnings in scripts by @scidomino in
|
- fix: model persistence for all scenarios by @sripasg in
|
||||||
[#24035](https://github.com/google-gemini/gemini-cli/pull/24035)
|
[#21051](https://github.com/google-gemini/gemini-cli/pull/21051)
|
||||||
- test(evals): add comprehensive subagent delegation evaluations by @abhipatel12
|
- chore/release: bump version to 0.34.0-nightly.20260304.28af4e127 by
|
||||||
in [#24132](https://github.com/google-gemini/gemini-cli/pull/24132)
|
@gemini-cli-robot in
|
||||||
- fix(a2a-server): prioritize ADC before evaluating headless constraints for
|
[#21054](https://github.com/google-gemini/gemini-cli/pull/21054)
|
||||||
auth initialization by @spencer426 in
|
- Consistently guard restarts against concurrent auto updates by @scidomino in
|
||||||
[#23614](https://github.com/google-gemini/gemini-cli/pull/23614)
|
[#21016](https://github.com/google-gemini/gemini-cli/pull/21016)
|
||||||
- Text can be added after /plan command by @rambleraptor in
|
- Defensive coding to reduce the risk of Maximum update depth errors by
|
||||||
[#22833](https://github.com/google-gemini/gemini-cli/pull/22833)
|
@jacob314 in [#20940](https://github.com/google-gemini/gemini-cli/pull/20940)
|
||||||
- fix(cli): resolve missing F12 logs via global console store by @scidomino in
|
- fix(cli): Polish shell autocomplete rendering to be a little more shell native
|
||||||
[#24235](https://github.com/google-gemini/gemini-cli/pull/24235)
|
feeling. by @jacob314 in
|
||||||
- fix broken tests by @scidomino in
|
[#20931](https://github.com/google-gemini/gemini-cli/pull/20931)
|
||||||
[#24279](https://github.com/google-gemini/gemini-cli/pull/24279)
|
- Docs: Update plan mode docs by @jkcinouye in
|
||||||
- fix(evals): add update_topic behavioral eval by @gundermanc in
|
[#19682](https://github.com/google-gemini/gemini-cli/pull/19682)
|
||||||
[#24223](https://github.com/google-gemini/gemini-cli/pull/24223)
|
- fix(mcp): Notifications/tools/list_changed support not working by @jacob314 in
|
||||||
- feat(core): Unified Context Management and Tool Distillation. by @joshualitt
|
[#21050](https://github.com/google-gemini/gemini-cli/pull/21050)
|
||||||
in [#24157](https://github.com/google-gemini/gemini-cli/pull/24157)
|
- fix(cli): register extension lifecycle events in DebugProfiler by
|
||||||
- Default enable narration for the team. by @gundermanc in
|
@fayerman-source in
|
||||||
[#24224](https://github.com/google-gemini/gemini-cli/pull/24224)
|
[#20101](https://github.com/google-gemini/gemini-cli/pull/20101)
|
||||||
- fix(core): ensure default agents provide tools and use model-specific schemas
|
- chore(dev): update vscode settings for typescriptreact by @rohit-4321 in
|
||||||
|
[#19907](https://github.com/google-gemini/gemini-cli/pull/19907)
|
||||||
|
- fix(cli): enable multi-arch docker builds for sandbox by @ru-aish in
|
||||||
|
[#19821](https://github.com/google-gemini/gemini-cli/pull/19821)
|
||||||
|
- Changelog for v0.32.0 by @gemini-cli-robot in
|
||||||
|
[#21033](https://github.com/google-gemini/gemini-cli/pull/21033)
|
||||||
|
- Changelog for v0.33.0-preview.1 by @gemini-cli-robot in
|
||||||
|
[#21058](https://github.com/google-gemini/gemini-cli/pull/21058)
|
||||||
|
- feat(core): improve @scripts/copy_files.js autocomplete to prioritize
|
||||||
|
filenames by @sehoon38 in
|
||||||
|
[#21064](https://github.com/google-gemini/gemini-cli/pull/21064)
|
||||||
|
- feat(sandbox): add experimental LXC container sandbox support by @h30s in
|
||||||
|
[#20735](https://github.com/google-gemini/gemini-cli/pull/20735)
|
||||||
|
- feat(evals): add overall pass rate row to eval nightly summary table by
|
||||||
|
@gundermanc in
|
||||||
|
[#20905](https://github.com/google-gemini/gemini-cli/pull/20905)
|
||||||
|
- feat(telemetry): include language in telemetry and fix accepted lines
|
||||||
|
computation by @gundermanc in
|
||||||
|
[#21126](https://github.com/google-gemini/gemini-cli/pull/21126)
|
||||||
|
- Changelog for v0.32.1 by @gemini-cli-robot in
|
||||||
|
[#21055](https://github.com/google-gemini/gemini-cli/pull/21055)
|
||||||
|
- feat(core): add robustness tests, logging, and metrics for CodeAssistServer
|
||||||
|
SSE parsing by @yunaseoul in
|
||||||
|
[#21013](https://github.com/google-gemini/gemini-cli/pull/21013)
|
||||||
|
- feat: add issue assignee workflow by @kartikangiras in
|
||||||
|
[#21003](https://github.com/google-gemini/gemini-cli/pull/21003)
|
||||||
|
- fix: improve error message when OAuth succeeds but project ID is required by
|
||||||
|
@Nixxx19 in [#21070](https://github.com/google-gemini/gemini-cli/pull/21070)
|
||||||
|
- feat(loop-reduction): implement iterative loop detection and model feedback by
|
||||||
|
@aishaneeshah in
|
||||||
|
[#20763](https://github.com/google-gemini/gemini-cli/pull/20763)
|
||||||
|
- chore(github): require prompt approvers for agent prompt files by @gundermanc
|
||||||
|
in [#20896](https://github.com/google-gemini/gemini-cli/pull/20896)
|
||||||
|
- Docs: Create tools reference by @jkcinouye in
|
||||||
|
[#19470](https://github.com/google-gemini/gemini-cli/pull/19470)
|
||||||
|
- fix(core, a2a-server): prevent hang during OAuth in non-interactive sessions
|
||||||
|
by @spencer426 in
|
||||||
|
[#21045](https://github.com/google-gemini/gemini-cli/pull/21045)
|
||||||
|
- chore(cli): enable deprecated settings removal by default by @yashodipmore in
|
||||||
|
[#20682](https://github.com/google-gemini/gemini-cli/pull/20682)
|
||||||
|
- feat(core): Disable fast ack helper for hints. by @joshualitt in
|
||||||
|
[#21011](https://github.com/google-gemini/gemini-cli/pull/21011)
|
||||||
|
- fix(ui): suppress redundant failure note when tool error note is shown by
|
||||||
|
@NTaylorMullen in
|
||||||
|
[#21078](https://github.com/google-gemini/gemini-cli/pull/21078)
|
||||||
|
- docs: document planning workflows with Conductor example by @jerop in
|
||||||
|
[#21166](https://github.com/google-gemini/gemini-cli/pull/21166)
|
||||||
|
- feat(release): ship esbuild bundle in npm package by @genneth in
|
||||||
|
[#19171](https://github.com/google-gemini/gemini-cli/pull/19171)
|
||||||
|
- fix(extensions): preserve symlinks in extension source path while enforcing
|
||||||
|
folder trust by @galz10 in
|
||||||
|
[#20867](https://github.com/google-gemini/gemini-cli/pull/20867)
|
||||||
|
- fix(cli): defer tool exclusions to policy engine in non-interactive mode by
|
||||||
|
@EricRahm in [#20639](https://github.com/google-gemini/gemini-cli/pull/20639)
|
||||||
|
- fix(ui): removed double padding on rendered content by @devr0306 in
|
||||||
|
[#21029](https://github.com/google-gemini/gemini-cli/pull/21029)
|
||||||
|
- fix(core): truncate excessively long lines in grep search output by
|
||||||
|
@gundermanc in
|
||||||
|
[#21147](https://github.com/google-gemini/gemini-cli/pull/21147)
|
||||||
|
- feat: add custom footer configuration via `/footer` by @jackwotherspoon in
|
||||||
|
[#19001](https://github.com/google-gemini/gemini-cli/pull/19001)
|
||||||
|
- perf(core): fix OOM crash in long-running sessions by @WizardsForgeGames in
|
||||||
|
[#19608](https://github.com/google-gemini/gemini-cli/pull/19608)
|
||||||
|
- refactor(cli): categorize built-in themes into dark/ and light/ directories by
|
||||||
|
@JayadityaGit in
|
||||||
|
[#18634](https://github.com/google-gemini/gemini-cli/pull/18634)
|
||||||
|
- fix(core): explicitly allow codebase_investigator and cli_help in read-only
|
||||||
|
mode by @Adib234 in
|
||||||
|
[#21157](https://github.com/google-gemini/gemini-cli/pull/21157)
|
||||||
|
- test: add browser agent integration tests by @kunal-10-cloud in
|
||||||
|
[#21151](https://github.com/google-gemini/gemini-cli/pull/21151)
|
||||||
|
- fix(cli): fix enabling kitty codes on Windows Terminal by @scidomino in
|
||||||
|
[#21136](https://github.com/google-gemini/gemini-cli/pull/21136)
|
||||||
|
- refactor(core): extract shared OAuth flow primitives from MCPOAuthProvider by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#20895](https://github.com/google-gemini/gemini-cli/pull/20895)
|
||||||
|
- fix(ui): add partial output to cancelled shell UI by @devr0306 in
|
||||||
|
[#21178](https://github.com/google-gemini/gemini-cli/pull/21178)
|
||||||
|
- fix(cli): replace hardcoded keybinding strings with dynamic formatters by
|
||||||
|
@scidomino in [#21159](https://github.com/google-gemini/gemini-cli/pull/21159)
|
||||||
|
- DOCS: Update quota and pricing page by @g-samroberts in
|
||||||
|
[#21194](https://github.com/google-gemini/gemini-cli/pull/21194)
|
||||||
|
- feat(telemetry): implement Clearcut logging for startup statistics by
|
||||||
|
@yunaseoul in [#21172](https://github.com/google-gemini/gemini-cli/pull/21172)
|
||||||
|
- feat(triage): add area/documentation to issue triage by @g-samroberts in
|
||||||
|
[#21222](https://github.com/google-gemini/gemini-cli/pull/21222)
|
||||||
|
- Fix so shell calls are formatted by @jacob314 in
|
||||||
|
[#21237](https://github.com/google-gemini/gemini-cli/pull/21237)
|
||||||
|
- feat(cli): add native gVisor (runsc) sandboxing support by @Zheyuan-Lin in
|
||||||
|
[#21062](https://github.com/google-gemini/gemini-cli/pull/21062)
|
||||||
|
- docs: use absolute paths for internal links in plan-mode.md by @jerop in
|
||||||
|
[#21299](https://github.com/google-gemini/gemini-cli/pull/21299)
|
||||||
|
- fix(core): prevent unhandled AbortError crash during stream loop detection by
|
||||||
|
@7hokerz in [#21123](https://github.com/google-gemini/gemini-cli/pull/21123)
|
||||||
|
- fix:reorder env var redaction checks to scan values first by @kartikangiras in
|
||||||
|
[#21059](https://github.com/google-gemini/gemini-cli/pull/21059)
|
||||||
|
- fix(acp): rename --experimental-acp to --acp & remove Zed-specific refrences
|
||||||
|
by @skeshive in
|
||||||
|
[#21171](https://github.com/google-gemini/gemini-cli/pull/21171)
|
||||||
|
- feat(core): fallback to 2.5 models with no access for toolcalls by @sehoon38
|
||||||
|
in [#21283](https://github.com/google-gemini/gemini-cli/pull/21283)
|
||||||
|
- test(core): improve testing for API request/response parsing by @sehoon38 in
|
||||||
|
[#21227](https://github.com/google-gemini/gemini-cli/pull/21227)
|
||||||
|
- docs(links): update docs-writer skill and fix broken link by @g-samroberts in
|
||||||
|
[#21314](https://github.com/google-gemini/gemini-cli/pull/21314)
|
||||||
|
- Fix code colorizer ansi escape bug. by @jacob314 in
|
||||||
|
[#21321](https://github.com/google-gemini/gemini-cli/pull/21321)
|
||||||
|
- remove wildcard behavior on keybindings by @scidomino in
|
||||||
|
[#21315](https://github.com/google-gemini/gemini-cli/pull/21315)
|
||||||
|
- feat(acp): Add support for AI Gateway auth by @skeshive in
|
||||||
|
[#21305](https://github.com/google-gemini/gemini-cli/pull/21305)
|
||||||
|
- fix(theme): improve theme color contrast for macOS Terminal.app by @clocky in
|
||||||
|
[#21175](https://github.com/google-gemini/gemini-cli/pull/21175)
|
||||||
|
- feat (core): Implement tracker related SI changes by @anj-s in
|
||||||
|
[#19964](https://github.com/google-gemini/gemini-cli/pull/19964)
|
||||||
|
- Changelog for v0.33.0-preview.2 by @gemini-cli-robot in
|
||||||
|
[#21333](https://github.com/google-gemini/gemini-cli/pull/21333)
|
||||||
|
- Changelog for v0.33.0-preview.3 by @gemini-cli-robot in
|
||||||
|
[#21347](https://github.com/google-gemini/gemini-cli/pull/21347)
|
||||||
|
- docs: format release times as HH:MM UTC by @pavan-sh in
|
||||||
|
[#20726](https://github.com/google-gemini/gemini-cli/pull/20726)
|
||||||
|
- fix(cli): implement --all flag for extensions uninstall by @sehoon38 in
|
||||||
|
[#21319](https://github.com/google-gemini/gemini-cli/pull/21319)
|
||||||
|
- docs: fix incorrect relative links to command reference by @kanywst in
|
||||||
|
[#20964](https://github.com/google-gemini/gemini-cli/pull/20964)
|
||||||
|
- documentiong ensures ripgrep by @Jatin24062005 in
|
||||||
|
[#21298](https://github.com/google-gemini/gemini-cli/pull/21298)
|
||||||
|
- fix(core): handle AbortError thrown during processTurn by @MumuTW in
|
||||||
|
[#21296](https://github.com/google-gemini/gemini-cli/pull/21296)
|
||||||
|
- docs(cli): clarify ! command output visibility in shell commands tutorial by
|
||||||
|
@MohammedADev in
|
||||||
|
[#21041](https://github.com/google-gemini/gemini-cli/pull/21041)
|
||||||
|
- fix: logic for task tracker strategy and remove tracker tools by @anj-s in
|
||||||
|
[#21355](https://github.com/google-gemini/gemini-cli/pull/21355)
|
||||||
|
- fix(partUtils): display media type and size for inline data parts by @Aboudjem
|
||||||
|
in [#21358](https://github.com/google-gemini/gemini-cli/pull/21358)
|
||||||
|
- Fix(accessibility): add screen reader support to RewindViewer by @Famous077 in
|
||||||
|
[#20750](https://github.com/google-gemini/gemini-cli/pull/20750)
|
||||||
|
- fix(hooks): propagate stopHookActive in AfterAgent retry path (#20426) by
|
||||||
|
@Aarchi-07 in [#20439](https://github.com/google-gemini/gemini-cli/pull/20439)
|
||||||
|
- fix(core): deduplicate GEMINI.md files by device/inode on case-insensitive
|
||||||
|
filesystems (#19904) by @Nixxx19 in
|
||||||
|
[#19915](https://github.com/google-gemini/gemini-cli/pull/19915)
|
||||||
|
- feat(core): add concurrency safety guidance for subagent delegation (#17753)
|
||||||
by @abhipatel12 in
|
by @abhipatel12 in
|
||||||
[#24268](https://github.com/google-gemini/gemini-cli/pull/24268)
|
[#21278](https://github.com/google-gemini/gemini-cli/pull/21278)
|
||||||
- feat(cli): show Flash Lite Preview model regardless of user tier by @sehoon38
|
- feat(ui): dynamically generate all keybinding hints by @scidomino in
|
||||||
in [#23904](https://github.com/google-gemini/gemini-cli/pull/23904)
|
[#21346](https://github.com/google-gemini/gemini-cli/pull/21346)
|
||||||
- feat(cli): implement compact tool output by @jwhelangoog in
|
- feat(core): implement unified KeychainService and migrate token storage by
|
||||||
[#20974](https://github.com/google-gemini/gemini-cli/pull/20974)
|
@ehedlund in [#21344](https://github.com/google-gemini/gemini-cli/pull/21344)
|
||||||
- Add security settings for tool sandboxing by @galz10 in
|
- fix(cli): gracefully handle --resume when no sessions exist by @SandyTao520 in
|
||||||
[#23923](https://github.com/google-gemini/gemini-cli/pull/23923)
|
[#21429](https://github.com/google-gemini/gemini-cli/pull/21429)
|
||||||
- chore(test-utils): switch integration tests to use PREVIEW_GEMINI_MODEL by
|
- fix(plan): keep approved plan during chat compression by @ruomengz in
|
||||||
@sehoon38 in [#24276](https://github.com/google-gemini/gemini-cli/pull/24276)
|
[#21284](https://github.com/google-gemini/gemini-cli/pull/21284)
|
||||||
- feat(core): enable topic update narration for legacy models by @Abhijit-2592
|
- feat(core): implement generic CacheService and optimize setupUser by @sehoon38
|
||||||
in [#24241](https://github.com/google-gemini/gemini-cli/pull/24241)
|
in [#21374](https://github.com/google-gemini/gemini-cli/pull/21374)
|
||||||
- feat(core): add project-level memory scope to save_memory tool by @SandyTao520
|
- Update quota and pricing documentation with subscription tiers by @srithreepo
|
||||||
in [#24161](https://github.com/google-gemini/gemini-cli/pull/24161)
|
in [#21351](https://github.com/google-gemini/gemini-cli/pull/21351)
|
||||||
- test(integration): fix plan mode write denial test false positive by @sehoon38
|
- fix(core): append correct OTLP paths for HTTP exporters by
|
||||||
in [#24299](https://github.com/google-gemini/gemini-cli/pull/24299)
|
@sebastien-prudhomme in
|
||||||
- feat(plan): support `Plan` mode in untrusted folders by @Adib234 in
|
[#16836](https://github.com/google-gemini/gemini-cli/pull/16836)
|
||||||
[#17586](https://github.com/google-gemini/gemini-cli/pull/17586)
|
- Changelog for v0.33.0-preview.4 by @gemini-cli-robot in
|
||||||
- fix(core): enable mid-stream retries for all models and re-enable compression
|
[#21354](https://github.com/google-gemini/gemini-cli/pull/21354)
|
||||||
test by @sehoon38 in
|
- feat(cli): implement dot-prefixing for slash command conflicts by @ehedlund in
|
||||||
[#24302](https://github.com/google-gemini/gemini-cli/pull/24302)
|
[#20979](https://github.com/google-gemini/gemini-cli/pull/20979)
|
||||||
- Changelog for v0.36.0-preview.6 by @gemini-cli-robot in
|
- refactor(core): standardize MCP tool naming to mcp\_ FQN format by
|
||||||
[#24082](https://github.com/google-gemini/gemini-cli/pull/24082)
|
|
||||||
- Changelog for v0.35.3 by @gemini-cli-robot in
|
|
||||||
[#24083](https://github.com/google-gemini/gemini-cli/pull/24083)
|
|
||||||
- feat(cli): add auth info to footer by @sehoon38 in
|
|
||||||
[#24042](https://github.com/google-gemini/gemini-cli/pull/24042)
|
|
||||||
- fix(browser): reset action counter for each agent session and let it ignore
|
|
||||||
internal actions by @cynthialong0-0 in
|
|
||||||
[#24228](https://github.com/google-gemini/gemini-cli/pull/24228)
|
|
||||||
- feat(plan): promote planning feature to stable by @ruomengz in
|
|
||||||
[#24282](https://github.com/google-gemini/gemini-cli/pull/24282)
|
|
||||||
- fix(browser): terminate subagent immediately on domain restriction violations
|
|
||||||
by @gsquared94 in
|
|
||||||
[#24313](https://github.com/google-gemini/gemini-cli/pull/24313)
|
|
||||||
- feat(cli): add UI to update extensions by @ruomengz in
|
|
||||||
[#23682](https://github.com/google-gemini/gemini-cli/pull/23682)
|
|
||||||
- Fix(browser): terminate immediately for "browser is already running" error by
|
|
||||||
@cynthialong0-0 in
|
|
||||||
[#24233](https://github.com/google-gemini/gemini-cli/pull/24233)
|
|
||||||
- docs: Add 'plan' option to approval mode in CLI reference by @YifanRuan in
|
|
||||||
[#24134](https://github.com/google-gemini/gemini-cli/pull/24134)
|
|
||||||
- fix(core): batch macOS seatbelt rules into a profile file to prevent ARG_MAX
|
|
||||||
errors by @ehedlund in
|
|
||||||
[#24255](https://github.com/google-gemini/gemini-cli/pull/24255)
|
|
||||||
- fix(core): fix race condition between browser agent and main closing process
|
|
||||||
by @cynthialong0-0 in
|
|
||||||
[#24340](https://github.com/google-gemini/gemini-cli/pull/24340)
|
|
||||||
- perf(build): optimize build scripts for parallel execution and remove
|
|
||||||
redundant checks by @sehoon38 in
|
|
||||||
[#24307](https://github.com/google-gemini/gemini-cli/pull/24307)
|
|
||||||
- ci: install bubblewrap on Linux for release workflows by @ehedlund in
|
|
||||||
[#24347](https://github.com/google-gemini/gemini-cli/pull/24347)
|
|
||||||
- chore(release): allow bundling for all builds, including stable by @sehoon38
|
|
||||||
in [#24305](https://github.com/google-gemini/gemini-cli/pull/24305)
|
|
||||||
- Revert "Add security settings for tool sandboxing" by @jerop in
|
|
||||||
[#24357](https://github.com/google-gemini/gemini-cli/pull/24357)
|
|
||||||
- docs: update subagents docs to not be experimental by @abhipatel12 in
|
|
||||||
[#24343](https://github.com/google-gemini/gemini-cli/pull/24343)
|
|
||||||
- fix(core): implement **read and **write commands in sandbox managers by
|
|
||||||
@galz10 in [#24283](https://github.com/google-gemini/gemini-cli/pull/24283)
|
|
||||||
- don't try to remove tags in dry run by @scidomino in
|
|
||||||
[#24356](https://github.com/google-gemini/gemini-cli/pull/24356)
|
|
||||||
- fix(config): disable JIT context loading by default by @SandyTao520 in
|
|
||||||
[#24364](https://github.com/google-gemini/gemini-cli/pull/24364)
|
|
||||||
- test(sandbox): add integration test for dynamic permission expansion by
|
|
||||||
@galz10 in [#24359](https://github.com/google-gemini/gemini-cli/pull/24359)
|
|
||||||
- docs(policy): remove unsupported mcpName wildcard edge case by @abhipatel12 in
|
|
||||||
[#24133](https://github.com/google-gemini/gemini-cli/pull/24133)
|
|
||||||
- docs: fix broken GEMINI.md link in CONTRIBUTING.md by @Panchal-Tirth in
|
|
||||||
[#24182](https://github.com/google-gemini/gemini-cli/pull/24182)
|
|
||||||
- feat(core): infrastructure for event-driven subagent history by @abhipatel12
|
|
||||||
in [#23914](https://github.com/google-gemini/gemini-cli/pull/23914)
|
|
||||||
- fix(core): resolve Plan Mode deadlock during plan file creation due to sandbox
|
|
||||||
restrictions by @DavidAPierce in
|
|
||||||
[#24047](https://github.com/google-gemini/gemini-cli/pull/24047)
|
|
||||||
- fix(core): fix browser agent UX issues and improve E2E test reliability by
|
|
||||||
@gsquared94 in
|
|
||||||
[#24312](https://github.com/google-gemini/gemini-cli/pull/24312)
|
|
||||||
- fix(ui): wrap topic and intent fields in TopicMessage by @jwhelangoog in
|
|
||||||
[#24386](https://github.com/google-gemini/gemini-cli/pull/24386)
|
|
||||||
- refactor(core): Centralize context management logic into src/context by
|
|
||||||
@joshualitt in
|
|
||||||
[#24380](https://github.com/google-gemini/gemini-cli/pull/24380)
|
|
||||||
- fix(core): pin AuthType.GATEWAY to use Gemini 3.1 Pro/Flash Lite by default by
|
|
||||||
@sripasg in [#24375](https://github.com/google-gemini/gemini-cli/pull/24375)
|
|
||||||
- feat(ui): add Tokyo Night theme by @danrneal in
|
|
||||||
[#24054](https://github.com/google-gemini/gemini-cli/pull/24054)
|
|
||||||
- fix(cli): refactor test config loading and mock debugLogger in test-setup by
|
|
||||||
@mattKorwel in
|
|
||||||
[#24389](https://github.com/google-gemini/gemini-cli/pull/24389)
|
|
||||||
- Set memoryManager to false in settings.json by @mattKorwel in
|
|
||||||
[#24393](https://github.com/google-gemini/gemini-cli/pull/24393)
|
|
||||||
- ink 6.6.3 by @jacob314 in
|
|
||||||
[#24372](https://github.com/google-gemini/gemini-cli/pull/24372)
|
|
||||||
- fix(core): resolve subagent chat recording gaps and directory inheritance by
|
|
||||||
@abhipatel12 in
|
@abhipatel12 in
|
||||||
[#24368](https://github.com/google-gemini/gemini-cli/pull/24368)
|
[#21425](https://github.com/google-gemini/gemini-cli/pull/21425)
|
||||||
- fix(cli): cap shell output at 10 MB to prevent RangeError crash by @ProthamD
|
- feat(cli): hide gemma settings from display and mark as experimental by
|
||||||
in [#24168](https://github.com/google-gemini/gemini-cli/pull/24168)
|
@abhipatel12 in
|
||||||
- feat(plan): conditionally add enter/exit plan mode tools based on current mode
|
[#21471](https://github.com/google-gemini/gemini-cli/pull/21471)
|
||||||
by @ruomengz in
|
- feat(skills): refine string-reviewer guidelines and description by @clocky in
|
||||||
[#24378](https://github.com/google-gemini/gemini-cli/pull/24378)
|
[#20368](https://github.com/google-gemini/gemini-cli/pull/20368)
|
||||||
- feat(core): prioritize discussion before formal plan approval by @jerop in
|
- fix(core): whitelist TERM and COLORTERM in environment sanitization by
|
||||||
[#24423](https://github.com/google-gemini/gemini-cli/pull/24423)
|
@deadsmash07 in
|
||||||
- fix(ui): add accelerated scrolling on alternate buffer mode by @devr0306 in
|
[#20514](https://github.com/google-gemini/gemini-cli/pull/20514)
|
||||||
[#23940](https://github.com/google-gemini/gemini-cli/pull/23940)
|
- fix(billing): fix overage strategy lifecycle and settings integration by
|
||||||
- feat(core): populate sandbox forbidden paths with project ignore file contents
|
|
||||||
by @ehedlund in
|
|
||||||
[#24038](https://github.com/google-gemini/gemini-cli/pull/24038)
|
|
||||||
- fix(core): ensure blue border overlay and input blocker to act correctly
|
|
||||||
depending on browser agent activities by @cynthialong0-0 in
|
|
||||||
[#24385](https://github.com/google-gemini/gemini-cli/pull/24385)
|
|
||||||
- fix(ui): removed additional vertical padding for tables by @devr0306 in
|
|
||||||
[#24381](https://github.com/google-gemini/gemini-cli/pull/24381)
|
|
||||||
- fix(build): upload full bundle directory archive to GitHub releases by
|
|
||||||
@sehoon38 in [#24403](https://github.com/google-gemini/gemini-cli/pull/24403)
|
|
||||||
- fix(build): wire bundle:browser-mcp into bundle pipeline by @gsquared94 in
|
|
||||||
[#24424](https://github.com/google-gemini/gemini-cli/pull/24424)
|
|
||||||
- feat(browser): add sandbox-aware browser agent initialization by @gsquared94
|
|
||||||
in [#24419](https://github.com/google-gemini/gemini-cli/pull/24419)
|
|
||||||
- feat(core): enhance tracker task schemas for detailed titles and descriptions
|
|
||||||
by @anj-s in [#23902](https://github.com/google-gemini/gemini-cli/pull/23902)
|
|
||||||
- refactor(core): Unified context management settings schema by @joshualitt in
|
|
||||||
[#24391](https://github.com/google-gemini/gemini-cli/pull/24391)
|
|
||||||
- feat(core): update browser agent prompt to check open pages first when
|
|
||||||
bringing up by @cynthialong0-0 in
|
|
||||||
[#24431](https://github.com/google-gemini/gemini-cli/pull/24431)
|
|
||||||
- fix(acp) refactor(core,cli): centralize model discovery logic in
|
|
||||||
ModelConfigService by @sripasg in
|
|
||||||
[#24392](https://github.com/google-gemini/gemini-cli/pull/24392)
|
|
||||||
- Changelog for v0.36.0-preview.7 by @gemini-cli-robot in
|
|
||||||
[#24346](https://github.com/google-gemini/gemini-cli/pull/24346)
|
|
||||||
- fix: update task tracker storage location in system prompt by @anj-s in
|
|
||||||
[#24034](https://github.com/google-gemini/gemini-cli/pull/24034)
|
|
||||||
- feat(browser): supersede stale snapshots to reclaim context-window tokens by
|
|
||||||
@gsquared94 in
|
@gsquared94 in
|
||||||
[#24440](https://github.com/google-gemini/gemini-cli/pull/24440)
|
[#21236](https://github.com/google-gemini/gemini-cli/pull/21236)
|
||||||
- docs(core): add subagent tool isolation draft doc by @akh64bit in
|
- fix: expand paste placeholders in TextInput on submit by @Jefftree in
|
||||||
[#23275](https://github.com/google-gemini/gemini-cli/pull/23275)
|
[#19946](https://github.com/google-gemini/gemini-cli/pull/19946)
|
||||||
- fix(patch): cherry-pick 64c928f to release/v0.37.0-preview.0-pr-23257 to patch
|
- fix(core): add in-memory cache to ChatRecordingService to prevent OOM by
|
||||||
version v0.37.0-preview.0 and create version 0.37.0-preview.1 by
|
@SandyTao520 in
|
||||||
|
[#21502](https://github.com/google-gemini/gemini-cli/pull/21502)
|
||||||
|
- feat(cli): overhaul thinking UI by @keithguerin in
|
||||||
|
[#18725](https://github.com/google-gemini/gemini-cli/pull/18725)
|
||||||
|
- fix(ui): unify Ctrl+O expansion hint experience across buffer modes by
|
||||||
|
@jwhelangoog in
|
||||||
|
[#21474](https://github.com/google-gemini/gemini-cli/pull/21474)
|
||||||
|
- fix(cli): correct shell height reporting by @jacob314 in
|
||||||
|
[#21492](https://github.com/google-gemini/gemini-cli/pull/21492)
|
||||||
|
- Make test suite pass when the GEMINI_SYSTEM_MD env variable or
|
||||||
|
GEMINI_WRITE_SYSTEM_MD variable happens to be set locally/ by @jacob314 in
|
||||||
|
[#21480](https://github.com/google-gemini/gemini-cli/pull/21480)
|
||||||
|
- Disallow underspecified types by @gundermanc in
|
||||||
|
[#21485](https://github.com/google-gemini/gemini-cli/pull/21485)
|
||||||
|
- refactor(cli): standardize on 'reload' verb for all components by @keithguerin
|
||||||
|
in [#20654](https://github.com/google-gemini/gemini-cli/pull/20654)
|
||||||
|
- feat(cli): Invert quota language to 'percent used' by @keithguerin in
|
||||||
|
[#20100](https://github.com/google-gemini/gemini-cli/pull/20100)
|
||||||
|
- Docs: Add documentation for notifications (experimental)(macOS) by @jkcinouye
|
||||||
|
in [#21163](https://github.com/google-gemini/gemini-cli/pull/21163)
|
||||||
|
- Code review comments as a pr by @jacob314 in
|
||||||
|
[#21209](https://github.com/google-gemini/gemini-cli/pull/21209)
|
||||||
|
- feat(cli): unify /chat and /resume command UX by @LyalinDotCom in
|
||||||
|
[#20256](https://github.com/google-gemini/gemini-cli/pull/20256)
|
||||||
|
- docs: fix typo 'allowslisted' -> 'allowlisted' in mcp-server.md by
|
||||||
|
@Gyanranjan-Priyam in
|
||||||
|
[#21665](https://github.com/google-gemini/gemini-cli/pull/21665)
|
||||||
|
- fix(core): display actual graph output in tracker_visualize tool by @anj-s in
|
||||||
|
[#21455](https://github.com/google-gemini/gemini-cli/pull/21455)
|
||||||
|
- fix(core): sanitize SSE-corrupted JSON and domain strings in error
|
||||||
|
classification by @gsquared94 in
|
||||||
|
[#21702](https://github.com/google-gemini/gemini-cli/pull/21702)
|
||||||
|
- Docs: Make documentation links relative by @diodesign in
|
||||||
|
[#21490](https://github.com/google-gemini/gemini-cli/pull/21490)
|
||||||
|
- feat(cli): expose /tools desc as explicit subcommand for discoverability by
|
||||||
|
@aworki in [#21241](https://github.com/google-gemini/gemini-cli/pull/21241)
|
||||||
|
- feat(cli): add /compact alias for /compress command by @jackwotherspoon in
|
||||||
|
[#21711](https://github.com/google-gemini/gemini-cli/pull/21711)
|
||||||
|
- feat(plan): enable Plan Mode by default by @jerop in
|
||||||
|
[#21713](https://github.com/google-gemini/gemini-cli/pull/21713)
|
||||||
|
- feat(core): Introduce `AgentLoopContext`. by @joshualitt in
|
||||||
|
[#21198](https://github.com/google-gemini/gemini-cli/pull/21198)
|
||||||
|
- fix(core): resolve symlinks for non-existent paths during validation by
|
||||||
|
@Adib234 in [#21487](https://github.com/google-gemini/gemini-cli/pull/21487)
|
||||||
|
- docs: document tool exclusion from memory via deny policy by @Abhijit-2592 in
|
||||||
|
[#21428](https://github.com/google-gemini/gemini-cli/pull/21428)
|
||||||
|
- perf(core): cache loadApiKey to reduce redundant keychain access by @sehoon38
|
||||||
|
in [#21520](https://github.com/google-gemini/gemini-cli/pull/21520)
|
||||||
|
- feat(cli): implement /upgrade command by @sehoon38 in
|
||||||
|
[#21511](https://github.com/google-gemini/gemini-cli/pull/21511)
|
||||||
|
- Feat/browser agent progress emission by @kunal-10-cloud in
|
||||||
|
[#21218](https://github.com/google-gemini/gemini-cli/pull/21218)
|
||||||
|
- fix(settings): display objects as JSON instead of [object Object] by
|
||||||
|
@Zheyuan-Lin in
|
||||||
|
[#21458](https://github.com/google-gemini/gemini-cli/pull/21458)
|
||||||
|
- Unmarshall update by @DavidAPierce in
|
||||||
|
[#21721](https://github.com/google-gemini/gemini-cli/pull/21721)
|
||||||
|
- Update mcp's list function to check for disablement. by @DavidAPierce in
|
||||||
|
[#21148](https://github.com/google-gemini/gemini-cli/pull/21148)
|
||||||
|
- robustness(core): static checks to validate history is immutable by @jacob314
|
||||||
|
in [#21228](https://github.com/google-gemini/gemini-cli/pull/21228)
|
||||||
|
- refactor(cli): better react patterns for BaseSettingsDialog by @psinha40898 in
|
||||||
|
[#21206](https://github.com/google-gemini/gemini-cli/pull/21206)
|
||||||
|
- feat(security): implement robust IP validation and safeFetch foundation by
|
||||||
|
@alisa-alisa in
|
||||||
|
[#21401](https://github.com/google-gemini/gemini-cli/pull/21401)
|
||||||
|
- feat(core): improve subagent result display by @joshualitt in
|
||||||
|
[#20378](https://github.com/google-gemini/gemini-cli/pull/20378)
|
||||||
|
- docs: fix broken markdown syntax and anchor links in /tools by @campox747 in
|
||||||
|
[#20902](https://github.com/google-gemini/gemini-cli/pull/20902)
|
||||||
|
- feat(policy): support subagent-specific policies in TOML by @akh64bit in
|
||||||
|
[#21431](https://github.com/google-gemini/gemini-cli/pull/21431)
|
||||||
|
- Add script to speed up reviewing PRs adding a worktree. by @jacob314 in
|
||||||
|
[#21748](https://github.com/google-gemini/gemini-cli/pull/21748)
|
||||||
|
- fix(core): prevent infinite recursion in symlink resolution by @Adib234 in
|
||||||
|
[#21750](https://github.com/google-gemini/gemini-cli/pull/21750)
|
||||||
|
- fix(docs): fix headless mode docs by @ame2en in
|
||||||
|
[#21287](https://github.com/google-gemini/gemini-cli/pull/21287)
|
||||||
|
- feat/redesign header compact by @jacob314 in
|
||||||
|
[#20922](https://github.com/google-gemini/gemini-cli/pull/20922)
|
||||||
|
- refactor: migrate to useKeyMatchers hook by @scidomino in
|
||||||
|
[#21753](https://github.com/google-gemini/gemini-cli/pull/21753)
|
||||||
|
- perf(cli): cache loadSettings to reduce redundant disk I/O at startup by
|
||||||
|
@sehoon38 in [#21521](https://github.com/google-gemini/gemini-cli/pull/21521)
|
||||||
|
- fix(core): resolve Windows line ending and path separation bugs across CLI by
|
||||||
|
@muhammadusman586 in
|
||||||
|
[#21068](https://github.com/google-gemini/gemini-cli/pull/21068)
|
||||||
|
- docs: fix heading formatting in commands.md and phrasing in tools-api.md by
|
||||||
|
@campox747 in [#20679](https://github.com/google-gemini/gemini-cli/pull/20679)
|
||||||
|
- refactor(ui): unify keybinding infrastructure and support string
|
||||||
|
initialization by @scidomino in
|
||||||
|
[#21776](https://github.com/google-gemini/gemini-cli/pull/21776)
|
||||||
|
- Add support for updating extension sources and names by @chrstnb in
|
||||||
|
[#21715](https://github.com/google-gemini/gemini-cli/pull/21715)
|
||||||
|
- fix(core): handle GUI editor non-zero exit codes gracefully by @reyyanxahmed
|
||||||
|
in [#20376](https://github.com/google-gemini/gemini-cli/pull/20376)
|
||||||
|
- fix(core): destroy PTY on kill() and exception to prevent fd leak by @nbardy
|
||||||
|
in [#21693](https://github.com/google-gemini/gemini-cli/pull/21693)
|
||||||
|
- fix(docs): update theme screenshots and add missing themes by @ashmod in
|
||||||
|
[#20689](https://github.com/google-gemini/gemini-cli/pull/20689)
|
||||||
|
- refactor(cli): rename 'return' key to 'enter' internally by @scidomino in
|
||||||
|
[#21796](https://github.com/google-gemini/gemini-cli/pull/21796)
|
||||||
|
- build(release): restrict npm bundling to non-stable tags by @sehoon38 in
|
||||||
|
[#21821](https://github.com/google-gemini/gemini-cli/pull/21821)
|
||||||
|
- fix(core): override toolRegistry property for sub-agent schedulers by
|
||||||
|
@gsquared94 in
|
||||||
|
[#21766](https://github.com/google-gemini/gemini-cli/pull/21766)
|
||||||
|
- fix(cli): make footer items equally spaced by @jacob314 in
|
||||||
|
[#21843](https://github.com/google-gemini/gemini-cli/pull/21843)
|
||||||
|
- docs: clarify global policy rules application in plan mode by @jerop in
|
||||||
|
[#21864](https://github.com/google-gemini/gemini-cli/pull/21864)
|
||||||
|
- fix(core): ensure correct flash model steering in plan mode implementation
|
||||||
|
phase by @jerop in
|
||||||
|
[#21871](https://github.com/google-gemini/gemini-cli/pull/21871)
|
||||||
|
- fix(core): update @a2a-js/sdk to 0.3.11 by @adamfweidman in
|
||||||
|
[#21875](https://github.com/google-gemini/gemini-cli/pull/21875)
|
||||||
|
- refactor(core): improve API response error logging when retry by @yunaseoul in
|
||||||
|
[#21784](https://github.com/google-gemini/gemini-cli/pull/21784)
|
||||||
|
- fix(ui): handle headless execution in credits and upgrade dialogs by
|
||||||
|
@gsquared94 in
|
||||||
|
[#21850](https://github.com/google-gemini/gemini-cli/pull/21850)
|
||||||
|
- fix(core): treat retryable errors with >5 min delay as terminal quota errors
|
||||||
|
by @gsquared94 in
|
||||||
|
[#21881](https://github.com/google-gemini/gemini-cli/pull/21881)
|
||||||
|
- feat(telemetry): add specific PR, issue, and custom tracking IDs for GitHub
|
||||||
|
Actions by @cocosheng-g in
|
||||||
|
[#21129](https://github.com/google-gemini/gemini-cli/pull/21129)
|
||||||
|
- feat(core): add OAuth2 Authorization Code auth provider for A2A agents by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#21496](https://github.com/google-gemini/gemini-cli/pull/21496)
|
||||||
|
- feat(cli): give visibility to /tools list command in the TUI and follow the
|
||||||
|
subcommand pattern of other commands by @JayadityaGit in
|
||||||
|
[#21213](https://github.com/google-gemini/gemini-cli/pull/21213)
|
||||||
|
- Handle dirty worktrees better and warn about running scripts/review.sh on
|
||||||
|
untrusted code. by @jacob314 in
|
||||||
|
[#21791](https://github.com/google-gemini/gemini-cli/pull/21791)
|
||||||
|
- feat(policy): support auto-add to policy by default and scoped persistence by
|
||||||
|
@spencer426 in
|
||||||
|
[#20361](https://github.com/google-gemini/gemini-cli/pull/20361)
|
||||||
|
- fix(core): handle AbortError when ESC cancels tool execution by @PrasannaPal21
|
||||||
|
in [#20863](https://github.com/google-gemini/gemini-cli/pull/20863)
|
||||||
|
- fix(release): Improve Patch Release Workflow Comments: Clearer Approval
|
||||||
|
Guidance by @jerop in
|
||||||
|
[#21894](https://github.com/google-gemini/gemini-cli/pull/21894)
|
||||||
|
- docs: clarify telemetry setup and comprehensive data map by @jerop in
|
||||||
|
[#21879](https://github.com/google-gemini/gemini-cli/pull/21879)
|
||||||
|
- feat(core): add per-model token usage to stream-json output by @yongruilin in
|
||||||
|
[#21839](https://github.com/google-gemini/gemini-cli/pull/21839)
|
||||||
|
- docs: remove experimental badge from plan mode in sidebar by @jerop in
|
||||||
|
[#21906](https://github.com/google-gemini/gemini-cli/pull/21906)
|
||||||
|
- fix(cli): prevent race condition in loop detection retry by @skyvanguard in
|
||||||
|
[#17916](https://github.com/google-gemini/gemini-cli/pull/17916)
|
||||||
|
- Add behavioral evals for tracker by @anj-s in
|
||||||
|
[#20069](https://github.com/google-gemini/gemini-cli/pull/20069)
|
||||||
|
- fix(auth): update terminology to 'sign in' and 'sign out' by @clocky in
|
||||||
|
[#20892](https://github.com/google-gemini/gemini-cli/pull/20892)
|
||||||
|
- docs(mcp): standardize mcp tool fqn documentation by @abhipatel12 in
|
||||||
|
[#21664](https://github.com/google-gemini/gemini-cli/pull/21664)
|
||||||
|
- fix(ui): prevent empty tool-group border stubs after filtering by @Aaxhirrr in
|
||||||
|
[#21852](https://github.com/google-gemini/gemini-cli/pull/21852)
|
||||||
|
- make command names consistent by @scidomino in
|
||||||
|
[#21907](https://github.com/google-gemini/gemini-cli/pull/21907)
|
||||||
|
- refactor: remove agent_card_requires_auth config flag by @adamfweidman in
|
||||||
|
[#21914](https://github.com/google-gemini/gemini-cli/pull/21914)
|
||||||
|
- feat(a2a): implement standardized normalization and streaming reassembly by
|
||||||
|
@alisa-alisa in
|
||||||
|
[#21402](https://github.com/google-gemini/gemini-cli/pull/21402)
|
||||||
|
- feat(cli): enable skill activation via slash commands by @NTaylorMullen in
|
||||||
|
[#21758](https://github.com/google-gemini/gemini-cli/pull/21758)
|
||||||
|
- docs(cli): mention per-model token usage in stream-json result event by
|
||||||
|
@yongruilin in
|
||||||
|
[#21908](https://github.com/google-gemini/gemini-cli/pull/21908)
|
||||||
|
- fix(plan): prevent plan truncation in approval dialog by supporting
|
||||||
|
unconstrained heights by @Adib234 in
|
||||||
|
[#21037](https://github.com/google-gemini/gemini-cli/pull/21037)
|
||||||
|
- feat(a2a): switch from callback-based to event-driven tool scheduler by
|
||||||
|
@cocosheng-g in
|
||||||
|
[#21467](https://github.com/google-gemini/gemini-cli/pull/21467)
|
||||||
|
- feat(voice): implement speech-friendly response formatter by @ayush31010 in
|
||||||
|
[#20989](https://github.com/google-gemini/gemini-cli/pull/20989)
|
||||||
|
- feat: add pulsating blue border automation overlay to browser agent by
|
||||||
|
@kunal-10-cloud in
|
||||||
|
[#21173](https://github.com/google-gemini/gemini-cli/pull/21173)
|
||||||
|
- Add extensionRegistryURI setting to change where the registry is read from by
|
||||||
|
@kevinjwang1 in
|
||||||
|
[#20463](https://github.com/google-gemini/gemini-cli/pull/20463)
|
||||||
|
- fix: patch gaxios v7 Array.toString() stream corruption by @gsquared94 in
|
||||||
|
[#21884](https://github.com/google-gemini/gemini-cli/pull/21884)
|
||||||
|
- fix: prevent hangs in non-interactive mode and improve agent guidance by
|
||||||
|
@cocosheng-g in
|
||||||
|
[#20893](https://github.com/google-gemini/gemini-cli/pull/20893)
|
||||||
|
- Add ExtensionDetails dialog and support install by @chrstnb in
|
||||||
|
[#20845](https://github.com/google-gemini/gemini-cli/pull/20845)
|
||||||
|
- chore/release: bump version to 0.34.0-nightly.20260310.4653b126f by
|
||||||
@gemini-cli-robot in
|
@gemini-cli-robot in
|
||||||
[#24561](https://github.com/google-gemini/gemini-cli/pull/24561)
|
[#21816](https://github.com/google-gemini/gemini-cli/pull/21816)
|
||||||
- fix(patch): cherry-pick cb7f7d6 to release/v0.37.0-preview.1-pr-24342 to patch
|
- Changelog for v0.33.0-preview.13 by @gemini-cli-robot in
|
||||||
version v0.37.0-preview.1 and create version 0.37.0-preview.2 by
|
[#21927](https://github.com/google-gemini/gemini-cli/pull/21927)
|
||||||
|
- fix(cli): stabilize prompt layout to prevent jumping when typing by
|
||||||
|
@NTaylorMullen in
|
||||||
|
[#21081](https://github.com/google-gemini/gemini-cli/pull/21081)
|
||||||
|
- fix: preserve prompt text when cancelling streaming by @Nixxx19 in
|
||||||
|
[#21103](https://github.com/google-gemini/gemini-cli/pull/21103)
|
||||||
|
- fix: robust UX for remote agent errors by @Shyam-Raghuwanshi in
|
||||||
|
[#20307](https://github.com/google-gemini/gemini-cli/pull/20307)
|
||||||
|
- feat: implement background process logging and cleanup by @galz10 in
|
||||||
|
[#21189](https://github.com/google-gemini/gemini-cli/pull/21189)
|
||||||
|
- Changelog for v0.33.0-preview.14 by @gemini-cli-robot in
|
||||||
|
[#21938](https://github.com/google-gemini/gemini-cli/pull/21938)
|
||||||
|
- fix(patch): cherry-pick 45faf4d to release/v0.34.0-preview.0-pr-22148
|
||||||
|
[CONFLICTS] by @gemini-cli-robot in
|
||||||
|
[#22174](https://github.com/google-gemini/gemini-cli/pull/22174)
|
||||||
|
- fix(patch): cherry-pick 8432bce to release/v0.34.0-preview.1-pr-22069 to patch
|
||||||
|
version v0.34.0-preview.1 and create version 0.34.0-preview.2 by
|
||||||
@gemini-cli-robot in
|
@gemini-cli-robot in
|
||||||
[#24842](https://github.com/google-gemini/gemini-cli/pull/24842)
|
[#22205](https://github.com/google-gemini/gemini-cli/pull/22205)
|
||||||
|
- fix(patch): cherry-pick 24adacd to release/v0.34.0-preview.2-pr-22332 to patch
|
||||||
|
version v0.34.0-preview.2 and create version 0.34.0-preview.3 by
|
||||||
|
@gemini-cli-robot in
|
||||||
|
[#22391](https://github.com/google-gemini/gemini-cli/pull/22391)
|
||||||
|
- fix(patch): cherry-pick 48130eb to release/v0.34.0-preview.3-pr-22665 to patch
|
||||||
|
version v0.34.0-preview.3 and create version 0.34.0-preview.4 by
|
||||||
|
@gemini-cli-robot in
|
||||||
|
[#22719](https://github.com/google-gemini/gemini-cli/pull/22719)
|
||||||
|
|
||||||
**Full Changelog**:
|
**Full Changelog**:
|
||||||
https://github.com/google-gemini/gemini-cli/compare/v0.36.0...v0.37.0
|
https://github.com/google-gemini/gemini-cli/compare/v0.33.2...v0.34.0
|
||||||
|
|||||||
+355
-247
@@ -1,6 +1,6 @@
|
|||||||
# Preview release: v0.38.0-preview.0
|
# Preview release: v0.35.0-preview.1
|
||||||
|
|
||||||
Released: April 08, 2026
|
Released: March 17, 2026
|
||||||
|
|
||||||
Our preview release includes the latest, new, and experimental features. This
|
Our preview release includes the latest, new, and experimental features. This
|
||||||
release may not be as stable as our [latest weekly release](latest.md).
|
release may not be as stable as our [latest weekly release](latest.md).
|
||||||
@@ -13,256 +13,364 @@ npm install -g @google/gemini-cli@preview
|
|||||||
|
|
||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
- **Context Management:** Introduced a Context Compression Service to optimize
|
- **Subagents & Architecture Enhancements**: Enabled subagents and laid the
|
||||||
context window usage and landed a background memory service for skill
|
foundation for subagent tool isolation. Added proxy routing support for remote
|
||||||
extraction.
|
A2A subagents and integrated `SandboxManager` to sandbox all process-spawning
|
||||||
- **Enhanced Security:** Implemented context-aware persistent policy approvals
|
tools.
|
||||||
for smarter tool permissions and enabled `web_fetch` in plan mode with user
|
- **CLI & UI Improvements**: Introduced customizable keyboard shortcuts and
|
||||||
confirmation.
|
support for literal character keybindings. Added missing vim mode motions and
|
||||||
- **Workflow Monitoring:** Added background process monitoring and inspection
|
CJK input support. Enabled code splitting and deferred UI loading for improved
|
||||||
tools for better visibility into long-running tasks.
|
performance.
|
||||||
- **UI/UX Refinements:** Enhanced the tool confirmation UI, selection layout,
|
- **Context & Tools Optimization**: JIT context loading is now enabled by
|
||||||
and added support for selective topic expansion and click-to-expand.
|
default with deduplication for project memory. Introduced a model-driven
|
||||||
- **Core Stability:** Improved sandbox reliability on Linux and Windows,
|
parallel tool scheduler and allowed safe tools to execute concurrently.
|
||||||
resolved shebang compatibility issues, and fixed various crashes in the CLI
|
- **Security & Extensions**: Implemented cryptographic integrity verification
|
||||||
and core services.
|
for extension updates and added a `disableAlwaysAllow` setting to prevent
|
||||||
|
auto-approvals for enhanced security.
|
||||||
|
- **Plan Mode & Web Fetch Updates**: Added an 'All the above' option for
|
||||||
|
multi-select AskUser questions in Plan Mode. Rolled out Stage 1 and Stage 2
|
||||||
|
security and consistency improvements for the `web_fetch` tool.
|
||||||
|
|
||||||
## What's Changed
|
## What's Changed
|
||||||
|
|
||||||
- fix(cli): refresh slash command list after /skills reload by @NTaylorMullen in
|
- feat(cli): customizable keyboard shortcuts by @scidomino in
|
||||||
[#24454](https://github.com/google-gemini/gemini-cli/pull/24454)
|
[#21945](https://github.com/google-gemini/gemini-cli/pull/21945)
|
||||||
- Update README.md for links. by @g-samroberts in
|
- feat(core): Thread `AgentLoopContext` through core. by @joshualitt in
|
||||||
[#22759](https://github.com/google-gemini/gemini-cli/pull/22759)
|
[#21944](https://github.com/google-gemini/gemini-cli/pull/21944)
|
||||||
- fix(core): ensure complete_task tool calls are recorded in chat history by
|
- chore(release): bump version to 0.35.0-nightly.20260311.657f19c1f by
|
||||||
@abhipatel12 in
|
@gemini-cli-robot in
|
||||||
[#24437](https://github.com/google-gemini/gemini-cli/pull/24437)
|
[#21966](https://github.com/google-gemini/gemini-cli/pull/21966)
|
||||||
- feat(policy): explicitly allow web_fetch in plan mode with ask_user by
|
- refactor(a2a): remove legacy CoreToolScheduler by @adamfweidman in
|
||||||
@Adib234 in [#24456](https://github.com/google-gemini/gemini-cli/pull/24456)
|
[#21955](https://github.com/google-gemini/gemini-cli/pull/21955)
|
||||||
- fix(core): refactor linux sandbox to fix ARG_MAX crashes by @ehedlund in
|
- feat(ui): add missing vim mode motions (X, ~, r, f/F/t/T, df/dt and friends)
|
||||||
[#24286](https://github.com/google-gemini/gemini-cli/pull/24286)
|
by @aanari in [#21932](https://github.com/google-gemini/gemini-cli/pull/21932)
|
||||||
- feat(config): add experimental.adk.agentSessionNoninteractiveEnabled setting
|
- Feat/retry fetch notifications by @aishaneeshah in
|
||||||
by @adamfweidman in
|
[#21813](https://github.com/google-gemini/gemini-cli/pull/21813)
|
||||||
[#24439](https://github.com/google-gemini/gemini-cli/pull/24439)
|
- fix(core): remove OAuth check from handleFallback and clean up stray file by
|
||||||
- Changelog for v0.36.0-preview.8 by @gemini-cli-robot in
|
@sehoon38 in [#21962](https://github.com/google-gemini/gemini-cli/pull/21962)
|
||||||
[#24453](https://github.com/google-gemini/gemini-cli/pull/24453)
|
- feat(cli): support literal character keybindings and extended Kitty protocol
|
||||||
- feat(cli): change default loadingPhrases to 'off' to hide tips by @keithguerin
|
keys by @scidomino in
|
||||||
in [#24342](https://github.com/google-gemini/gemini-cli/pull/24342)
|
[#21972](https://github.com/google-gemini/gemini-cli/pull/21972)
|
||||||
- fix(cli): ensure agent stops when all declinable tools are cancelled by
|
- fix(ui): clamp cursor to last char after all NORMAL mode deletes by @aanari in
|
||||||
@NTaylorMullen in
|
[#21973](https://github.com/google-gemini/gemini-cli/pull/21973)
|
||||||
[#24479](https://github.com/google-gemini/gemini-cli/pull/24479)
|
- test(core): add missing tests for prompts/utils.ts by @krrishverma1805-web in
|
||||||
- fix(core): enhance sandbox usability and fix build error by @galz10 in
|
[#19941](https://github.com/google-gemini/gemini-cli/pull/19941)
|
||||||
[#24460](https://github.com/google-gemini/gemini-cli/pull/24460)
|
- fix(cli): allow scrolling keys in copy mode (Ctrl+S selection mode) by
|
||||||
- Terminal Serializer Optimization by @jacob314 in
|
@nsalerni in [#19933](https://github.com/google-gemini/gemini-cli/pull/19933)
|
||||||
[#24485](https://github.com/google-gemini/gemini-cli/pull/24485)
|
- docs(cli): add custom keybinding documentation by @scidomino in
|
||||||
- Auto configure memory. by @jacob314 in
|
[#21980](https://github.com/google-gemini/gemini-cli/pull/21980)
|
||||||
[#24474](https://github.com/google-gemini/gemini-cli/pull/24474)
|
- docs: fix misleading YOLO mode description in defaultApprovalMode by
|
||||||
- Unused error variables in catch block are not allowed by @alisa-alisa in
|
@Gyanranjan-Priyam in
|
||||||
[#24487](https://github.com/google-gemini/gemini-cli/pull/24487)
|
[#21878](https://github.com/google-gemini/gemini-cli/pull/21878)
|
||||||
- feat(core): add background memory service for skill extraction by @SandyTao520
|
- fix: clean up /clear and /resume by @jackwotherspoon in
|
||||||
in [#24274](https://github.com/google-gemini/gemini-cli/pull/24274)
|
[#22007](https://github.com/google-gemini/gemini-cli/pull/22007)
|
||||||
- feat: implement high-signal PR regression check for evaluations by
|
- fix(core)#20941: reap orphaned descendant processes on PTY abort by @manavmax
|
||||||
@alisa-alisa in
|
in [#21124](https://github.com/google-gemini/gemini-cli/pull/21124)
|
||||||
[#23937](https://github.com/google-gemini/gemini-cli/pull/23937)
|
- fix(core): update language detection to use LSP 3.18 identifiers by @yunaseoul
|
||||||
- Fix shell output display by @jacob314 in
|
in [#21931](https://github.com/google-gemini/gemini-cli/pull/21931)
|
||||||
[#24490](https://github.com/google-gemini/gemini-cli/pull/24490)
|
- feat(cli): support removing keybindings via '-' prefix by @scidomino in
|
||||||
- fix(ui): resolve unwanted vertical spacing around various tool output
|
[#22042](https://github.com/google-gemini/gemini-cli/pull/22042)
|
||||||
treatments by @jwhelangoog in
|
- feat(policy): add --admin-policy flag for supplemental admin policies by
|
||||||
[#24449](https://github.com/google-gemini/gemini-cli/pull/24449)
|
@galz10 in [#20360](https://github.com/google-gemini/gemini-cli/pull/20360)
|
||||||
- revert(cli): bring back input box and footer visibility in copy mode by
|
- merge duplicate imports packages/cli/src subtask1 by @Nixxx19 in
|
||||||
@sehoon38 in [#24504](https://github.com/google-gemini/gemini-cli/pull/24504)
|
[#22040](https://github.com/google-gemini/gemini-cli/pull/22040)
|
||||||
- fix(cli): prevent crash in AnsiOutputText when handling non-array data by
|
- perf(core): parallelize user quota and experiments fetching in refreshAuth by
|
||||||
@sehoon38 in [#24498](https://github.com/google-gemini/gemini-cli/pull/24498)
|
@sehoon38 in [#21648](https://github.com/google-gemini/gemini-cli/pull/21648)
|
||||||
- feat(cli): support default values for environment variables by @ruomengz in
|
- Changelog for v0.34.0-preview.0 by @gemini-cli-robot in
|
||||||
[#24469](https://github.com/google-gemini/gemini-cli/pull/24469)
|
[#21965](https://github.com/google-gemini/gemini-cli/pull/21965)
|
||||||
- Implement background process monitoring and inspection tools by @cocosheng-g
|
- Changelog for v0.33.0 by @gemini-cli-robot in
|
||||||
in [#23799](https://github.com/google-gemini/gemini-cli/pull/23799)
|
[#21967](https://github.com/google-gemini/gemini-cli/pull/21967)
|
||||||
- docs(browser-agent): update stale browser agent documentation by @gsquared94
|
- fix(core): handle EISDIR in robustRealpath on Windows by @sehoon38 in
|
||||||
in [#24463](https://github.com/google-gemini/gemini-cli/pull/24463)
|
[#21984](https://github.com/google-gemini/gemini-cli/pull/21984)
|
||||||
- fix: enable browser_agent in integration tests and add localhost fixture tests
|
- feat(core): include initiationMethod in conversation interaction telemetry by
|
||||||
by @gsquared94 in
|
@yunaseoul in [#22054](https://github.com/google-gemini/gemini-cli/pull/22054)
|
||||||
[#24523](https://github.com/google-gemini/gemini-cli/pull/24523)
|
- feat(ui): add vim yank/paste (y/p/P) with unnamed register by @aanari in
|
||||||
- fix(browser): handle computer-use model detection for analyze_screenshot by
|
[#22026](https://github.com/google-gemini/gemini-cli/pull/22026)
|
||||||
@gsquared94 in
|
- fix(core): enable numerical routing for api key users by @sehoon38 in
|
||||||
[#24502](https://github.com/google-gemini/gemini-cli/pull/24502)
|
[#21977](https://github.com/google-gemini/gemini-cli/pull/21977)
|
||||||
- feat(core): Land ContextCompressionService by @joshualitt in
|
- feat(telemetry): implement retry attempt telemetry for network related retries
|
||||||
[#24483](https://github.com/google-gemini/gemini-cli/pull/24483)
|
by @aishaneeshah in
|
||||||
- feat(core): scope subagent workspace directories via AsyncLocalStorage by
|
[#22027](https://github.com/google-gemini/gemini-cli/pull/22027)
|
||||||
@SandyTao520 in
|
- fix(policy): remove unnecessary escapeRegex from pattern builders by
|
||||||
[#24445](https://github.com/google-gemini/gemini-cli/pull/24445)
|
@spencer426 in
|
||||||
- Update ink version to 6.6.7 by @jacob314 in
|
[#21921](https://github.com/google-gemini/gemini-cli/pull/21921)
|
||||||
[#24514](https://github.com/google-gemini/gemini-cli/pull/24514)
|
- fix(core): preserve dynamic tool descriptions on session resume by @sehoon38
|
||||||
- fix(acp): handle all InvalidStreamError types gracefully in prompt by @sripasg
|
in [#18835](https://github.com/google-gemini/gemini-cli/pull/18835)
|
||||||
in [#24540](https://github.com/google-gemini/gemini-cli/pull/24540)
|
- chore: allow 'gemini-3.1' in sensitive keyword linter by @scidomino in
|
||||||
- Fix crash when vim editor is not found in PATH on Windows by
|
[#22065](https://github.com/google-gemini/gemini-cli/pull/22065)
|
||||||
@Nagajyothi-tammisetti in
|
- feat(core): support custom base URL via env vars by @junaiddshaukat in
|
||||||
[#22423](https://github.com/google-gemini/gemini-cli/pull/22423)
|
[#21561](https://github.com/google-gemini/gemini-cli/pull/21561)
|
||||||
- fix(core): move project memory dir under tmp directory by @SandyTao520 in
|
- merge duplicate imports packages/cli/src subtask2 by @Nixxx19 in
|
||||||
[#24542](https://github.com/google-gemini/gemini-cli/pull/24542)
|
[#22051](https://github.com/google-gemini/gemini-cli/pull/22051)
|
||||||
- Enable 'Other' option for yesno question type by @ruomengz in
|
- fix(core): silently retry API errors up to 3 times before halting session by
|
||||||
[#24545](https://github.com/google-gemini/gemini-cli/pull/24545)
|
@spencer426 in
|
||||||
- fix(cli): clear stale retry/loading state after cancellation (#21096) by
|
[#21989](https://github.com/google-gemini/gemini-cli/pull/21989)
|
||||||
@Aaxhirrr in [#21960](https://github.com/google-gemini/gemini-cli/pull/21960)
|
- feat(core): simplify subagent success UI and improve early termination display
|
||||||
- Changelog for v0.37.0-preview.0 by @gemini-cli-robot in
|
|
||||||
[#24464](https://github.com/google-gemini/gemini-cli/pull/24464)
|
|
||||||
- feat(core): implement context-aware persistent policy approvals by @jerop in
|
|
||||||
[#23257](https://github.com/google-gemini/gemini-cli/pull/23257)
|
|
||||||
- docs: move agent disabling instructions and update remote agent status by
|
|
||||||
@jackwotherspoon in
|
|
||||||
[#24559](https://github.com/google-gemini/gemini-cli/pull/24559)
|
|
||||||
- feat(cli): migrate nonInteractiveCli to LegacyAgentSession by @adamfweidman in
|
|
||||||
[#22987](https://github.com/google-gemini/gemini-cli/pull/22987)
|
|
||||||
- fix(core): unsafe type assertions in Core File System #19712 by
|
|
||||||
@aniketsaurav18 in
|
|
||||||
[#19739](https://github.com/google-gemini/gemini-cli/pull/19739)
|
|
||||||
- fix(ui): hide model quota in /stats and refactor quota display by @danzaharia1
|
|
||||||
in [#24206](https://github.com/google-gemini/gemini-cli/pull/24206)
|
|
||||||
- Changelog for v0.36.0 by @gemini-cli-robot in
|
|
||||||
[#24558](https://github.com/google-gemini/gemini-cli/pull/24558)
|
|
||||||
- Changelog for v0.37.0-preview.1 by @gemini-cli-robot in
|
|
||||||
[#24568](https://github.com/google-gemini/gemini-cli/pull/24568)
|
|
||||||
- docs: add missing .md extensions to internal doc links by @ishaan-arora-1 in
|
|
||||||
[#24145](https://github.com/google-gemini/gemini-cli/pull/24145)
|
|
||||||
- fix(ui): fixed table styling by @devr0306 in
|
|
||||||
[#24565](https://github.com/google-gemini/gemini-cli/pull/24565)
|
|
||||||
- fix(core): pass includeDirectories to sandbox configuration by @galz10 in
|
|
||||||
[#24573](https://github.com/google-gemini/gemini-cli/pull/24573)
|
|
||||||
- feat(ui): enable "TerminalBuffer" mode to solve flicker by @jacob314 in
|
|
||||||
[#24512](https://github.com/google-gemini/gemini-cli/pull/24512)
|
|
||||||
- docs: clarify release coordination by @scidomino in
|
|
||||||
[#24575](https://github.com/google-gemini/gemini-cli/pull/24575)
|
|
||||||
- fix(core): remove broken PowerShell translation and fix native \_\_write in
|
|
||||||
Windows sandbox by @scidomino in
|
|
||||||
[#24571](https://github.com/google-gemini/gemini-cli/pull/24571)
|
|
||||||
- Add instructions for how to start react in prod and force react to prod mode
|
|
||||||
by @jacob314 in
|
|
||||||
[#24590](https://github.com/google-gemini/gemini-cli/pull/24590)
|
|
||||||
- feat(cli): minimalist sandbox status labels by @galz10 in
|
|
||||||
[#24582](https://github.com/google-gemini/gemini-cli/pull/24582)
|
|
||||||
- Feat/browser agent metrics by @kunal-10-cloud in
|
|
||||||
[#24210](https://github.com/google-gemini/gemini-cli/pull/24210)
|
|
||||||
- test: fix Windows CI execution and resolve exposed platform failures by
|
|
||||||
@ehedlund in [#24476](https://github.com/google-gemini/gemini-cli/pull/24476)
|
|
||||||
- feat(core,cli): prioritize summary for topics (#24608) by @Abhijit-2592 in
|
|
||||||
[#24609](https://github.com/google-gemini/gemini-cli/pull/24609)
|
|
||||||
- show color by @jacob314 in
|
|
||||||
[#24613](https://github.com/google-gemini/gemini-cli/pull/24613)
|
|
||||||
- feat(cli): enable compact tool output by default (#24509) by @jwhelangoog in
|
|
||||||
[#24510](https://github.com/google-gemini/gemini-cli/pull/24510)
|
|
||||||
- fix(core): inject skill system instructions into subagent prompts if activated
|
|
||||||
by @abhipatel12 in
|
by @abhipatel12 in
|
||||||
[#24620](https://github.com/google-gemini/gemini-cli/pull/24620)
|
[#21917](https://github.com/google-gemini/gemini-cli/pull/21917)
|
||||||
- fix(core): improve windows sandbox reliability and fix integration tests by
|
- merge duplicate imports packages/cli/src subtask3 by @Nixxx19 in
|
||||||
@ehedlund in [#24480](https://github.com/google-gemini/gemini-cli/pull/24480)
|
[#22056](https://github.com/google-gemini/gemini-cli/pull/22056)
|
||||||
- fix(core): ensure sandbox approvals are correctly persisted and matched for
|
- fix(hooks): fix BeforeAgent/AfterAgent inconsistencies (#18514) by @krishdef7
|
||||||
proactive expansions by @galz10 in
|
in [#21383](https://github.com/google-gemini/gemini-cli/pull/21383)
|
||||||
[#24577](https://github.com/google-gemini/gemini-cli/pull/24577)
|
- feat(core): implement SandboxManager interface and config schema by @galz10 in
|
||||||
- feat(cli) Scrollbar for input prompt by @jacob314 in
|
[#21774](https://github.com/google-gemini/gemini-cli/pull/21774)
|
||||||
[#21992](https://github.com/google-gemini/gemini-cli/pull/21992)
|
- docs: document npm deprecation warnings as safe to ignore by @h30s in
|
||||||
- Do not run pr-eval workflow when no steering changes detected by @alisa-alisa
|
[#20692](https://github.com/google-gemini/gemini-cli/pull/20692)
|
||||||
in [#24621](https://github.com/google-gemini/gemini-cli/pull/24621)
|
- fix: remove status/need-triage from maintainer-only issues by @SandyTao520 in
|
||||||
- Fix restoration of topic headers. by @gundermanc in
|
[#22044](https://github.com/google-gemini/gemini-cli/pull/22044)
|
||||||
[#24650](https://github.com/google-gemini/gemini-cli/pull/24650)
|
- fix(core): propagate subagent context to policy engine by @NTaylorMullen in
|
||||||
- feat(core): discourage update topic tool for simple tasks by @Samee24 in
|
[#22086](https://github.com/google-gemini/gemini-cli/pull/22086)
|
||||||
[#24640](https://github.com/google-gemini/gemini-cli/pull/24640)
|
- fix(cli): resolve skill uninstall failure when skill name is updated by
|
||||||
- fix(core): ensure global temp directory is always in sandbox allowed paths by
|
@NTaylorMullen in
|
||||||
@galz10 in [#24638](https://github.com/google-gemini/gemini-cli/pull/24638)
|
[#22085](https://github.com/google-gemini/gemini-cli/pull/22085)
|
||||||
- fix(core): detect uninitialized lines by @jacob314 in
|
- docs(plan): clarify interactive plan editing with Ctrl+X by @Adib234 in
|
||||||
[#24646](https://github.com/google-gemini/gemini-cli/pull/24646)
|
[#22076](https://github.com/google-gemini/gemini-cli/pull/22076)
|
||||||
- docs: update sandboxing documentation and toolSandboxing settings by @galz10
|
- fix(policy): ensure user policies are loaded when policyPaths is empty by
|
||||||
in [#24655](https://github.com/google-gemini/gemini-cli/pull/24655)
|
@NTaylorMullen in
|
||||||
- feat(cli): enhance tool confirmation UI and selection layout by @galz10 in
|
[#22090](https://github.com/google-gemini/gemini-cli/pull/22090)
|
||||||
[#24376](https://github.com/google-gemini/gemini-cli/pull/24376)
|
- Docs: Add documentation for model steering (experimental). by @jkcinouye in
|
||||||
- feat(acp): add support for `/about` command by @sripasg in
|
[#21154](https://github.com/google-gemini/gemini-cli/pull/21154)
|
||||||
[#24649](https://github.com/google-gemini/gemini-cli/pull/24649)
|
- Add issue for automated changelogs by @g-samroberts in
|
||||||
- feat(cli): add role specific metrics to /stats by @cynthialong0-0 in
|
[#21912](https://github.com/google-gemini/gemini-cli/pull/21912)
|
||||||
[#24659](https://github.com/google-gemini/gemini-cli/pull/24659)
|
- fix(core): secure argsPattern and revert WEB_FETCH_TOOL_NAME escalation by
|
||||||
- split context by @jacob314 in
|
@spencer426 in
|
||||||
[#24623](https://github.com/google-gemini/gemini-cli/pull/24623)
|
[#22104](https://github.com/google-gemini/gemini-cli/pull/22104)
|
||||||
- fix(cli): remove -S from shebang to fix Windows and BSD execution by
|
- feat(core): differentiate User-Agent for a2a-server and ACP clients by
|
||||||
@scidomino in [#24756](https://github.com/google-gemini/gemini-cli/pull/24756)
|
@bdmorgan in [#22059](https://github.com/google-gemini/gemini-cli/pull/22059)
|
||||||
- Fix issue where topic headers can be posted back to back by @gundermanc in
|
- refactor(core): extract ExecutionLifecycleService for tool backgrounding by
|
||||||
[#24759](https://github.com/google-gemini/gemini-cli/pull/24759)
|
@adamfweidman in
|
||||||
- fix(core): handle partial llm_request in BeforeModel hook override by
|
[#21717](https://github.com/google-gemini/gemini-cli/pull/21717)
|
||||||
@krishdef7 in [#22326](https://github.com/google-gemini/gemini-cli/pull/22326)
|
- feat: Display pending and confirming tool calls by @sripasg in
|
||||||
- fix(ui): improve narration suppression and reduce flicker by @gundermanc in
|
[#22106](https://github.com/google-gemini/gemini-cli/pull/22106)
|
||||||
[#24635](https://github.com/google-gemini/gemini-cli/pull/24635)
|
- feat(browser): implement input blocker overlay during automation by
|
||||||
- fix(ui): fixed auth race condition causing logo to flicker by @devr0306 in
|
@kunal-10-cloud in
|
||||||
[#24652](https://github.com/google-gemini/gemini-cli/pull/24652)
|
[#21132](https://github.com/google-gemini/gemini-cli/pull/21132)
|
||||||
- fix(browser): remove premature browser cleanup after subagent invocation by
|
- fix: register themes on extension load not start by @jackwotherspoon in
|
||||||
|
[#22148](https://github.com/google-gemini/gemini-cli/pull/22148)
|
||||||
|
- feat(ui): Do not show Ultra users /upgrade hint (#22154) by @sehoon38 in
|
||||||
|
[#22156](https://github.com/google-gemini/gemini-cli/pull/22156)
|
||||||
|
- chore: remove unnecessary log for themes by @jackwotherspoon in
|
||||||
|
[#22165](https://github.com/google-gemini/gemini-cli/pull/22165)
|
||||||
|
- fix(core): resolve MCP tool FQN validation, schema export, and wildcards in
|
||||||
|
subagents by @abhipatel12 in
|
||||||
|
[#22069](https://github.com/google-gemini/gemini-cli/pull/22069)
|
||||||
|
- fix(cli): validate --model argument at startup by @JaisalJain in
|
||||||
|
[#21393](https://github.com/google-gemini/gemini-cli/pull/21393)
|
||||||
|
- fix(core): handle policy ALLOW for exit_plan_mode by @backnotprop in
|
||||||
|
[#21802](https://github.com/google-gemini/gemini-cli/pull/21802)
|
||||||
|
- feat(telemetry): add Clearcut instrumentation for AI credits billing events by
|
||||||
@gsquared94 in
|
@gsquared94 in
|
||||||
[#24753](https://github.com/google-gemini/gemini-cli/pull/24753)
|
[#22153](https://github.com/google-gemini/gemini-cli/pull/22153)
|
||||||
- Revert "feat(core,cli): prioritize summary for topics (#24608)" by
|
- feat(core): add google credentials provider for remote agents by @adamfweidman
|
||||||
|
in [#21024](https://github.com/google-gemini/gemini-cli/pull/21024)
|
||||||
|
- test(cli): add integration test for node deprecation warnings by @Nixxx19 in
|
||||||
|
[#20215](https://github.com/google-gemini/gemini-cli/pull/20215)
|
||||||
|
- feat(cli): allow safe tools to execute concurrently while agent is busy by
|
||||||
|
@spencer426 in
|
||||||
|
[#21988](https://github.com/google-gemini/gemini-cli/pull/21988)
|
||||||
|
- feat(core): implement model-driven parallel tool scheduler by @abhipatel12 in
|
||||||
|
[#21933](https://github.com/google-gemini/gemini-cli/pull/21933)
|
||||||
|
- update vulnerable deps by @scidomino in
|
||||||
|
[#22180](https://github.com/google-gemini/gemini-cli/pull/22180)
|
||||||
|
- fix(core): fix startup stats to use int values for timestamps and durations by
|
||||||
|
@yunaseoul in [#22201](https://github.com/google-gemini/gemini-cli/pull/22201)
|
||||||
|
- fix(core): prevent duplicate tool schemas for instantiated tools by
|
||||||
|
@abhipatel12 in
|
||||||
|
[#22204](https://github.com/google-gemini/gemini-cli/pull/22204)
|
||||||
|
- fix(core): add proxy routing support for remote A2A subagents by @adamfweidman
|
||||||
|
in [#22199](https://github.com/google-gemini/gemini-cli/pull/22199)
|
||||||
|
- fix(core/ide): add Antigravity CLI fallbacks by @apfine in
|
||||||
|
[#22030](https://github.com/google-gemini/gemini-cli/pull/22030)
|
||||||
|
- fix(browser): fix duplicate function declaration error in browser agent by
|
||||||
|
@gsquared94 in
|
||||||
|
[#22207](https://github.com/google-gemini/gemini-cli/pull/22207)
|
||||||
|
- feat(core): implement Stage 1 improvements for webfetch tool by @aishaneeshah
|
||||||
|
in [#21313](https://github.com/google-gemini/gemini-cli/pull/21313)
|
||||||
|
- Changelog for v0.34.0-preview.1 by @gemini-cli-robot in
|
||||||
|
[#22194](https://github.com/google-gemini/gemini-cli/pull/22194)
|
||||||
|
- perf(cli): enable code splitting and deferred UI loading by @sehoon38 in
|
||||||
|
[#22117](https://github.com/google-gemini/gemini-cli/pull/22117)
|
||||||
|
- fix: remove unused img.png from project root by @SandyTao520 in
|
||||||
|
[#22222](https://github.com/google-gemini/gemini-cli/pull/22222)
|
||||||
|
- docs(local model routing): add docs on how to use Gemma for local model
|
||||||
|
routing by @douglas-reid in
|
||||||
|
[#21365](https://github.com/google-gemini/gemini-cli/pull/21365)
|
||||||
|
- feat(a2a): enable native gRPC support and protocol routing by @alisa-alisa in
|
||||||
|
[#21403](https://github.com/google-gemini/gemini-cli/pull/21403)
|
||||||
|
- fix(cli): escape @ symbols on paste to prevent unintended file expansion by
|
||||||
|
@krishdef7 in [#21239](https://github.com/google-gemini/gemini-cli/pull/21239)
|
||||||
|
- feat(core): add trajectoryId to ConversationOffered telemetry by @yunaseoul in
|
||||||
|
[#22214](https://github.com/google-gemini/gemini-cli/pull/22214)
|
||||||
|
- docs: clarify that tools.core is an allowlist for ALL built-in tools by
|
||||||
|
@hobostay in [#18813](https://github.com/google-gemini/gemini-cli/pull/18813)
|
||||||
|
- docs(plan): document hooks with plan mode by @ruomengz in
|
||||||
|
[#22197](https://github.com/google-gemini/gemini-cli/pull/22197)
|
||||||
|
- Changelog for v0.33.1 by @gemini-cli-robot in
|
||||||
|
[#22235](https://github.com/google-gemini/gemini-cli/pull/22235)
|
||||||
|
- build(ci): fix false positive evals trigger on merge commits by @gundermanc in
|
||||||
|
[#22237](https://github.com/google-gemini/gemini-cli/pull/22237)
|
||||||
|
- fix(core): explicitly pass messageBus to policy engine for MCP tool saves by
|
||||||
|
@abhipatel12 in
|
||||||
|
[#22255](https://github.com/google-gemini/gemini-cli/pull/22255)
|
||||||
|
- feat(core): Fully migrate packages/core to AgentLoopContext. by @joshualitt in
|
||||||
|
[#22115](https://github.com/google-gemini/gemini-cli/pull/22115)
|
||||||
|
- feat(core): increase sub-agent turn and time limits by @bdmorgan in
|
||||||
|
[#22196](https://github.com/google-gemini/gemini-cli/pull/22196)
|
||||||
|
- feat(core): instrument file system tools for JIT context discovery by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#22082](https://github.com/google-gemini/gemini-cli/pull/22082)
|
||||||
|
- refactor(ui): extract pure session browser utilities by @abhipatel12 in
|
||||||
|
[#22256](https://github.com/google-gemini/gemini-cli/pull/22256)
|
||||||
|
- fix(plan): Fix AskUser evals by @Adib234 in
|
||||||
|
[#22074](https://github.com/google-gemini/gemini-cli/pull/22074)
|
||||||
|
- fix(settings): prevent j/k navigation keys from intercepting edit buffer input
|
||||||
|
by @student-ankitpandit in
|
||||||
|
[#21865](https://github.com/google-gemini/gemini-cli/pull/21865)
|
||||||
|
- feat(skills): improve async-pr-review workflow and logging by @mattKorwel in
|
||||||
|
[#21790](https://github.com/google-gemini/gemini-cli/pull/21790)
|
||||||
|
- refactor(cli): consolidate getErrorMessage utility to core by @scidomino in
|
||||||
|
[#22190](https://github.com/google-gemini/gemini-cli/pull/22190)
|
||||||
|
- fix(core): show descriptive error messages when saving settings fails by
|
||||||
|
@afarber in [#18095](https://github.com/google-gemini/gemini-cli/pull/18095)
|
||||||
|
- docs(core): add authentication guide for remote subagents by @adamfweidman in
|
||||||
|
[#22178](https://github.com/google-gemini/gemini-cli/pull/22178)
|
||||||
|
- docs: overhaul subagents documentation and add /agents command by @abhipatel12
|
||||||
|
in [#22345](https://github.com/google-gemini/gemini-cli/pull/22345)
|
||||||
|
- refactor(ui): extract SessionBrowser static ui components by @abhipatel12 in
|
||||||
|
[#22348](https://github.com/google-gemini/gemini-cli/pull/22348)
|
||||||
|
- test: add Object.create context regression test and tool confirmation
|
||||||
|
integration test by @gsquared94 in
|
||||||
|
[#22356](https://github.com/google-gemini/gemini-cli/pull/22356)
|
||||||
|
- feat(tracker): return TodoList display for tracker tools by @anj-s in
|
||||||
|
[#22060](https://github.com/google-gemini/gemini-cli/pull/22060)
|
||||||
|
- feat(agent): add allowed domain restrictions for browser agent by
|
||||||
|
@cynthialong0-0 in
|
||||||
|
[#21775](https://github.com/google-gemini/gemini-cli/pull/21775)
|
||||||
|
- chore/release: bump version to 0.35.0-nightly.20260313.bb060d7a9 by
|
||||||
|
@gemini-cli-robot in
|
||||||
|
[#22251](https://github.com/google-gemini/gemini-cli/pull/22251)
|
||||||
|
- Move keychain fallback to keychain service by @chrstnb in
|
||||||
|
[#22332](https://github.com/google-gemini/gemini-cli/pull/22332)
|
||||||
|
- feat(core): integrate SandboxManager to sandbox all process-spawning tools by
|
||||||
|
@galz10 in [#22231](https://github.com/google-gemini/gemini-cli/pull/22231)
|
||||||
|
- fix(cli): support CJK input and full Unicode scalar values in terminal
|
||||||
|
protocols by @scidomino in
|
||||||
|
[#22353](https://github.com/google-gemini/gemini-cli/pull/22353)
|
||||||
|
- Promote stable tests. by @gundermanc in
|
||||||
|
[#22253](https://github.com/google-gemini/gemini-cli/pull/22253)
|
||||||
|
- feat(tracker): add tracker policy by @anj-s in
|
||||||
|
[#22379](https://github.com/google-gemini/gemini-cli/pull/22379)
|
||||||
|
- feat(security): add disableAlwaysAllow setting to disable auto-approvals by
|
||||||
|
@galz10 in [#21941](https://github.com/google-gemini/gemini-cli/pull/21941)
|
||||||
|
- Revert "fix(cli): validate --model argument at startup" by @sehoon38 in
|
||||||
|
[#22378](https://github.com/google-gemini/gemini-cli/pull/22378)
|
||||||
|
- fix(mcp): handle equivalent root resource URLs in OAuth validation by @galz10
|
||||||
|
in [#20231](https://github.com/google-gemini/gemini-cli/pull/20231)
|
||||||
|
- fix(core): use session-specific temp directory for task tracker by @anj-s in
|
||||||
|
[#22382](https://github.com/google-gemini/gemini-cli/pull/22382)
|
||||||
|
- Fix issue where config was undefined. by @gundermanc in
|
||||||
|
[#22397](https://github.com/google-gemini/gemini-cli/pull/22397)
|
||||||
|
- fix(core): deduplicate project memory when JIT context is enabled by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#22234](https://github.com/google-gemini/gemini-cli/pull/22234)
|
||||||
|
- feat(prompts): implement Topic-Action-Summary model for verbosity reduction by
|
||||||
@Abhijit-2592 in
|
@Abhijit-2592 in
|
||||||
[#24777](https://github.com/google-gemini/gemini-cli/pull/24777)
|
[#21503](https://github.com/google-gemini/gemini-cli/pull/21503)
|
||||||
- relax tool sandboxing overrides for plan mode to match defaults. by
|
- fix(core): fix manual deletion of subagent histories by @abhipatel12 in
|
||||||
@DavidAPierce in
|
[#22407](https://github.com/google-gemini/gemini-cli/pull/22407)
|
||||||
[#24762](https://github.com/google-gemini/gemini-cli/pull/24762)
|
- Add registry var by @kevinjwang1 in
|
||||||
- fix(cli): respect global environment variable allowlist by @scidomino in
|
[#22224](https://github.com/google-gemini/gemini-cli/pull/22224)
|
||||||
[#24767](https://github.com/google-gemini/gemini-cli/pull/24767)
|
- Add ModelDefinitions to ModelConfigService by @kevinjwang1 in
|
||||||
- fix(cli): ensure skills list outputs to stdout in non-interactive environments
|
[#22302](https://github.com/google-gemini/gemini-cli/pull/22302)
|
||||||
by @spencer426 in
|
- fix(cli): improve command conflict handling for skills by @NTaylorMullen in
|
||||||
[#24566](https://github.com/google-gemini/gemini-cli/pull/24566)
|
[#21942](https://github.com/google-gemini/gemini-cli/pull/21942)
|
||||||
- Add an eval for and fix unsafe cloning behavior. by @gundermanc in
|
- fix(core): merge user settings with extension-provided MCP servers by
|
||||||
[#24457](https://github.com/google-gemini/gemini-cli/pull/24457)
|
@abhipatel12 in
|
||||||
- fix(policy): allow complete_task in plan mode by @abhipatel12 in
|
[#22484](https://github.com/google-gemini/gemini-cli/pull/22484)
|
||||||
[#24771](https://github.com/google-gemini/gemini-cli/pull/24771)
|
- fix(core): skip discovery for incomplete MCP configs and resolve merge race
|
||||||
- feat(telemetry): add browser agent clearcut metrics by @gsquared94 in
|
condition by @abhipatel12 in
|
||||||
[#24688](https://github.com/google-gemini/gemini-cli/pull/24688)
|
[#22494](https://github.com/google-gemini/gemini-cli/pull/22494)
|
||||||
- feat(cli): support selective topic expansion and click-to-expand by
|
- fix(automation): harden stale PR closer permissions and maintainer detection
|
||||||
@Abhijit-2592 in
|
by @bdmorgan in
|
||||||
[#24793](https://github.com/google-gemini/gemini-cli/pull/24793)
|
[#22558](https://github.com/google-gemini/gemini-cli/pull/22558)
|
||||||
- temporarily disable sandbox integration test on windows by @ehedlund in
|
- fix(automation): evaluate staleness before checking protected labels by
|
||||||
[#24786](https://github.com/google-gemini/gemini-cli/pull/24786)
|
@bdmorgan in [#22561](https://github.com/google-gemini/gemini-cli/pull/22561)
|
||||||
- Remove flakey test by @scidomino in
|
- feat(agent): replace the runtime npx for browser agent chrome devtool mcp with
|
||||||
[#24837](https://github.com/google-gemini/gemini-cli/pull/24837)
|
pre-built bundle by @cynthialong0-0 in
|
||||||
- Alisa/approve button by @alisa-alisa in
|
[#22213](https://github.com/google-gemini/gemini-cli/pull/22213)
|
||||||
[#24645](https://github.com/google-gemini/gemini-cli/pull/24645)
|
- perf: optimize TrackerService dependency checks by @anj-s in
|
||||||
- feat(hooks): display hook system messages in UI by @mbleigh in
|
[#22384](https://github.com/google-gemini/gemini-cli/pull/22384)
|
||||||
[#24616](https://github.com/google-gemini/gemini-cli/pull/24616)
|
- docs(policy): remove trailing space from commandPrefix examples by @kawasin73
|
||||||
- fix(core): propagate BeforeModel hook model override end-to-end by @krishdef7
|
in [#22264](https://github.com/google-gemini/gemini-cli/pull/22264)
|
||||||
in [#24784](https://github.com/google-gemini/gemini-cli/pull/24784)
|
- fix(a2a-server): resolve unsafe assignment lint errors by @ehedlund in
|
||||||
- chore: fix formatting for behavioral eval skill reference file by @abhipatel12
|
[#22661](https://github.com/google-gemini/gemini-cli/pull/22661)
|
||||||
in [#24846](https://github.com/google-gemini/gemini-cli/pull/24846)
|
- fix: Adjust ToolGroupMessage filtering to hide Confirming and show Canceled
|
||||||
- fix: use directory junctions on Windows for skill linking by @enjoykumawat in
|
tool calls. by @sripasg in
|
||||||
[#24823](https://github.com/google-gemini/gemini-cli/pull/24823)
|
[#22230](https://github.com/google-gemini/gemini-cli/pull/22230)
|
||||||
- fix(cli): prevent multiple banner increments on remount by @sehoon38 in
|
- Disallow Object.create() and reflect. by @gundermanc in
|
||||||
[#24843](https://github.com/google-gemini/gemini-cli/pull/24843)
|
[#22408](https://github.com/google-gemini/gemini-cli/pull/22408)
|
||||||
- feat(acp): add /help command by @sripasg in
|
- Guard pro model usage by @sehoon38 in
|
||||||
[#24839](https://github.com/google-gemini/gemini-cli/pull/24839)
|
[#22665](https://github.com/google-gemini/gemini-cli/pull/22665)
|
||||||
- fix(core): remove tmux alternate buffer warning by @jackwotherspoon in
|
- refactor(core): Creates AgentSession abstraction for consolidated agent
|
||||||
[#24852](https://github.com/google-gemini/gemini-cli/pull/24852)
|
interface. by @mbleigh in
|
||||||
- Improve sandbox error matching and caching by @DavidAPierce in
|
[#22270](https://github.com/google-gemini/gemini-cli/pull/22270)
|
||||||
[#24550](https://github.com/google-gemini/gemini-cli/pull/24550)
|
- docs(changelog): remove internal commands from release notes by
|
||||||
- feat(core): add agent protocol UI types and experimental flag by @mbleigh in
|
@jackwotherspoon in
|
||||||
[#24275](https://github.com/google-gemini/gemini-cli/pull/24275)
|
[#22529](https://github.com/google-gemini/gemini-cli/pull/22529)
|
||||||
- feat(core): use experiment flags for default fetch timeouts by @yunaseoul in
|
- feat: enable subagents by @abhipatel12 in
|
||||||
[#24261](https://github.com/google-gemini/gemini-cli/pull/24261)
|
[#22386](https://github.com/google-gemini/gemini-cli/pull/22386)
|
||||||
- Revert "fix(ui): improve narration suppression and reduce flicker (#2… by
|
- feat(extensions): implement cryptographic integrity verification for extension
|
||||||
@gundermanc in
|
updates by @ehedlund in
|
||||||
[#24857](https://github.com/google-gemini/gemini-cli/pull/24857)
|
[#21772](https://github.com/google-gemini/gemini-cli/pull/21772)
|
||||||
- refactor(cli): remove duplication in interactive shell awaiting input hint by
|
- feat(tracker): polish UI sorting and formatting by @anj-s in
|
||||||
@JayadityaGit in
|
[#22437](https://github.com/google-gemini/gemini-cli/pull/22437)
|
||||||
[#24801](https://github.com/google-gemini/gemini-cli/pull/24801)
|
- Changelog for v0.34.0-preview.2 by @gemini-cli-robot in
|
||||||
- refactor(core): make LegacyAgentSession dependencies optional by @mbleigh in
|
[#22220](https://github.com/google-gemini/gemini-cli/pull/22220)
|
||||||
[#24287](https://github.com/google-gemini/gemini-cli/pull/24287)
|
- fix(core): fix three JIT context bugs in read_file, read_many_files, and
|
||||||
- Changelog for v0.37.0-preview.2 by @gemini-cli-robot in
|
memoryDiscovery by @SandyTao520 in
|
||||||
[#24848](https://github.com/google-gemini/gemini-cli/pull/24848)
|
[#22679](https://github.com/google-gemini/gemini-cli/pull/22679)
|
||||||
- fix(cli): always show shell command description or actual command by @jacob314
|
- refactor(core): introduce InjectionService with source-aware injection and
|
||||||
in [#24774](https://github.com/google-gemini/gemini-cli/pull/24774)
|
backend-native background completions by @adamfweidman in
|
||||||
- Added flag for ept size and increased default size by @devr0306 in
|
[#22544](https://github.com/google-gemini/gemini-cli/pull/22544)
|
||||||
[#24859](https://github.com/google-gemini/gemini-cli/pull/24859)
|
- Linux sandbox bubblewrap by @DavidAPierce in
|
||||||
- fix(core): dispose Scheduler to prevent McpProgress listener leak by
|
[#22680](https://github.com/google-gemini/gemini-cli/pull/22680)
|
||||||
@Anjaligarhwal in
|
- feat(core): increase thought signature retry resilience by @bdmorgan in
|
||||||
[#24870](https://github.com/google-gemini/gemini-cli/pull/24870)
|
[#22202](https://github.com/google-gemini/gemini-cli/pull/22202)
|
||||||
- fix(cli): switch default back to terminalBuffer=false and fix regressions
|
- feat(core): implement Stage 2 security and consistency improvements for
|
||||||
introduced for that mode by @jacob314 in
|
web_fetch by @aishaneeshah in
|
||||||
[#24873](https://github.com/google-gemini/gemini-cli/pull/24873)
|
[#22217](https://github.com/google-gemini/gemini-cli/pull/22217)
|
||||||
- feat(cli): switch to ctrl+g from ctrl-x by @jacob314 in
|
- refactor(core): replace positional execute params with ExecuteOptions bag by
|
||||||
[#24861](https://github.com/google-gemini/gemini-cli/pull/24861)
|
@adamfweidman in
|
||||||
- fix: isolate concurrent browser agent instances by @gsquared94 in
|
[#22674](https://github.com/google-gemini/gemini-cli/pull/22674)
|
||||||
[#24794](https://github.com/google-gemini/gemini-cli/pull/24794)
|
- feat(config): enable JIT context loading by default by @SandyTao520 in
|
||||||
- docs: update MCP server OAuth redirect port documentation by @adamfweidman in
|
[#22736](https://github.com/google-gemini/gemini-cli/pull/22736)
|
||||||
[#24844](https://github.com/google-gemini/gemini-cli/pull/24844)
|
- fix(config): ensure discoveryMaxDirs is passed to global config during
|
||||||
|
initialization by @kevin-ramdass in
|
||||||
|
[#22744](https://github.com/google-gemini/gemini-cli/pull/22744)
|
||||||
|
- fix(plan): allowlist get_internal_docs in Plan Mode by @Adib234 in
|
||||||
|
[#22668](https://github.com/google-gemini/gemini-cli/pull/22668)
|
||||||
|
- Changelog for v0.34.0-preview.3 by @gemini-cli-robot in
|
||||||
|
[#22393](https://github.com/google-gemini/gemini-cli/pull/22393)
|
||||||
|
- feat(core): add foundation for subagent tool isolation by @akh64bit in
|
||||||
|
[#22708](https://github.com/google-gemini/gemini-cli/pull/22708)
|
||||||
|
- fix(core): handle surrogate pairs in truncateString by @sehoon38 in
|
||||||
|
[#22754](https://github.com/google-gemini/gemini-cli/pull/22754)
|
||||||
|
- fix(cli): override j/k navigation in settings dialog to fix search input
|
||||||
|
conflict by @sehoon38 in
|
||||||
|
[#22800](https://github.com/google-gemini/gemini-cli/pull/22800)
|
||||||
|
- feat(plan): add 'All the above' option to multi-select AskUser questions by
|
||||||
|
@Adib234 in [#22365](https://github.com/google-gemini/gemini-cli/pull/22365)
|
||||||
|
- docs: distribute package-specific GEMINI.md context to each package by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#22734](https://github.com/google-gemini/gemini-cli/pull/22734)
|
||||||
|
- fix(cli): clean up stale pasted placeholder metadata after word/line deletions
|
||||||
|
by @Jomak-x in
|
||||||
|
[#20375](https://github.com/google-gemini/gemini-cli/pull/20375)
|
||||||
|
- refactor(core): align JIT memory placement with tiered context model by
|
||||||
|
@SandyTao520 in
|
||||||
|
[#22766](https://github.com/google-gemini/gemini-cli/pull/22766)
|
||||||
|
- Linux sandbox seccomp by @DavidAPierce in
|
||||||
|
[#22815](https://github.com/google-gemini/gemini-cli/pull/22815)
|
||||||
|
|
||||||
**Full Changelog**:
|
**Full Changelog**:
|
||||||
https://github.com/google-gemini/gemini-cli/compare/v0.37.0-preview.2...v0.38.0-preview.0
|
https://github.com/google-gemini/gemini-cli/compare/v0.34.0-preview.4...v0.35.0-preview.1
|
||||||
|
|||||||
@@ -1,126 +0,0 @@
|
|||||||
# ACP Mode
|
|
||||||
|
|
||||||
ACP (Agent Client Protocol) mode is a special operational mode of Gemini CLI
|
|
||||||
designed for programmatic control, primarily for IDE and other developer tool
|
|
||||||
integrations. It uses a JSON-RPC protocol over stdio to communicate between
|
|
||||||
Gemini CLI agent and a client.
|
|
||||||
|
|
||||||
To start Gemini CLI in ACP mode, use the `--acp` flag:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini --acp
|
|
||||||
```
|
|
||||||
|
|
||||||
## Agent Client Protocol (ACP)
|
|
||||||
|
|
||||||
ACP is an open protocol that standardizes how AI coding agents communicate with
|
|
||||||
code editors and IDEs. It addresses the challenge of fragmented distribution,
|
|
||||||
where agents traditionally needed custom integrations for each client. With ACP,
|
|
||||||
developers can implement their agent once, and it becomes compatible with any
|
|
||||||
ACP-compliant editor.
|
|
||||||
|
|
||||||
For a comprehensive introduction to ACP, including its architecture and
|
|
||||||
benefits, refer to the official
|
|
||||||
[ACP Introduction](https://agentclientprotocol.com/get-started/introduction)
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
### Existing integrations using ACP
|
|
||||||
|
|
||||||
The ACP Agent Registry simplifies the distribution and management of
|
|
||||||
ACP-compatible agents across various IDEs. Gemini CLI is an ACP-compatible agent
|
|
||||||
and can be found in this registry.
|
|
||||||
|
|
||||||
For more general information about the registry, and how to use it with specific
|
|
||||||
IDEs like JetBrains and Zed, refer to the
|
|
||||||
[IDE Integration](../ide-integration/index.md) documentation.
|
|
||||||
|
|
||||||
You can also find more information on the official
|
|
||||||
[ACP Agent Registry](https://agentclientprotocol.com/get-started/registry) page.
|
|
||||||
|
|
||||||
## Architecture and protocol basics
|
|
||||||
|
|
||||||
ACP mode establishes a client-server relationship between your tool (the client)
|
|
||||||
and Gemini CLI (the server).
|
|
||||||
|
|
||||||
- **Communication:** The entire communication happens over standard input/output
|
|
||||||
(stdio) using the JSON-RPC 2.0 protocol.
|
|
||||||
- **Client's role:** The client is responsible for sending requests (e.g.,
|
|
||||||
prompts) and handling responses and notifications from Gemini CLI.
|
|
||||||
- **Gemini CLI's role:** In ACP mode, Gemini CLI listens for incoming JSON-RPC
|
|
||||||
requests, processes them, and sends back responses.
|
|
||||||
|
|
||||||
The core of the ACP implementation can be found in
|
|
||||||
`packages/cli/src/acp/acpClient.ts`.
|
|
||||||
|
|
||||||
### Extending with MCP
|
|
||||||
|
|
||||||
ACP can be used with the Model Context Protocol (MCP). This lets an ACP client
|
|
||||||
(like an IDE) expose its own functionality as "tools" that the Gemini model can
|
|
||||||
use.
|
|
||||||
|
|
||||||
1. The client implements an **MCP server** that advertises its tools.
|
|
||||||
2. During the ACP `initialize` handshake, the client provides the connection
|
|
||||||
details for its MCP server.
|
|
||||||
3. Gemini CLI connects to the MCP server, discovers the available tools, and
|
|
||||||
makes them available to the AI model.
|
|
||||||
4. When the model decides to use one of these tools, Gemini CLI sends a tool
|
|
||||||
call request to the MCP server.
|
|
||||||
|
|
||||||
This mechanism lets for a powerful, two-way integration where the agent can
|
|
||||||
leverage the IDE's capabilities to perform tasks. The MCP client logic is in
|
|
||||||
`packages/core/src/tools/mcp-client.ts`.
|
|
||||||
|
|
||||||
## Capabilities and supported methods
|
|
||||||
|
|
||||||
The ACP protocol exposes a number of methods for ACP clients (e.g. IDEs) to
|
|
||||||
control Gemini CLI.
|
|
||||||
|
|
||||||
### Core methods
|
|
||||||
|
|
||||||
- `initialize`: Establishes the initial connection and lets the client to
|
|
||||||
register its MCP server.
|
|
||||||
- `authenticate`: Authenticates the user.
|
|
||||||
- `newSession`: Starts a new chat session.
|
|
||||||
- `loadSession`: Loads a previous session.
|
|
||||||
- `prompt`: Sends a prompt to the agent.
|
|
||||||
- `cancel`: Cancels an ongoing prompt.
|
|
||||||
|
|
||||||
### Session control
|
|
||||||
|
|
||||||
- `setSessionMode`: Allows changing the approval level for tool calls (e.g., to
|
|
||||||
`auto-approve`).
|
|
||||||
- `unstable_setSessionModel`: Changes the model for the current session.
|
|
||||||
|
|
||||||
### File system proxy
|
|
||||||
|
|
||||||
ACP includes a proxied file system service. This means that when the agent needs
|
|
||||||
to read or write files, it does so through the ACP client. This is a security
|
|
||||||
feature that ensures the agent only has access to the files that the client (and
|
|
||||||
by extension, the user) has explicitly allowed.
|
|
||||||
|
|
||||||
## Debugging and telemetry
|
|
||||||
|
|
||||||
You can get insights into the ACP communication and the agent's behavior through
|
|
||||||
debugging logs and telemetry.
|
|
||||||
|
|
||||||
### Debugging logs
|
|
||||||
|
|
||||||
To enable general debugging logs, start Gemini CLI with the `--debug` flag:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini --acp --debug
|
|
||||||
```
|
|
||||||
|
|
||||||
### Telemetry
|
|
||||||
|
|
||||||
For more detailed telemetry, you can use the following environment variables to
|
|
||||||
capture telemetry data to a file:
|
|
||||||
|
|
||||||
- `GEMINI_TELEMETRY_ENABLED=true`
|
|
||||||
- `GEMINI_TELEMETRY_TARGET=local`
|
|
||||||
- `GEMINI_TELEMETRY_OUTFILE=/path/to/your/log.json`
|
|
||||||
|
|
||||||
This will write a JSON log file containing detailed information about all the
|
|
||||||
events happening within the agent, including ACP requests and responses. The
|
|
||||||
integration test `integration-tests/acp-telemetry.test.ts` provides a working
|
|
||||||
example of how to set this up.
|
|
||||||
@@ -39,9 +39,7 @@ file in your project's temporary directory, typically located at
|
|||||||
The Checkpointing feature is disabled by default. To enable it, you need to edit
|
The Checkpointing feature is disabled by default. To enable it, you need to edit
|
||||||
your `settings.json` file.
|
your `settings.json` file.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The `--checkpointing` command-line flag was removed in version
|
||||||
> [!CAUTION]
|
|
||||||
> The `--checkpointing` command-line flag was removed in version
|
|
||||||
> 0.11.0. Checkpointing can now only be enabled through the `settings.json`
|
> 0.11.0. Checkpointing can now only be enabled through the `settings.json`
|
||||||
> configuration file.
|
> configuration file.
|
||||||
|
|
||||||
|
|||||||
@@ -50,9 +50,8 @@ These commands are available within the interactive REPL.
|
|||||||
| `--model` | `-m` | string | `auto` | Model to use. See [Model Selection](#model-selection) for available values. |
|
| `--model` | `-m` | string | `auto` | Model to use. See [Model Selection](#model-selection) for available values. |
|
||||||
| `--prompt` | `-p` | string | - | Prompt text. Appended to stdin input if provided. Forces non-interactive mode. |
|
| `--prompt` | `-p` | string | - | Prompt text. Appended to stdin input if provided. Forces non-interactive mode. |
|
||||||
| `--prompt-interactive` | `-i` | string | - | Execute prompt and continue in interactive mode |
|
| `--prompt-interactive` | `-i` | string | - | Execute prompt and continue in interactive mode |
|
||||||
| `--worktree` | `-w` | string | - | Start Gemini in a new git worktree. If no name is provided, one is generated automatically. Requires `experimental.worktrees: true` in settings. |
|
|
||||||
| `--sandbox` | `-s` | boolean | `false` | Run in a sandboxed environment for safer execution |
|
| `--sandbox` | `-s` | boolean | `false` | Run in a sandboxed environment for safer execution |
|
||||||
| `--approval-mode` | - | string | `default` | Approval mode for tool execution. Choices: `default`, `auto_edit`, `yolo`, `plan` |
|
| `--approval-mode` | - | string | `default` | Approval mode for tool execution. Choices: `default`, `auto_edit`, `yolo` |
|
||||||
| `--yolo` | `-y` | boolean | `false` | **Deprecated.** Auto-approve all actions. Use `--approval-mode=yolo` instead. |
|
| `--yolo` | `-y` | boolean | `false` | **Deprecated.** Auto-approve all actions. Use `--approval-mode=yolo` instead. |
|
||||||
| `--experimental-acp` | - | boolean | - | Start in ACP (Agent Code Pilot) mode. **Experimental feature.** |
|
| `--experimental-acp` | - | boolean | - | Start in ACP (Agent Code Pilot) mode. **Experimental feature.** |
|
||||||
| `--experimental-zed-integration` | - | boolean | - | Run in Zed editor integration mode. **Experimental feature.** |
|
| `--experimental-zed-integration` | - | boolean | - | Run in Zed editor integration mode. **Experimental feature.** |
|
||||||
|
|||||||
@@ -30,9 +30,7 @@ separator (`/` or `\`) being converted to a colon (`:`).
|
|||||||
- A file at `<project>/.gemini/commands/git/commit.toml` becomes the namespaced
|
- A file at `<project>/.gemini/commands/git/commit.toml` becomes the namespaced
|
||||||
command `/git:commit`.
|
command `/git:commit`.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> [!TIP] After creating or modifying `.toml` command files, run
|
||||||
> [!TIP]
|
|
||||||
> After creating or modifying `.toml` command files, run
|
|
||||||
> `/commands reload` to pick up your changes without restarting the CLI.
|
> `/commands reload` to pick up your changes without restarting the CLI.
|
||||||
|
|
||||||
## TOML file format (v1)
|
## TOML file format (v1)
|
||||||
@@ -179,10 +177,10 @@ ensure that only intended commands can be run.
|
|||||||
automatically shell-escaped (see
|
automatically shell-escaped (see
|
||||||
[Context-Aware Injection](#1-context-aware-injection-with-args) above).
|
[Context-Aware Injection](#1-context-aware-injection-with-args) above).
|
||||||
3. **Robust parsing:** The parser correctly handles complex shell commands that
|
3. **Robust parsing:** The parser correctly handles complex shell commands that
|
||||||
include nested braces, such as JSON payloads. The content inside `!{...}`
|
include nested braces, such as JSON payloads. **Note:** The content inside
|
||||||
must have balanced braces (`{` and `}`). If you need to execute a command
|
`!{...}` must have balanced braces (`{` and `}`). If you need to execute a
|
||||||
containing unbalanced braces, consider wrapping it in an external script
|
command containing unbalanced braces, consider wrapping it in an external
|
||||||
file and calling the script within the `!{...}` block.
|
script file and calling the script within the `!{...}` block.
|
||||||
4. **Security check and confirmation:** The CLI performs a security check on
|
4. **Security check and confirmation:** The CLI performs a security check on
|
||||||
the final, resolved command (after arguments are escaped and substituted). A
|
the final, resolved command (after arguments are escaped and substituted). A
|
||||||
dialog will appear showing the exact command(s) to be executed.
|
dialog will appear showing the exact command(s) to be executed.
|
||||||
|
|||||||
+9
-15
@@ -5,11 +5,9 @@ and managing Gemini CLI in an enterprise environment. By leveraging system-level
|
|||||||
settings, administrators can enforce security policies, manage tool access, and
|
settings, administrators can enforce security policies, manage tool access, and
|
||||||
ensure a consistent experience for all users.
|
ensure a consistent experience for all users.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **A note on security:** The patterns described in this document are intended
|
||||||
> [!WARNING]
|
> to help administrators create a more controlled and secure environment for
|
||||||
> The patterns described in this document are intended to help
|
> using Gemini CLI. However, they should not be considered a foolproof security
|
||||||
> administrators create a more controlled and secure environment for using
|
|
||||||
> Gemini CLI. However, they should not be considered a foolproof security
|
|
||||||
> boundary. A determined user with sufficient privileges on their local machine
|
> boundary. A determined user with sufficient privileges on their local machine
|
||||||
> may still be able to circumvent these configurations. These measures are
|
> may still be able to circumvent these configurations. These measures are
|
||||||
> designed to prevent accidental misuse and enforce corporate policy in a
|
> designed to prevent accidental misuse and enforce corporate policy in a
|
||||||
@@ -282,12 +280,10 @@ environment to a blocklist.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Security note:** Blocklisting with `excludeTools` is less secure than
|
||||||
> [!WARNING]
|
allowlisting with `coreTools`, as it relies on blocking known-bad commands, and
|
||||||
> Blocklisting with `excludeTools` is less secure than
|
clever users may find ways to bypass simple string-based blocks. **Allowlisting
|
||||||
> allowlisting with `coreTools`, as it relies on blocking known-bad commands,
|
is the recommended approach.**
|
||||||
> and clever users may find ways to bypass simple string-based blocks.
|
|
||||||
> **Allowlisting is the recommended approach.**
|
|
||||||
|
|
||||||
### Disabling YOLO mode
|
### Disabling YOLO mode
|
||||||
|
|
||||||
@@ -498,10 +494,8 @@ other events. For more information, see the
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** Ensure that `logPrompts` is set to `false` in an enterprise setting to
|
||||||
> [!NOTE]
|
avoid collecting potentially sensitive information from user prompts.
|
||||||
> Ensure that `logPrompts` is set to `false` in an enterprise setting to
|
|
||||||
> avoid collecting potentially sensitive information from user prompts.
|
|
||||||
|
|
||||||
## Authentication
|
## Authentication
|
||||||
|
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
# Git Worktrees (experimental)
|
|
||||||
|
|
||||||
When working on multiple tasks at once, you can use Git worktrees to give each
|
|
||||||
Gemini session its own copy of the codebase. Git worktrees create separate
|
|
||||||
working directories that each have their own files and branch while sharing the
|
|
||||||
same repository history. This prevents changes in one session from colliding
|
|
||||||
with another.
|
|
||||||
|
|
||||||
Learn more about [session management](./session-management.md).
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!NOTE]
|
|
||||||
> This is an experimental feature currently under active development. Your
|
|
||||||
> feedback is invaluable as we refine this feature. If you have ideas,
|
|
||||||
> suggestions, or encounter issues:
|
|
||||||
>
|
|
||||||
> - [Open an issue](https://github.com/google-gemini/gemini-cli/issues/new?template=bug_report.yml) on GitHub.
|
|
||||||
> - Use the **/bug** command within Gemini CLI to file an issue.
|
|
||||||
|
|
||||||
Learn more in the official Git worktree
|
|
||||||
[documentation](https://git-scm.com/docs/git-worktree).
|
|
||||||
|
|
||||||
## How to enable Git worktrees
|
|
||||||
|
|
||||||
Git worktrees are an experimental feature. You must enable them in your settings
|
|
||||||
using the `/settings` command or by manually editing your `settings.json` file.
|
|
||||||
|
|
||||||
1. Use the `/settings` command.
|
|
||||||
2. Search for and set **Enable Git Worktrees** to `true`.
|
|
||||||
|
|
||||||
Alternatively, add the following to your `settings.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"experimental": {
|
|
||||||
"worktrees": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to use Git worktrees
|
|
||||||
|
|
||||||
Use the `--worktree` (`-w`) flag to create an isolated worktree and start Gemini
|
|
||||||
CLI in it.
|
|
||||||
|
|
||||||
- **Start with a specific name:** The value you pass becomes both the directory
|
|
||||||
name (within `.gemini/worktrees/`) and the branch name.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini --worktree feature-search
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Start with a random name:** If you omit the name, Gemini generates a random
|
|
||||||
one automatically (for example, `worktree-a1b2c3d4`).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gemini --worktree
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!NOTE]
|
|
||||||
> Remember to initialize your development environment in each new
|
|
||||||
> worktree according to your project's setup. Depending on your stack, this
|
|
||||||
> might include running dependency installation (`npm install`, `yarn`), setting
|
|
||||||
> up virtual environments, or following your project's standard build process.
|
|
||||||
|
|
||||||
## How to exit a Git worktree session
|
|
||||||
|
|
||||||
When you exit a worktree session (using `/quit` or `Ctrl+C`), Gemini leaves the
|
|
||||||
worktree intact so your work is not lost. This includes your uncommitted changes
|
|
||||||
(modified files, staged changes, or untracked files) and any new commits you
|
|
||||||
have made.
|
|
||||||
|
|
||||||
Gemini prioritizes a fast and safe exit: it **does not automatically delete**
|
|
||||||
your worktree or branch. You are responsible for cleaning up your worktrees
|
|
||||||
manually once you are finished with them.
|
|
||||||
|
|
||||||
When you exit, Gemini displays instructions on how to resume your work or how to
|
|
||||||
manually remove the worktree if you no longer need it.
|
|
||||||
|
|
||||||
## Resuming work in a Git worktree
|
|
||||||
|
|
||||||
To resume a session in a worktree, navigate to the worktree directory and start
|
|
||||||
Gemini CLI with the `--resume` flag and the session ID:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd .gemini/worktrees/feature-search
|
|
||||||
gemini --resume <session_id>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Managing Git worktrees manually
|
|
||||||
|
|
||||||
For more control over worktree location and branch configuration, or to clean up
|
|
||||||
a preserved worktree, you can use Git directly:
|
|
||||||
|
|
||||||
- **Clean up a preserved Git worktree:**
|
|
||||||
```bash
|
|
||||||
git worktree remove .gemini/worktrees/feature-search --force
|
|
||||||
git branch -D worktree-feature-search
|
|
||||||
```
|
|
||||||
- **Create a Git worktree manually:**
|
|
||||||
```bash
|
|
||||||
git worktree add ../project-feature-search -b feature-search
|
|
||||||
cd ../project-feature-search && gemini
|
|
||||||
```
|
|
||||||
|
|
||||||
[Open an issue]: https://github.com/google-gemini/gemini-cli/issues
|
|
||||||
@@ -4,10 +4,9 @@ Model steering lets you provide real-time guidance and feedback to Gemini CLI
|
|||||||
while it is actively executing a task. This lets you correct course, add missing
|
while it is actively executing a task. This lets you correct course, add missing
|
||||||
context, or skip unnecessary steps without having to stop and restart the agent.
|
context, or skip unnecessary steps without having to stop and restart the agent.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** This is a preview feature under active development. Preview features
|
||||||
> [!NOTE]
|
> may only be available in the **Preview** channel or may need to be enabled
|
||||||
> This is an experimental feature currently under active development and
|
> under `/settings`.
|
||||||
> may need to be enabled under `/settings`.
|
|
||||||
|
|
||||||
Model steering is particularly useful during complex [Plan Mode](./plan-mode.md)
|
Model steering is particularly useful during complex [Plan Mode](./plan-mode.md)
|
||||||
workflows or long-running subagent executions where you want to ensure the agent
|
workflows or long-running subagent executions where you want to ensure the agent
|
||||||
|
|||||||
+1
-3
@@ -5,9 +5,7 @@ used by Gemini CLI, giving you more control over your results. Use **Pro**
|
|||||||
models for complex tasks and reasoning, **Flash** models for high speed results,
|
models for complex tasks and reasoning, **Flash** models for high speed results,
|
||||||
or the (recommended) **Auto** setting to choose the best model for your tasks.
|
or the (recommended) **Auto** setting to choose the best model for your tasks.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The `/model` command (and the `--model` flag) does not override the
|
||||||
> [!NOTE]
|
|
||||||
> The `/model` command (and the `--model` flag) does not override the
|
|
||||||
> model used by sub-agents. Consequently, even when using the `/model` flag you
|
> model used by sub-agents. Consequently, even when using the `/model` flag you
|
||||||
> may see other models used in your model usage reports.
|
> may see other models used in your model usage reports.
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,9 @@ Gemini CLI can send system notifications to alert you when a session completes
|
|||||||
or when it needs your attention, such as when it's waiting for you to approve a
|
or when it needs your attention, such as when it's waiting for you to approve a
|
||||||
tool call.
|
tool call.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** This is a preview feature currently under active development.
|
||||||
> [!NOTE]
|
> Preview features may be available on the **Preview** channel or may need to be
|
||||||
> This is an experimental feature currently under active development and
|
> enabled under `/settings`.
|
||||||
> may need to be enabled under `/settings`.
|
|
||||||
|
|
||||||
Notifications are particularly useful when running long-running tasks or using
|
Notifications are particularly useful when running long-running tasks or using
|
||||||
[Plan Mode](./plan-mode.md), letting you switch to other windows while Gemini
|
[Plan Mode](./plan-mode.md), letting you switch to other windows while Gemini
|
||||||
@@ -15,14 +14,14 @@ CLI works in the background.
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
|
Currently, system notifications are only supported on macOS.
|
||||||
|
|
||||||
### Terminal support
|
### Terminal support
|
||||||
|
|
||||||
The CLI uses the OSC 9 terminal escape sequence to trigger system notifications.
|
The CLI uses the OSC 9 terminal escape sequence to trigger system notifications.
|
||||||
This is supported by several modern terminal emulators including iTerm2,
|
This is supported by several modern terminal emulators. If your terminal does
|
||||||
WezTerm, Ghostty, and Kitty. If your terminal does not support OSC 9
|
not support OSC 9 notifications, Gemini CLI falls back to a system alert sound
|
||||||
notifications, Gemini CLI falls back to a terminal bell (BEL) to get your
|
to get your attention.
|
||||||
attention. Most terminals respond to BEL with a taskbar flash or system alert
|
|
||||||
sound.
|
|
||||||
|
|
||||||
## Enable notifications
|
## Enable notifications
|
||||||
|
|
||||||
|
|||||||
+19
-32
@@ -35,19 +35,19 @@ To launch Gemini CLI in Plan Mode once:
|
|||||||
To start Plan Mode while using Gemini CLI:
|
To start Plan Mode while using Gemini CLI:
|
||||||
|
|
||||||
- **Keyboard shortcut:** Press `Shift+Tab` to cycle through approval modes
|
- **Keyboard shortcut:** Press `Shift+Tab` to cycle through approval modes
|
||||||
(`Default` -> `Auto-Edit` -> `Plan`). Plan Mode is automatically removed from
|
(`Default` -> `Auto-Edit` -> `Plan`).
|
||||||
the rotation when Gemini CLI is actively processing or showing confirmation
|
|
||||||
dialogs.
|
|
||||||
|
|
||||||
- **Command:** Type `/plan [goal]` in the input box. The `[goal]` is optional;
|
> **Note:** Plan Mode is automatically removed from the rotation when Gemini
|
||||||
for example, `/plan implement authentication` will switch to Plan Mode and
|
> CLI is actively processing or showing confirmation dialogs.
|
||||||
immediately submit the prompt to the model.
|
|
||||||
|
- **Command:** Type `/plan` in the input box.
|
||||||
|
|
||||||
- **Natural Language:** Ask Gemini CLI to "start a plan for...". Gemini CLI
|
- **Natural Language:** Ask Gemini CLI to "start a plan for...". Gemini CLI
|
||||||
calls the
|
calls the
|
||||||
[`enter_plan_mode`](../tools/planning.md#1-enter_plan_mode-enterplanmode) tool
|
[`enter_plan_mode`](../tools/planning.md#1-enter_plan_mode-enterplanmode) tool
|
||||||
to switch modes. This tool is not available when Gemini CLI is in
|
to switch modes.
|
||||||
[YOLO mode](../reference/configuration.md#command-line-arguments).
|
> **Note:** This tool is not available when Gemini CLI is in
|
||||||
|
> [YOLO mode](../reference/configuration.md#command-line-arguments).
|
||||||
|
|
||||||
## How to use Plan Mode
|
## How to use Plan Mode
|
||||||
|
|
||||||
@@ -56,21 +56,19 @@ Gemini CLI takes action.
|
|||||||
|
|
||||||
1. **Provide a goal:** Start by describing what you want to achieve. Gemini CLI
|
1. **Provide a goal:** Start by describing what you want to achieve. Gemini CLI
|
||||||
will then enter Plan Mode (if it's not already) to research the task.
|
will then enter Plan Mode (if it's not already) to research the task.
|
||||||
2. **Discuss and agree on strategy:** As Gemini CLI analyzes your codebase, it
|
2. **Review research and provide input:** As Gemini CLI analyzes your codebase,
|
||||||
will discuss its findings and proposed strategy with you to ensure
|
it may ask you questions or present different implementation options using
|
||||||
alignment. It may ask you questions or present different implementation
|
[`ask_user`](../tools/ask-user.md). Provide your preferences to help guide
|
||||||
options using [`ask_user`](../tools/ask-user.md). **Gemini CLI will stop and
|
the design.
|
||||||
wait for your confirmation** before drafting the formal plan. You should
|
3. **Review the plan:** Once Gemini CLI has a proposed strategy, it creates a
|
||||||
reach an informal agreement on the approach before proceeding.
|
detailed implementation plan as a Markdown file in your plans directory.
|
||||||
3. **Review the plan:** Once you've agreed on the strategy, Gemini CLI creates
|
|
||||||
a detailed implementation plan as a Markdown file in your plans directory.
|
|
||||||
- **View:** You can open and read this file to understand the proposed
|
- **View:** You can open and read this file to understand the proposed
|
||||||
changes.
|
changes.
|
||||||
- **Edit:** Press `Ctrl+X` to open the plan directly in your configured
|
- **Edit:** Press `Ctrl+X` to open the plan directly in your configured
|
||||||
external editor.
|
external editor.
|
||||||
|
|
||||||
4. **Approve or iterate:** Gemini CLI will present the finalized plan for your
|
4. **Approve or iterate:** Gemini CLI will present the finalized plan for your
|
||||||
formal approval.
|
approval.
|
||||||
- **Approve:** If you're satisfied with the plan, approve it to start the
|
- **Approve:** If you're satisfied with the plan, approve it to start the
|
||||||
implementation immediately: **Yes, automatically accept edits** or **Yes,
|
implementation immediately: **Yes, automatically accept edits** or **Yes,
|
||||||
manually accept edits**.
|
manually accept edits**.
|
||||||
@@ -123,7 +121,6 @@ These are the only allowed tools:
|
|||||||
[`glob`](../tools/file-system.md#4-glob-findfiles)
|
[`glob`](../tools/file-system.md#4-glob-findfiles)
|
||||||
- **Search:** [`grep_search`](../tools/file-system.md#5-grep_search-searchtext),
|
- **Search:** [`grep_search`](../tools/file-system.md#5-grep_search-searchtext),
|
||||||
[`google_web_search`](../tools/web-search.md),
|
[`google_web_search`](../tools/web-search.md),
|
||||||
[`web_fetch`](../tools/web-fetch.md) (requires explicit confirmation),
|
|
||||||
[`get_internal_docs`](../tools/internal-docs.md)
|
[`get_internal_docs`](../tools/internal-docs.md)
|
||||||
- **Research Subagents:**
|
- **Research Subagents:**
|
||||||
[`codebase_investigator`](../core/subagents.md#codebase-investigator),
|
[`codebase_investigator`](../core/subagents.md#codebase-investigator),
|
||||||
@@ -181,16 +178,9 @@ As described in the
|
|||||||
rule that does not explicitly specify `modes` is considered "always active" and
|
rule that does not explicitly specify `modes` is considered "always active" and
|
||||||
will apply to Plan Mode as well.
|
will apply to Plan Mode as well.
|
||||||
|
|
||||||
To maintain the integrity of Plan Mode as a safe research environment,
|
If you want a rule to apply to other modes but _not_ to Plan Mode, you must
|
||||||
persistent tool approvals are context-aware. Approvals granted in modes like
|
explicitly specify the target modes. For example, to allow `npm test` in default
|
||||||
Default or Auto-Edit do not apply to Plan Mode, ensuring that tools trusted for
|
and Auto-Edit modes but not in Plan Mode:
|
||||||
implementation don't automatically execute while you're researching. However,
|
|
||||||
approvals granted while in Plan Mode are treated as intentional choices for
|
|
||||||
global trust and apply to all modes.
|
|
||||||
|
|
||||||
If you want to manually restrict a rule to other modes but _not_ to Plan Mode,
|
|
||||||
you must explicitly specify the target modes. For example, to allow `npm test`
|
|
||||||
in default and Auto-Edit modes but not in Plan Mode:
|
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[[rule]]
|
[[rule]]
|
||||||
@@ -212,7 +202,6 @@ your specific environment.
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
[[rule]]
|
[[rule]]
|
||||||
toolName = "*"
|
|
||||||
mcpName = "*"
|
mcpName = "*"
|
||||||
toolAnnotations = { readOnlyHint = true }
|
toolAnnotations = { readOnlyHint = true }
|
||||||
decision = "allow"
|
decision = "allow"
|
||||||
@@ -418,9 +407,7 @@ To build a custom planning workflow, you can use:
|
|||||||
[custom plan directories](#custom-plan-directory-and-policies) and
|
[custom plan directories](#custom-plan-directory-and-policies) and
|
||||||
[custom policies](#custom-policies).
|
[custom policies](#custom-policies).
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Use [Conductor] as a reference when building your own custom
|
||||||
> [!TIP]
|
|
||||||
> Use [Conductor] as a reference when building your own custom
|
|
||||||
> planning workflow.
|
> planning workflow.
|
||||||
|
|
||||||
By using Plan Mode as its execution environment, your custom methodology can
|
By using Plan Mode as its execution environment, your custom methodology can
|
||||||
|
|||||||
+5
-77
@@ -50,25 +50,7 @@ Cross-platform sandboxing with complete process isolation.
|
|||||||
**Note**: Requires building the sandbox image locally or using a published image
|
**Note**: Requires building the sandbox image locally or using a published image
|
||||||
from your organization's registry.
|
from your organization's registry.
|
||||||
|
|
||||||
### 3. Windows Native Sandbox (Windows only)
|
### 3. gVisor / runsc (Linux only)
|
||||||
|
|
||||||
... **Troubleshooting and Side Effects:**
|
|
||||||
|
|
||||||
The Windows Native sandbox uses the `icacls` command to set a "Low Mandatory
|
|
||||||
Level" on files and directories it needs to write to.
|
|
||||||
|
|
||||||
- **Persistence**: These integrity level changes are persistent on the
|
|
||||||
filesystem. Even after the sandbox session ends, files created or modified by
|
|
||||||
the sandbox will retain their "Low" integrity level.
|
|
||||||
- **Manual Reset**: If you need to reset the integrity level of a file or
|
|
||||||
directory, you can use:
|
|
||||||
```powershell
|
|
||||||
icacls "C:\path\to\dir" /setintegritylevel Medium
|
|
||||||
```
|
|
||||||
- **System Folders**: The sandbox manager automatically skips setting integrity
|
|
||||||
levels on system folders (like `C:\Windows`) for safety.
|
|
||||||
|
|
||||||
### 4. gVisor / runsc (Linux only)
|
|
||||||
|
|
||||||
Strongest isolation available: runs containers inside a user-space kernel via
|
Strongest isolation available: runs containers inside a user-space kernel via
|
||||||
[gVisor](https://github.com/google/gvisor). gVisor intercepts all container
|
[gVisor](https://github.com/google/gvisor). gVisor intercepts all container
|
||||||
@@ -92,7 +74,7 @@ To set up runsc:
|
|||||||
2. Configure the Docker daemon to use the runsc runtime.
|
2. Configure the Docker daemon to use the runsc runtime.
|
||||||
3. Verify the installation.
|
3. Verify the installation.
|
||||||
|
|
||||||
### 5. LXC/LXD (Linux only, experimental)
|
### 4. LXC/LXD (Linux only, experimental)
|
||||||
|
|
||||||
Full-system container sandboxing using LXC/LXD. Unlike Docker/Podman, LXC
|
Full-system container sandboxing using LXC/LXD. Unlike Docker/Podman, LXC
|
||||||
containers run a complete Linux system with `systemd`, `snapd`, and other system
|
containers run a complete Linux system with `systemd`, `snapd`, and other system
|
||||||
@@ -136,58 +118,6 @@ gemini -p "build the snap"
|
|||||||
absolute path — the path must be writable inside the container.
|
absolute path — the path must be writable inside the container.
|
||||||
- Used with tools like Snapcraft or Rockcraft that require a full system.
|
- Used with tools like Snapcraft or Rockcraft that require a full system.
|
||||||
|
|
||||||
## Tool sandboxing
|
|
||||||
|
|
||||||
Tool-level sandboxing provides granular isolation for individual tool executions
|
|
||||||
(like `shell_exec` and `write_file`) instead of sandboxing the entire Gemini CLI
|
|
||||||
process.
|
|
||||||
|
|
||||||
This approach offers better integration with your local environment for non-tool
|
|
||||||
tasks (like UI rendering and configuration loading) while still providing
|
|
||||||
security for tool-driven operations.
|
|
||||||
|
|
||||||
### How to turn off tool sandboxing
|
|
||||||
|
|
||||||
If you experience issues with tool sandboxing or prefer full-process isolation,
|
|
||||||
you can disable it by setting `security.toolSandboxing` to `false` in your
|
|
||||||
`settings.json` file.
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"security": {
|
|
||||||
"toolSandboxing": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!NOTE]
|
|
||||||
> Changing the `security.toolSandboxing` setting requires a restart of Gemini
|
|
||||||
> CLI to take effect.
|
|
||||||
|
|
||||||
## Sandbox expansion
|
|
||||||
|
|
||||||
Sandbox expansion is a dynamic permission system that lets Gemini CLI request
|
|
||||||
additional permissions for a command when needed.
|
|
||||||
|
|
||||||
When a sandboxed command fails due to permission restrictions (like restricted
|
|
||||||
file paths or network access), or when a command is proactively identified as
|
|
||||||
requiring extra permissions (like `npm install`), Gemini CLI will present you
|
|
||||||
with a "Sandbox Expansion Request."
|
|
||||||
|
|
||||||
### How sandbox expansion works
|
|
||||||
|
|
||||||
1. **Detection**: Gemini CLI detects a sandbox denial or proactively identifies
|
|
||||||
a command that requires extra permissions.
|
|
||||||
2. **Request**: A modal dialog is shown, explaining which additional
|
|
||||||
permissions (e.g., specific directories or network access) are required.
|
|
||||||
3. **Approval**: If you approve the expansion, the command is executed with the
|
|
||||||
extended permissions for that specific run.
|
|
||||||
|
|
||||||
This mechanism ensures you don't have to manually re-run commands with more
|
|
||||||
permissive sandbox settings, while still maintaining control over what the AI
|
|
||||||
can access.
|
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -323,11 +253,9 @@ $env:SANDBOX_SET_UID_GID="false" # Disable UID/GID mapping
|
|||||||
DEBUG=1 gemini -s -p "debug command"
|
DEBUG=1 gemini -s -p "debug command"
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** If you have `DEBUG=true` in a project's `.env` file, it won't affect
|
||||||
> [!NOTE]
|
gemini-cli due to automatic exclusion. Use `.gemini/.env` files for gemini-cli
|
||||||
> If you have `DEBUG=true` in a project's `.env` file, it won't affect
|
specific debug settings.
|
||||||
> gemini-cli due to automatic exclusion. Use `.gemini/.env` files for
|
|
||||||
> gemini-cli specific debug settings.
|
|
||||||
|
|
||||||
### Inspect sandbox
|
### Inspect sandbox
|
||||||
|
|
||||||
|
|||||||
@@ -96,12 +96,6 @@ Compatibility aliases:
|
|||||||
- `/chat ...` works for the same commands.
|
- `/chat ...` works for the same commands.
|
||||||
- `/resume checkpoints ...` also remains supported during migration.
|
- `/resume checkpoints ...` also remains supported during migration.
|
||||||
|
|
||||||
## Parallel sessions with Git worktrees
|
|
||||||
|
|
||||||
When working on multiple tasks at once, you can use
|
|
||||||
[Git worktrees](./git-worktrees.md) to give each Gemini session its own copy of
|
|
||||||
the codebase. This prevents changes in one session from colliding with another.
|
|
||||||
|
|
||||||
## Managing sessions
|
## Managing sessions
|
||||||
|
|
||||||
You can list and delete sessions to keep your history organized and manage disk
|
You can list and delete sessions to keep your history organized and manage disk
|
||||||
|
|||||||
+49
-66
@@ -11,9 +11,7 @@ locations:
|
|||||||
- **User settings**: `~/.gemini/settings.json`
|
- **User settings**: `~/.gemini/settings.json`
|
||||||
- **Workspace settings**: `your-project/.gemini/settings.json`
|
- **Workspace settings**: `your-project/.gemini/settings.json`
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
Note: Workspace settings override user settings.
|
||||||
> [!IMPORTANT]
|
|
||||||
> Workspace settings override user settings.
|
|
||||||
|
|
||||||
## Settings reference
|
## Settings reference
|
||||||
|
|
||||||
@@ -29,9 +27,8 @@ they appear in the UI.
|
|||||||
| Vim Mode | `general.vimMode` | Enable Vim keybindings | `false` |
|
| Vim Mode | `general.vimMode` | Enable Vim keybindings | `false` |
|
||||||
| Default Approval Mode | `general.defaultApprovalMode` | The default approval mode for tool execution. 'default' prompts for approval, 'auto_edit' auto-approves edit tools, and 'plan' is read-only mode. YOLO mode (auto-approve all actions) can only be enabled via command line (--yolo or --approval-mode=yolo). | `"default"` |
|
| Default Approval Mode | `general.defaultApprovalMode` | The default approval mode for tool execution. 'default' prompts for approval, 'auto_edit' auto-approves edit tools, and 'plan' is read-only mode. YOLO mode (auto-approve all actions) can only be enabled via command line (--yolo or --approval-mode=yolo). | `"default"` |
|
||||||
| Enable Auto Update | `general.enableAutoUpdate` | Enable automatic updates. | `true` |
|
| Enable Auto Update | `general.enableAutoUpdate` | Enable automatic updates. | `true` |
|
||||||
| Enable Notifications | `general.enableNotifications` | Enable run-event notifications for action-required prompts and session completion. | `false` |
|
| Enable Notifications | `general.enableNotifications` | Enable run-event notifications for action-required prompts and session completion. Currently macOS only. | `false` |
|
||||||
| Enable Plan Mode | `general.plan.enabled` | Enable Plan Mode for read-only safety during planning. | `true` |
|
| Plan Directory | `general.plan.directory` | The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory. | `undefined` |
|
||||||
| Plan Directory | `general.plan.directory` | The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory. A custom directory requires a policy to allow write access in Plan Mode. | `undefined` |
|
|
||||||
| Plan Model Routing | `general.plan.modelRouting` | Automatically switch between Pro and Flash models based on Plan Mode status. Uses Pro for the planning phase and Flash for the implementation phase. | `true` |
|
| Plan Model Routing | `general.plan.modelRouting` | Automatically switch between Pro and Flash models based on Plan Mode status. Uses Pro for the planning phase and Flash for the implementation phase. | `true` |
|
||||||
| Retry Fetch Errors | `general.retryFetchErrors` | Retry on "exception TypeError: fetch failed sending request" errors. | `true` |
|
| Retry Fetch Errors | `general.retryFetchErrors` | Retry on "exception TypeError: fetch failed sending request" errors. | `true` |
|
||||||
| Max Chat Model Attempts | `general.maxAttempts` | Maximum number of attempts for requests to the main chat model. Cannot exceed 10. | `10` |
|
| Max Chat Model Attempts | `general.maxAttempts` | Maximum number of attempts for requests to the main chat model. Cannot exceed 10. | `10` |
|
||||||
@@ -47,41 +44,38 @@ they appear in the UI.
|
|||||||
|
|
||||||
### UI
|
### UI
|
||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
| ------------------------------------ | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
| ------------------------------------ | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
|
||||||
| Auto Theme Switching | `ui.autoThemeSwitching` | Automatically switch between default light and dark themes based on terminal background color. | `true` |
|
| Auto Theme Switching | `ui.autoThemeSwitching` | Automatically switch between default light and dark themes based on terminal background color. | `true` |
|
||||||
| Terminal Background Polling Interval | `ui.terminalBackgroundPollingInterval` | Interval in seconds to poll the terminal background color. | `60` |
|
| Terminal Background Polling Interval | `ui.terminalBackgroundPollingInterval` | Interval in seconds to poll the terminal background color. | `60` |
|
||||||
| Hide Window Title | `ui.hideWindowTitle` | Hide the window title bar | `false` |
|
| Hide Window Title | `ui.hideWindowTitle` | Hide the window title bar | `false` |
|
||||||
| Inline Thinking | `ui.inlineThinkingMode` | Display model thinking inline: off or full. | `"off"` |
|
| Inline Thinking | `ui.inlineThinkingMode` | Display model thinking inline: off or full. | `"off"` |
|
||||||
| Show Thoughts in Title | `ui.showStatusInTitle` | Show Gemini CLI model thoughts in the terminal window title during the working phase | `false` |
|
| Show Thoughts in Title | `ui.showStatusInTitle` | Show Gemini CLI model thoughts in the terminal window title during the working phase | `false` |
|
||||||
| Dynamic Window Title | `ui.dynamicWindowTitle` | Update the terminal window title with current status icons (Ready: ◇, Action Required: ✋, Working: ✦) | `true` |
|
| Dynamic Window Title | `ui.dynamicWindowTitle` | Update the terminal window title with current status icons (Ready: ◇, Action Required: ✋, Working: ✦) | `true` |
|
||||||
| Show Home Directory Warning | `ui.showHomeDirectoryWarning` | Show a warning when running Gemini CLI in the home directory. | `true` |
|
| Show Home Directory Warning | `ui.showHomeDirectoryWarning` | Show a warning when running Gemini CLI in the home directory. | `true` |
|
||||||
| Show Compatibility Warnings | `ui.showCompatibilityWarnings` | Show warnings about terminal or OS compatibility issues. | `true` |
|
| Show Compatibility Warnings | `ui.showCompatibilityWarnings` | Show warnings about terminal or OS compatibility issues. | `true` |
|
||||||
| Hide Tips | `ui.hideTips` | Hide helpful tips in the UI | `false` |
|
| Hide Tips | `ui.hideTips` | Hide helpful tips in the UI | `false` |
|
||||||
| Escape Pasted @ Symbols | `ui.escapePastedAtSymbols` | When enabled, @ symbols in pasted text are escaped to prevent unintended @path expansion. | `false` |
|
| Escape Pasted @ Symbols | `ui.escapePastedAtSymbols` | When enabled, @ symbols in pasted text are escaped to prevent unintended @path expansion. | `false` |
|
||||||
| Show Shortcuts Hint | `ui.showShortcutsHint` | Show the "? for shortcuts" hint above the input. | `true` |
|
| Show Shortcuts Hint | `ui.showShortcutsHint` | Show the "? for shortcuts" hint above the input. | `true` |
|
||||||
| Compact Tool Output | `ui.compactToolOutput` | Display tool outputs (like directory listings and file reads) in a compact, structured format. | `true` |
|
| Hide Banner | `ui.hideBanner` | Hide the application banner | `false` |
|
||||||
| Hide Banner | `ui.hideBanner` | Hide the application banner | `false` |
|
| Hide Context Summary | `ui.hideContextSummary` | Hide the context summary (GEMINI.md, MCP servers) above the input. | `false` |
|
||||||
| Hide Context Summary | `ui.hideContextSummary` | Hide the context summary (GEMINI.md, MCP servers) above the input. | `false` |
|
| Hide CWD | `ui.footer.hideCWD` | Hide the current working directory in the footer. | `false` |
|
||||||
| Hide CWD | `ui.footer.hideCWD` | Hide the current working directory in the footer. | `false` |
|
| Hide Sandbox Status | `ui.footer.hideSandboxStatus` | Hide the sandbox status indicator in the footer. | `false` |
|
||||||
| Hide Sandbox Status | `ui.footer.hideSandboxStatus` | Hide the sandbox status indicator in the footer. | `false` |
|
| Hide Model Info | `ui.footer.hideModelInfo` | Hide the model name and context usage in the footer. | `false` |
|
||||||
| Hide Model Info | `ui.footer.hideModelInfo` | Hide the model name and context usage in the footer. | `false` |
|
| Hide Context Window Percentage | `ui.footer.hideContextPercentage` | Hides the context window usage percentage. | `true` |
|
||||||
| Hide Context Window Percentage | `ui.footer.hideContextPercentage` | Hides the context window usage percentage. | `true` |
|
| Hide Footer | `ui.hideFooter` | Hide the footer from the UI | `false` |
|
||||||
| Hide Footer | `ui.hideFooter` | Hide the footer from the UI | `false` |
|
| Show Memory Usage | `ui.showMemoryUsage` | Display memory usage information in the UI | `false` |
|
||||||
| Show Memory Usage | `ui.showMemoryUsage` | Display memory usage information in the UI | `false` |
|
| Show Line Numbers | `ui.showLineNumbers` | Show line numbers in the chat. | `true` |
|
||||||
| Show Line Numbers | `ui.showLineNumbers` | Show line numbers in the chat. | `true` |
|
| Show Citations | `ui.showCitations` | Show citations for generated text in the chat. | `false` |
|
||||||
| Show Citations | `ui.showCitations` | Show citations for generated text in the chat. | `false` |
|
| Show Model Info In Chat | `ui.showModelInfoInChat` | Show the model name in the chat for each model turn. | `false` |
|
||||||
| Show Model Info In Chat | `ui.showModelInfoInChat` | Show the model name in the chat for each model turn. | `false` |
|
| Show User Identity | `ui.showUserIdentity` | Show the signed-in user's identity (e.g. email) in the UI. | `true` |
|
||||||
| Show User Identity | `ui.showUserIdentity` | Show the signed-in user's identity (e.g. email) in the UI. | `true` |
|
| Use Alternate Screen Buffer | `ui.useAlternateBuffer` | Use an alternate screen buffer for the UI, preserving shell history. | `false` |
|
||||||
| Use Alternate Screen Buffer | `ui.useAlternateBuffer` | Use an alternate screen buffer for the UI, preserving shell history. | `false` |
|
| Use Background Color | `ui.useBackgroundColor` | Whether to use background colors in the UI. | `true` |
|
||||||
| Render Process | `ui.renderProcess` | Enable Ink render process for the UI. | `true` |
|
| Incremental Rendering | `ui.incrementalRendering` | Enable incremental rendering for the UI. This option will reduce flickering but may cause rendering artifacts. Only supported when useAlternateBuffer is enabled. | `true` |
|
||||||
| Terminal Buffer | `ui.terminalBuffer` | Use the new terminal buffer architecture for rendering. | `false` |
|
| Show Spinner | `ui.showSpinner` | Show the spinner during operations. | `true` |
|
||||||
| Use Background Color | `ui.useBackgroundColor` | Whether to use background colors in the UI. | `true` |
|
| Loading Phrases | `ui.loadingPhrases` | What to show while the model is working: tips, witty comments, both, or nothing. | `"tips"` |
|
||||||
| Incremental Rendering | `ui.incrementalRendering` | Enable incremental rendering for the UI. This option will reduce flickering but may cause rendering artifacts. Only supported when useAlternateBuffer is enabled. | `true` |
|
| Error Verbosity | `ui.errorVerbosity` | Controls whether recoverable errors are hidden (low) or fully shown (full). | `"low"` |
|
||||||
| Show Spinner | `ui.showSpinner` | Show the spinner during operations. | `true` |
|
| Screen Reader Mode | `ui.accessibility.screenReader` | Render output in plain-text to be more screen reader accessible | `false` |
|
||||||
| Loading Phrases | `ui.loadingPhrases` | What to show while the model is working: tips, witty comments, all, or off. | `"off"` |
|
|
||||||
| Error Verbosity | `ui.errorVerbosity` | Controls whether recoverable errors are hidden (low) or fully shown (full). | `"low"` |
|
|
||||||
| Screen Reader Mode | `ui.accessibility.screenReader` | Render output in plain-text to be more screen reader accessible | `false` |
|
|
||||||
|
|
||||||
### IDE
|
### IDE
|
||||||
|
|
||||||
@@ -105,13 +99,6 @@ they appear in the UI.
|
|||||||
| Disable Loop Detection | `model.disableLoopDetection` | Disable automatic detection and prevention of infinite loops. | `false` |
|
| Disable Loop Detection | `model.disableLoopDetection` | Disable automatic detection and prevention of infinite loops. | `false` |
|
||||||
| Skip Next Speaker Check | `model.skipNextSpeakerCheck` | Skip the next speaker check. | `true` |
|
| Skip Next Speaker Check | `model.skipNextSpeakerCheck` | Skip the next speaker check. | `true` |
|
||||||
|
|
||||||
### Agents
|
|
||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
|
||||||
| ------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------- | ------- |
|
|
||||||
| Confirm Sensitive Actions | `agents.browser.confirmSensitiveActions` | Require manual confirmation for sensitive browser actions (e.g., fill_form, evaluate_script). | `false` |
|
|
||||||
| Block File Uploads | `agents.browser.blockFileUploads` | Hard-block file upload requests from the browser agent. | `false` |
|
|
||||||
|
|
||||||
### Context
|
### Context
|
||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
@@ -128,10 +115,8 @@ they appear in the UI.
|
|||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
| -------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
| -------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
||||||
| Sandbox Allowed Paths | `tools.sandboxAllowedPaths` | List of additional paths that the sandbox is allowed to access. | `[]` |
|
|
||||||
| Sandbox Network Access | `tools.sandboxNetworkAccess` | Whether the sandbox is allowed to access the network. | `false` |
|
|
||||||
| Enable Interactive Shell | `tools.shell.enableInteractiveShell` | Use node-pty for an interactive shell experience. Fallback to child_process still applies. | `true` |
|
| Enable Interactive Shell | `tools.shell.enableInteractiveShell` | Use node-pty for an interactive shell experience. Fallback to child_process still applies. | `true` |
|
||||||
| Show Color | `tools.shell.showColor` | Show color in shell output. | `true` |
|
| Show Color | `tools.shell.showColor` | Show color in shell output. | `false` |
|
||||||
| Use Ripgrep | `tools.useRipgrep` | Use ripgrep for file content search instead of the fallback implementation. Provides faster search performance. | `true` |
|
| Use Ripgrep | `tools.useRipgrep` | Use ripgrep for file content search instead of the fallback implementation. Provides faster search performance. | `true` |
|
||||||
| Tool Output Truncation Threshold | `tools.truncateToolOutputThreshold` | Maximum characters to show when truncating large tool outputs. Set to 0 or negative to disable truncation. | `40000` |
|
| Tool Output Truncation Threshold | `tools.truncateToolOutputThreshold` | Maximum characters to show when truncating large tool outputs. Set to 0 or negative to disable truncation. | `40000` |
|
||||||
| Disable LLM Correction | `tools.disableLLMCorrection` | Disable LLM-based error correction for edit tools. When enabled, tools will fail immediately if exact string matches are not found, instead of attempting to self-correct. | `true` |
|
| Disable LLM Correction | `tools.disableLLMCorrection` | Disable LLM-based error correction for edit tools. When enabled, tools will fail immediately if exact string matches are not found, instead of attempting to self-correct. | `true` |
|
||||||
@@ -140,7 +125,7 @@ they appear in the UI.
|
|||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
| ------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
|
| ------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
|
||||||
| Tool Sandboxing | `security.toolSandboxing` | Tool-level sandboxing. Isolates individual tools instead of the entire CLI process. | `false` |
|
| Tool Sandboxing | `security.toolSandboxing` | Experimental tool-level sandboxing (implementation in progress). | `false` |
|
||||||
| Disable YOLO Mode | `security.disableYoloMode` | Disable YOLO mode, even if enabled by a flag. | `false` |
|
| Disable YOLO Mode | `security.disableYoloMode` | Disable YOLO mode, even if enabled by a flag. | `false` |
|
||||||
| Disable Always Allow | `security.disableAlwaysAllow` | Disable "Always allow" options in tool confirmation dialogs. | `false` |
|
| Disable Always Allow | `security.disableAlwaysAllow` | Disable "Always allow" options in tool confirmation dialogs. | `false` |
|
||||||
| Allow Permanent Tool Approval | `security.enablePermanentToolApproval` | Enable the "Allow for all future sessions" option in tool confirmation dialogs. | `false` |
|
| Allow Permanent Tool Approval | `security.enablePermanentToolApproval` | Enable the "Allow for all future sessions" option in tool confirmation dialogs. | `false` |
|
||||||
@@ -153,23 +138,21 @@ they appear in the UI.
|
|||||||
|
|
||||||
### Advanced
|
### Advanced
|
||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
| --------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
| --------------------------------- | ------------------------------ | --------------------------------------------- | ------- |
|
||||||
| Auto Configure Max Old Space Size | `advanced.autoConfigureMemory` | Automatically configure Node.js memory limits. Note: Because memory is allocated during the initial process boot, this setting is only read from the global user settings file and ignores workspace-level overrides. | `true` |
|
| Auto Configure Max Old Space Size | `advanced.autoConfigureMemory` | Automatically configure Node.js memory limits | `false` |
|
||||||
|
|
||||||
### Experimental
|
### Experimental
|
||||||
|
|
||||||
| UI Label | Setting | Description | Default |
|
| UI Label | Setting | Description | Default |
|
||||||
| ---------------------------------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
| -------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
||||||
| Enable Git Worktrees | `experimental.worktrees` | Enable automated Git worktree management for parallel work. | `false` |
|
| Enable Tool Output Masking | `experimental.toolOutputMasking.enabled` | Enables tool output masking to save tokens. | `true` |
|
||||||
| Use OSC 52 Paste | `experimental.useOSC52Paste` | Use OSC 52 for pasting. This may be more robust than the default system when using remote terminal sessions (if your terminal is configured to allow it). | `false` |
|
| Use OSC 52 Paste | `experimental.useOSC52Paste` | Use OSC 52 for pasting. This may be more robust than the default system when using remote terminal sessions (if your terminal is configured to allow it). | `false` |
|
||||||
| Use OSC 52 Copy | `experimental.useOSC52Copy` | Use OSC 52 for copying. This may be more robust than the default system when using remote terminal sessions (if your terminal is configured to allow it). | `false` |
|
| Use OSC 52 Copy | `experimental.useOSC52Copy` | Use OSC 52 for copying. This may be more robust than the default system when using remote terminal sessions (if your terminal is configured to allow it). | `false` |
|
||||||
| Model Steering | `experimental.modelSteering` | Enable model steering (user hints) to guide the model during tool execution. | `false` |
|
| Plan | `experimental.plan` | Enable Plan Mode. | `true` |
|
||||||
| Direct Web Fetch | `experimental.directWebFetch` | Enable web fetch behavior that bypasses LLM summarization. | `false` |
|
| Model Steering | `experimental.modelSteering` | Enable model steering (user hints) to guide the model during tool execution. | `false` |
|
||||||
| Memory Manager Agent | `experimental.memoryManager` | Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories. | `false` |
|
| Direct Web Fetch | `experimental.directWebFetch` | Enable web fetch behavior that bypasses LLM summarization. | `false` |
|
||||||
| Use the generalist profile to manage agent contexts. | `experimental.generalistProfile` | Suitable for general coding and software development tasks. | `false` |
|
| Topic & Update Narration | `experimental.topicUpdateNarration` | Enable the experimental Topic & Update communication model for reduced chattiness and structured progress reporting. | `false` |
|
||||||
| Enable Context Management | `experimental.contextManagement` | Enable logic for context management. | `false` |
|
|
||||||
| Topic & Update Narration | `experimental.topicUpdateNarration` | Enable the experimental Topic & Update communication model for reduced chattiness and structured progress reporting. | `false` |
|
|
||||||
|
|
||||||
### Skills
|
### Skills
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -63,10 +63,8 @@ Use the `/skills` slash command to view and manage available expertise:
|
|||||||
- `/skills enable <name>`: Re-enables a disabled skill.
|
- `/skills enable <name>`: Re-enables a disabled skill.
|
||||||
- `/skills reload`: Refreshes the list of discovered skills from all tiers.
|
- `/skills reload`: Refreshes the list of discovered skills from all tiers.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
_Note: `/skills disable` and `/skills enable` default to the `user` scope. Use
|
||||||
> [!NOTE]
|
`--scope workspace` to manage workspace-specific settings._
|
||||||
> `/skills disable` and `/skills enable` default to the `user` scope. Use
|
|
||||||
> `--scope workspace` to manage workspace-specific settings.
|
|
||||||
|
|
||||||
### From the Terminal
|
### From the Terminal
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ core instructions will apply unless you include them yourself.
|
|||||||
This feature is intended for advanced users who need to enforce strict,
|
This feature is intended for advanced users who need to enforce strict,
|
||||||
project-specific behavior or create a customized persona.
|
project-specific behavior or create a customized persona.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> Tip: You can export the current default system prompt to a file first, review
|
||||||
> [!TIP]
|
|
||||||
> You can export the current default system prompt to a file first, review
|
|
||||||
> it, and then selectively modify or replace it (see
|
> it, and then selectively modify or replace it (see
|
||||||
> [“Export the default prompt”](#export-the-default-prompt-recommended)).
|
> [“Export the default prompt”](#export-the-default-prompt-recommended)).
|
||||||
|
|
||||||
|
|||||||
+3
-34
@@ -125,11 +125,9 @@ You must complete several setup steps before enabling Google Cloud telemetry.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** This setting requires **Direct export** (in-process exporters)
|
||||||
> [!NOTE]
|
> and cannot be used when `useCollector` is `true`. If both are enabled,
|
||||||
> This setting requires **Direct export** (in-process exporters)
|
> telemetry will be disabled.
|
||||||
> and cannot be used when `useCollector` is `true`. If both are enabled,
|
|
||||||
> telemetry will be disabled.
|
|
||||||
|
|
||||||
3. Ensure your account or service account has these IAM roles:
|
3. Ensure your account or service account has these IAM roles:
|
||||||
- Cloud Trace Agent
|
- Cloud Trace Agent
|
||||||
@@ -306,7 +304,6 @@ Emitted at startup with the CLI configuration.
|
|||||||
- `extension_ids` (string)
|
- `extension_ids` (string)
|
||||||
- `extensions_count` (int)
|
- `extensions_count` (int)
|
||||||
- `auth_type` (string)
|
- `auth_type` (string)
|
||||||
- `worktree_active` (boolean)
|
|
||||||
- `github_workflow_name` (string, optional)
|
- `github_workflow_name` (string, optional)
|
||||||
- `github_repository_hash` (string, optional)
|
- `github_repository_hash` (string, optional)
|
||||||
- `github_event_name` (string, optional)
|
- `github_event_name` (string, optional)
|
||||||
@@ -904,20 +901,6 @@ Logs keychain availability checks.
|
|||||||
|
|
||||||
- `available` (boolean)
|
- `available` (boolean)
|
||||||
|
|
||||||
##### `gemini_cli.startup_stats`
|
|
||||||
|
|
||||||
Logs detailed startup performance statistics.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Attributes</summary>
|
|
||||||
|
|
||||||
- `phases` (json array of startup phases)
|
|
||||||
- `os_platform` (string)
|
|
||||||
- `os_release` (string)
|
|
||||||
- `is_docker` (boolean)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Metrics
|
### Metrics
|
||||||
@@ -934,20 +917,6 @@ Gemini CLI exports several custom metrics.
|
|||||||
|
|
||||||
Incremented once per CLI startup.
|
Incremented once per CLI startup.
|
||||||
|
|
||||||
##### Onboarding
|
|
||||||
|
|
||||||
Tracks onboarding flow from authentication to the user
|
|
||||||
|
|
||||||
- `gemini_cli.onboarding.start` (Counter, Int): Incremented when the
|
|
||||||
authentication flow begins.
|
|
||||||
|
|
||||||
- `gemini_cli.onboarding.success` (Counter, Int): Incremented when the user
|
|
||||||
onboarding flow completes successfully.
|
|
||||||
<details>
|
|
||||||
<summary>Attributes (Success)</summary>
|
|
||||||
|
|
||||||
- `user_tier` (string)
|
|
||||||
|
|
||||||
##### Tools
|
##### Tools
|
||||||
|
|
||||||
##### `gemini_cli.tool.call.count`
|
##### `gemini_cli.tool.call.count`
|
||||||
|
|||||||
+8
-17
@@ -19,7 +19,6 @@ using the `/theme` command within Gemini CLI:
|
|||||||
- `Holiday`
|
- `Holiday`
|
||||||
- `Shades Of Purple`
|
- `Shades Of Purple`
|
||||||
- `Solarized Dark`
|
- `Solarized Dark`
|
||||||
- `Tokyo Night`
|
|
||||||
- **Light themes:**
|
- **Light themes:**
|
||||||
- `ANSI Light`
|
- `ANSI Light`
|
||||||
- `Ayu Light`
|
- `Ayu Light`
|
||||||
@@ -37,11 +36,9 @@ using the `/theme` command within Gemini CLI:
|
|||||||
preview or highlight as you select.
|
preview or highlight as you select.
|
||||||
4. Confirm your selection to apply the theme.
|
4. Confirm your selection to apply the theme.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** If a theme is defined in your `settings.json` file (either by name or
|
||||||
> [!NOTE]
|
by a file path), you must remove the `"theme"` setting from the file before you
|
||||||
> If a theme is defined in your `settings.json` file (either by name or
|
can change the theme using the `/theme` command.
|
||||||
> by a file path), you must remove the `"theme"` setting from the file before
|
|
||||||
> you can change the theme using the `/theme` command.
|
|
||||||
|
|
||||||
### Theme persistence
|
### Theme persistence
|
||||||
|
|
||||||
@@ -182,13 +179,11 @@ custom theme defined in `settings.json`.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Security note:** For your safety, Gemini CLI will only load theme files that
|
||||||
> [!WARNING]
|
are located within your home directory. If you attempt to load a theme from
|
||||||
> For your safety, Gemini CLI will only load theme files that
|
outside your home directory, a warning will be displayed and the theme will not
|
||||||
> are located within your home directory. If you attempt to load a theme from
|
be loaded. This is to prevent loading potentially malicious theme files from
|
||||||
> outside your home directory, a warning will be displayed and the theme will
|
untrusted sources.
|
||||||
> not be loaded. This is to prevent loading potentially malicious theme files
|
|
||||||
> from untrusted sources.
|
|
||||||
|
|
||||||
### Example custom theme
|
### Example custom theme
|
||||||
|
|
||||||
@@ -253,10 +248,6 @@ identify their source, for example: `shades-of-green (green-extension)`.
|
|||||||
|
|
||||||
<img src="/docs/assets/theme-solarized-dark.png" alt="Solarized Dark theme" width="600">
|
<img src="/docs/assets/theme-solarized-dark.png" alt="Solarized Dark theme" width="600">
|
||||||
|
|
||||||
### Tokyo Night
|
|
||||||
|
|
||||||
<img src="/docs/assets/theme-tokyonight-dark.png" alt="Tokyo Night theme" width="600">
|
|
||||||
|
|
||||||
## Light themes
|
## Light themes
|
||||||
|
|
||||||
### ANSI Light
|
### ANSI Light
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ create files, and control what Gemini CLI can see.
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Gemini CLI installed and authenticated.
|
- Gemini CLI installed and authenticated.
|
||||||
- A project directory to work with (for example, a git repository).
|
- A project directory to work with (e.g., a git repository).
|
||||||
|
|
||||||
## Providing context by reading files
|
## How to give the agent context (Reading files)
|
||||||
|
|
||||||
Gemini CLI will generally try to read relevant files, sometimes prompting you
|
Gemini CLI will generally try to read relevant files, sometimes prompting you
|
||||||
for access (depending on your settings). To ensure that Gemini CLI uses a file,
|
for access (depending on your settings). To ensure that Gemini CLI uses a file,
|
||||||
@@ -58,13 +58,11 @@ You know there's a `UserProfile` component, but you don't know where it lives.
|
|||||||
```
|
```
|
||||||
|
|
||||||
Gemini uses the `glob` or `list_directory` tools to search your project
|
Gemini uses the `glob` or `list_directory` tools to search your project
|
||||||
structure. It will return the specific path (for example,
|
structure. It will return the specific path (e.g.,
|
||||||
`src/components/UserProfile.tsx`), which you can then use with `@` in your next
|
`src/components/UserProfile.tsx`), which you can then use with `@` in your next
|
||||||
turn.
|
turn.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Tip:** You can also ask for lists of files, like "Show me all the TypeScript
|
||||||
> [!TIP]
|
|
||||||
> You can also ask for lists of files, like "Show me all the TypeScript
|
|
||||||
> configuration files in the root directory."
|
> configuration files in the root directory."
|
||||||
|
|
||||||
## How to modify code
|
## How to modify code
|
||||||
@@ -113,8 +111,8 @@ or, better yet, run your project's tests.
|
|||||||
`Run the tests for the UserProfile component.`
|
`Run the tests for the UserProfile component.`
|
||||||
```
|
```
|
||||||
|
|
||||||
Gemini CLI uses the `run_shell_command` tool to execute your test runner (for
|
Gemini CLI uses the `run_shell_command` tool to execute your test runner (e.g.,
|
||||||
example, `npm test` or `jest`). This ensures the changes didn't break existing
|
`npm test` or `jest`). This ensures the changes didn't break existing
|
||||||
functionality.
|
functionality.
|
||||||
|
|
||||||
## Advanced: Controlling what Gemini sees
|
## Advanced: Controlling what Gemini sees
|
||||||
|
|||||||
@@ -62,10 +62,8 @@ You tell Gemini about new servers by editing your `settings.json`.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The `command` is `docker`, and the rest are arguments passed to it.
|
||||||
> [!NOTE]
|
> We map the local environment variable into the container so your secret isn't
|
||||||
> The `command` is `docker`, and the rest are arguments passed to it. We
|
|
||||||
> map the local environment variable into the container so your secret isn't
|
|
||||||
> hardcoded in the config file.
|
> hardcoded in the config file.
|
||||||
|
|
||||||
## How to verify the connection
|
## How to verify the connection
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ persistent facts, and inspect the active context.
|
|||||||
|
|
||||||
## Why manage context?
|
## Why manage context?
|
||||||
|
|
||||||
Gemini CLI is powerful but general. It doesn't know your preferred testing
|
Out of the box, Gemini CLI is smart but generic. It doesn't know your preferred
|
||||||
framework, your indentation style, or your preference against `any` in
|
testing framework, your indentation style, or that you hate using `any` in
|
||||||
TypeScript. Context management solves this by giving the agent persistent
|
TypeScript. Context management solves this by giving the agent persistent
|
||||||
memory.
|
memory.
|
||||||
|
|
||||||
@@ -109,11 +109,11 @@ immediately. Force a reload with:
|
|||||||
|
|
||||||
## Best practices
|
## Best practices
|
||||||
|
|
||||||
- **Keep it focused:** Avoid adding excessive content to `GEMINI.md`. Keep
|
- **Keep it focused:** Don't dump your entire internal wiki into `GEMINI.md`.
|
||||||
instructions actionable and relevant to code generation.
|
Keep instructions actionable and relevant to code generation.
|
||||||
- **Use negative constraints:** Explicitly telling the agent what _not_ to do
|
- **Use negative constraints:** Explicitly telling the agent what _not_ to do
|
||||||
(for example, "Do not use class components") is often more effective than
|
(e.g., "Do not use class components") is often more effective than vague
|
||||||
vague positive instructions.
|
positive instructions.
|
||||||
- **Review often:** Periodically check your `GEMINI.md` files to remove outdated
|
- **Review often:** Periodically check your `GEMINI.md` files to remove outdated
|
||||||
rules.
|
rules.
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,9 @@ structured environment with model steering's real-time feedback, you can guide
|
|||||||
Gemini CLI through the research and design phases to ensure the final
|
Gemini CLI through the research and design phases to ensure the final
|
||||||
implementation plan is exactly what you need.
|
implementation plan is exactly what you need.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** This is a preview feature under active development. Preview features
|
||||||
> [!NOTE]
|
> may only be available in the **Preview** channel or may need to be enabled
|
||||||
> This is an experimental feature currently under active development and
|
> under `/settings`.
|
||||||
> may need to be enabled under `/settings`.
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ automate complex workflows, and manage background processes safely.
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Gemini CLI installed and authenticated.
|
- Gemini CLI installed and authenticated.
|
||||||
- Basic familiarity with your system's shell (Bash, Zsh, PowerShell, and so on).
|
- Basic familiarity with your system's shell (Bash, Zsh, PowerShell, etc.).
|
||||||
|
|
||||||
## How to run commands directly (`!`)
|
## How to run commands directly (`!`)
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ You want to run tests and fix any failures.
|
|||||||
6. Gemini uses `replace` to fix the bug.
|
6. Gemini uses `replace` to fix the bug.
|
||||||
7. Gemini runs `npm test` again to verify the fix.
|
7. Gemini runs `npm test` again to verify the fix.
|
||||||
|
|
||||||
This loop lets Gemini work autonomously.
|
This loop turns Gemini into an autonomous engineer.
|
||||||
|
|
||||||
## How to manage background processes
|
## How to manage background processes
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ confirmation prompts) by streaming the output to you. However, for highly
|
|||||||
interactive tools (like `vim` or `top`), it's often better to run them yourself
|
interactive tools (like `vim` or `top`), it's often better to run them yourself
|
||||||
in a separate terminal window or use the `!` prefix.
|
in a separate terminal window or use the `!` prefix.
|
||||||
|
|
||||||
## Safety features
|
## Safety first
|
||||||
|
|
||||||
Giving an AI access to your shell is powerful but risky. Gemini CLI includes
|
Giving an AI access to your shell is powerful but risky. Gemini CLI includes
|
||||||
several safety layers.
|
several safety layers.
|
||||||
|
|||||||
+2
-2
@@ -7,8 +7,8 @@ requests sent from `packages/cli`. For a general overview of Gemini CLI, see the
|
|||||||
|
|
||||||
## Navigating this section
|
## Navigating this section
|
||||||
|
|
||||||
- **[Sub-agents](./subagents.md):** Learn how to create and use specialized
|
- **[Sub-agents (experimental)](./subagents.md):** Learn how to create and use
|
||||||
sub-agents for complex tasks.
|
specialized sub-agents for complex tasks.
|
||||||
- **[Core tools reference](../reference/tools.md):** Information on how tools
|
- **[Core tools reference](../reference/tools.md):** Information on how tools
|
||||||
are defined, registered, and used by the core.
|
are defined, registered, and used by the core.
|
||||||
- **[Memory Import Processor](../reference/memport.md):** Documentation for the
|
- **[Memory Import Processor](../reference/memport.md):** Documentation for the
|
||||||
|
|||||||
+29
-120
@@ -1,4 +1,4 @@
|
|||||||
# Remote Subagents
|
# Remote Subagents (experimental)
|
||||||
|
|
||||||
Gemini CLI supports connecting to remote subagents using the Agent-to-Agent
|
Gemini CLI supports connecting to remote subagents using the Agent-to-Agent
|
||||||
(A2A) protocol. This allows Gemini CLI to interact with other agents, expanding
|
(A2A) protocol. This allows Gemini CLI to interact with other agents, expanding
|
||||||
@@ -10,6 +10,21 @@ agents in the following repositories:
|
|||||||
- [ADK Samples (Python)](https://github.com/google/adk-samples/tree/main/python)
|
- [ADK Samples (Python)](https://github.com/google/adk-samples/tree/main/python)
|
||||||
- [ADK Python Contributing Samples](https://github.com/google/adk-python/tree/main/contributing/samples)
|
- [ADK Python Contributing Samples](https://github.com/google/adk-python/tree/main/contributing/samples)
|
||||||
|
|
||||||
|
> **Note: Remote subagents are currently an experimental feature.**
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
To use remote subagents, you must explicitly enable them in your
|
||||||
|
`settings.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"experimental": {
|
||||||
|
"enableAgents": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Proxy support
|
## Proxy support
|
||||||
|
|
||||||
Gemini CLI routes traffic to remote agents through an HTTP/HTTPS proxy if one is
|
Gemini CLI routes traffic to remote agents through an HTTP/HTTPS proxy if one is
|
||||||
@@ -34,13 +49,12 @@ You can place them in:
|
|||||||
|
|
||||||
### Configuration schema
|
### Configuration schema
|
||||||
|
|
||||||
| Field | Type | Required | Description |
|
| Field | Type | Required | Description |
|
||||||
| :---------------- | :----- | :------- | :------------------------------------------------------------------------------------------------------------- |
|
| :--------------- | :----- | :------- | :------------------------------------------------------------------------------------------------------------- |
|
||||||
| `kind` | string | Yes | Must be `remote`. |
|
| `kind` | string | Yes | Must be `remote`. |
|
||||||
| `name` | string | Yes | A unique name for the agent. Must be a valid slug (lowercase letters, numbers, hyphens, and underscores only). |
|
| `name` | string | Yes | A unique name for the agent. Must be a valid slug (lowercase letters, numbers, hyphens, and underscores only). |
|
||||||
| `agent_card_url` | string | Yes\* | The URL to the agent's A2A card endpoint. Required if `agent_card_json` is not provided. |
|
| `agent_card_url` | string | Yes | The URL to the agent's A2A card endpoint. |
|
||||||
| `agent_card_json` | string | Yes\* | The inline JSON string of the agent's A2A card. Required if `agent_card_url` is not provided. |
|
| `auth` | object | No | Authentication configuration. See [Authentication](#authentication). |
|
||||||
| `auth` | object | No | Authentication configuration. See [Authentication](#authentication). |
|
|
||||||
|
|
||||||
### Single-subagent example
|
### Single-subagent example
|
||||||
|
|
||||||
@@ -68,99 +82,9 @@ Markdown file.
|
|||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Mixed local and remote agents, or multiple local agents, are not
|
||||||
> [!NOTE] Mixed local and remote agents, or multiple local agents, are not
|
|
||||||
> supported in a single file; the list format is currently remote-only.
|
> supported in a single file; the list format is currently remote-only.
|
||||||
|
|
||||||
### Inline Agent Card JSON
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>View formatting options for JSON strings</summary>
|
|
||||||
|
|
||||||
If you don't have an endpoint serving the agent card, you can provide the A2A
|
|
||||||
card directly as a JSON string using `agent_card_json`.
|
|
||||||
|
|
||||||
When providing a JSON string in YAML, you must properly format it as a string
|
|
||||||
scalar. You can use single quotes, a block scalar, or double quotes (which
|
|
||||||
require escaping internal double quotes).
|
|
||||||
|
|
||||||
#### Using single quotes
|
|
||||||
|
|
||||||
Single quotes allow you to embed unescaped double quotes inside the JSON string.
|
|
||||||
This format is useful for shorter, single-line JSON strings.
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
kind: remote
|
|
||||||
name: single-quotes-agent
|
|
||||||
agent_card_json:
|
|
||||||
'{ "protocolVersion": "0.3.0", "name": "Example Agent", "version": "1.0.0",
|
|
||||||
"url": "dummy-url" }'
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Using a block scalar
|
|
||||||
|
|
||||||
The literal block scalar (`|`) preserves line breaks and is highly recommended
|
|
||||||
for multiline JSON strings as it avoids quote escaping entirely. The following
|
|
||||||
is a complete, valid Agent Card configuration using dummy values.
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
kind: remote
|
|
||||||
name: block-scalar-agent
|
|
||||||
agent_card_json: |
|
|
||||||
{
|
|
||||||
"protocolVersion": "0.3.0",
|
|
||||||
"name": "Example Agent Name",
|
|
||||||
"description": "An example agent description for documentation purposes.",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"url": "dummy-url",
|
|
||||||
"preferredTransport": "HTTP+JSON",
|
|
||||||
"capabilities": {
|
|
||||||
"streaming": true,
|
|
||||||
"extendedAgentCard": false
|
|
||||||
},
|
|
||||||
"defaultInputModes": [
|
|
||||||
"text/plain"
|
|
||||||
],
|
|
||||||
"defaultOutputModes": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"skills": [
|
|
||||||
{
|
|
||||||
"id": "ExampleSkill",
|
|
||||||
"name": "Example Skill Assistant",
|
|
||||||
"description": "A description of what this example skill does.",
|
|
||||||
"tags": [
|
|
||||||
"example-tag"
|
|
||||||
],
|
|
||||||
"examples": [
|
|
||||||
"Show me an example."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Using double quotes
|
|
||||||
|
|
||||||
Double quotes are also supported, but any internal double quotes in your JSON
|
|
||||||
must be escaped with a backslash.
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
kind: remote
|
|
||||||
name: double-quotes-agent
|
|
||||||
agent_card_json:
|
|
||||||
'{ "protocolVersion": "0.3.0", "name": "Example Agent", "version": "1.0.0",
|
|
||||||
"url": "dummy-url" }'
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Authentication
|
## Authentication
|
||||||
|
|
||||||
Many remote agents require authentication. Gemini CLI supports several
|
Many remote agents require authentication. Gemini CLI supports several
|
||||||
@@ -177,7 +101,7 @@ Gemini CLI supports the following authentication types:
|
|||||||
| `apiKey` | Send a static API key as an HTTP header. |
|
| `apiKey` | Send a static API key as an HTTP header. |
|
||||||
| `http` | HTTP authentication (Bearer token, Basic credentials, or any IANA-registered scheme). |
|
| `http` | HTTP authentication (Bearer token, Basic credentials, or any IANA-registered scheme). |
|
||||||
| `google-credentials` | Google Application Default Credentials (ADC). Automatically selects access or identity tokens. |
|
| `google-credentials` | Google Application Default Credentials (ADC). Automatically selects access or identity tokens. |
|
||||||
| `oauth` | OAuth 2.0 Authorization Code flow with PKCE. Opens a browser for interactive sign-in. |
|
| `oauth2` | OAuth 2.0 Authorization Code flow with PKCE. Opens a browser for interactive sign-in. |
|
||||||
|
|
||||||
### Dynamic values
|
### Dynamic values
|
||||||
|
|
||||||
@@ -336,7 +260,7 @@ hosts:
|
|||||||
|
|
||||||
Requests to any other host will be rejected with an error. If your agent is
|
Requests to any other host will be rejected with an error. If your agent is
|
||||||
hosted on a different domain, use one of the other auth types (`apiKey`, `http`,
|
hosted on a different domain, use one of the other auth types (`apiKey`, `http`,
|
||||||
or `oauth`).
|
or `oauth2`).
|
||||||
|
|
||||||
#### Examples
|
#### Examples
|
||||||
|
|
||||||
@@ -370,7 +294,7 @@ auth:
|
|||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
### OAuth 2.0 (`oauth`)
|
### OAuth 2.0 (`oauth2`)
|
||||||
|
|
||||||
Performs an interactive OAuth 2.0 Authorization Code flow with PKCE. On first
|
Performs an interactive OAuth 2.0 Authorization Code flow with PKCE. On first
|
||||||
use, Gemini CLI opens your browser for sign-in and persists the resulting tokens
|
use, Gemini CLI opens your browser for sign-in and persists the resulting tokens
|
||||||
@@ -378,7 +302,7 @@ for subsequent requests.
|
|||||||
|
|
||||||
| Field | Type | Required | Description |
|
| Field | Type | Required | Description |
|
||||||
| :------------------ | :------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| :------------------ | :------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `type` | string | Yes | Must be `oauth`. |
|
| `type` | string | Yes | Must be `oauth2`. |
|
||||||
| `client_id` | string | Yes\* | OAuth client ID. Required for interactive auth. |
|
| `client_id` | string | Yes\* | OAuth client ID. Required for interactive auth. |
|
||||||
| `client_secret` | string | No\* | OAuth client secret. Required by most authorization servers (confidential clients). Can be omitted for public clients that don't require a secret. |
|
| `client_secret` | string | No\* | OAuth client secret. Required by most authorization servers (confidential clients). Can be omitted for public clients that don't require a secret. |
|
||||||
| `scopes` | string[] | No | Requested scopes. Can also be discovered from the agent card. |
|
| `scopes` | string[] | No | Requested scopes. Can also be discovered from the agent card. |
|
||||||
@@ -391,7 +315,7 @@ kind: remote
|
|||||||
name: oauth-agent
|
name: oauth-agent
|
||||||
agent_card_url: https://example.com/.well-known/agent.json
|
agent_card_url: https://example.com/.well-known/agent.json
|
||||||
auth:
|
auth:
|
||||||
type: oauth
|
type: oauth2
|
||||||
client_id: my-client-id.apps.example.com
|
client_id: my-client-id.apps.example.com
|
||||||
---
|
---
|
||||||
```
|
```
|
||||||
@@ -438,20 +362,5 @@ Users can manage subagents using the following commands within the Gemini CLI:
|
|||||||
- `/agents enable <agent_name>`: Enables a specific subagent.
|
- `/agents enable <agent_name>`: Enables a specific subagent.
|
||||||
- `/agents disable <agent_name>`: Disables a specific subagent.
|
- `/agents disable <agent_name>`: Disables a specific subagent.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Tip:** You can use the `@cli_help` agent within Gemini CLI for assistance
|
||||||
> [!TIP]
|
|
||||||
> You can use the `@cli_help` agent within Gemini CLI for assistance
|
|
||||||
> with configuring subagents.
|
> with configuring subagents.
|
||||||
|
|
||||||
## Disabling remote agents
|
|
||||||
|
|
||||||
Remote subagents are enabled by default. To disable them, set `enableAgents` to
|
|
||||||
`false` in your `settings.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"experimental": {
|
|
||||||
"enableAgents": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|||||||
+43
-198
@@ -1,10 +1,21 @@
|
|||||||
# Subagents
|
# Subagents (experimental)
|
||||||
|
|
||||||
Subagents are specialized agents that operate within your main Gemini CLI
|
Subagents are specialized agents that operate within your main Gemini CLI
|
||||||
session. They are designed to handle specific, complex tasks—like deep codebase
|
session. They are designed to handle specific, complex tasks—like deep codebase
|
||||||
analysis, documentation lookup, or domain-specific reasoning—without cluttering
|
analysis, documentation lookup, or domain-specific reasoning—without cluttering
|
||||||
the main agent's context or toolset.
|
the main agent's context or toolset.
|
||||||
|
|
||||||
|
> **Note: Subagents are currently an experimental feature.**
|
||||||
|
>
|
||||||
|
> To use custom subagents, you must ensure they are enabled in your
|
||||||
|
> `settings.json` (enabled by default):
|
||||||
|
>
|
||||||
|
> ```json
|
||||||
|
> {
|
||||||
|
> "experimental": { "enableAgents": true }
|
||||||
|
> }
|
||||||
|
> ```
|
||||||
|
|
||||||
## What are subagents?
|
## What are subagents?
|
||||||
|
|
||||||
Subagents are "specialists" that the main Gemini agent can hire for a specific
|
Subagents are "specialists" that the main Gemini agent can hire for a specific
|
||||||
@@ -103,20 +114,16 @@ Gemini CLI comes with the following built-in subagents:
|
|||||||
the pricing table from this page," "Click the login button and enter my
|
the pricing table from this page," "Click the login button and enter my
|
||||||
credentials."
|
credentials."
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** This is a preview feature currently under active development.
|
||||||
> [!NOTE]
|
|
||||||
> This is a preview feature currently under active development.
|
|
||||||
|
|
||||||
#### Prerequisites
|
#### Prerequisites
|
||||||
|
|
||||||
The browser agent requires:
|
The browser agent requires:
|
||||||
|
|
||||||
- **Chrome** version 144 or later (any recent stable release works).
|
- **Chrome** version 144 or later (any recent stable release will work).
|
||||||
|
- **Node.js** with `npx` available (used to launch the
|
||||||
The underlying
|
[`chrome-devtools-mcp`](https://www.npmjs.com/package/chrome-devtools-mcp)
|
||||||
[`chrome-devtools-mcp`](https://www.npmjs.com/package/chrome-devtools-mcp)
|
server).
|
||||||
server is bundled with Gemini CLI and launched automatically — no separate
|
|
||||||
installation is needed.
|
|
||||||
|
|
||||||
#### Enabling the browser agent
|
#### Enabling the browser agent
|
||||||
|
|
||||||
@@ -162,58 +169,26 @@ The available modes are:
|
|||||||
| `isolated` | Launches Chrome with a temporary profile that is deleted after each session. Use this for clean-state automation. |
|
| `isolated` | Launches Chrome with a temporary profile that is deleted after each session. Use this for clean-state automation. |
|
||||||
| `existing` | Attaches to an already-running Chrome instance. You must enable remote debugging first by navigating to `chrome://inspect/#remote-debugging` in Chrome. No new browser process is launched. |
|
| `existing` | Attaches to an already-running Chrome instance. You must enable remote debugging first by navigating to `chrome://inspect/#remote-debugging` in Chrome. No new browser process is launched. |
|
||||||
|
|
||||||
#### First-run consent
|
|
||||||
|
|
||||||
The first time the browser agent is invoked, Gemini CLI displays a consent
|
|
||||||
dialog. You must accept before the browser session starts. This dialog only
|
|
||||||
appears once.
|
|
||||||
|
|
||||||
#### Configuration reference
|
#### Configuration reference
|
||||||
|
|
||||||
All browser-specific settings go under `agents.browser` in your `settings.json`.
|
All browser-specific settings go under `agents.browser` in your `settings.json`.
|
||||||
For full details, see the
|
|
||||||
[`agents.browser` configuration reference](../reference/configuration.md#agents).
|
|
||||||
|
|
||||||
| Setting | Type | Default | Description |
|
| Setting | Type | Default | Description |
|
||||||
| :------------------------ | :--------- | :------------- | :------------------------------------------------------------------------------ |
|
| :------------ | :-------- | :------------- | :---------------------------------------------------------------------------------------------- |
|
||||||
| `sessionMode` | `string` | `"persistent"` | How Chrome is managed: `"persistent"`, `"isolated"`, or `"existing"`. |
|
| `sessionMode` | `string` | `"persistent"` | How Chrome is managed: `"persistent"`, `"isolated"`, or `"existing"`. |
|
||||||
| `headless` | `boolean` | `false` | Run Chrome in headless mode (no visible window). |
|
| `headless` | `boolean` | `false` | Run Chrome in headless mode (no visible window). |
|
||||||
| `profilePath` | `string` | — | Custom path to a browser profile directory. |
|
| `profilePath` | `string` | — | Custom path to a browser profile directory. |
|
||||||
| `visualModel` | `string` | — | Model override for the visual agent. |
|
| `visualModel` | `string` | — | Model override for the visual agent (for example, `"gemini-2.5-computer-use-preview-10-2025"`). |
|
||||||
| `allowedDomains` | `string[]` | — | Restrict navigation to specific domains (for example, `["github.com"]`). |
|
|
||||||
| `disableUserInput` | `boolean` | `true` | Disable user input on the browser window during automation (non-headless only). |
|
|
||||||
| `maxActionsPerTask` | `number` | `100` | Maximum tool calls per task. The agent is terminated when the limit is reached. |
|
|
||||||
| `confirmSensitiveActions` | `boolean` | `false` | Require manual confirmation for `upload_file` and `evaluate_script`. |
|
|
||||||
| `blockFileUploads` | `boolean` | `false` | Hard-block all file upload requests from the agent. |
|
|
||||||
|
|
||||||
#### Automation overlay and input blocking
|
|
||||||
|
|
||||||
In non-headless mode, the browser agent injects a visual overlay into the
|
|
||||||
browser window to indicate that automation is in progress. By default, user
|
|
||||||
input (keyboard and mouse) is also blocked to prevent accidental interference.
|
|
||||||
You can disable this by setting `disableUserInput` to `false`.
|
|
||||||
|
|
||||||
#### Security
|
#### Security
|
||||||
|
|
||||||
The browser agent enforces several layers of security:
|
The browser agent enforces the following security restrictions:
|
||||||
|
|
||||||
- **Domain restrictions:** When `allowedDomains` is set, the agent can only
|
- **Blocked URL patterns:** `file://`, `javascript:`, `data:text/html`,
|
||||||
navigate to the listed domains (and their subdomains when using `*.` prefix).
|
`chrome://extensions`, and `chrome://settings/passwords` are always blocked.
|
||||||
Attempting to visit a disallowed domain throws a fatal error that immediately
|
- **Sensitive action confirmation:** Actions like form filling, file uploads,
|
||||||
terminates the agent. The agent also attempts to detect and block the use of
|
and form submissions require user confirmation through the standard policy
|
||||||
allowed domains as proxies (e.g., via query parameters or fragments) to access
|
engine.
|
||||||
restricted content.
|
|
||||||
- **Blocked URL patterns:** The underlying MCP server blocks dangerous URL
|
|
||||||
schemes including `file://`, `javascript:`, `data:text/html`,
|
|
||||||
`chrome://extensions`, and `chrome://settings/passwords`.
|
|
||||||
- **Sensitive action confirmation:** Form filling (`fill`, `fill_form`) always
|
|
||||||
requires user confirmation through the policy engine, regardless of approval
|
|
||||||
mode. When `confirmSensitiveActions` is `true`, `upload_file` and
|
|
||||||
`evaluate_script` also require confirmation.
|
|
||||||
- **File upload blocking:** Set `blockFileUploads` to `true` to hard-block all
|
|
||||||
file upload requests, preventing the agent from uploading any files.
|
|
||||||
- **Action rate limiting:** The `maxActionsPerTask` setting (default: 100)
|
|
||||||
limits the total number of tool calls per task to prevent runaway execution.
|
|
||||||
|
|
||||||
#### Visual agent
|
#### Visual agent
|
||||||
|
|
||||||
@@ -242,70 +217,22 @@ captures a screenshot and sends it to the vision model for analysis. The model
|
|||||||
returns coordinates and element descriptions that the browser agent uses with
|
returns coordinates and element descriptions that the browser agent uses with
|
||||||
the `click_at` tool for precise, coordinate-based interactions.
|
the `click_at` tool for precise, coordinate-based interactions.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The visual agent requires API key or Vertex AI authentication. It is
|
||||||
> [!NOTE]
|
|
||||||
> The visual agent requires API key or Vertex AI authentication. It is
|
|
||||||
> not available when using "Sign in with Google".
|
> not available when using "Sign in with Google".
|
||||||
|
|
||||||
#### Sandbox support
|
|
||||||
|
|
||||||
The browser agent adjusts its behavior automatically when running inside a
|
|
||||||
sandbox.
|
|
||||||
|
|
||||||
##### macOS seatbelt (`sandbox-exec`)
|
|
||||||
|
|
||||||
When the CLI runs under the macOS seatbelt sandbox, `persistent` and `isolated`
|
|
||||||
session modes are forced to `isolated` with `headless` enabled. This avoids
|
|
||||||
permission errors caused by seatbelt file-system restrictions on persistent
|
|
||||||
browser profiles. If `sessionMode` is set to `existing`, no override is applied.
|
|
||||||
|
|
||||||
##### Container sandboxes (Docker / Podman)
|
|
||||||
|
|
||||||
Chrome is not available inside the container, so the browser agent is
|
|
||||||
**disabled** unless `sessionMode` is set to `"existing"`. When enabled with
|
|
||||||
`existing` mode, the agent automatically connects to Chrome on the host via the
|
|
||||||
resolved IP of `host.docker.internal:9222` instead of using local pipe
|
|
||||||
discovery. Port `9222` is currently hardcoded and cannot be customized.
|
|
||||||
|
|
||||||
To use the browser agent in a Docker sandbox:
|
|
||||||
|
|
||||||
1. Start Chrome on the host with remote debugging enabled:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Option A: Launch Chrome from the command line
|
|
||||||
google-chrome --remote-debugging-port=9222
|
|
||||||
|
|
||||||
# Option B: Enable in Chrome settings
|
|
||||||
# Navigate to chrome://inspect/#remote-debugging and enable
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Configure `sessionMode` and allowed domains in your project's
|
|
||||||
`.gemini/settings.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"agents": {
|
|
||||||
"overrides": {
|
|
||||||
"browser_agent": { "enabled": true }
|
|
||||||
},
|
|
||||||
"browser": {
|
|
||||||
"sessionMode": "existing",
|
|
||||||
"allowedDomains": ["example.com"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Launch the CLI with port forwarding:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
GEMINI_SANDBOX=docker SANDBOX_PORTS=9222 gemini
|
|
||||||
```
|
|
||||||
|
|
||||||
## Creating custom subagents
|
## Creating custom subagents
|
||||||
|
|
||||||
You can create your own subagents to automate specific workflows or enforce
|
You can create your own subagents to automate specific workflows or enforce
|
||||||
specific personas.
|
specific personas. To use custom subagents, you must enable them in your
|
||||||
|
`settings.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"experimental": {
|
||||||
|
"enableAgents": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Agent definition files
|
### Agent definition files
|
||||||
|
|
||||||
@@ -357,7 +284,6 @@ it yourself; just report it.
|
|||||||
| `description` | string | Yes | Short description of what the agent does. This is visible to the main agent to help it decide when to call this subagent. |
|
| `description` | string | Yes | Short description of what the agent does. This is visible to the main agent to help it decide when to call this subagent. |
|
||||||
| `kind` | string | No | `local` (default) or `remote`. |
|
| `kind` | string | No | `local` (default) or `remote`. |
|
||||||
| `tools` | array | No | List of tool names this agent can use. Supports wildcards: `*` (all tools), `mcp_*` (all MCP tools), `mcp_server_*` (all tools from a server). **If omitted, it inherits all tools from the parent session.** |
|
| `tools` | array | No | List of tool names this agent can use. Supports wildcards: `*` (all tools), `mcp_*` (all MCP tools), `mcp_server_*` (all tools from a server). **If omitted, it inherits all tools from the parent session.** |
|
||||||
| `mcpServers` | object | No | Configuration for inline Model Context Protocol (MCP) servers isolated to this specific agent. |
|
|
||||||
| `model` | string | No | Specific model to use (e.g., `gemini-3-preview`). Defaults to `inherit` (uses the main session model). |
|
| `model` | string | No | Specific model to use (e.g., `gemini-3-preview`). Defaults to `inherit` (uses the main session model). |
|
||||||
| `temperature` | number | No | Model temperature (0.0 - 2.0). Defaults to `1`. |
|
| `temperature` | number | No | Model temperature (0.0 - 2.0). Defaults to `1`. |
|
||||||
| `max_turns` | number | No | Maximum number of conversation turns allowed for this agent before it must return. Defaults to `30`. |
|
| `max_turns` | number | No | Maximum number of conversation turns allowed for this agent before it must return. Defaults to `30`. |
|
||||||
@@ -385,78 +311,6 @@ Each subagent runs in its own isolated context loop. This means:
|
|||||||
subagents **cannot** call other subagents. If a subagent is granted the `*`
|
subagents **cannot** call other subagents. If a subagent is granted the `*`
|
||||||
tool wildcard, it will still be unable to see or invoke other agents.
|
tool wildcard, it will still be unable to see or invoke other agents.
|
||||||
|
|
||||||
## Subagent tool isolation
|
|
||||||
|
|
||||||
Subagent tool isolation moves Gemini CLI away from a single global tool
|
|
||||||
registry. By providing isolated execution environments, you can ensure that
|
|
||||||
subagents only interact with the parts of the system they are designed for. This
|
|
||||||
prevents unintended side effects, improves reliability by avoiding state
|
|
||||||
contamination, and enables fine-grained permission control.
|
|
||||||
|
|
||||||
With this feature, you can:
|
|
||||||
|
|
||||||
- **Specify tool access:** Define exactly which tools an agent can access using
|
|
||||||
a `tools` list in the agent definition.
|
|
||||||
- **Define inline MCP servers:** Configure Model Context Protocol (MCP) servers
|
|
||||||
(which provide a standardized way to connect AI models to external tools and
|
|
||||||
data sources) directly in the subagent's markdown frontmatter, isolating them
|
|
||||||
to that specific agent.
|
|
||||||
- **Maintain state isolation:** Ensure that subagents only interact with their
|
|
||||||
own set of tools and servers, preventing side effects and state contamination.
|
|
||||||
- **Apply subagent-specific policies:** Enforce granular rules in your
|
|
||||||
[Policy Engine](../reference/policy-engine.md) TOML configuration based on the
|
|
||||||
executing subagent's name.
|
|
||||||
|
|
||||||
### Configuring isolated tools and servers
|
|
||||||
|
|
||||||
You can configure tool isolation for a subagent by updating its markdown
|
|
||||||
frontmatter. This allows you to explicitly state which tools the subagent can
|
|
||||||
use, rather than relying on the global registry.
|
|
||||||
|
|
||||||
Add an `mcpServers` object to define inline MCP servers that are unique to the
|
|
||||||
agent.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: my-isolated-agent
|
|
||||||
tools:
|
|
||||||
- grep_search
|
|
||||||
- read_file
|
|
||||||
mcpServers:
|
|
||||||
my-custom-server:
|
|
||||||
command: 'node'
|
|
||||||
args: ['path/to/server.js']
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
### Subagent-specific policies
|
|
||||||
|
|
||||||
You can enforce fine-grained control over subagents using the
|
|
||||||
[Policy Engine's](../reference/policy-engine.md) TOML configuration. This allows
|
|
||||||
you to grant or restrict permissions specifically for an agent, without
|
|
||||||
affecting the rest of your CLI session.
|
|
||||||
|
|
||||||
To restrict a policy rule to a specific subagent, add the `subagent` property to
|
|
||||||
the `[[rules]]` block in your `policy.toml` file.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[[rules]]
|
|
||||||
name = "Allow pr-creator to push code"
|
|
||||||
subagent = "pr-creator"
|
|
||||||
description = "Permit pr-creator to push branches automatically."
|
|
||||||
action = "allow"
|
|
||||||
toolName = "run_shell_command"
|
|
||||||
commandPrefix = "git push"
|
|
||||||
```
|
|
||||||
|
|
||||||
In this configuration, the policy rule only triggers if the executing subagent's
|
|
||||||
name matches `pr-creator`. Rules without the `subagent` property apply
|
|
||||||
universally to all agents.
|
|
||||||
|
|
||||||
## Managing subagents
|
## Managing subagents
|
||||||
|
|
||||||
You can manage subagents interactively using the `/agents` command or
|
You can manage subagents interactively using the `/agents` command or
|
||||||
@@ -546,11 +400,13 @@ If you need to further tune your subagent, you can do so by selecting the model
|
|||||||
to optimize for with `/model` and then asking the model why it does not think
|
to optimize for with `/model` and then asking the model why it does not think
|
||||||
that your subagent was called with a specific prompt and the given description.
|
that your subagent was called with a specific prompt and the given description.
|
||||||
|
|
||||||
## Remote subagents (Agent2Agent)
|
## Remote subagents (Agent2Agent) (experimental)
|
||||||
|
|
||||||
Gemini CLI can also delegate tasks to remote subagents using the Agent-to-Agent
|
Gemini CLI can also delegate tasks to remote subagents using the Agent-to-Agent
|
||||||
(A2A) protocol.
|
(A2A) protocol.
|
||||||
|
|
||||||
|
> **Note: Remote subagents are currently an experimental feature.**
|
||||||
|
|
||||||
See the [Remote Subagents documentation](remote-agents) for detailed
|
See the [Remote Subagents documentation](remote-agents) for detailed
|
||||||
configuration, authentication, and usage instructions.
|
configuration, authentication, and usage instructions.
|
||||||
|
|
||||||
@@ -559,14 +415,3 @@ configuration, authentication, and usage instructions.
|
|||||||
Extensions can bundle and distribute subagents. See the
|
Extensions can bundle and distribute subagents. See the
|
||||||
[Extensions documentation](../extensions/index.md#subagents) for details on how
|
[Extensions documentation](../extensions/index.md#subagents) for details on how
|
||||||
to package agents within an extension.
|
to package agents within an extension.
|
||||||
|
|
||||||
## Disabling subagents
|
|
||||||
|
|
||||||
Subagents are enabled by default. To disable them, set `enableAgents` to `false`
|
|
||||||
in your `settings.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"experimental": { "enableAgents": false }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Gemini CLI creates a copy of the extension during installation. You must run
|
|||||||
GitHub, you must have `git` installed on your machine.
|
GitHub, you must have `git` installed on your machine.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gemini extensions install <source> [--ref <ref>] [--auto-update] [--pre-release] [--consent] [--skip-settings]
|
gemini extensions install <source> [--ref <ref>] [--auto-update] [--pre-release] [--consent]
|
||||||
```
|
```
|
||||||
|
|
||||||
- `<source>`: The GitHub URL or local path of the extension.
|
- `<source>`: The GitHub URL or local path of the extension.
|
||||||
@@ -31,7 +31,6 @@ gemini extensions install <source> [--ref <ref>] [--auto-update] [--pre-release]
|
|||||||
- `--auto-update`: Enable automatic updates for this extension.
|
- `--auto-update`: Enable automatic updates for this extension.
|
||||||
- `--pre-release`: Enable installation of pre-release versions.
|
- `--pre-release`: Enable installation of pre-release versions.
|
||||||
- `--consent`: Acknowledge security risks and skip the confirmation prompt.
|
- `--consent`: Acknowledge security risks and skip the confirmation prompt.
|
||||||
- `--skip-settings`: Skip the configuration on install process.
|
|
||||||
|
|
||||||
### Uninstall an extension
|
### Uninstall an extension
|
||||||
|
|
||||||
@@ -235,9 +234,7 @@ skill definitions in a `skills/` directory. For example,
|
|||||||
|
|
||||||
### Sub-agents
|
### Sub-agents
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Sub-agents are a preview feature currently under active development.
|
||||||
> [!NOTE]
|
|
||||||
> Sub-agents are a preview feature currently under active development.
|
|
||||||
|
|
||||||
Provide [sub-agents](../core/subagents.md) that users can delegate tasks to. Add
|
Provide [sub-agents](../core/subagents.md) that users can delegate tasks to. Add
|
||||||
agent definition files (`.md`) to an `agents/` directory in your extension root.
|
agent definition files (`.md`) to an `agents/` directory in your extension root.
|
||||||
@@ -256,9 +253,7 @@ Rules contributed by extensions run in their own tier (tier 2), alongside
|
|||||||
workspace-defined policies. This tier has higher priority than the default rules
|
workspace-defined policies. This tier has higher priority than the default rules
|
||||||
but lower priority than user or admin policies.
|
but lower priority than user or admin policies.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** For security, Gemini CLI ignores any `allow` decisions or `yolo`
|
||||||
> [!WARNING]
|
|
||||||
> For security, Gemini CLI ignores any `allow` decisions or `yolo`
|
|
||||||
> mode configurations in extension policies. This ensures that an extension
|
> mode configurations in extension policies. This ensures that an extension
|
||||||
> cannot automatically approve tool calls or bypass security measures without
|
> cannot automatically approve tool calls or bypass security measures without
|
||||||
> your confirmation.
|
> your confirmation.
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ To use Gemini CLI, you'll need to authenticate with Google. This guide helps you
|
|||||||
quickly find the best way to sign in based on your account type and how you're
|
quickly find the best way to sign in based on your account type and how you're
|
||||||
using the CLI.
|
using the CLI.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Looking for a high-level comparison of all available subscriptions?
|
||||||
> [!TIP]
|
|
||||||
> Looking for a high-level comparison of all available subscriptions?
|
|
||||||
> To compare features and find the right quota for your needs, see our
|
> To compare features and find the right quota for your needs, see our
|
||||||
> [Plans page](https://geminicli.com/plans/).
|
> [Plans page](https://geminicli.com/plans/).
|
||||||
|
|
||||||
@@ -42,11 +40,11 @@ Select the authentication method that matches your situation in the table below:
|
|||||||
|
|
||||||
If you run Gemini CLI on your local machine, the simplest authentication method
|
If you run Gemini CLI on your local machine, the simplest authentication method
|
||||||
is logging in with your Google account. This method requires a web browser on a
|
is logging in with your Google account. This method requires a web browser on a
|
||||||
machine that can communicate with the terminal running Gemini CLI (for example,
|
machine that can communicate with the terminal running Gemini CLI (e.g., your
|
||||||
your local machine).
|
local machine).
|
||||||
|
|
||||||
If you are a **Google AI Pro** or **Google AI Ultra** subscriber, use the Google
|
> **Important:** If you are a **Google AI Pro** or **Google AI Ultra**
|
||||||
account associated with your subscription.
|
> subscriber, use the Google account associated with your subscription.
|
||||||
|
|
||||||
To authenticate and use Gemini CLI:
|
To authenticate and use Gemini CLI:
|
||||||
|
|
||||||
@@ -109,9 +107,7 @@ To authenticate and use Gemini CLI with a Gemini API key:
|
|||||||
|
|
||||||
4. Select **Use Gemini API key**.
|
4. Select **Use Gemini API key**.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** Treat API keys, especially for services like Gemini, as sensitive
|
||||||
> [!WARNING]
|
|
||||||
> Treat API keys, especially for services like Gemini, as sensitive
|
|
||||||
> credentials. Protect them to prevent unauthorized access and potential misuse
|
> credentials. Protect them to prevent unauthorized access and potential misuse
|
||||||
> of the service under your account.
|
> of the service under your account.
|
||||||
|
|
||||||
@@ -134,7 +130,7 @@ For example:
|
|||||||
**macOS/Linux**
|
**macOS/Linux**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Replace with your project ID and desired location (for example, us-central1)
|
# Replace with your project ID and desired location (e.g., us-central1)
|
||||||
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
|
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
|
||||||
export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
|
export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
|
||||||
```
|
```
|
||||||
@@ -142,7 +138,7 @@ export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
|
|||||||
**Windows (PowerShell)**
|
**Windows (PowerShell)**
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# Replace with your project ID and desired location (for example, us-central1)
|
# Replace with your project ID and desired location (e.g., us-central1)
|
||||||
$env:GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
|
$env:GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
|
||||||
$env:GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
|
$env:GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
|
||||||
```
|
```
|
||||||
@@ -154,20 +150,20 @@ To make any Vertex AI environment variable settings persistent, see
|
|||||||
|
|
||||||
Consider this authentication method if you have Google Cloud CLI installed.
|
Consider this authentication method if you have Google Cloud CLI installed.
|
||||||
|
|
||||||
If you have previously set `GOOGLE_API_KEY` or `GEMINI_API_KEY`, you must unset
|
> **Note:** If you have previously set `GOOGLE_API_KEY` or `GEMINI_API_KEY`, you
|
||||||
them to use ADC.
|
> must unset them to use ADC:
|
||||||
|
>
|
||||||
**macOS/Linux**
|
> **macOS/Linux**
|
||||||
|
>
|
||||||
```bash
|
> ```bash
|
||||||
unset GOOGLE_API_KEY GEMINI_API_KEY
|
> unset GOOGLE_API_KEY GEMINI_API_KEY
|
||||||
```
|
> ```
|
||||||
|
>
|
||||||
**Windows (PowerShell)**
|
> **Windows (PowerShell)**
|
||||||
|
>
|
||||||
```powershell
|
> ```powershell
|
||||||
Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
> Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
||||||
```
|
> ```
|
||||||
|
|
||||||
1. Verify you have a Google Cloud project and Vertex AI API is enabled.
|
1. Verify you have a Google Cloud project and Vertex AI API is enabled.
|
||||||
|
|
||||||
@@ -192,20 +188,20 @@ Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
|||||||
Consider this method of authentication in non-interactive environments, CI/CD
|
Consider this method of authentication in non-interactive environments, CI/CD
|
||||||
pipelines, or if your organization restricts user-based ADC or API key creation.
|
pipelines, or if your organization restricts user-based ADC or API key creation.
|
||||||
|
|
||||||
If you have previously set `GOOGLE_API_KEY` or `GEMINI_API_KEY`, you must unset
|
> **Note:** If you have previously set `GOOGLE_API_KEY` or `GEMINI_API_KEY`, you
|
||||||
them:
|
> must unset them:
|
||||||
|
>
|
||||||
**macOS/Linux**
|
> **macOS/Linux**
|
||||||
|
>
|
||||||
```bash
|
> ```bash
|
||||||
unset GOOGLE_API_KEY GEMINI_API_KEY
|
> unset GOOGLE_API_KEY GEMINI_API_KEY
|
||||||
```
|
> ```
|
||||||
|
>
|
||||||
**Windows (PowerShell)**
|
> **Windows (PowerShell)**
|
||||||
|
>
|
||||||
```powershell
|
> ```powershell
|
||||||
Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
> Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
||||||
```
|
> ```
|
||||||
|
|
||||||
1. [Create a service account and key](https://cloud.google.com/iam/docs/keys-create-delete)
|
1. [Create a service account and key](https://cloud.google.com/iam/docs/keys-create-delete)
|
||||||
and download the provided JSON file. Assign the "Vertex AI User" role to the
|
and download the provided JSON file. Assign the "Vertex AI User" role to the
|
||||||
@@ -237,11 +233,8 @@ Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
|||||||
```
|
```
|
||||||
|
|
||||||
5. Select **Vertex AI**.
|
5. Select **Vertex AI**.
|
||||||
|
> **Warning:** Protect your service account key file as it gives access to
|
||||||
<!-- prettier-ignore -->
|
> your resources.
|
||||||
> [!WARNING]
|
|
||||||
> Protect your service account key file as it gives access to
|
|
||||||
> your resources.
|
|
||||||
|
|
||||||
#### C. Vertex AI - Google Cloud API key
|
#### C. Vertex AI - Google Cloud API key
|
||||||
|
|
||||||
@@ -264,9 +257,10 @@ Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
|||||||
$env:GOOGLE_API_KEY="YOUR_GOOGLE_API_KEY"
|
$env:GOOGLE_API_KEY="YOUR_GOOGLE_API_KEY"
|
||||||
```
|
```
|
||||||
|
|
||||||
If you see errors like `"API keys are not supported by this API..."`, your
|
> **Note:** If you see errors like
|
||||||
organization might restrict API key usage for this service. Try the other
|
> `"API keys are not supported by this API..."`, your organization might
|
||||||
Vertex AI authentication methods instead.
|
> restrict API key usage for this service. Try the other Vertex AI
|
||||||
|
> authentication methods instead.
|
||||||
|
|
||||||
3. [Configure your Google Cloud Project](#set-gcp).
|
3. [Configure your Google Cloud Project](#set-gcp).
|
||||||
|
|
||||||
@@ -280,9 +274,7 @@ Remove-Item Env:\GOOGLE_API_KEY, Env:\GEMINI_API_KEY -ErrorAction Ignore
|
|||||||
|
|
||||||
## Set your Google Cloud project <a id="set-gcp"></a>
|
## Set your Google Cloud project <a id="set-gcp"></a>
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Important:** Most individual Google accounts (free and paid) don't require a
|
||||||
> [!IMPORTANT]
|
|
||||||
> Most individual Google accounts (free and paid) don't require a
|
|
||||||
> Google Cloud project for authentication.
|
> Google Cloud project for authentication.
|
||||||
|
|
||||||
When you sign in using your Google account, you may need to configure a Google
|
When you sign in using your Google account, you may need to configure a Google
|
||||||
@@ -333,31 +325,29 @@ persist them with the following methods:
|
|||||||
1. **Add your environment variables to your shell configuration file:** Append
|
1. **Add your environment variables to your shell configuration file:** Append
|
||||||
the environment variable commands to your shell's startup file.
|
the environment variable commands to your shell's startup file.
|
||||||
|
|
||||||
**macOS/Linux** (for example, `~/.bashrc`, `~/.zshrc`, or `~/.profile`):
|
**macOS/Linux** (e.g., `~/.bashrc`, `~/.zshrc`, or `~/.profile`):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
echo 'export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"' >> ~/.bashrc
|
echo 'export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"' >> ~/.bashrc
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows (PowerShell)** (for example, `$PROFILE`):
|
**Windows (PowerShell)** (e.g., `$PROFILE`):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
Add-Content -Path $PROFILE -Value '$env:GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"'
|
Add-Content -Path $PROFILE -Value '$env:GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"'
|
||||||
. $PROFILE
|
. $PROFILE
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** Be aware that when you export API keys or service account
|
||||||
> [!WARNING]
|
> paths in your shell configuration file, any process launched from that
|
||||||
> Be aware that when you export API keys or service account
|
> shell can read them.
|
||||||
> paths in your shell configuration file, any process launched from that
|
|
||||||
> shell can read them.
|
|
||||||
|
|
||||||
2. **Use a `.env` file:** Create a `.gemini/.env` file in your project
|
2. **Use a `.env` file:** Create a `.gemini/.env` file in your project
|
||||||
directory or home directory. Gemini CLI automatically loads variables from
|
directory or home directory. Gemini CLI automatically loads variables from
|
||||||
the first `.env` file it finds, searching up from the current directory,
|
the first `.env` file it finds, searching up from the current directory,
|
||||||
then in your home directory's `.gemini/.env` (for example, `~/.gemini/.env`
|
then in your home directory's `.gemini/.env` (e.g., `~/.gemini/.env` or
|
||||||
or `%USERPROFILE%\.gemini\.env`).
|
`%USERPROFILE%\.gemini\.env`).
|
||||||
|
|
||||||
Example for user-wide settings:
|
Example for user-wide settings:
|
||||||
|
|
||||||
@@ -398,8 +388,8 @@ on this page.
|
|||||||
|
|
||||||
## Running in headless mode <a id="headless"></a>
|
## Running in headless mode <a id="headless"></a>
|
||||||
|
|
||||||
[Headless mode](../cli/headless.md) will use your existing authentication
|
[Headless mode](../cli/headless) will use your existing authentication method,
|
||||||
method, if an existing authentication credential is cached.
|
if an existing authentication credential is cached.
|
||||||
|
|
||||||
If you have not already signed in with an authentication credential, you must
|
If you have not already signed in with an authentication credential, you must
|
||||||
configure authentication using environment variables:
|
configure authentication using environment variables:
|
||||||
|
|||||||
@@ -0,0 +1,139 @@
|
|||||||
|
# Gemini CLI examples
|
||||||
|
|
||||||
|
Gemini CLI helps you automate common engineering tasks by combining AI reasoning
|
||||||
|
with local system tools. This document provides examples of how to use the CLI
|
||||||
|
for file management, code analysis, and data transformation.
|
||||||
|
|
||||||
|
> **Note:** These examples demonstrate potential capabilities. Your actual
|
||||||
|
> results can vary based on the model used and your project environment.
|
||||||
|
|
||||||
|
## Rename your photographs based on content
|
||||||
|
|
||||||
|
You can use Gemini CLI to automate file management tasks that require visual
|
||||||
|
analysis. In this example, Gemini CLI renames images based on their actual
|
||||||
|
subject matter.
|
||||||
|
|
||||||
|
Scenario: You have a folder containing the following files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
photos/photo1.png
|
||||||
|
photos/photo2.png
|
||||||
|
photos/photo3.png
|
||||||
|
```
|
||||||
|
|
||||||
|
Give Gemini the following prompt:
|
||||||
|
|
||||||
|
```cli
|
||||||
|
Rename the photos in my "photos" directory based on their contents.
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: Gemini asks for permission to rename your files.
|
||||||
|
|
||||||
|
Select **Allow once** and your files are renamed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
photos/yellow_flowers.png
|
||||||
|
photos/antique_dresser.png
|
||||||
|
photos/green_android_robot.png
|
||||||
|
```
|
||||||
|
|
||||||
|
## Explain a repository by reading its code
|
||||||
|
|
||||||
|
Gemini CLI is effective for rapid codebase exploration. The following example
|
||||||
|
shows how to ask Gemini CLI to fetch, analyze, and summarize a remote project.
|
||||||
|
|
||||||
|
Scenario: You want to understand how a popular open-source utility works by
|
||||||
|
inspecting its code, not just its README.
|
||||||
|
|
||||||
|
Give Gemini CLI the following prompt:
|
||||||
|
|
||||||
|
```cli
|
||||||
|
Clone the 'chalk' repository from https://github.com/chalk/chalk, read its key source files, and explain how it works.
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: Gemini performs a sequence of actions to answer your request.
|
||||||
|
|
||||||
|
1. First, it asks for permission to run `git clone` to download the repository.
|
||||||
|
2. Next, it finds the important source files and asks for permission to read
|
||||||
|
them.
|
||||||
|
3. Finally, after analyzing the code, it provides a summary.
|
||||||
|
|
||||||
|
Gemini CLI returns an explanation based on the actual source code:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
The `chalk` library is a popular npm package for styling terminal output with
|
||||||
|
colors. After analyzing the source code, here's how it works:
|
||||||
|
|
||||||
|
- **Core functionality:** The main file sets up a chainable API. Each color or
|
||||||
|
modifier (like `bold` or `italic`) is a getter that appends the corresponding
|
||||||
|
ANSI escape code to an internal stack.
|
||||||
|
|
||||||
|
- **Chainable API:** When you call `chalk.red.bold('Hello')`, you are accessing
|
||||||
|
getters. The `red` getter adds the red color code, and the `bold` getter adds
|
||||||
|
the bold code.
|
||||||
|
|
||||||
|
- **Output generation:** When the chain is treated as a string (e.g., in
|
||||||
|
`console.log`), a final `toString()` method is called. This method joins all
|
||||||
|
the stored ANSI codes, wraps them around the input string ('Hello'), and adds
|
||||||
|
a reset code at the end. This produces the final, styled string that the
|
||||||
|
terminal can render.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Combine two spreadsheets into one spreadsheet
|
||||||
|
|
||||||
|
Gemini CLI can process and transform data across multiple files. Use this
|
||||||
|
capability to merge reports or reformat data sets without manual copying.
|
||||||
|
|
||||||
|
Scenario: You have two .csv files: `Revenue - 2023.csv` and
|
||||||
|
`Revenue - 2024.csv`. Each file contains monthly revenue figures.
|
||||||
|
|
||||||
|
Give Gemini CLI the following prompt:
|
||||||
|
|
||||||
|
```cli
|
||||||
|
Combine the two .csv files into a single .csv file, with each year a different column.
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: Gemini CLI reads each file and then asks for permission to write a new
|
||||||
|
file. Provide your permission and Gemini CLI provides the combined data:
|
||||||
|
|
||||||
|
```csv
|
||||||
|
Month,2023,2024
|
||||||
|
January,0,1000
|
||||||
|
February,0,1200
|
||||||
|
March,0,2400
|
||||||
|
April,900,500
|
||||||
|
May,1000,800
|
||||||
|
June,1000,900
|
||||||
|
July,1200,1000
|
||||||
|
August,1800,400
|
||||||
|
September,2000,2000
|
||||||
|
October,2400,3400
|
||||||
|
November,3400,1800
|
||||||
|
December,2100,9000
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run unit tests
|
||||||
|
|
||||||
|
Gemini CLI can generate boilerplate code and tests based on your existing
|
||||||
|
implementation. This example demonstrates how to request code coverage for a
|
||||||
|
JavaScript component.
|
||||||
|
|
||||||
|
Scenario: You've written a simple login page. You wish to write unit tests to
|
||||||
|
ensure that your login page has code coverage.
|
||||||
|
|
||||||
|
Give Gemini CLI the following prompt:
|
||||||
|
|
||||||
|
```cli
|
||||||
|
Write unit tests for Login.js.
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: Gemini CLI asks for permission to write a new file and creates a test
|
||||||
|
for your login page.
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
|
||||||
|
- Follow the [File management](../cli/tutorials/file-management.md) guide to
|
||||||
|
start working with your codebase.
|
||||||
|
- Follow the [Quickstart](./index.md) to start your first session.
|
||||||
|
- See the [Cheatsheet](../cli/cli-reference.md) for a quick reference of
|
||||||
|
available commands.
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
# Gemini 3 Pro and Gemini 3 Flash on Gemini CLI
|
# Gemini 3 Pro and Gemini 3 Flash on Gemini CLI
|
||||||
|
|
||||||
Learn about how you can use Gemini 3 Pro and Gemini 3 Flash on Gemini CLI.
|
Gemini 3 Pro and Gemini 3 Flash are available on Gemini CLI for all users!
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Gemini 3.1 Pro Preview is rolling out. To determine whether you have
|
||||||
> [!NOTE]
|
|
||||||
> Gemini 3.1 Pro Preview is rolling out. To determine whether you have
|
|
||||||
> access to Gemini 3.1, use the `/model` command and select **Manual**. If you
|
> access to Gemini 3.1, use the `/model` command and select **Manual**. If you
|
||||||
> have access, you will see `gemini-3.1-pro-preview`.
|
> have access, you will see `gemini-3.1-pro-preview`.
|
||||||
>
|
>
|
||||||
@@ -27,7 +25,7 @@ Get started by upgrading Gemini CLI to the latest version:
|
|||||||
npm install -g @google/gemini-cli@latest
|
npm install -g @google/gemini-cli@latest
|
||||||
```
|
```
|
||||||
|
|
||||||
If your version is 0.21.1 or later:
|
After you’ve confirmed your version is 0.21.1 or later:
|
||||||
|
|
||||||
1. Run `/model`.
|
1. Run `/model`.
|
||||||
2. Select **Auto (Gemini 3)**.
|
2. Select **Auto (Gemini 3)**.
|
||||||
@@ -41,9 +39,7 @@ When you encounter that limit, you’ll be given the option to switch to Gemini
|
|||||||
2.5 Pro, upgrade for higher limits, or stop. You’ll also be told when your usage
|
2.5 Pro, upgrade for higher limits, or stop. You’ll also be told when your usage
|
||||||
limit resets and Gemini 3 Pro can be used again.
|
limit resets and Gemini 3 Pro can be used again.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Looking to upgrade for higher limits? To compare subscription
|
||||||
> [!TIP]
|
|
||||||
> Looking to upgrade for higher limits? To compare subscription
|
|
||||||
> options and find the right quota for your needs, see our
|
> options and find the right quota for your needs, see our
|
||||||
> [Plans page](https://geminicli.com/plans/).
|
> [Plans page](https://geminicli.com/plans/).
|
||||||
|
|
||||||
@@ -56,9 +52,7 @@ There may be times when the Gemini 3 Pro model is overloaded. When that happens,
|
|||||||
Gemini CLI will ask you to decide whether you want to keep trying Gemini 3 Pro
|
Gemini CLI will ask you to decide whether you want to keep trying Gemini 3 Pro
|
||||||
or fallback to Gemini 2.5 Pro.
|
or fallback to Gemini 2.5 Pro.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The **Keep trying** option uses exponential backoff, in which Gemini
|
||||||
> [!NOTE]
|
|
||||||
> The **Keep trying** option uses exponential backoff, in which Gemini
|
|
||||||
> CLI waits longer between each retry, when the system is busy. If the retry
|
> CLI waits longer between each retry, when the system is busy. If the retry
|
||||||
> doesn't happen immediately, please wait a few minutes for the request to
|
> doesn't happen immediately, please wait a few minutes for the request to
|
||||||
> process.
|
> process.
|
||||||
@@ -115,7 +109,7 @@ then:
|
|||||||
|
|
||||||
Restart Gemini CLI and you should have access to Gemini 3.
|
Restart Gemini CLI and you should have access to Gemini 3.
|
||||||
|
|
||||||
## Next steps
|
## Need help?
|
||||||
|
|
||||||
If you need help, we recommend searching for an existing
|
If you need help, we recommend searching for an existing
|
||||||
[GitHub issue](https://github.com/google-gemini/gemini-cli/issues). If you
|
[GitHub issue](https://github.com/google-gemini/gemini-cli/issues). If you
|
||||||
|
|||||||
+1
-127
@@ -62,133 +62,7 @@ Once installed and authenticated, you can start using Gemini CLI by issuing
|
|||||||
commands and prompts in your terminal. Ask it to generate code, explain files,
|
commands and prompts in your terminal. Ask it to generate code, explain files,
|
||||||
and more.
|
and more.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
To explore the power of Gemini CLI, see [Gemini CLI examples](./examples.md).
|
||||||
> [!NOTE]
|
|
||||||
> These examples demonstrate potential capabilities. Your actual
|
|
||||||
> results can vary based on the model used and your project environment.
|
|
||||||
|
|
||||||
### Rename your photographs based on content
|
|
||||||
|
|
||||||
You can use Gemini CLI to automate file management tasks that require visual
|
|
||||||
analysis. In this example, Gemini CLI renames images based on their actual
|
|
||||||
subject matter.
|
|
||||||
|
|
||||||
Scenario: You have a folder containing the following files:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
photos/photo1.png
|
|
||||||
photos/photo2.png
|
|
||||||
photos/photo3.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Give Gemini the following prompt:
|
|
||||||
|
|
||||||
```cli
|
|
||||||
Rename the photos in my "photos" directory based on their contents.
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: Gemini asks for permission to rename your files.
|
|
||||||
|
|
||||||
Select **Allow once** and your files are renamed:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
photos/yellow_flowers.png
|
|
||||||
photos/antique_dresser.png
|
|
||||||
photos/green_android_robot.png
|
|
||||||
```
|
|
||||||
|
|
||||||
### Explain a repository by reading its code
|
|
||||||
|
|
||||||
Gemini CLI is effective for rapid codebase exploration. The following example
|
|
||||||
shows how to ask Gemini CLI to fetch, analyze, and summarize a remote project.
|
|
||||||
|
|
||||||
Scenario: You want to understand how a popular open-source utility works by
|
|
||||||
inspecting its code, not just its README.
|
|
||||||
|
|
||||||
Give Gemini CLI the following prompt:
|
|
||||||
|
|
||||||
```cli
|
|
||||||
Clone the 'chalk' repository from https://github.com/chalk/chalk, read its key source files, and explain how it works.
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: Gemini performs a sequence of actions to answer your request.
|
|
||||||
|
|
||||||
1. First, it asks for permission to run `git clone` to download the repository.
|
|
||||||
2. Next, it finds the important source files and asks for permission to read
|
|
||||||
them.
|
|
||||||
3. Finally, after analyzing the code, it provides a summary.
|
|
||||||
|
|
||||||
Gemini CLI returns an explanation based on the actual source code:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
The `chalk` library is a popular npm package for styling terminal output with
|
|
||||||
colors. After analyzing the source code, here's how it works:
|
|
||||||
|
|
||||||
- **Core functionality:** The main file sets up a chainable API. Each color or
|
|
||||||
modifier (like `bold` or `italic`) is a getter that appends the corresponding
|
|
||||||
ANSI escape code to an internal stack.
|
|
||||||
|
|
||||||
- **Chainable API:** When you call `chalk.red.bold('Hello')`, you are accessing
|
|
||||||
getters. The `red` getter adds the red color code, and the `bold` getter adds
|
|
||||||
the bold code.
|
|
||||||
|
|
||||||
- **Output generation:** When the chain is treated as a string (e.g., in
|
|
||||||
`console.log`), a final `toString()` method is called. This method joins all
|
|
||||||
the stored ANSI codes, wraps them around the input string ('Hello'), and adds
|
|
||||||
a reset code at the end. This produces the final, styled string that the
|
|
||||||
terminal can render.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Combine two spreadsheets into one spreadsheet
|
|
||||||
|
|
||||||
Gemini CLI can process and transform data across multiple files. Use this
|
|
||||||
capability to merge reports or reformat data sets without manual copying.
|
|
||||||
|
|
||||||
Scenario: You have two .csv files: `Revenue - 2023.csv` and
|
|
||||||
`Revenue - 2024.csv`. Each file contains monthly revenue figures.
|
|
||||||
|
|
||||||
Give Gemini CLI the following prompt:
|
|
||||||
|
|
||||||
```cli
|
|
||||||
Combine the two .csv files into a single .csv file, with each year a different column.
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: Gemini CLI reads each file and then asks for permission to write a new
|
|
||||||
file. Provide your permission and Gemini CLI provides the combined data:
|
|
||||||
|
|
||||||
```csv
|
|
||||||
Month,2023,2024
|
|
||||||
January,0,1000
|
|
||||||
February,0,1200
|
|
||||||
March,0,2400
|
|
||||||
April,900,500
|
|
||||||
May,1000,800
|
|
||||||
June,1000,900
|
|
||||||
July,1200,1000
|
|
||||||
August,1800,400
|
|
||||||
September,2000,2000
|
|
||||||
October,2400,3400
|
|
||||||
November,3400,1800
|
|
||||||
December,2100,9000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run unit tests
|
|
||||||
|
|
||||||
Gemini CLI can generate boilerplate code and tests based on your existing
|
|
||||||
implementation. This example demonstrates how to request code coverage for a
|
|
||||||
JavaScript component.
|
|
||||||
|
|
||||||
Scenario: You've written a simple login page. You wish to write unit tests to
|
|
||||||
ensure that your login page has code coverage.
|
|
||||||
|
|
||||||
Give Gemini CLI the following prompt:
|
|
||||||
|
|
||||||
```cli
|
|
||||||
Write unit tests for Login.js.
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: Gemini CLI asks for permission to write a new file and creates a test
|
|
||||||
for your login page.
|
|
||||||
|
|
||||||
## Check usage and quota
|
## Check usage and quota
|
||||||
|
|
||||||
|
|||||||
@@ -122,13 +122,6 @@ code.
|
|||||||
# From the root of the repository
|
# From the root of the repository
|
||||||
npm run start
|
npm run start
|
||||||
```
|
```
|
||||||
- **Production mode (React optimizations):** This method runs the CLI with React
|
|
||||||
production mode enabled, which is useful for testing performance without
|
|
||||||
development overhead.
|
|
||||||
```bash
|
|
||||||
# From the root of the repository
|
|
||||||
npm run start:prod
|
|
||||||
```
|
|
||||||
- **Production-like mode (linked package):** This method simulates a global
|
- **Production-like mode (linked package):** This method simulates a global
|
||||||
installation by linking your local package. It's useful for testing a local
|
installation by linking your local package. It's useful for testing a local
|
||||||
build in a production workflow.
|
build in a production workflow.
|
||||||
|
|||||||
+7
-9
@@ -22,11 +22,11 @@ With hooks, you can:
|
|||||||
|
|
||||||
### Getting started
|
### Getting started
|
||||||
|
|
||||||
- **[Writing hooks guide](../hooks/writing-hooks.md)**: A tutorial on creating
|
- **[Writing hooks guide](../hooks/writing-hooks)**: A tutorial on creating your
|
||||||
your first hook with comprehensive examples.
|
first hook with comprehensive examples.
|
||||||
- **[Best practices](../hooks/best-practices.md)**: Guidelines on security,
|
- **[Best practices](../hooks/best-practices)**: Guidelines on security,
|
||||||
performance, and debugging.
|
performance, and debugging.
|
||||||
- **[Hooks reference](../hooks/reference.md)**: The definitive technical
|
- **[Hooks reference](../hooks/reference)**: The definitive technical
|
||||||
specification of I/O schemas and exit codes.
|
specification of I/O schemas and exit codes.
|
||||||
|
|
||||||
## Core concepts
|
## Core concepts
|
||||||
@@ -143,9 +143,7 @@ Hooks are executed with a sanitized environment.
|
|||||||
|
|
||||||
## Security and risks
|
## Security and risks
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning: Hooks execute arbitrary code with your user privileges.** By
|
||||||
> [!WARNING]
|
|
||||||
> Hooks execute arbitrary code with your user privileges. By
|
|
||||||
> configuring hooks, you are allowing scripts to run shell commands on your
|
> configuring hooks, you are allowing scripts to run shell commands on your
|
||||||
> machine.
|
> machine.
|
||||||
|
|
||||||
@@ -154,8 +152,8 @@ Gemini CLI **fingerprints** project hooks. If a hook's name or command changes
|
|||||||
(e.g., via `git pull`), it is treated as a **new, untrusted hook** and you will
|
(e.g., via `git pull`), it is treated as a **new, untrusted hook** and you will
|
||||||
be warned before it executes.
|
be warned before it executes.
|
||||||
|
|
||||||
See [Security Considerations](../hooks/best-practices.md#using-hooks-securely)
|
See [Security Considerations](../hooks/best-practices#using-hooks-securely) for
|
||||||
for a detailed threat model.
|
a detailed threat model.
|
||||||
|
|
||||||
## Managing hooks
|
## Managing hooks
|
||||||
|
|
||||||
|
|||||||
@@ -470,5 +470,5 @@ console.error('Consolidating memories for session end...');
|
|||||||
|
|
||||||
While project-level hooks are great for specific repositories, you can share
|
While project-level hooks are great for specific repositories, you can share
|
||||||
your hooks across multiple projects by packaging them as a
|
your hooks across multiple projects by packaging them as a
|
||||||
[Gemini CLI extension](../extensions/index.md). This provides version control,
|
[Gemini CLI extension](https://www.google.com/search?q=../extensions/index.md).
|
||||||
easy distribution, and centralized management.
|
This provides version control, easy distribution, and centralized management.
|
||||||
|
|||||||
@@ -132,11 +132,9 @@ to the CLI whenever the user's context changes.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** The `openFiles` list should only include files that exist on disk.
|
||||||
> [!NOTE]
|
Virtual files (e.g., unsaved files without a path, editor settings pages)
|
||||||
> The `openFiles` list should only include files that exist on disk.
|
**MUST** be excluded.
|
||||||
> Virtual files (e.g., unsaved files without a path, editor settings pages)
|
|
||||||
> **MUST** be excluded.
|
|
||||||
|
|
||||||
### How the CLI uses this context
|
### How the CLI uses this context
|
||||||
|
|
||||||
|
|||||||
+28
-107
@@ -1,29 +1,15 @@
|
|||||||
# IDE Integration
|
# IDE integration
|
||||||
|
|
||||||
Gemini CLI can integrate with your IDE to provide a more seamless and
|
Gemini CLI can integrate with your IDE to provide a more seamless and
|
||||||
context-aware experience. This integration allows the CLI to understand your
|
context-aware experience. This integration allows the CLI to understand your
|
||||||
workspace better and enables powerful features like native in-editor diffing.
|
workspace better and enables powerful features like native in-editor diffing.
|
||||||
|
|
||||||
There are two primary ways to integrate Gemini CLI with an IDE:
|
Currently, the supported IDEs are [Antigravity](https://antigravity.google),
|
||||||
|
[Visual Studio Code](https://code.visualstudio.com/), and other editors that
|
||||||
|
support VS Code extensions. To build support for other editors, see the
|
||||||
|
[IDE Companion Extension Spec](./ide-companion-spec.md).
|
||||||
|
|
||||||
1. **VS Code companion extension**: Install the "Gemini CLI Companion"
|
## Features
|
||||||
extension on [Antigravity](https://antigravity.google),
|
|
||||||
[Visual Studio Code](https://code.visualstudio.com/), or other VS Code
|
|
||||||
compatible editors.
|
|
||||||
2. **Agent Client Protocol (ACP)**: An open protocol for interoperability
|
|
||||||
between AI coding agents and IDEs. This method is used for integrations with
|
|
||||||
tools like JetBrains and Zed, which leverage the ACP Agent Registry for easy
|
|
||||||
discovery and installation of compatible agents like Gemini CLI.
|
|
||||||
|
|
||||||
## VS Code companion extension
|
|
||||||
|
|
||||||
The **Gemini CLI Companion extension** grants Gemini CLI direct access to your
|
|
||||||
VS Code compatible IDEs and improves your experience by providing real-time
|
|
||||||
context such as open files, cursor positions, and text selection. The extension
|
|
||||||
also enables a native diffing interface so you can seamlessly review and apply
|
|
||||||
AI-generated code changes directly within your editor.
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
- **Workspace context:** The CLI automatically gains awareness of your workspace
|
- **Workspace context:** The CLI automatically gains awareness of your workspace
|
||||||
to provide more relevant and accurate responses. This context includes:
|
to provide more relevant and accurate responses. This context includes:
|
||||||
@@ -33,8 +19,8 @@ AI-generated code changes directly within your editor.
|
|||||||
truncated).
|
truncated).
|
||||||
|
|
||||||
- **Native diffing:** When Gemini suggests code modifications, you can view the
|
- **Native diffing:** When Gemini suggests code modifications, you can view the
|
||||||
changes directly within your IDE's native diff viewer. This lets you review,
|
changes directly within your IDE's native diff viewer. This allows you to
|
||||||
edit, and accept or reject the suggested changes seamlessly.
|
review, edit, and accept or reject the suggested changes seamlessly.
|
||||||
|
|
||||||
- **VS Code commands:** You can access Gemini CLI features directly from the VS
|
- **VS Code commands:** You can access Gemini CLI features directly from the VS
|
||||||
Code Command Palette (`Cmd+Shift+P` or `Ctrl+Shift+P`):
|
Code Command Palette (`Cmd+Shift+P` or `Ctrl+Shift+P`):
|
||||||
@@ -46,18 +32,18 @@ AI-generated code changes directly within your editor.
|
|||||||
- `Gemini CLI: View Third-Party Notices`: Displays the third-party notices for
|
- `Gemini CLI: View Third-Party Notices`: Displays the third-party notices for
|
||||||
the extension.
|
the extension.
|
||||||
|
|
||||||
### Installation and setup
|
## Installation and setup
|
||||||
|
|
||||||
There are three ways to set up the IDE integration:
|
There are three ways to set up the IDE integration:
|
||||||
|
|
||||||
#### 1. Automatic nudge (recommended)
|
### 1. Automatic nudge (recommended)
|
||||||
|
|
||||||
When you run Gemini CLI inside a supported editor, it will automatically detect
|
When you run Gemini CLI inside a supported editor, it will automatically detect
|
||||||
your environment and prompt you to connect. Answering "Yes" will automatically
|
your environment and prompt you to connect. Answering "Yes" will automatically
|
||||||
run the necessary setup, which includes installing the companion extension and
|
run the necessary setup, which includes installing the companion extension and
|
||||||
enabling the connection.
|
enabling the connection.
|
||||||
|
|
||||||
#### 2. Manual installation from CLI
|
### 2. Manual installation from CLI
|
||||||
|
|
||||||
If you previously dismissed the prompt or want to install the extension
|
If you previously dismissed the prompt or want to install the extension
|
||||||
manually, you can run the following command inside Gemini CLI:
|
manually, you can run the following command inside Gemini CLI:
|
||||||
@@ -68,7 +54,7 @@ manually, you can run the following command inside Gemini CLI:
|
|||||||
|
|
||||||
This will find the correct extension for your IDE and install it.
|
This will find the correct extension for your IDE and install it.
|
||||||
|
|
||||||
#### 3. Manual installation from a marketplace
|
### 3. Manual installation from a marketplace
|
||||||
|
|
||||||
You can also install the extension directly from a marketplace.
|
You can also install the extension directly from a marketplace.
|
||||||
|
|
||||||
@@ -80,18 +66,16 @@ You can also install the extension directly from a marketplace.
|
|||||||
Follow your editor's instructions for installing extensions from this
|
Follow your editor's instructions for installing extensions from this
|
||||||
registry.
|
registry.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> NOTE: The "Gemini CLI Companion" extension may appear towards the bottom of
|
||||||
> [!NOTE]
|
> search results. If you don't see it immediately, try scrolling down or sorting
|
||||||
> The "Gemini CLI Companion" extension may appear towards the bottom of
|
> by "Newly Published".
|
||||||
> search results. If you don't see it immediately, try scrolling down or
|
|
||||||
> sorting by "Newly Published".
|
|
||||||
>
|
>
|
||||||
> After manually installing the extension, you must run `/ide enable` in the CLI
|
> After manually installing the extension, you must run `/ide enable` in the CLI
|
||||||
> to activate the integration.
|
> to activate the integration.
|
||||||
|
|
||||||
### Usage
|
## Usage
|
||||||
|
|
||||||
#### Enabling and disabling
|
### Enabling and disabling
|
||||||
|
|
||||||
You can control the IDE integration from within the CLI:
|
You can control the IDE integration from within the CLI:
|
||||||
|
|
||||||
@@ -107,7 +91,7 @@ You can control the IDE integration from within the CLI:
|
|||||||
When enabled, Gemini CLI will automatically attempt to connect to the IDE
|
When enabled, Gemini CLI will automatically attempt to connect to the IDE
|
||||||
companion extension.
|
companion extension.
|
||||||
|
|
||||||
#### Checking the status
|
### Checking the status
|
||||||
|
|
||||||
To check the connection status and see the context the CLI has received from the
|
To check the connection status and see the context the CLI has received from the
|
||||||
IDE, run:
|
IDE, run:
|
||||||
@@ -119,12 +103,10 @@ IDE, run:
|
|||||||
If connected, this command will show the IDE it's connected to and a list of
|
If connected, this command will show the IDE it's connected to and a list of
|
||||||
recently opened files it is aware of.
|
recently opened files it is aware of.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> [!NOTE] The file list is limited to 10 recently accessed files within your
|
||||||
> [!NOTE]
|
> workspace and only includes local files on disk.)
|
||||||
> The file list is limited to 10 recently accessed files within your
|
|
||||||
> workspace and only includes local files on disk.
|
|
||||||
|
|
||||||
#### Working with diffs
|
### Working with diffs
|
||||||
|
|
||||||
When you ask Gemini to modify a file, it can open a diff view directly in your
|
When you ask Gemini to modify a file, it can open a diff view directly in your
|
||||||
editor.
|
editor.
|
||||||
@@ -149,63 +131,6 @@ accepting them.
|
|||||||
If you select ‘Allow for this session’ in the CLI, changes will no longer show
|
If you select ‘Allow for this session’ in the CLI, changes will no longer show
|
||||||
up in the IDE as they will be auto-accepted.
|
up in the IDE as they will be auto-accepted.
|
||||||
|
|
||||||
## Agent Client Protocol (ACP)
|
|
||||||
|
|
||||||
ACP is an open protocol that standardizes how AI coding agents communicate with
|
|
||||||
code editors and IDEs. It addresses the challenge of fragmented distribution,
|
|
||||||
where agents traditionally needed custom integrations for each client. With ACP,
|
|
||||||
developers can implement their agent once, and it becomes compatible with any
|
|
||||||
ACP-compliant editor.
|
|
||||||
|
|
||||||
For a comprehensive introduction to ACP, including its architecture and
|
|
||||||
benefits, refer to the official
|
|
||||||
[ACP Introduction](https://agentclientprotocol.com/get-started/introduction)
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
### The ACP Agent Registry
|
|
||||||
|
|
||||||
Gemini CLI is officially available in the **ACP Agent Registry**. This allows
|
|
||||||
you to install and update Gemini CLI directly within supporting IDEs and
|
|
||||||
eliminates the need for manual downloads or IDE-specific extensions.
|
|
||||||
|
|
||||||
Using the registry ensures:
|
|
||||||
|
|
||||||
- **Ease of use**: Discover and install agents directly within your IDE
|
|
||||||
settings.
|
|
||||||
- **Latest versions**: Ensures users always have access to the most up-to-date
|
|
||||||
agent implementations.
|
|
||||||
|
|
||||||
For more details on how the registry works, visit the official
|
|
||||||
[ACP Agent Registry](https://agentclientprotocol.com/get-started/registry) page.
|
|
||||||
You can learn about how specific IDEs leverage this integration in the following
|
|
||||||
section.
|
|
||||||
|
|
||||||
### IDE-specific integration
|
|
||||||
|
|
||||||
Gemini CLI is an ACP-compatible agent available in the ACP Agent Registry.
|
|
||||||
Here’s how different IDEs leverage the ACP and the registry:
|
|
||||||
|
|
||||||
#### JetBrains IDEs
|
|
||||||
|
|
||||||
JetBrains IDEs (like IntelliJ IDEA, PyCharm, or GoLand) offer built-in registry
|
|
||||||
support, allowing users to find and install ACP-compatible agents directly.
|
|
||||||
|
|
||||||
For more details, refer to the official
|
|
||||||
[JetBrains AI Blog announcement](https://blog.jetbrains.com/ai/2026/01/acp-agent-registry/).
|
|
||||||
|
|
||||||
#### Zed
|
|
||||||
|
|
||||||
Zed, a modern code editor, also integrates with the ACP Agent Registry. This
|
|
||||||
allows Zed users to easily browse, install, and manage ACP agents.
|
|
||||||
|
|
||||||
Learn more about Zed's integration with the ACP Registry in their
|
|
||||||
[blog post](https://zed.dev/blog/acp-registry).
|
|
||||||
|
|
||||||
#### Other ACP-compatible IDEs
|
|
||||||
|
|
||||||
Any other IDE that supports the ACP Agent Registry can install Gemini CLI
|
|
||||||
directly through their in-built registry features.
|
|
||||||
|
|
||||||
## Using with sandboxing
|
## Using with sandboxing
|
||||||
|
|
||||||
If you are using Gemini CLI within a sandbox, please be aware of the following:
|
If you are using Gemini CLI within a sandbox, please be aware of the following:
|
||||||
@@ -222,9 +147,10 @@ If you are using Gemini CLI within a sandbox, please be aware of the following:
|
|||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### VS Code companion extension errors
|
If you encounter issues with IDE integration, here are some common error
|
||||||
|
messages and how to resolve them.
|
||||||
|
|
||||||
#### Connection errors
|
### Connection errors
|
||||||
|
|
||||||
- **Message:**
|
- **Message:**
|
||||||
`🔴 Disconnected: Failed to connect to IDE companion extension in [IDE Name]. Please ensure the extension is running. To install the extension, run /ide install.`
|
`🔴 Disconnected: Failed to connect to IDE companion extension in [IDE Name]. Please ensure the extension is running. To install the extension, run /ide install.`
|
||||||
@@ -244,7 +170,7 @@ If you are using Gemini CLI within a sandbox, please be aware of the following:
|
|||||||
- **Solution:** Run `/ide enable` to try and reconnect. If the issue
|
- **Solution:** Run `/ide enable` to try and reconnect. If the issue
|
||||||
continues, open a new terminal window or restart your IDE.
|
continues, open a new terminal window or restart your IDE.
|
||||||
|
|
||||||
#### Manual PID override
|
### Manual PID override
|
||||||
|
|
||||||
If automatic IDE detection fails, or if you are running Gemini CLI in a
|
If automatic IDE detection fails, or if you are running Gemini CLI in a
|
||||||
standalone terminal and want to manually associate it with a specific IDE
|
standalone terminal and want to manually associate it with a specific IDE
|
||||||
@@ -266,7 +192,7 @@ $env:GEMINI_CLI_IDE_PID=12345
|
|||||||
When this variable is set, Gemini CLI will skip automatic detection and attempt
|
When this variable is set, Gemini CLI will skip automatic detection and attempt
|
||||||
to connect using the provided PID.
|
to connect using the provided PID.
|
||||||
|
|
||||||
#### Configuration errors
|
### Configuration errors
|
||||||
|
|
||||||
- **Message:**
|
- **Message:**
|
||||||
`🔴 Disconnected: Directory mismatch. Gemini CLI is running in a different location than the open workspace in [IDE Name]. Please run the CLI from one of the following directories: [List of directories]`
|
`🔴 Disconnected: Directory mismatch. Gemini CLI is running in a different location than the open workspace in [IDE Name]. Please run the CLI from one of the following directories: [List of directories]`
|
||||||
@@ -280,7 +206,7 @@ to connect using the provided PID.
|
|||||||
- **Cause:** You have no workspace open in your IDE.
|
- **Cause:** You have no workspace open in your IDE.
|
||||||
- **Solution:** Open a workspace in your IDE and restart the CLI.
|
- **Solution:** Open a workspace in your IDE and restart the CLI.
|
||||||
|
|
||||||
#### General errors
|
### General errors
|
||||||
|
|
||||||
- **Message:**
|
- **Message:**
|
||||||
`IDE integration is not supported in your current environment. To use this feature, run Gemini CLI in one of these supported IDEs: [List of IDEs]`
|
`IDE integration is not supported in your current environment. To use this feature, run Gemini CLI in one of these supported IDEs: [List of IDEs]`
|
||||||
@@ -290,14 +216,9 @@ to connect using the provided PID.
|
|||||||
IDE, like Antigravity or VS Code.
|
IDE, like Antigravity or VS Code.
|
||||||
|
|
||||||
- **Message:**
|
- **Message:**
|
||||||
`No installer is available for IDE. Please install Gemini CLI Companion extension manually from the marketplace.`
|
`No installer is available for IDE. Please install the Gemini CLI Companion extension manually from the marketplace.`
|
||||||
- **Cause:** You ran `/ide install`, but the CLI does not have an automated
|
- **Cause:** You ran `/ide install`, but the CLI does not have an automated
|
||||||
installer for your specific IDE.
|
installer for your specific IDE.
|
||||||
- **Solution:** Open your IDE's extension marketplace, search for "Gemini CLI
|
- **Solution:** Open your IDE's extension marketplace, search for "Gemini CLI
|
||||||
Companion", and
|
Companion", and
|
||||||
[install it manually](#3-manual-installation-from-a-marketplace).
|
[install it manually](#3-manual-installation-from-a-marketplace).
|
||||||
|
|
||||||
### ACP integration errors
|
|
||||||
|
|
||||||
For issues related to ACP integration, please refer to the debugging and
|
|
||||||
telemetry section in the [ACP Mode](../cli/acp-mode.md) documentation.
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ Jump in to Gemini CLI.
|
|||||||
on your system.
|
on your system.
|
||||||
- **[Authentication](./get-started/authentication.md):** Setup instructions for
|
- **[Authentication](./get-started/authentication.md):** Setup instructions for
|
||||||
personal and enterprise accounts.
|
personal and enterprise accounts.
|
||||||
|
- **[Examples](./get-started/examples.md):** Practical examples of Gemini CLI in
|
||||||
|
action.
|
||||||
- **[CLI cheatsheet](./cli/cli-reference.md):** A quick reference for common
|
- **[CLI cheatsheet](./cli/cli-reference.md):** A quick reference for common
|
||||||
commands and options.
|
commands and options.
|
||||||
- **[Gemini 3 on Gemini CLI](./get-started/gemini-3.md):** Learn about Gemini 3
|
- **[Gemini 3 on Gemini CLI](./get-started/gemini-3.md):** Learn about Gemini 3
|
||||||
|
|||||||
@@ -117,88 +117,6 @@ npm run test:integration:sandbox:docker
|
|||||||
npm run test:integration:sandbox:podman
|
npm run test:integration:sandbox:podman
|
||||||
```
|
```
|
||||||
|
|
||||||
## Memory regression tests
|
|
||||||
|
|
||||||
Memory regression tests are designed to detect heap growth and leaks across key
|
|
||||||
CLI scenarios. They are located in the `memory-tests` directory.
|
|
||||||
|
|
||||||
These tests are distinct from standard integration tests because they measure
|
|
||||||
memory usage and compare it against committed baselines.
|
|
||||||
|
|
||||||
### Running memory tests
|
|
||||||
|
|
||||||
Memory tests are not run as part of the default `npm run test` or
|
|
||||||
`npm run test:e2e` commands. They are run nightly in CI but can be run manually:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run test:memory
|
|
||||||
```
|
|
||||||
|
|
||||||
### Updating baselines
|
|
||||||
|
|
||||||
If you intentionally change behavior that affects memory usage, you may need to
|
|
||||||
update the baselines. Set the `UPDATE_MEMORY_BASELINES` environment variable to
|
|
||||||
`true`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
UPDATE_MEMORY_BASELINES=true npm run test:memory
|
|
||||||
```
|
|
||||||
|
|
||||||
This will run the tests, take median snapshots, and overwrite
|
|
||||||
`memory-tests/baselines.json`. You should review the changes and commit the
|
|
||||||
updated baseline file.
|
|
||||||
|
|
||||||
### How it works
|
|
||||||
|
|
||||||
The harness (`MemoryTestHarness` in `packages/test-utils`):
|
|
||||||
|
|
||||||
- Forces garbage collection multiple times to reduce noise.
|
|
||||||
- Takes median snapshots to filter spikes.
|
|
||||||
- Compares against baselines with a 10% tolerance.
|
|
||||||
- Can analyze sustained leaks across 3 snapshots using `analyzeSnapshots()`.
|
|
||||||
|
|
||||||
## Performance regression tests
|
|
||||||
|
|
||||||
Performance regression tests are designed to detect wall-clock time, CPU usage,
|
|
||||||
and event loop delay regressions across key CLI scenarios. They are located in
|
|
||||||
the `perf-tests` directory.
|
|
||||||
|
|
||||||
These tests are distinct from standard integration tests because they measure
|
|
||||||
performance metrics and compare it against committed baselines.
|
|
||||||
|
|
||||||
### Running performance tests
|
|
||||||
|
|
||||||
Performance tests are not run as part of the default `npm run test` or
|
|
||||||
`npm run test:e2e` commands. They are run nightly in CI but can be run manually:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run test:perf
|
|
||||||
```
|
|
||||||
|
|
||||||
### Updating baselines
|
|
||||||
|
|
||||||
If you intentionally change behavior that affects performance, you may need to
|
|
||||||
update the baselines. Set the `UPDATE_PERF_BASELINES` environment variable to
|
|
||||||
`true`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
UPDATE_PERF_BASELINES=true npm run test:perf
|
|
||||||
```
|
|
||||||
|
|
||||||
This will run the tests multiple times (with warmup), apply IQR outlier
|
|
||||||
filtering, and overwrite `perf-tests/baselines.json`. You should review the
|
|
||||||
changes and commit the updated baseline file.
|
|
||||||
|
|
||||||
### How it works
|
|
||||||
|
|
||||||
The harness (`PerfTestHarness` in `packages/test-utils`):
|
|
||||||
|
|
||||||
- Measures wall-clock time using `performance.now()`.
|
|
||||||
- Measures CPU usage using `process.cpuUsage()`.
|
|
||||||
- Monitors event loop delay using `perf_hooks.monitorEventLoopDelay()`.
|
|
||||||
- Applies IQR (Interquartile Range) filtering to remove outlier samples.
|
|
||||||
- Compares against baselines with a 15% tolerance.
|
|
||||||
|
|
||||||
## Diagnostics
|
## Diagnostics
|
||||||
|
|
||||||
The integration test runner provides several options for diagnostics to help
|
The integration test runner provides several options for diagnostics to help
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ feature), while the PR is the "how" (the implementation). This separation helps
|
|||||||
us track work, prioritize features, and maintain clear historical context. Our
|
us track work, prioritize features, and maintain clear historical context. Our
|
||||||
automation is built around this principle.
|
automation is built around this principle.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Issues tagged as "🔒Maintainers only" are reserved for project
|
||||||
> [!NOTE]
|
|
||||||
> Issues tagged as "🔒Maintainers only" are reserved for project
|
|
||||||
> maintainers. We will not accept pull requests related to these issues.
|
> maintainers. We will not accept pull requests related to these issues.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -79,9 +79,7 @@ You can view traces in the Jaeger UI for local development.
|
|||||||
You can use an OpenTelemetry collector to forward telemetry data to Google Cloud
|
You can use an OpenTelemetry collector to forward telemetry data to Google Cloud
|
||||||
Trace for custom processing or routing.
|
Trace for custom processing or routing.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** Ensure you complete the
|
||||||
> [!WARNING]
|
|
||||||
> Ensure you complete the
|
|
||||||
> [Google Cloud telemetry prerequisites](./cli/telemetry.md#prerequisites)
|
> [Google Cloud telemetry prerequisites](./cli/telemetry.md#prerequisites)
|
||||||
> (Project ID, authentication, IAM roles, and APIs) before using this method.
|
> (Project ID, authentication, IAM roles, and APIs) before using this method.
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
"/docs/faq": "/docs/resources/faq",
|
"/docs/faq": "/docs/resources/faq",
|
||||||
"/docs/get-started/configuration": "/docs/reference/configuration",
|
"/docs/get-started/configuration": "/docs/reference/configuration",
|
||||||
"/docs/get-started/configuration-v1": "/docs/reference/configuration",
|
"/docs/get-started/configuration-v1": "/docs/reference/configuration",
|
||||||
"/docs/get-started/examples": "/docs/get-started/index",
|
|
||||||
"/docs/index": "/docs",
|
"/docs/index": "/docs",
|
||||||
"/docs/quota-and-pricing": "/docs/resources/quota-and-pricing",
|
"/docs/quota-and-pricing": "/docs/resources/quota-and-pricing",
|
||||||
"/docs/tos-privacy": "/docs/resources/tos-privacy",
|
"/docs/tos-privacy": "/docs/resources/tos-privacy",
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ Slash commands provide meta-level control over the CLI itself.
|
|||||||
### `/agents`
|
### `/agents`
|
||||||
|
|
||||||
- **Description:** Manage local and remote subagents.
|
- **Description:** Manage local and remote subagents.
|
||||||
|
- **Note:** This command is experimental and requires
|
||||||
|
`experimental.enableAgents: true` in your `settings.json`.
|
||||||
- **Sub-commands:**
|
- **Sub-commands:**
|
||||||
- **`list`**:
|
- **`list`**:
|
||||||
- **Description:** Lists all discovered agents, including built-in, local,
|
- **Description:** Lists all discovered agents, including built-in, local,
|
||||||
@@ -58,8 +60,8 @@ Slash commands provide meta-level control over the CLI itself.
|
|||||||
- `list` (selecting this opens the auto-saved session browser)
|
- `list` (selecting this opens the auto-saved session browser)
|
||||||
- `-- checkpoints --`
|
- `-- checkpoints --`
|
||||||
- `list`, `save`, `resume`, `delete`, `share` (manual tagged checkpoints)
|
- `list`, `save`, `resume`, `delete`, `share` (manual tagged checkpoints)
|
||||||
- Unique prefixes (for example `/cha` or `/resu`) resolve to the same grouped
|
- **Note:** Unique prefixes (for example `/cha` or `/resum`) resolve to the
|
||||||
menu.
|
same grouped menu.
|
||||||
- **Sub-commands:**
|
- **Sub-commands:**
|
||||||
- **`debug`**
|
- **`debug`**
|
||||||
- **Description:** Export the most recent API request as a JSON payload.
|
- **Description:** Export the most recent API request as a JSON payload.
|
||||||
@@ -248,8 +250,8 @@ Slash commands provide meta-level control over the CLI itself.
|
|||||||
- **`list`** or **`ls`**:
|
- **`list`** or **`ls`**:
|
||||||
- **Description:** List configured MCP servers and tools. This is the
|
- **Description:** List configured MCP servers and tools. This is the
|
||||||
default action if no subcommand is specified.
|
default action if no subcommand is specified.
|
||||||
- **`reload`**:
|
- **`refresh`**:
|
||||||
- **Description:** Reloads all MCP servers and re-discovers their available
|
- **Description:** Restarts all MCP servers and re-discovers their available
|
||||||
tools.
|
tools.
|
||||||
- **`schema`**:
|
- **`schema`**:
|
||||||
- **Description:** List configured MCP servers and tools with descriptions
|
- **Description:** List configured MCP servers and tools with descriptions
|
||||||
@@ -303,7 +305,7 @@ Slash commands provide meta-level control over the CLI itself.
|
|||||||
- **Description:** Switch to Plan Mode (read-only) and view the current plan if
|
- **Description:** Switch to Plan Mode (read-only) and view the current plan if
|
||||||
one has been generated.
|
one has been generated.
|
||||||
- **Note:** This feature is enabled by default. It can be disabled via the
|
- **Note:** This feature is enabled by default. It can be disabled via the
|
||||||
`general.plan.enabled` setting in your configuration.
|
`experimental.plan` setting in your configuration.
|
||||||
- **Sub-commands:**
|
- **Sub-commands:**
|
||||||
- **`copy`**:
|
- **`copy`**:
|
||||||
- **Description:** Copy the currently approved plan to your clipboard.
|
- **Description:** Copy the currently approved plan to your clipboard.
|
||||||
|
|||||||
+110
-474
@@ -25,9 +25,7 @@ overridden by higher numbers):
|
|||||||
Gemini CLI uses JSON settings files for persistent configuration. There are four
|
Gemini CLI uses JSON settings files for persistent configuration. There are four
|
||||||
locations for these files:
|
locations for these files:
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Tip:** JSON-aware editors can use autocomplete and validation by pointing to
|
||||||
> [!TIP]
|
|
||||||
> JSON-aware editors can use autocomplete and validation by pointing to
|
|
||||||
> the generated schema at `schemas/settings.schema.json` in this repository.
|
> the generated schema at `schemas/settings.schema.json` in this repository.
|
||||||
> When working outside the repo, reference the hosted schema at
|
> When working outside the repo, reference the hosted schema at
|
||||||
> `https://raw.githubusercontent.com/google-gemini/gemini-cli/main/schemas/settings.schema.json`.
|
> `https://raw.githubusercontent.com/google-gemini/gemini-cli/main/schemas/settings.schema.json`.
|
||||||
@@ -62,17 +60,15 @@ locations for these files:
|
|||||||
|
|
||||||
**Note on environment variables in settings:** String values within your
|
**Note on environment variables in settings:** String values within your
|
||||||
`settings.json` and `gemini-extension.json` files can reference environment
|
`settings.json` and `gemini-extension.json` files can reference environment
|
||||||
variables using `$VAR_NAME`, `${VAR_NAME}`, or `${VAR_NAME:-DEFAULT_VALUE}`
|
variables using either `$VAR_NAME` or `${VAR_NAME}` syntax. These variables will
|
||||||
syntax. These variables will be automatically resolved when the settings are
|
be automatically resolved when the settings are loaded. For example, if you have
|
||||||
loaded. For example, if you have an environment variable `MY_API_TOKEN`, you
|
an environment variable `MY_API_TOKEN`, you could use it in `settings.json` like
|
||||||
could use it in `settings.json` like this: `"apiKey": "$MY_API_TOKEN"`. If you
|
this: `"apiKey": "$MY_API_TOKEN"`. Additionally, each extension can have its own
|
||||||
want to provide a fallback value, use `${MY_API_TOKEN:-default-token}`.
|
`.env` file in its directory, which will be loaded automatically.
|
||||||
Additionally, each extension can have its own `.env` file in its directory,
|
|
||||||
which will be loaded automatically.
|
|
||||||
|
|
||||||
**Note for Enterprise Users:** For guidance on deploying and managing Gemini CLI
|
> **Note for Enterprise Users:** For guidance on deploying and managing Gemini
|
||||||
in a corporate environment, please see the
|
> CLI in a corporate environment, please see the
|
||||||
[Enterprise Configuration](../cli/enterprise.md) documentation.
|
> [Enterprise Configuration](../cli/enterprise.md) documentation.
|
||||||
|
|
||||||
### The `.gemini` directory in your project
|
### The `.gemini` directory in your project
|
||||||
|
|
||||||
@@ -135,7 +131,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **`general.enableNotifications`** (boolean):
|
- **`general.enableNotifications`** (boolean):
|
||||||
- **Description:** Enable run-event notifications for action-required prompts
|
- **Description:** Enable run-event notifications for action-required prompts
|
||||||
and session completion.
|
and session completion. Currently macOS only.
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
|
|
||||||
- **`general.checkpointing.enabled`** (boolean):
|
- **`general.checkpointing.enabled`** (boolean):
|
||||||
@@ -143,15 +139,9 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`general.plan.enabled`** (boolean):
|
|
||||||
- **Description:** Enable Plan Mode for read-only safety during planning.
|
|
||||||
- **Default:** `true`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`general.plan.directory`** (string):
|
- **`general.plan.directory`** (string):
|
||||||
- **Description:** The directory where planning artifacts are stored. If not
|
- **Description:** The directory where planning artifacts are stored. If not
|
||||||
specified, defaults to the system temporary directory. A custom directory
|
specified, defaults to the system temporary directory.
|
||||||
requires a policy to allow write access in Plan Mode.
|
|
||||||
- **Default:** `undefined`
|
- **Default:** `undefined`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
@@ -264,11 +254,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Description:** Show the "? for shortcuts" hint above the input.
|
- **Description:** Show the "? for shortcuts" hint above the input.
|
||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
|
|
||||||
- **`ui.compactToolOutput`** (boolean):
|
|
||||||
- **Description:** Display tool outputs (like directory listings and file
|
|
||||||
reads) in a compact, structured format.
|
|
||||||
- **Default:** `true`
|
|
||||||
|
|
||||||
- **`ui.hideBanner`** (boolean):
|
- **`ui.hideBanner`** (boolean):
|
||||||
- **Description:** Hide the application banner
|
- **Description:** Hide the application banner
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
@@ -308,11 +293,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Description:** Hide the footer from the UI
|
- **Description:** Hide the footer from the UI
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
|
|
||||||
- **`ui.collapseDrawerDuringApproval`** (boolean):
|
|
||||||
- **Description:** Whether to collapse the UI drawer when a tool is awaiting
|
|
||||||
confirmation.
|
|
||||||
- **Default:** `true`
|
|
||||||
|
|
||||||
- **`ui.showMemoryUsage`** (boolean):
|
- **`ui.showMemoryUsage`** (boolean):
|
||||||
- **Description:** Display memory usage information in the UI
|
- **Description:** Display memory usage information in the UI
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
@@ -339,16 +319,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`ui.renderProcess`** (boolean):
|
|
||||||
- **Description:** Enable Ink render process for the UI.
|
|
||||||
- **Default:** `true`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`ui.terminalBuffer`** (boolean):
|
|
||||||
- **Description:** Use the new terminal buffer architecture for rendering.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`ui.useBackgroundColor`** (boolean):
|
- **`ui.useBackgroundColor`** (boolean):
|
||||||
- **Description:** Whether to use background colors in the UI.
|
- **Description:** Whether to use background colors in the UI.
|
||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
@@ -366,8 +336,8 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **`ui.loadingPhrases`** (enum):
|
- **`ui.loadingPhrases`** (enum):
|
||||||
- **Description:** What to show while the model is working: tips, witty
|
- **Description:** What to show while the model is working: tips, witty
|
||||||
comments, all, or off.
|
comments, both, or nothing.
|
||||||
- **Default:** `"off"`
|
- **Default:** `"tips"`
|
||||||
- **Values:** `"tips"`, `"witty"`, `"all"`, `"off"`
|
- **Values:** `"tips"`, `"witty"`, `"all"`, `"off"`
|
||||||
|
|
||||||
- **`ui.errorVerbosity`** (enum):
|
- **`ui.errorVerbosity`** (enum):
|
||||||
@@ -668,11 +638,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
"model": "gemini-3-flash-preview"
|
"model": "gemini-3-flash-preview"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chat-compression-3.1-flash-lite": {
|
|
||||||
"modelConfig": {
|
|
||||||
"model": "gemini-3.1-flash-lite-preview"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chat-compression-2.5-pro": {
|
"chat-compression-2.5-pro": {
|
||||||
"modelConfig": {
|
"modelConfig": {
|
||||||
"model": "gemini-2.5-pro"
|
"model": "gemini-2.5-pro"
|
||||||
@@ -692,11 +657,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
"modelConfig": {
|
"modelConfig": {
|
||||||
"model": "gemini-3-pro-preview"
|
"model": "gemini-3-pro-preview"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"agent-history-provider-summarizer": {
|
|
||||||
"modelConfig": {
|
|
||||||
"model": "gemini-3-flash-preview"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -724,16 +684,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"gemini-3.1-flash-lite-preview": {
|
|
||||||
"tier": "flash-lite",
|
|
||||||
"family": "gemini-3",
|
|
||||||
"isPreview": true,
|
|
||||||
"isVisible": true,
|
|
||||||
"features": {
|
|
||||||
"thinking": false,
|
|
||||||
"multimodalToolUse": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gemini-3.1-pro-preview": {
|
"gemini-3.1-pro-preview": {
|
||||||
"tier": "pro",
|
"tier": "pro",
|
||||||
"family": "gemini-3",
|
"family": "gemini-3",
|
||||||
@@ -845,7 +795,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
"tier": "auto",
|
"tier": "auto",
|
||||||
"isPreview": true,
|
"isPreview": true,
|
||||||
"isVisible": true,
|
"isVisible": true,
|
||||||
"dialogDescription": "Let Gemini CLI decide the best model for the task: gemini-3-pro, gemini-3-flash",
|
"dialogDescription": "Let Gemini CLI decide the best model for the task: gemini-3.1-pro, gemini-3-flash",
|
||||||
"features": {
|
"features": {
|
||||||
"thinking": true,
|
"thinking": true,
|
||||||
"multimodalToolUse": false
|
"multimodalToolUse": false
|
||||||
@@ -874,45 +824,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"gemini-3.1-pro-preview": {
|
|
||||||
"default": "gemini-3.1-pro-preview",
|
|
||||||
"contexts": [
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"hasAccessToPreview": false
|
|
||||||
},
|
|
||||||
"target": "gemini-2.5-pro"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"useCustomTools": true
|
|
||||||
},
|
|
||||||
"target": "gemini-3.1-pro-preview-customtools"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"gemini-3.1-pro-preview-customtools": {
|
|
||||||
"default": "gemini-3.1-pro-preview-customtools",
|
|
||||||
"contexts": [
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"hasAccessToPreview": false
|
|
||||||
},
|
|
||||||
"target": "gemini-2.5-pro"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"gemini-3-flash-preview": {
|
|
||||||
"default": "gemini-3-flash-preview",
|
|
||||||
"contexts": [
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"hasAccessToPreview": false
|
|
||||||
},
|
|
||||||
"target": "gemini-2.5-flash"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"gemini-3-pro-preview": {
|
"gemini-3-pro-preview": {
|
||||||
"default": "gemini-3-pro-preview",
|
"default": "gemini-3-pro-preview",
|
||||||
"contexts": [
|
"contexts": [
|
||||||
@@ -1012,17 +923,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
"auto-gemini-2.5": {
|
"auto-gemini-2.5": {
|
||||||
"default": "gemini-2.5-pro"
|
"default": "gemini-2.5-pro"
|
||||||
},
|
},
|
||||||
"gemini-3.1-flash-lite-preview": {
|
|
||||||
"default": "gemini-3.1-flash-lite-preview",
|
|
||||||
"contexts": [
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"useGemini3_1FlashLite": false
|
|
||||||
},
|
|
||||||
"target": "gemini-2.5-flash-lite"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"flash": {
|
"flash": {
|
||||||
"default": "gemini-3-flash-preview",
|
"default": "gemini-3-flash-preview",
|
||||||
"contexts": [
|
"contexts": [
|
||||||
@@ -1035,15 +935,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"flash-lite": {
|
"flash-lite": {
|
||||||
"default": "gemini-2.5-flash-lite",
|
"default": "gemini-2.5-flash-lite"
|
||||||
"contexts": [
|
|
||||||
{
|
|
||||||
"condition": {
|
|
||||||
"useGemini3_1FlashLite": true
|
|
||||||
},
|
|
||||||
"target": "gemini-3.1-flash-lite-preview"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1103,132 +995,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`modelConfigs.modelChains`** (object):
|
|
||||||
- **Description:** Availability policy chains defining fallback behavior for
|
|
||||||
models.
|
|
||||||
- **Default:**
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"preview": [
|
|
||||||
{
|
|
||||||
"model": "gemini-3-pro-preview",
|
|
||||||
"actions": {
|
|
||||||
"terminal": "prompt",
|
|
||||||
"transient": "prompt",
|
|
||||||
"not_found": "prompt",
|
|
||||||
"unknown": "prompt"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "gemini-3-flash-preview",
|
|
||||||
"isLastResort": true,
|
|
||||||
"actions": {
|
|
||||||
"terminal": "prompt",
|
|
||||||
"transient": "prompt",
|
|
||||||
"not_found": "prompt",
|
|
||||||
"unknown": "prompt"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default": [
|
|
||||||
{
|
|
||||||
"model": "gemini-2.5-pro",
|
|
||||||
"actions": {
|
|
||||||
"terminal": "prompt",
|
|
||||||
"transient": "prompt",
|
|
||||||
"not_found": "prompt",
|
|
||||||
"unknown": "prompt"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "gemini-2.5-flash",
|
|
||||||
"isLastResort": true,
|
|
||||||
"actions": {
|
|
||||||
"terminal": "prompt",
|
|
||||||
"transient": "prompt",
|
|
||||||
"not_found": "prompt",
|
|
||||||
"unknown": "prompt"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"lite": [
|
|
||||||
{
|
|
||||||
"model": "gemini-2.5-flash-lite",
|
|
||||||
"actions": {
|
|
||||||
"terminal": "silent",
|
|
||||||
"transient": "silent",
|
|
||||||
"not_found": "silent",
|
|
||||||
"unknown": "silent"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "gemini-2.5-flash",
|
|
||||||
"actions": {
|
|
||||||
"terminal": "silent",
|
|
||||||
"transient": "silent",
|
|
||||||
"not_found": "silent",
|
|
||||||
"unknown": "silent"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"model": "gemini-2.5-pro",
|
|
||||||
"isLastResort": true,
|
|
||||||
"actions": {
|
|
||||||
"terminal": "silent",
|
|
||||||
"transient": "silent",
|
|
||||||
"not_found": "silent",
|
|
||||||
"unknown": "silent"
|
|
||||||
},
|
|
||||||
"stateTransitions": {
|
|
||||||
"terminal": "terminal",
|
|
||||||
"transient": "terminal",
|
|
||||||
"not_found": "terminal",
|
|
||||||
"unknown": "terminal"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
#### `agents`
|
#### `agents`
|
||||||
|
|
||||||
- **`agents.overrides`** (object):
|
- **`agents.overrides`** (object):
|
||||||
@@ -1254,8 +1020,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`agents.browser.visualModel`** (string):
|
- **`agents.browser.visualModel`** (string):
|
||||||
- **Description:** Model for the visual agent's analyze_screenshot tool. When
|
- **Description:** Model override for the visual agent.
|
||||||
set, enables the tool.
|
|
||||||
- **Default:** `undefined`
|
- **Default:** `undefined`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
@@ -1274,22 +1039,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Description:** Disable user input on browser window during automation.
|
- **Description:** Disable user input on browser window during automation.
|
||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
|
|
||||||
- **`agents.browser.maxActionsPerTask`** (number):
|
|
||||||
- **Description:** The maximum number of tool calls allowed per browser task.
|
|
||||||
Enforcement is hard: the agent will be terminated when the limit is reached.
|
|
||||||
- **Default:** `100`
|
|
||||||
|
|
||||||
- **`agents.browser.confirmSensitiveActions`** (boolean):
|
|
||||||
- **Description:** Require manual confirmation for sensitive browser actions
|
|
||||||
(e.g., fill_form, evaluate_script).
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`agents.browser.blockFileUploads`** (boolean):
|
|
||||||
- **Description:** Hard-block file upload requests from the browser agent.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
#### `context`
|
#### `context`
|
||||||
|
|
||||||
- **`context.fileName`** (string | string[]):
|
- **`context.fileName`** (string | string[]):
|
||||||
@@ -1310,18 +1059,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Description:** Maximum number of directories to search for memory.
|
- **Description:** Maximum number of directories to search for memory.
|
||||||
- **Default:** `200`
|
- **Default:** `200`
|
||||||
|
|
||||||
- **`context.memoryBoundaryMarkers`** (array):
|
|
||||||
- **Description:** File or directory names that mark the boundary for
|
|
||||||
GEMINI.md discovery. The upward traversal stops at the first directory
|
|
||||||
containing any of these markers. An empty array disables parent traversal.
|
|
||||||
- **Default:**
|
|
||||||
|
|
||||||
```json
|
|
||||||
[".git"]
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`context.includeDirectories`** (array):
|
- **`context.includeDirectories`** (array):
|
||||||
- **Description:** Additional directories to include in the workspace context.
|
- **Description:** Additional directories to include in the workspace context.
|
||||||
Missing directories will be skipped with a warning.
|
Missing directories will be skipped with a warning.
|
||||||
@@ -1368,35 +1105,16 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Description:** Legacy full-process sandbox execution environment. Set to a
|
- **Description:** Legacy full-process sandbox execution environment. Set to a
|
||||||
boolean to enable or disable the sandbox, provide a string path to a sandbox
|
boolean to enable or disable the sandbox, provide a string path to a sandbox
|
||||||
profile, or specify an explicit sandbox command (e.g., "docker", "podman",
|
profile, or specify an explicit sandbox command (e.g., "docker", "podman",
|
||||||
"lxc", "windows-native").
|
"lxc").
|
||||||
- **Default:** `undefined`
|
- **Default:** `undefined`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`tools.sandboxAllowedPaths`** (array):
|
|
||||||
- **Description:** List of additional paths that the sandbox is allowed to
|
|
||||||
access.
|
|
||||||
- **Default:** `[]`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`tools.sandboxNetworkAccess`** (boolean):
|
|
||||||
- **Description:** Whether the sandbox is allowed to access the network.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`tools.shell.enableInteractiveShell`** (boolean):
|
- **`tools.shell.enableInteractiveShell`** (boolean):
|
||||||
- **Description:** Use node-pty for an interactive shell experience. Fallback
|
- **Description:** Use node-pty for an interactive shell experience. Fallback
|
||||||
to child_process still applies.
|
to child_process still applies.
|
||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`tools.shell.backgroundCompletionBehavior`** (enum):
|
|
||||||
- **Description:** Controls what happens when a background shell command
|
|
||||||
finishes. 'silent' (default): quietly exits in background. 'inject':
|
|
||||||
automatically returns output to agent. 'notify': shows brief message in
|
|
||||||
chat.
|
|
||||||
- **Default:** `"silent"`
|
|
||||||
- **Values:** `"silent"`, `"inject"`, `"notify"`
|
|
||||||
|
|
||||||
- **`tools.shell.pager`** (string):
|
- **`tools.shell.pager`** (string):
|
||||||
- **Description:** The pager command to use for shell output. Defaults to
|
- **Description:** The pager command to use for shell output. Defaults to
|
||||||
`cat`.
|
`cat`.
|
||||||
@@ -1404,7 +1122,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **`tools.shell.showColor`** (boolean):
|
- **`tools.shell.showColor`** (boolean):
|
||||||
- **Description:** Show color in shell output.
|
- **Description:** Show color in shell output.
|
||||||
- **Default:** `true`
|
- **Default:** `false`
|
||||||
|
|
||||||
- **`tools.shell.inactivityTimeout`** (number):
|
- **`tools.shell.inactivityTimeout`** (number):
|
||||||
- **Description:** The maximum time in seconds allowed without output from the
|
- **Description:** The maximum time in seconds allowed without output from the
|
||||||
@@ -1492,10 +1210,9 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
#### `security`
|
#### `security`
|
||||||
|
|
||||||
- **`security.toolSandboxing`** (boolean):
|
- **`security.toolSandboxing`** (boolean):
|
||||||
- **Description:** Tool-level sandboxing. Isolates individual tools instead of
|
- **Description:** Experimental tool-level sandboxing (implementation in
|
||||||
the entire CLI process.
|
progress).
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`security.disableYoloMode`** (boolean):
|
- **`security.disableYoloMode`** (boolean):
|
||||||
- **Description:** Disable YOLO mode, even if enabled by a flag.
|
- **Description:** Disable YOLO mode, even if enabled by a flag.
|
||||||
@@ -1578,11 +1295,8 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
#### `advanced`
|
#### `advanced`
|
||||||
|
|
||||||
- **`advanced.autoConfigureMemory`** (boolean):
|
- **`advanced.autoConfigureMemory`** (boolean):
|
||||||
- **Description:** Automatically configure Node.js memory limits. Note:
|
- **Description:** Automatically configure Node.js memory limits
|
||||||
Because memory is allocated during the initial process boot, this setting is
|
- **Default:** `false`
|
||||||
only read from the global user settings file and ignores workspace-level
|
|
||||||
overrides.
|
|
||||||
- **Default:** `true`
|
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`advanced.dnsResolutionOrder`** (string):
|
- **`advanced.dnsResolutionOrder`** (string):
|
||||||
@@ -1604,15 +1318,26 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
#### `experimental`
|
#### `experimental`
|
||||||
|
|
||||||
- **`experimental.adk.agentSessionNoninteractiveEnabled`** (boolean):
|
- **`experimental.toolOutputMasking.enabled`** (boolean):
|
||||||
- **Description:** Enable non-interactive agent sessions.
|
- **Description:** Enables tool output masking to save tokens.
|
||||||
- **Default:** `false`
|
- **Default:** `true`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.adk.agentSessionInteractiveEnabled`** (boolean):
|
- **`experimental.toolOutputMasking.toolProtectionThreshold`** (number):
|
||||||
- **Description:** Enable the agent session implementation for the interactive
|
- **Description:** Minimum number of tokens to protect from masking (most
|
||||||
CLI.
|
recent tool outputs).
|
||||||
- **Default:** `false`
|
- **Default:** `50000`
|
||||||
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
|
- **`experimental.toolOutputMasking.minPrunableTokensThreshold`** (number):
|
||||||
|
- **Description:** Minimum prunable tokens required to trigger a masking pass.
|
||||||
|
- **Default:** `30000`
|
||||||
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
|
- **`experimental.toolOutputMasking.protectLatestTurn`** (boolean):
|
||||||
|
- **Description:** Ensures the absolute latest turn is never masked,
|
||||||
|
regardless of token count.
|
||||||
|
- **Default:** `true`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.enableAgents`** (boolean):
|
- **`experimental.enableAgents`** (boolean):
|
||||||
@@ -1620,11 +1345,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.worktrees`** (boolean):
|
|
||||||
- **Description:** Enable automated Git worktree management for parallel work.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`experimental.extensionManagement`** (boolean):
|
- **`experimental.extensionManagement`** (boolean):
|
||||||
- **Description:** Enable extension management features.
|
- **Description:** Enable extension management features.
|
||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
@@ -1653,7 +1373,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
|
|
||||||
- **`experimental.jitContext`** (boolean):
|
- **`experimental.jitContext`** (boolean):
|
||||||
- **Description:** Enable Just-In-Time (JIT) context loading.
|
- **Description:** Enable Just-In-Time (JIT) context loading.
|
||||||
- **Default:** `false`
|
- **Default:** `true`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.useOSC52Paste`** (boolean):
|
- **`experimental.useOSC52Paste`** (boolean):
|
||||||
@@ -1668,6 +1388,11 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
configured to allow it).
|
configured to allow it).
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
|
|
||||||
|
- **`experimental.plan`** (boolean):
|
||||||
|
- **Description:** Enable Plan Mode.
|
||||||
|
- **Default:** `true`
|
||||||
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.taskTracker`** (boolean):
|
- **`experimental.taskTracker`** (boolean):
|
||||||
- **Description:** Enable task tracker tools.
|
- **Description:** Enable task tracker tools.
|
||||||
- **Default:** `false`
|
- **Default:** `false`
|
||||||
@@ -1706,23 +1431,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Default:** `"gemma3-1b-gpu-custom"`
|
- **Default:** `"gemma3-1b-gpu-custom"`
|
||||||
- **Requires restart:** Yes
|
- **Requires restart:** Yes
|
||||||
|
|
||||||
- **`experimental.memoryManager`** (boolean):
|
|
||||||
- **Description:** Replace the built-in save_memory tool with a memory manager
|
|
||||||
subagent that supports adding, removing, de-duplicating, and organizing
|
|
||||||
memories.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`experimental.generalistProfile`** (boolean):
|
|
||||||
- **Description:** Suitable for general coding and software development tasks.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`experimental.contextManagement`** (boolean):
|
|
||||||
- **Description:** Enable logic for context management.
|
|
||||||
- **Default:** `false`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`experimental.topicUpdateNarration`** (boolean):
|
- **`experimental.topicUpdateNarration`** (boolean):
|
||||||
- **Description:** Enable the experimental Topic & Update communication model
|
- **Description:** Enable the experimental Topic & Update communication model
|
||||||
for reduced chattiness and structured progress reporting.
|
for reduced chattiness and structured progress reporting.
|
||||||
@@ -1814,69 +1522,6 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
prioritize available tools dynamically.
|
prioritize available tools dynamically.
|
||||||
- **Default:** `[]`
|
- **Default:** `[]`
|
||||||
|
|
||||||
#### `contextManagement`
|
|
||||||
|
|
||||||
- **`contextManagement.historyWindow.maxTokens`** (number):
|
|
||||||
- **Description:** The number of tokens to allow before triggering
|
|
||||||
compression.
|
|
||||||
- **Default:** `150000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.historyWindow.retainedTokens`** (number):
|
|
||||||
- **Description:** The number of tokens to always retain.
|
|
||||||
- **Default:** `40000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.messageLimits.normalMaxTokens`** (number):
|
|
||||||
- **Description:** The target number of tokens to budget for a normal
|
|
||||||
conversation turn.
|
|
||||||
- **Default:** `2500`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.messageLimits.retainedMaxTokens`** (number):
|
|
||||||
- **Description:** The maximum number of tokens a single conversation turn can
|
|
||||||
consume before truncation.
|
|
||||||
- **Default:** `12000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.messageLimits.normalizationHeadRatio`** (number):
|
|
||||||
- **Description:** The ratio of tokens to retain from the beginning of a
|
|
||||||
truncated message (0.0 to 1.0).
|
|
||||||
- **Default:** `0.25`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.tools.distillation.maxOutputTokens`** (number):
|
|
||||||
- **Description:** Maximum tokens to show to the model when truncating large
|
|
||||||
tool outputs.
|
|
||||||
- **Default:** `10000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.tools.distillation.summarizationThresholdTokens`**
|
|
||||||
(number):
|
|
||||||
- **Description:** Threshold above which truncated tool outputs will be
|
|
||||||
summarized by an LLM.
|
|
||||||
- **Default:** `20000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.tools.outputMasking.protectionThresholdTokens`**
|
|
||||||
(number):
|
|
||||||
- **Description:** Minimum number of tokens to protect from masking (most
|
|
||||||
recent tool outputs).
|
|
||||||
- **Default:** `50000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.tools.outputMasking.minPrunableThresholdTokens`**
|
|
||||||
(number):
|
|
||||||
- **Description:** Minimum prunable tokens required to trigger a masking pass.
|
|
||||||
- **Default:** `30000`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
- **`contextManagement.tools.outputMasking.protectLatestTurn`** (boolean):
|
|
||||||
- **Description:** Ensures the absolute latest turn is never masked,
|
|
||||||
regardless of token count.
|
|
||||||
- **Default:** `true`
|
|
||||||
- **Requires restart:** Yes
|
|
||||||
|
|
||||||
#### `admin`
|
#### `admin`
|
||||||
|
|
||||||
- **`admin.secureModeEnabled`** (boolean):
|
- **`admin.secureModeEnabled`** (boolean):
|
||||||
@@ -1894,11 +1539,7 @@ their corresponding top-level category object in your `settings.json` file.
|
|||||||
- **Default:** `true`
|
- **Default:** `true`
|
||||||
|
|
||||||
- **`admin.mcp.config`** (object):
|
- **`admin.mcp.config`** (object):
|
||||||
- **Description:** Admin-configured MCP servers (allowlist).
|
- **Description:** Admin-configured MCP servers.
|
||||||
- **Default:** `{}`
|
|
||||||
|
|
||||||
- **`admin.mcp.requiredConfig`** (object):
|
|
||||||
- **Description:** Admin-required MCP servers that are always injected.
|
|
||||||
- **Default:** `{}`
|
- **Default:** `{}`
|
||||||
|
|
||||||
- **`admin.skills.enabled`** (boolean):
|
- **`admin.skills.enabled`** (boolean):
|
||||||
@@ -1918,9 +1559,7 @@ for compatibility. At least one of `command`, `url`, or `httpUrl` must be
|
|||||||
provided. If multiple are specified, the order of precedence is `httpUrl`, then
|
provided. If multiple are specified, the order of precedence is `httpUrl`, then
|
||||||
`url`, then `command`.
|
`url`, then `command`.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** Avoid using underscores (`_`) in your server aliases (e.g., use
|
||||||
> [!WARNING]
|
|
||||||
> Avoid using underscores (`_`) in your server aliases (e.g., use
|
|
||||||
> `my-server` instead of `my_server`). The underlying policy engine parses Fully
|
> `my-server` instead of `my_server`). The underlying policy engine parses Fully
|
||||||
> Qualified Names (`mcp_server_tool`) using the first underscore after the
|
> Qualified Names (`mcp_server_tool`) using the first underscore after the
|
||||||
> `mcp_` prefix. An underscore in your server alias will cause the parser to
|
> `mcp_` prefix. An underscore in your server alias will cause the parser to
|
||||||
@@ -2269,14 +1908,37 @@ You can customize this behavior in your `settings.json` file:
|
|||||||
Arguments passed directly when running the CLI can override other configurations
|
Arguments passed directly when running the CLI can override other configurations
|
||||||
for that specific session.
|
for that specific session.
|
||||||
|
|
||||||
- **`--acp`**:
|
- **`--model <model_name>`** (**`-m <model_name>`**):
|
||||||
- Starts the agent in Agent Communication Protocol (ACP) mode.
|
- Specifies the Gemini model to use for this session.
|
||||||
- **`--allowed-mcp-server-names`**:
|
- Example: `npm start -- --model gemini-3-pro-preview`
|
||||||
- A comma-separated list of MCP server names to allow for the session.
|
- **`--prompt <your_prompt>`** (**`-p <your_prompt>`**):
|
||||||
- **`--allowed-tools <tool1,tool2,...>`**:
|
- **Deprecated:** Use positional arguments instead.
|
||||||
- A comma-separated list of tool names that will bypass the confirmation
|
- Used to pass a prompt directly to the command. This invokes Gemini CLI in a
|
||||||
dialog.
|
non-interactive mode.
|
||||||
- Example: `gemini --allowed-tools "ShellTool(git status)"`
|
- **`--prompt-interactive <your_prompt>`** (**`-i <your_prompt>`**):
|
||||||
|
- Starts an interactive session with the provided prompt as the initial input.
|
||||||
|
- The prompt is processed within the interactive session, not before it.
|
||||||
|
- Cannot be used when piping input from stdin.
|
||||||
|
- Example: `gemini -i "explain this code"`
|
||||||
|
- **`--output-format <format>`**:
|
||||||
|
- **Description:** Specifies the format of the CLI output for non-interactive
|
||||||
|
mode.
|
||||||
|
- **Values:**
|
||||||
|
- `text`: (Default) The standard human-readable output.
|
||||||
|
- `json`: A machine-readable JSON output.
|
||||||
|
- `stream-json`: A streaming JSON output that emits real-time events.
|
||||||
|
- **Note:** For structured output and scripting, use the
|
||||||
|
`--output-format json` or `--output-format stream-json` flag.
|
||||||
|
- **`--sandbox`** (**`-s`**):
|
||||||
|
- Enables sandbox mode for this session.
|
||||||
|
- **`--debug`** (**`-d`**):
|
||||||
|
- Enables debug mode for this session, providing more verbose output. Open the
|
||||||
|
debug console with F12 to see the additional logging.
|
||||||
|
|
||||||
|
- **`--help`** (or **`-h`**):
|
||||||
|
- Displays help information about command-line arguments.
|
||||||
|
- **`--yolo`**:
|
||||||
|
- Enables YOLO mode, which automatically approves all tool calls.
|
||||||
- **`--approval-mode <mode>`**:
|
- **`--approval-mode <mode>`**:
|
||||||
- Sets the approval mode for tool calls. Available modes:
|
- Sets the approval mode for tool calls. Available modes:
|
||||||
- `default`: Prompt for approval on each tool call (default behavior)
|
- `default`: Prompt for approval on each tool call (default behavior)
|
||||||
@@ -2290,61 +1952,17 @@ for that specific session.
|
|||||||
- Cannot be used together with `--yolo`. Use `--approval-mode=yolo` instead of
|
- Cannot be used together with `--yolo`. Use `--approval-mode=yolo` instead of
|
||||||
`--yolo` for the new unified approach.
|
`--yolo` for the new unified approach.
|
||||||
- Example: `gemini --approval-mode auto_edit`
|
- Example: `gemini --approval-mode auto_edit`
|
||||||
- **`--debug`** (**`-d`**):
|
- **`--allowed-tools <tool1,tool2,...>`**:
|
||||||
- Enables debug mode for this session, providing more verbose output. Open the
|
- A comma-separated list of tool names that will bypass the confirmation
|
||||||
debug console with F12 to see the additional logging.
|
dialog.
|
||||||
- **`--delete-session <identifier>`**:
|
- Example: `gemini --allowed-tools "ShellTool(git status)"`
|
||||||
- Delete a specific chat session by its index number or full session UUID.
|
|
||||||
- Use `--list-sessions` first to see available sessions, their indices, and
|
|
||||||
UUIDs.
|
|
||||||
- Example: `gemini --delete-session 3` or
|
|
||||||
`gemini --delete-session a1b2c3d4-e5f6-7890-abcd-ef1234567890`
|
|
||||||
- **`--extensions <extension_name ...>`** (**`-e <extension_name ...>`**):
|
- **`--extensions <extension_name ...>`** (**`-e <extension_name ...>`**):
|
||||||
- Specifies a list of extensions to use for the session. If not provided, all
|
- Specifies a list of extensions to use for the session. If not provided, all
|
||||||
available extensions are used.
|
available extensions are used.
|
||||||
- Use the special term `gemini -e none` to disable all extensions.
|
- Use the special term `gemini -e none` to disable all extensions.
|
||||||
- Example: `gemini -e my-extension -e my-other-extension`
|
- Example: `gemini -e my-extension -e my-other-extension`
|
||||||
- **`--fake-responses`**:
|
|
||||||
- Path to a file with fake model responses for testing.
|
|
||||||
- **`--help`** (or **`-h`**):
|
|
||||||
- Displays help information about command-line arguments.
|
|
||||||
- **`--include-directories <dir1,dir2,...>`**:
|
|
||||||
- Includes additional directories in the workspace for multi-directory
|
|
||||||
support.
|
|
||||||
- Can be specified multiple times or as comma-separated values.
|
|
||||||
- 5 directories can be added at maximum.
|
|
||||||
- Example: `--include-directories /path/to/project1,/path/to/project2` or
|
|
||||||
`--include-directories /path/to/project1 --include-directories /path/to/project2`
|
|
||||||
- **`--list-extensions`** (**`-l`**):
|
- **`--list-extensions`** (**`-l`**):
|
||||||
- Lists all available extensions and exits.
|
- Lists all available extensions and exits.
|
||||||
- **`--list-sessions`**:
|
|
||||||
- List all available chat sessions for the current project and exit.
|
|
||||||
- Shows session indices, dates, message counts, and preview of first user
|
|
||||||
message.
|
|
||||||
- Example: `gemini --list-sessions`
|
|
||||||
- **`--model <model_name>`** (**`-m <model_name>`**):
|
|
||||||
- Specifies the Gemini model to use for this session.
|
|
||||||
- Example: `npm start -- --model gemini-3-pro-preview`
|
|
||||||
- **`--output-format <format>`**:
|
|
||||||
- **Description:** Specifies the format of the CLI output for non-interactive
|
|
||||||
mode.
|
|
||||||
- **Values:**
|
|
||||||
- `text`: (Default) The standard human-readable output.
|
|
||||||
- `json`: A machine-readable JSON output.
|
|
||||||
- `stream-json`: A streaming JSON output that emits real-time events.
|
|
||||||
- **Note:** For structured output and scripting, use the
|
|
||||||
`--output-format json` or `--output-format stream-json` flag.
|
|
||||||
- **`--prompt <your_prompt>`** (**`-p <your_prompt>`**):
|
|
||||||
- **Deprecated:** Use positional arguments instead.
|
|
||||||
- Used to pass a prompt directly to the command. This invokes Gemini CLI in a
|
|
||||||
non-interactive mode.
|
|
||||||
- **`--prompt-interactive <your_prompt>`** (**`-i <your_prompt>`**):
|
|
||||||
- Starts an interactive session with the provided prompt as the initial input.
|
|
||||||
- The prompt is processed within the interactive session, not before it.
|
|
||||||
- Cannot be used when piping input from stdin.
|
|
||||||
- Example: `gemini -i "explain this code"`
|
|
||||||
- **`--record-responses`**:
|
|
||||||
- Path to a file to record model responses for testing.
|
|
||||||
- **`--resume [session_id]`** (**`-r [session_id]`**):
|
- **`--resume [session_id]`** (**`-r [session_id]`**):
|
||||||
- Resume a previous chat session. Use "latest" for the most recent session,
|
- Resume a previous chat session. Use "latest" for the most recent session,
|
||||||
provide a session index number, or provide a full session UUID.
|
provide a session index number, or provide a full session UUID.
|
||||||
@@ -2352,15 +1970,37 @@ for that specific session.
|
|||||||
- Example: `gemini --resume 5` or `gemini --resume latest` or
|
- Example: `gemini --resume 5` or `gemini --resume latest` or
|
||||||
`gemini --resume a1b2c3d4-e5f6-7890-abcd-ef1234567890` or `gemini --resume`
|
`gemini --resume a1b2c3d4-e5f6-7890-abcd-ef1234567890` or `gemini --resume`
|
||||||
- See [Session Management](../cli/session-management.md) for more details.
|
- See [Session Management](../cli/session-management.md) for more details.
|
||||||
- **`--sandbox`** (**`-s`**):
|
- **`--list-sessions`**:
|
||||||
- Enables sandbox mode for this session.
|
- List all available chat sessions for the current project and exit.
|
||||||
|
- Shows session indices, dates, message counts, and preview of first user
|
||||||
|
message.
|
||||||
|
- Example: `gemini --list-sessions`
|
||||||
|
- **`--delete-session <identifier>`**:
|
||||||
|
- Delete a specific chat session by its index number or full session UUID.
|
||||||
|
- Use `--list-sessions` first to see available sessions, their indices, and
|
||||||
|
UUIDs.
|
||||||
|
- Example: `gemini --delete-session 3` or
|
||||||
|
`gemini --delete-session a1b2c3d4-e5f6-7890-abcd-ef1234567890`
|
||||||
|
- **`--include-directories <dir1,dir2,...>`**:
|
||||||
|
- Includes additional directories in the workspace for multi-directory
|
||||||
|
support.
|
||||||
|
- Can be specified multiple times or as comma-separated values.
|
||||||
|
- 5 directories can be added at maximum.
|
||||||
|
- Example: `--include-directories /path/to/project1,/path/to/project2` or
|
||||||
|
`--include-directories /path/to/project1 --include-directories /path/to/project2`
|
||||||
- **`--screen-reader`**:
|
- **`--screen-reader`**:
|
||||||
- Enables screen reader mode, which adjusts the TUI for better compatibility
|
- Enables screen reader mode, which adjusts the TUI for better compatibility
|
||||||
with screen readers.
|
with screen readers.
|
||||||
- **`--version`**:
|
- **`--version`**:
|
||||||
- Displays the version of the CLI.
|
- Displays the version of the CLI.
|
||||||
- **`--yolo`**:
|
- **`--experimental-acp`**:
|
||||||
- Enables YOLO mode, which automatically approves all tool calls.
|
- Starts the agent in ACP mode.
|
||||||
|
- **`--allowed-mcp-server-names`**:
|
||||||
|
- Allowed MCP server names.
|
||||||
|
- **`--fake-responses`**:
|
||||||
|
- Path to a file with fake model responses for testing.
|
||||||
|
- **`--record-responses`**:
|
||||||
|
- Path to a file to record model responses for testing.
|
||||||
|
|
||||||
## Context files (hierarchical instructional context)
|
## Context files (hierarchical instructional context)
|
||||||
|
|
||||||
@@ -2485,13 +2125,9 @@ can be based on the base sandbox image:
|
|||||||
```dockerfile
|
```dockerfile
|
||||||
FROM gemini-cli-sandbox
|
FROM gemini-cli-sandbox
|
||||||
|
|
||||||
# Add your custom dependencies or configurations here.
|
# Add your custom dependencies or configurations here
|
||||||
# Note: The base image runs as the non-root 'node' user.
|
|
||||||
# You must switch to 'root' to install system packages.
|
|
||||||
# For example:
|
# For example:
|
||||||
# USER root
|
|
||||||
# RUN apt-get update && apt-get install -y some-package
|
# RUN apt-get update && apt-get install -y some-package
|
||||||
# USER node
|
|
||||||
# COPY ./my-config /app/my-config
|
# COPY ./my-config /app/my-config
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -86,14 +86,12 @@ available combinations.
|
|||||||
|
|
||||||
#### Text Input
|
#### Text Input
|
||||||
|
|
||||||
| Command | Action | Keys |
|
| Command | Action | Keys |
|
||||||
| ------------------------------------ | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
|
| -------------------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------- |
|
||||||
| `input.submit` | Submit the current prompt. | `Enter` |
|
| `input.submit` | Submit the current prompt. | `Enter` |
|
||||||
| `input.queueMessage` | Queue the current prompt to be processed after the current task finishes. | `Tab` |
|
| `input.newline` | Insert a newline without submitting. | `Ctrl+Enter`<br />`Cmd/Win+Enter`<br />`Alt+Enter`<br />`Shift+Enter`<br />`Ctrl+J` |
|
||||||
| `input.newline` | Insert a newline without submitting. | `Ctrl+Enter`<br />`Cmd/Win+Enter`<br />`Alt+Enter`<br />`Shift+Enter`<br />`Ctrl+J` |
|
| `input.openExternalEditor` | Open the current prompt or the plan in an external editor. | `Ctrl+X` |
|
||||||
| `input.openExternalEditor` | Open the current prompt or the plan in an external editor. | `Ctrl+G`<br />`Ctrl+Shift+G` |
|
| `input.paste` | Paste from the clipboard. | `Ctrl+V`<br />`Cmd/Win+V`<br />`Alt+V` |
|
||||||
| `input.deprecatedOpenExternalEditor` | Deprecated command to open external editor. | `Ctrl+X` |
|
|
||||||
| `input.paste` | Paste from the clipboard. | `Ctrl+V`<br />`Cmd/Win+V`<br />`Alt+V` |
|
|
||||||
|
|
||||||
#### App Controls
|
#### App Controls
|
||||||
|
|
||||||
@@ -101,10 +99,9 @@ available combinations.
|
|||||||
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
|
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
|
||||||
| `app.showErrorDetails` | Toggle detailed error information. | `F12` |
|
| `app.showErrorDetails` | Toggle detailed error information. | `F12` |
|
||||||
| `app.showFullTodos` | Toggle the full TODO list. | `Ctrl+T` |
|
| `app.showFullTodos` | Toggle the full TODO list. | `Ctrl+T` |
|
||||||
| `app.showIdeContextDetail` | Show IDE context details. | `F4` |
|
| `app.showIdeContextDetail` | Show IDE context details. | `Ctrl+G` |
|
||||||
| `app.toggleMarkdown` | Toggle Markdown rendering. | `Alt+M` |
|
| `app.toggleMarkdown` | Toggle Markdown rendering. | `Alt+M` |
|
||||||
| `app.toggleCopyMode` | Toggle copy mode when in alternate buffer mode. | `F9` |
|
| `app.toggleCopyMode` | Toggle copy mode when in alternate buffer mode. | `Ctrl+S` |
|
||||||
| `app.toggleMouseMode` | Toggle mouse mode (scrolling and clicking). | `Ctrl+S` |
|
|
||||||
| `app.toggleYolo` | Toggle YOLO (auto-approval) mode for tool calls. | `Ctrl+Y` |
|
| `app.toggleYolo` | Toggle YOLO (auto-approval) mode for tool calls. | `Ctrl+Y` |
|
||||||
| `app.cycleApprovalMode` | Cycle through approval modes: default (prompt), auto_edit (auto-approve edits), and plan (read-only). Plan mode is skipped when the agent is busy. | `Shift+Tab` |
|
| `app.cycleApprovalMode` | Cycle through approval modes: default (prompt), auto_edit (auto-approve edits), and plan (read-only). Plan mode is skipped when the agent is busy. | `Shift+Tab` |
|
||||||
| `app.showMoreLines` | Expand and collapse blocks of content when not in alternate buffer mode. | `Ctrl+O` |
|
| `app.showMoreLines` | Expand and collapse blocks of content when not in alternate buffer mode. | `Ctrl+O` |
|
||||||
@@ -128,16 +125,6 @@ available combinations.
|
|||||||
| `background.unfocus` | Move focus from background shell to Gemini. | `Shift+Tab` |
|
| `background.unfocus` | Move focus from background shell to Gemini. | `Shift+Tab` |
|
||||||
| `background.unfocusList` | Move focus from background shell list to Gemini. | `Tab` |
|
| `background.unfocusList` | Move focus from background shell list to Gemini. | `Tab` |
|
||||||
| `background.unfocusWarning` | Show warning when trying to move focus away from background shell. | `Tab` |
|
| `background.unfocusWarning` | Show warning when trying to move focus away from background shell. | `Tab` |
|
||||||
| `app.dumpFrame` | Dump the current frame as a snapshot. | `F8` |
|
|
||||||
| `app.startRecording` | Start recording the session. | `F6` |
|
|
||||||
| `app.stopRecording` | Stop recording the session. | `F7` |
|
|
||||||
|
|
||||||
#### Extension Controls
|
|
||||||
|
|
||||||
| Command | Action | Keys |
|
|
||||||
| ------------------ | ------------------------------------------- | ---- |
|
|
||||||
| `extension.update` | Update the current extension if available. | `I` |
|
|
||||||
| `extension.link` | Link the current extension to a local path. | `L` |
|
|
||||||
|
|
||||||
<!-- KEYBINDINGS-AUTOGEN:END -->
|
<!-- KEYBINDINGS-AUTOGEN:END -->
|
||||||
|
|
||||||
|
|||||||
@@ -29,12 +29,13 @@ To create your first policy:
|
|||||||
```toml
|
```toml
|
||||||
[[rule]]
|
[[rule]]
|
||||||
toolName = "run_shell_command"
|
toolName = "run_shell_command"
|
||||||
commandPrefix = "rm -rf"
|
commandPrefix = "git status"
|
||||||
decision = "deny"
|
decision = "allow"
|
||||||
priority = 100
|
priority = 100
|
||||||
```
|
```
|
||||||
3. **Run a command** that triggers the policy (e.g., ask Gemini CLI to
|
3. **Run a command** that triggers the policy (e.g., ask Gemini CLI to
|
||||||
`rm -rf /`). The tool will now be blocked automatically.
|
`git status`). The tool will now execute automatically without prompting for
|
||||||
|
confirmation.
|
||||||
|
|
||||||
## Core concepts
|
## Core concepts
|
||||||
|
|
||||||
@@ -112,9 +113,7 @@ There are three possible decisions a rule can enforce:
|
|||||||
- `ask_user`: The user is prompted to approve or deny the tool call. (In
|
- `ask_user`: The user is prompted to approve or deny the tool call. (In
|
||||||
non-interactive mode, this is treated as `deny`.)
|
non-interactive mode, this is treated as `deny`.)
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** The `deny` decision is the recommended way to exclude tools. The
|
||||||
> [!NOTE]
|
|
||||||
> The `deny` decision is the recommended way to exclude tools. The
|
|
||||||
> legacy `tools.exclude` setting in `settings.json` is deprecated in favor of
|
> legacy `tools.exclude` setting in `settings.json` is deprecated in favor of
|
||||||
> policy rules with a `deny` decision.
|
> policy rules with a `deny` decision.
|
||||||
|
|
||||||
@@ -142,26 +141,25 @@ engine transforms this into a final priority using the following formula:
|
|||||||
|
|
||||||
This system guarantees that:
|
This system guarantees that:
|
||||||
|
|
||||||
- Admin policies always override User, Workspace, and Default policies (defined
|
- Admin policies always override User, Workspace, and Default policies.
|
||||||
in policy TOML files).
|
|
||||||
- User policies override Workspace and Default policies.
|
- User policies override Workspace and Default policies.
|
||||||
- Workspace policies override Default policies.
|
- Workspace policies override Default policies.
|
||||||
- You can still order rules within a single tier with fine-grained control.
|
- You can still order rules within a single tier with fine-grained control.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
- A `priority: 50` rule in a Default policy TOML becomes `1.050`.
|
- A `priority: 50` rule in a Default policy file becomes `1.050`.
|
||||||
- A `priority: 10` rule in a Workspace policy TOML becomes `2.010`.
|
- A `priority: 10` rule in a Workspace policy policy file becomes `2.010`.
|
||||||
- A `priority: 100` rule in a User policy TOML becomes `3.100`.
|
- A `priority: 100` rule in a User policy file becomes `3.100`.
|
||||||
- A `priority: 20` rule in an Admin policy TOML becomes `4.020`.
|
- A `priority: 20` rule in an Admin policy file becomes `4.020`.
|
||||||
|
|
||||||
### Approval modes
|
### Approval modes
|
||||||
|
|
||||||
Approval modes allow the policy engine to apply different sets of rules based on
|
Approval modes allow the policy engine to apply different sets of rules based on
|
||||||
the CLI's operational mode. A rule in a TOML policy file can be associated with
|
the CLI's operational mode. A rule can be associated with one or more modes
|
||||||
one or more modes (e.g., `yolo`, `autoEdit`, `plan`). The rule will only be
|
(e.g., `yolo`, `autoEdit`, `plan`). The rule will only be active if the CLI is
|
||||||
active if the CLI is running in one of its specified modes. If a rule has no
|
running in one of its specified modes. If a rule has no modes specified, it is
|
||||||
modes specified, it is always active.
|
always active.
|
||||||
|
|
||||||
- `default`: The standard interactive mode where most write tools require
|
- `default`: The standard interactive mode where most write tools require
|
||||||
confirmation.
|
confirmation.
|
||||||
@@ -171,24 +169,6 @@ modes specified, it is always active.
|
|||||||
[Customizing Plan Mode Policies](../cli/plan-mode.md#customizing-policies).
|
[Customizing Plan Mode Policies](../cli/plan-mode.md#customizing-policies).
|
||||||
- `yolo`: A mode where all tools are auto-approved (use with extreme caution).
|
- `yolo`: A mode where all tools are auto-approved (use with extreme caution).
|
||||||
|
|
||||||
To maintain the integrity of Plan Mode as a safe research environment,
|
|
||||||
persistent tool approvals are context-aware. When you select **"Allow for all
|
|
||||||
future sessions"**, the policy engine explicitly includes the current mode and
|
|
||||||
all more permissive modes in the hierarchy (`plan` < `default` < `autoEdit` <
|
|
||||||
`yolo`).
|
|
||||||
|
|
||||||
- **Approvals in `plan` mode**: These represent an intentional choice to trust a
|
|
||||||
tool globally. The resulting rule explicitly includes all modes (`plan`,
|
|
||||||
`default`, `autoEdit`, and `yolo`).
|
|
||||||
- **Approvals in other modes**: These only apply to the current mode and those
|
|
||||||
more permissive. For example:
|
|
||||||
- An approval granted in **`default`** mode applies to `default`, `autoEdit`,
|
|
||||||
and `yolo`.
|
|
||||||
- An approval granted in **`autoEdit`** mode applies to `autoEdit` and `yolo`.
|
|
||||||
- An approval granted in **`yolo`** mode applies only to `yolo`. This ensures
|
|
||||||
that trust flows correctly to more permissive environments while maintaining
|
|
||||||
the safety of more restricted modes like `plan`.
|
|
||||||
|
|
||||||
## Rule matching
|
## Rule matching
|
||||||
|
|
||||||
When a tool call is made, the engine checks it against all active rules,
|
When a tool call is made, the engine checks it against all active rules,
|
||||||
@@ -197,8 +177,8 @@ outcome.
|
|||||||
|
|
||||||
A rule matches a tool call if all of its conditions are met:
|
A rule matches a tool call if all of its conditions are met:
|
||||||
|
|
||||||
1. **Tool name**: The `toolName` in the TOML rule must match the name of the
|
1. **Tool name**: The `toolName` in the rule must match the name of the tool
|
||||||
tool being called.
|
being called.
|
||||||
- **Wildcards**: You can use wildcards like `*`, `mcp_server_*`, or
|
- **Wildcards**: You can use wildcards like `*`, `mcp_server_*`, or
|
||||||
`mcp_*_toolName` to match multiple tools. See [Tool Name](#tool-name) for
|
`mcp_*_toolName` to match multiple tools. See [Tool Name](#tool-name) for
|
||||||
details.
|
details.
|
||||||
@@ -259,17 +239,15 @@ directory are **ignored**.
|
|||||||
- **Linux / macOS:** Must be owned by `root` (UID 0) and NOT writable by group
|
- **Linux / macOS:** Must be owned by `root` (UID 0) and NOT writable by group
|
||||||
or others (e.g., `chmod 755`).
|
or others (e.g., `chmod 755`).
|
||||||
- **Windows:** Must be in `C:\ProgramData`. Standard users (`Users`, `Everyone`)
|
- **Windows:** Must be in `C:\ProgramData`. Standard users (`Users`, `Everyone`)
|
||||||
must NOT have `Write`, `Modify`, or `Full Control` permissions. If you see a
|
must NOT have `Write`, `Modify`, or `Full Control` permissions. _Tip: If you
|
||||||
security warning, use the folder properties to remove write permissions for
|
see a security warning, use the folder properties to remove write permissions
|
||||||
non-admin groups. You may need to "Disable inheritance" in Advanced Security
|
for non-admin groups. You may need to "Disable inheritance" in Advanced
|
||||||
Settings.
|
Security Settings._
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** Supplemental admin policies (provided via `--admin-policy` or
|
||||||
> [!NOTE]
|
`adminPolicyPaths` settings) are **NOT** subject to these strict ownership
|
||||||
> Supplemental admin policies (provided via `--admin-policy` or
|
checks, as they are explicitly provided by the user or administrator in their
|
||||||
> `adminPolicyPaths` settings) are **NOT** subject to these strict ownership
|
current execution context.
|
||||||
> checks, as they are explicitly provided by the user or administrator in their
|
|
||||||
> current execution context.
|
|
||||||
|
|
||||||
### TOML rule schema
|
### TOML rule schema
|
||||||
|
|
||||||
@@ -280,9 +258,9 @@ Here is a breakdown of the fields available in a TOML policy rule:
|
|||||||
# A unique name for the tool, or an array of names.
|
# A unique name for the tool, or an array of names.
|
||||||
toolName = "run_shell_command"
|
toolName = "run_shell_command"
|
||||||
|
|
||||||
# (Optional) The name of a subagent. If provided, the rule only applies to tool
|
# (Optional) The name of a subagent. If provided, the rule only applies to tool calls
|
||||||
# calls made by this specific subagent.
|
# made by this specific subagent.
|
||||||
subagent = "codebase_investigator"
|
subagent = "generalist"
|
||||||
|
|
||||||
# (Optional) The name of an MCP server. Can be combined with toolName
|
# (Optional) The name of an MCP server. Can be combined with toolName
|
||||||
# to form a composite FQN internally like "mcp_mcpName_toolName".
|
# to form a composite FQN internally like "mcp_mcpName_toolName".
|
||||||
@@ -296,17 +274,14 @@ toolAnnotations = { readOnlyHint = true }
|
|||||||
argsPattern = '"command":"(git|npm)'
|
argsPattern = '"command":"(git|npm)'
|
||||||
|
|
||||||
# (Optional) A string or array of strings that a shell command must start with.
|
# (Optional) A string or array of strings that a shell command must start with.
|
||||||
# This is syntactic sugar for `toolName = "run_shell_command"` and an
|
# This is syntactic sugar for `toolName = "run_shell_command"` and an `argsPattern`.
|
||||||
# `argsPattern`.
|
|
||||||
commandPrefix = "git"
|
commandPrefix = "git"
|
||||||
|
|
||||||
# (Optional) A regex to match against the entire shell command.
|
# (Optional) A regex to match against the entire shell command.
|
||||||
# This is also syntactic sugar for `toolName = "run_shell_command"`.
|
# This is also syntactic sugar for `toolName = "run_shell_command"`.
|
||||||
# Note: This pattern is tested against the JSON representation of the arguments
|
# Note: This pattern is tested against the JSON representation of the arguments (e.g., `{"command":"<your_command>"}`).
|
||||||
# (e.g., `{"command":"<your_command>"}`). Because it prepends `"command":"`,
|
# Because it prepends `"command":"`, it effectively matches from the start of the command.
|
||||||
# it effectively matches from the start of the command.
|
# Anchors like `^` or `$` apply to the full JSON string, so `^` should usually be avoided here.
|
||||||
# Anchors like `^` or `$` apply to the full JSON string,
|
|
||||||
# so `^` should usually be avoided here.
|
|
||||||
# You cannot use commandPrefix and commandRegex in the same rule.
|
# You cannot use commandPrefix and commandRegex in the same rule.
|
||||||
commandRegex = "git (commit|push)"
|
commandRegex = "git (commit|push)"
|
||||||
|
|
||||||
@@ -316,27 +291,16 @@ decision = "ask_user"
|
|||||||
# The priority of the rule, from 0 to 999.
|
# The priority of the rule, from 0 to 999.
|
||||||
priority = 10
|
priority = 10
|
||||||
|
|
||||||
# (Optional) A custom message to display when a tool call is denied by this
|
# (Optional) A custom message to display when a tool call is denied by this rule.
|
||||||
# rule. This message is returned to the model and user,
|
# This message is returned to the model and user, useful for explaining *why* it was denied.
|
||||||
# useful for explaining *why* it was denied.
|
deny_message = "Deletion is permanent"
|
||||||
denyMessage = "Deletion is permanent"
|
|
||||||
|
|
||||||
# (Optional) An array of approval modes where this rule is active.
|
# (Optional) An array of approval modes where this rule is active.
|
||||||
# If omitted or empty, the rule applies to all modes.
|
modes = ["autoEdit"]
|
||||||
modes = ["default", "autoEdit", "yolo"]
|
|
||||||
|
|
||||||
# (Optional) A boolean to restrict the rule to interactive (true) or
|
# (Optional) A boolean to restrict the rule to interactive (true) or non-interactive (false) environments.
|
||||||
# non-interactive (false) environments.
|
|
||||||
# If omitted, the rule applies to both.
|
# If omitted, the rule applies to both.
|
||||||
interactive = true
|
interactive = true
|
||||||
|
|
||||||
# (Optional) If true, lets shell commands use redirection operators
|
|
||||||
# (>, >>, <, <<, <<<). By default, the policy engine asks for confirmation
|
|
||||||
# when redirection is detected, even if a rule matches the command.
|
|
||||||
# This permission is granular; it only applies to the specific rule it's
|
|
||||||
# defined in. In chained commands (e.g., cmd1 > file && cmd2), each
|
|
||||||
# individual command rule must permit redirection if it's used.
|
|
||||||
allowRedirection = true
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using arrays (lists)
|
### Using arrays (lists)
|
||||||
@@ -384,9 +348,7 @@ using the `mcpName` field. **This is the recommended approach** for defining MCP
|
|||||||
policies, as it is much more robust than manually writing Fully Qualified Names
|
policies, as it is much more robust than manually writing Fully Qualified Names
|
||||||
(FQNs) or string wildcards.
|
(FQNs) or string wildcards.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Warning:** Do not use underscores (`_`) in your MCP server names (e.g., use
|
||||||
> [!WARNING]
|
|
||||||
> Do not use underscores (`_`) in your MCP server names (e.g., use
|
|
||||||
> `my-server` rather than `my_server`). The policy parser splits Fully Qualified
|
> `my-server` rather than `my_server`). The policy parser splits Fully Qualified
|
||||||
> Names (`mcp_server_tool`) on the _first_ underscore following the `mcp_`
|
> Names (`mcp_server_tool`) on the _first_ underscore following the `mcp_`
|
||||||
> prefix. If your server name contains an underscore, the parser will
|
> prefix. If your server name contains an underscore, the parser will
|
||||||
@@ -421,7 +383,7 @@ server.
|
|||||||
mcpName = "untrusted-server"
|
mcpName = "untrusted-server"
|
||||||
decision = "deny"
|
decision = "deny"
|
||||||
priority = 500
|
priority = 500
|
||||||
denyMessage = "This server is not trusted by the admin."
|
deny_message = "This server is not trusted by the admin."
|
||||||
```
|
```
|
||||||
|
|
||||||
**3. Targeting all MCP servers**
|
**3. Targeting all MCP servers**
|
||||||
@@ -432,12 +394,25 @@ registered MCP server. This is useful for setting category-wide defaults.
|
|||||||
```toml
|
```toml
|
||||||
# Ask user for any tool call from any MCP server
|
# Ask user for any tool call from any MCP server
|
||||||
[[rule]]
|
[[rule]]
|
||||||
toolName = "*"
|
|
||||||
mcpName = "*"
|
mcpName = "*"
|
||||||
decision = "ask_user"
|
decision = "ask_user"
|
||||||
priority = 10
|
priority = 10
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**4. Targeting a tool name across all servers**
|
||||||
|
|
||||||
|
Use `mcpName = "*"` with a specific `toolName` to target that operation
|
||||||
|
regardless of which server provides it.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# Allow the `search` tool across all connected MCP servers
|
||||||
|
[[rule]]
|
||||||
|
mcpName = "*"
|
||||||
|
toolName = "search"
|
||||||
|
decision = "allow"
|
||||||
|
priority = 50
|
||||||
|
```
|
||||||
|
|
||||||
## Default policies
|
## Default policies
|
||||||
|
|
||||||
The Gemini CLI ships with a set of default policies to provide a safe
|
The Gemini CLI ships with a set of default policies to provide a safe
|
||||||
|
|||||||
+23
-58
@@ -63,62 +63,29 @@ details.
|
|||||||
|
|
||||||
## Available tools
|
## Available tools
|
||||||
|
|
||||||
The following sections list all available tools, categorized by their primary
|
The following table lists all available tools, categorized by their primary
|
||||||
function. For detailed parameter information, see the linked documentation for
|
function.
|
||||||
each tool.
|
|
||||||
|
|
||||||
### Execution
|
| Category | Tool | Kind | Description |
|
||||||
|
| :---------- | :----------------------------------------------- | :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
| Tool | Kind | Description |
|
| Execution | [`run_shell_command`](../tools/shell.md) | `Execute` | Executes arbitrary shell commands. Supports interactive sessions and background processes. Requires manual confirmation.<br><br>**Parameters:** `command`, `description`, `dir_path`, `is_background` |
|
||||||
| :--------------------------------------- | :-------- | :----------------------------------------------------------------------------------------------------------------------- |
|
| File System | [`glob`](../tools/file-system.md) | `Search` | Finds files matching specific glob patterns across the workspace.<br><br>**Parameters:** `pattern`, `dir_path`, `case_sensitive`, `respect_git_ignore`, `respect_gemini_ignore` |
|
||||||
| [`run_shell_command`](../tools/shell.md) | `Execute` | Executes arbitrary shell commands. Supports interactive sessions and background processes. Requires manual confirmation. |
|
| File System | [`grep_search`](../tools/file-system.md) | `Search` | Searches for a regular expression pattern within file contents. Legacy alias: `search_file_content`.<br><br>**Parameters:** `pattern`, `dir_path`, `include`, `exclude_pattern`, `names_only`, `max_matches_per_file`, `total_max_matches` |
|
||||||
|
| File System | [`list_directory`](../tools/file-system.md) | `Read` | Lists the names of files and subdirectories within a specified path.<br><br>**Parameters:** `dir_path`, `ignore`, `file_filtering_options` |
|
||||||
### File System
|
| File System | [`read_file`](../tools/file-system.md) | `Read` | Reads the content of a specific file. Supports text, images, audio, and PDF.<br><br>**Parameters:** `file_path`, `start_line`, `end_line` |
|
||||||
|
| File System | [`read_many_files`](../tools/file-system.md) | `Read` | Reads and concatenates content from multiple files. Often triggered by the `@` symbol in your prompt.<br><br>**Parameters:** `include`, `exclude`, `recursive`, `useDefaultExcludes`, `file_filtering_options` |
|
||||||
| Tool | Kind | Description |
|
| File System | [`replace`](../tools/file-system.md) | `Edit` | Performs precise text replacement within a file. Requires manual confirmation.<br><br>**Parameters:** `file_path`, `instruction`, `old_string`, `new_string`, `allow_multiple` |
|
||||||
| :------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------------- |
|
| File System | [`write_file`](../tools/file-system.md) | `Edit` | Creates or overwrites a file with new content. Requires manual confirmation.<br><br>**Parameters:** `file_path`, `content` |
|
||||||
| [`glob`](../tools/file-system.md) | `Search` | Finds files matching specific glob patterns across the workspace. |
|
| Interaction | [`ask_user`](../tools/ask-user.md) | `Communicate` | Requests clarification or missing information via an interactive dialog.<br><br>**Parameters:** `questions` |
|
||||||
| [`grep_search`](../tools/file-system.md) | `Search` | Searches for a regular expression pattern within file contents. Legacy alias: `search_file_content`. |
|
| Interaction | [`write_todos`](../tools/todos.md) | `Other` | Maintains an internal list of subtasks. The model uses this to track its own progress and display it to you.<br><br>**Parameters:** `todos` |
|
||||||
| [`list_directory`](../tools/file-system.md) | `Read` | Lists the names of files and subdirectories within a specified path. |
|
| Memory | [`activate_skill`](../tools/activate-skill.md) | `Other` | Loads specialized procedural expertise for specific tasks from the `.gemini/skills` directory.<br><br>**Parameters:** `name` |
|
||||||
| [`read_file`](../tools/file-system.md) | `Read` | Reads the content of a specific file. Supports text, images, audio, and PDF. |
|
| Memory | [`get_internal_docs`](../tools/internal-docs.md) | `Think` | Accesses Gemini CLI's own documentation to provide more accurate answers about its capabilities.<br><br>**Parameters:** `path` |
|
||||||
| [`read_many_files`](../tools/file-system.md) | `Read` | Reads and concatenates content from multiple files. Often triggered by the `@` symbol in your prompt. |
|
| Memory | [`save_memory`](../tools/memory.md) | `Think` | Persists specific facts and project details to your `GEMINI.md` file to retain context.<br><br>**Parameters:** `fact` |
|
||||||
| [`replace`](../tools/file-system.md) | `Edit` | Performs precise text replacement within a file. Requires manual confirmation. |
|
| Planning | [`enter_plan_mode`](../tools/planning.md) | `Plan` | Switches the CLI to a safe, read-only "Plan Mode" for researching complex changes.<br><br>**Parameters:** `reason` |
|
||||||
| [`write_file`](../tools/file-system.md) | `Edit` | Creates or overwrites a file with new content. Requires manual confirmation. |
|
| Planning | [`exit_plan_mode`](../tools/planning.md) | `Plan` | Finalizes a plan, presents it for review, and requests approval to start implementation.<br><br>**Parameters:** `plan` |
|
||||||
|
| System | `complete_task` | `Other` | Finalizes a subagent's mission and returns the result to the parent agent. This tool is not available to the user.<br><br>**Parameters:** `result` |
|
||||||
### Interaction
|
| Web | [`google_web_search`](../tools/web-search.md) | `Search` | Performs a Google Search to find up-to-date information.<br><br>**Parameters:** `query` |
|
||||||
|
| Web | [`web_fetch`](../tools/web-fetch.md) | `Fetch` | Retrieves and processes content from specific URLs. **Warning:** This tool can access local and private network addresses (e.g., localhost), which may pose a security risk if used with untrusted prompts.<br><br>**Parameters:** `prompt` |
|
||||||
| Tool | Kind | Description |
|
|
||||||
| :--------------------------------- | :------------ | :------------------------------------------------------------------------------------- |
|
|
||||||
| [`ask_user`](../tools/ask-user.md) | `Communicate` | Requests clarification or missing information via an interactive dialog. |
|
|
||||||
| [`write_todos`](../tools/todos.md) | `Other` | Maintains an internal list of subtasks. The model uses this to track its own progress. |
|
|
||||||
|
|
||||||
### Memory
|
|
||||||
|
|
||||||
| Tool | Kind | Description |
|
|
||||||
| :----------------------------------------------- | :------ | :----------------------------------------------------------------------------------- |
|
|
||||||
| [`activate_skill`](../tools/activate-skill.md) | `Other` | Loads specialized procedural expertise from the `.gemini/skills` directory. |
|
|
||||||
| [`get_internal_docs`](../tools/internal-docs.md) | `Think` | Accesses Gemini CLI's own documentation for accurate answers about its capabilities. |
|
|
||||||
| [`save_memory`](../tools/memory.md) | `Think` | Persists specific facts and project details to your `GEMINI.md` file. |
|
|
||||||
|
|
||||||
### Planning
|
|
||||||
|
|
||||||
| Tool | Kind | Description |
|
|
||||||
| :---------------------------------------- | :----- | :--------------------------------------------------------------------------------------- |
|
|
||||||
| [`enter_plan_mode`](../tools/planning.md) | `Plan` | Switches the CLI to a safe, read-only "Plan Mode" for researching complex changes. |
|
|
||||||
| [`exit_plan_mode`](../tools/planning.md) | `Plan` | Finalizes a plan, presents it for review, and requests approval to start implementation. |
|
|
||||||
|
|
||||||
### System
|
|
||||||
|
|
||||||
| Tool | Kind | Description |
|
|
||||||
| :-------------- | :------ | :----------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| `complete_task` | `Other` | Finalizes a subagent's mission and returns the result to the parent agent. This tool is not available to the user. |
|
|
||||||
|
|
||||||
### Web
|
|
||||||
|
|
||||||
| Tool | Kind | Description |
|
|
||||||
| :-------------------------------------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| [`google_web_search`](../tools/web-search.md) | `Search` | Performs a Google Search to find up-to-date information. |
|
|
||||||
| [`web_fetch`](../tools/web-fetch.md) | `Fetch` | Retrieves and processes content from specific URLs. **Warning:** This tool can access local and private network addresses (e.g., localhost), which may pose a security risk if used with untrusted prompts. In Plan Mode, this tool requires explicit user confirmation. |
|
|
||||||
|
|
||||||
## Under the hood
|
## Under the hood
|
||||||
|
|
||||||
@@ -128,9 +95,7 @@ For developers, the tool system is designed to be extensible and robust. The
|
|||||||
You can extend Gemini CLI with custom tools by configuring
|
You can extend Gemini CLI with custom tools by configuring
|
||||||
`tools.discoveryCommand` in your settings or by connecting to MCP servers.
|
`tools.discoveryCommand` in your settings or by connecting to MCP servers.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** For a deep dive into the internal Tool API and how to implement your
|
||||||
> [!NOTE]
|
|
||||||
> For a deep dive into the internal Tool API and how to implement your
|
|
||||||
> own tools in the codebase, see the `packages/core/src/tools/` directory in
|
> own tools in the codebase, see the `packages/core/src/tools/` directory in
|
||||||
> GitHub.
|
> GitHub.
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ All workflows in `.github/workflows/ci.yml` must pass on the `main` branch (for
|
|||||||
nightly) or the release branch (for preview/stable).
|
nightly) or the release branch (for preview/stable).
|
||||||
|
|
||||||
- **Platforms:** Tests must pass on **Linux and macOS**.
|
- **Platforms:** Tests must pass on **Linux and macOS**.
|
||||||
|
- _Note:_ Windows tests currently run with `continue-on-error: true`. While a
|
||||||
|
failure here doesn't block the release technically, it should be
|
||||||
|
investigated.
|
||||||
- **Checks:**
|
- **Checks:**
|
||||||
- **Linting:** No linting errors (ESLint, Prettier, etc.).
|
- **Linting:** No linting errors (ESLint, Prettier, etc.).
|
||||||
- **Typechecking:** No TypeScript errors.
|
- **Typechecking:** No TypeScript errors.
|
||||||
|
|||||||
+7
-15
@@ -1,9 +1,5 @@
|
|||||||
# Gemini CLI releases
|
# Gemini CLI releases
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> **Coordinate with the Release Manager:** The release manager is responsible for coordinating patches and releases. Please update them before performing any of the release actions described in this document.
|
|
||||||
|
|
||||||
## `dev` vs `prod` environment
|
## `dev` vs `prod` environment
|
||||||
|
|
||||||
Our release flows support both `dev` and `prod` environments.
|
Our release flows support both `dev` and `prod` environments.
|
||||||
@@ -238,12 +234,10 @@ This workflow will automatically:
|
|||||||
Review the automatically created pull request(s) to ensure the cherry-pick was
|
Review the automatically created pull request(s) to ensure the cherry-pick was
|
||||||
successful and the changes are correct. Once approved, merge the pull request.
|
successful and the changes are correct. Once approved, merge the pull request.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Security note:** The `release/*` branches are protected by branch protection
|
||||||
> [!WARNING]
|
rules. A pull request to one of these branches requires at least one review from
|
||||||
> The `release/*` branches are protected by branch protection
|
a code owner before it can be merged. This ensures that no unauthorized code is
|
||||||
> rules. A pull request to one of these branches requires at least one review from
|
released.
|
||||||
> a code owner before it can be merged. This ensures that no unauthorized code is
|
|
||||||
> released.
|
|
||||||
|
|
||||||
#### 2.5. Adding multiple commits to a hotfix (advanced)
|
#### 2.5. Adding multiple commits to a hotfix (advanced)
|
||||||
|
|
||||||
@@ -530,11 +524,9 @@ Notifications use
|
|||||||
[GitHub for Google Chat](https://workspace.google.com/marketplace/app/github_for_google_chat/536184076190).
|
[GitHub for Google Chat](https://workspace.google.com/marketplace/app/github_for_google_chat/536184076190).
|
||||||
To modify the notifications, use `/github-settings` within the chat space.
|
To modify the notifications, use `/github-settings` within the chat space.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> [!WARNING] The following instructions describe a fragile workaround that
|
||||||
> [!WARNING]
|
> depends on the internal structure of the chat application's UI. It is likely
|
||||||
> The following instructions describe a fragile workaround that depends on the
|
> to break with future updates.
|
||||||
> internal structure of the chat application's UI. It is likely to break with
|
|
||||||
> future updates.
|
|
||||||
|
|
||||||
The list of available labels is not currently populated correctly. If you want
|
The list of available labels is not currently populated correctly. If you want
|
||||||
to add a label that does not appear alphabetically in the first 30 labels in the
|
to add a label that does not appear alphabetically in the first 30 labels in the
|
||||||
|
|||||||
@@ -12,21 +12,6 @@ quota for your needs, see the [Plans page](https://geminicli.com/plans/).
|
|||||||
This article outlines the specific quotas and pricing applicable to Gemini CLI
|
This article outlines the specific quotas and pricing applicable to Gemini CLI
|
||||||
when using different authentication methods.
|
when using different authentication methods.
|
||||||
|
|
||||||
The following table summarizes the available quotas and their respective limits:
|
|
||||||
|
|
||||||
| Authentication method | Tier / Subscription | Maximum requests per user per day |
|
|
||||||
| :-------------------- | :------------------------------ | :-------------------------------- |
|
|
||||||
| **Google account** | Gemini Code Assist (Individual) | 1,000 requests |
|
|
||||||
| | Google AI Pro | 1,500 requests |
|
|
||||||
| | Google AI Ultra | 2,000 requests |
|
|
||||||
| **Gemini API key** | Free tier (Unpaid) | 250 requests |
|
|
||||||
| | Pay-as-you-go (Paid) | Varies |
|
|
||||||
| **Vertex AI** | Express mode (Free) | Varies |
|
|
||||||
| | Pay-as-you-go (Paid) | Varies |
|
|
||||||
| **Google Workspace** | Code Assist Standard | 1,500 requests |
|
|
||||||
| | Code Assist Enterprise | 2,000 requests |
|
|
||||||
| | Workspace AI Ultra | 2,000 requests |
|
|
||||||
|
|
||||||
Generally, there are three categories to choose from:
|
Generally, there are three categories to choose from:
|
||||||
|
|
||||||
- Free Usage: Ideal for experimentation and light use.
|
- Free Usage: Ideal for experimentation and light use.
|
||||||
@@ -35,9 +20,6 @@ Generally, there are three categories to choose from:
|
|||||||
- Pay-As-You-Go: The most flexible option for professional use, long-running
|
- Pay-As-You-Go: The most flexible option for professional use, long-running
|
||||||
tasks, or when you need full control over your usage.
|
tasks, or when you need full control over your usage.
|
||||||
|
|
||||||
Requests are limited per user per minute and are subject to the availability of
|
|
||||||
the service in times of high demand.
|
|
||||||
|
|
||||||
## Free usage
|
## Free usage
|
||||||
|
|
||||||
Access to Gemini CLI begins with a generous free tier, perfect for
|
Access to Gemini CLI begins with a generous free tier, perfect for
|
||||||
@@ -51,7 +33,8 @@ authorization type.
|
|||||||
For users who authenticate by using their Google account to access Gemini Code
|
For users who authenticate by using their Google account to access Gemini Code
|
||||||
Assist for individuals. This includes:
|
Assist for individuals. This includes:
|
||||||
|
|
||||||
- 1000 maximum model requests / user / day
|
- 1000 model requests / user / day
|
||||||
|
- 60 model requests / user / minute
|
||||||
- Model requests will be made across the Gemini model family as determined by
|
- Model requests will be made across the Gemini model family as determined by
|
||||||
Gemini CLI.
|
Gemini CLI.
|
||||||
|
|
||||||
@@ -63,7 +46,8 @@ Learn more at
|
|||||||
If you are using a Gemini API key, you can also benefit from a free tier. This
|
If you are using a Gemini API key, you can also benefit from a free tier. This
|
||||||
includes:
|
includes:
|
||||||
|
|
||||||
- 250 maximum model requests / user / day
|
- 250 model requests / user / day
|
||||||
|
- 10 model requests / user / minute
|
||||||
- Model requests to Flash model only.
|
- Model requests to Flash model only.
|
||||||
|
|
||||||
Learn more at
|
Learn more at
|
||||||
@@ -75,7 +59,7 @@ Vertex AI offers an Express Mode without the need to enable billing. This
|
|||||||
includes:
|
includes:
|
||||||
|
|
||||||
- 90 days before you need to enable billing.
|
- 90 days before you need to enable billing.
|
||||||
- Quotas and models are specific to your account and their limits vary.
|
- Quotas and models are variable and specific to your account.
|
||||||
|
|
||||||
Learn more at
|
Learn more at
|
||||||
[Vertex AI Express Mode Limits](https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview#quotas).
|
[Vertex AI Express Mode Limits](https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview#quotas).
|
||||||
@@ -128,9 +112,11 @@ Standard/Plus and AI Expanded, are not supported._
|
|||||||
|
|
||||||
This includes the following request limits:
|
This includes the following request limits:
|
||||||
- Gemini Code Assist Standard edition:
|
- Gemini Code Assist Standard edition:
|
||||||
- 1500 maximum model requests / user / day
|
- 1500 model requests / user / day
|
||||||
|
- 120 model requests / user / minute
|
||||||
- Gemini Code Assist Enterprise edition:
|
- Gemini Code Assist Enterprise edition:
|
||||||
- 2000 maximum model requests / user / day
|
- 2000 model requests / user / day
|
||||||
|
- 120 model requests / user / minute
|
||||||
- Model requests will be made across the Gemini model family as determined by
|
- Model requests will be made across the Gemini model family as determined by
|
||||||
Gemini CLI.
|
Gemini CLI.
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,8 @@ account.
|
|||||||
Your Gemini CLI Usage Statistics are handled in accordance with Google's Privacy
|
Your Gemini CLI Usage Statistics are handled in accordance with Google's Privacy
|
||||||
Policy.
|
Policy.
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
**Note:** See [quotas and pricing](quota-and-pricing.md) for the quota and
|
||||||
> [!NOTE]
|
pricing details that apply to your usage of the Gemini CLI.
|
||||||
> See [quotas and pricing](quota-and-pricing.md) for the quota and
|
|
||||||
> pricing details that apply to your usage of the Gemini CLI.
|
|
||||||
|
|
||||||
## Supported authentication methods
|
## Supported authentication methods
|
||||||
|
|
||||||
|
|||||||
@@ -187,7 +187,5 @@ guide_, consider searching the Gemini CLI
|
|||||||
If you can't find an issue similar to yours, consider creating a new GitHub
|
If you can't find an issue similar to yours, consider creating a new GitHub
|
||||||
Issue with a detailed description. Pull requests are also welcome!
|
Issue with a detailed description. Pull requests are also welcome!
|
||||||
|
|
||||||
<!-- prettier-ignore -->
|
> **Note:** Issues tagged as "🔒Maintainers only" are reserved for project
|
||||||
> [!NOTE]
|
|
||||||
> Issues tagged as "🔒Maintainers only" are reserved for project
|
|
||||||
> maintainers. We will not accept pull requests related to these issues.
|
> maintainers. We will not accept pull requests related to these issues.
|
||||||
|
|||||||
+4
-16
@@ -12,6 +12,7 @@
|
|||||||
"label": "Authentication",
|
"label": "Authentication",
|
||||||
"slug": "docs/get-started/authentication"
|
"slug": "docs/get-started/authentication"
|
||||||
},
|
},
|
||||||
|
{ "label": "Examples", "slug": "docs/get-started/examples" },
|
||||||
{ "label": "CLI cheatsheet", "slug": "docs/cli/cli-reference" },
|
{ "label": "CLI cheatsheet", "slug": "docs/cli/cli-reference" },
|
||||||
{
|
{
|
||||||
"label": "Gemini 3 on Gemini CLI",
|
"label": "Gemini 3 on Gemini CLI",
|
||||||
@@ -98,11 +99,6 @@
|
|||||||
{ "label": "Agent Skills", "slug": "docs/cli/skills" },
|
{ "label": "Agent Skills", "slug": "docs/cli/skills" },
|
||||||
{ "label": "Checkpointing", "slug": "docs/cli/checkpointing" },
|
{ "label": "Checkpointing", "slug": "docs/cli/checkpointing" },
|
||||||
{ "label": "Headless mode", "slug": "docs/cli/headless" },
|
{ "label": "Headless mode", "slug": "docs/cli/headless" },
|
||||||
{
|
|
||||||
"label": "Git worktrees",
|
|
||||||
"badge": "🔬",
|
|
||||||
"slug": "docs/cli/git-worktrees"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Hooks",
|
"label": "Hooks",
|
||||||
"collapsed": true,
|
"collapsed": true,
|
||||||
@@ -111,17 +107,7 @@
|
|||||||
{ "label": "Reference", "slug": "docs/hooks/reference" }
|
{ "label": "Reference", "slug": "docs/hooks/reference" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{ "label": "IDE integration", "slug": "docs/ide-integration" },
|
||||||
"label": "IDE integration",
|
|
||||||
"collapsed": true,
|
|
||||||
"items": [
|
|
||||||
{ "label": "Overview", "slug": "docs/ide-integration" },
|
|
||||||
{
|
|
||||||
"label": "Developer guide: ACP mode",
|
|
||||||
"slug": "docs/cli/acp-mode"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ "label": "MCP servers", "slug": "docs/tools/mcp-server" },
|
{ "label": "MCP servers", "slug": "docs/tools/mcp-server" },
|
||||||
{ "label": "Model routing", "slug": "docs/cli/model-routing" },
|
{ "label": "Model routing", "slug": "docs/cli/model-routing" },
|
||||||
{ "label": "Model selection", "slug": "docs/cli/model" },
|
{ "label": "Model selection", "slug": "docs/cli/model" },
|
||||||
@@ -138,10 +124,12 @@
|
|||||||
{ "label": "Plan mode", "slug": "docs/cli/plan-mode" },
|
{ "label": "Plan mode", "slug": "docs/cli/plan-mode" },
|
||||||
{
|
{
|
||||||
"label": "Subagents",
|
"label": "Subagents",
|
||||||
|
"badge": "🔬",
|
||||||
"slug": "docs/core/subagents"
|
"slug": "docs/core/subagents"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Remote subagents",
|
"label": "Remote subagents",
|
||||||
|
"badge": "🔬",
|
||||||
"slug": "docs/core/remote-agents"
|
"slug": "docs/core/remote-agents"
|
||||||
},
|
},
|
||||||
{ "label": "Rewind", "slug": "docs/cli/rewind" },
|
{ "label": "Rewind", "slug": "docs/cli/rewind" },
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user