|
Download CONTRIBUTING.md from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 20.4 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/CONTRIBUTING.md
- Command line
-
hf download hf://SaylorTwift/gemini-cli/CONTRIBUTING.md
-
curl -L -o CONTRIBUTING.md https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/CONTRIBUTING.md
20.4 kB
| # How to contribute | |
| We would love to accept your patches and contributions to this project. This | |
| document includes: | |
| - **[Before you begin](#before-you-begin):** Essential steps to take before | |
| becoming a Gemini CLI contributor. | |
| - **[Code contribution process](#code-contribution-process):** How to contribute | |
| code to Gemini CLI. | |
| - **[Development setup and workflow](#development-setup-and-workflow):** How to | |
| set up your development environment and workflow. | |
| - **[Documentation contribution process](#documentation-contribution-process):** | |
| How to contribute documentation to Gemini CLI. | |
| We're looking forward to seeing your contributions! | |
| ## Before you begin | |
| ### Sign our Contributor License Agreement | |
| Contributions to this project must be accompanied by a | |
| [Contributor License Agreement](https://cla.developers.google.com/about) (CLA). | |
| You (or your employer) retain the copyright to your contribution; this simply | |
| gives us permission to use and redistribute your contributions as part of the | |
| project. | |
| If you or your current employer have already signed the Google CLA (even if it | |
| was for a different project), you probably don't need to do it again. | |
| Visit <https://cla.developers.google.com/> to see your current agreements or to | |
| sign a new one. | |
| ### Review our Community Guidelines | |
| This project follows | |
| [Google's Open Source Community Guidelines](https://opensource.google/conduct/). | |
| ## Code contribution process | |
| ### Get started | |
| The process for contributing code is as follows: | |
| 1. **Find an issue** that you want to work on. If an issue is tagged as | |
| `🔒Maintainers only`, this means it is reserved for project maintainers. We | |
| will not accept pull requests related to these issues. In the near future, | |
| we will explicitly mark issues looking for contributions using the | |
| `help-wanted` label. If you believe an issue is a good candidate for | |
| community contribution, please leave a comment on the issue. A maintainer | |
| will review it and apply the `help-wanted` label if appropriate. Only | |
| maintainers should attempt to add the `help-wanted` label to an issue. | |
| 2. **Fork the repository** and create a new branch. | |
| 3. **Make your changes** in the `packages/` directory. | |
| 4. **Ensure all checks pass** by running `npm run preflight`. | |
| 5. **Open a pull request** with your changes. | |
| ### Code reviews | |
| All submissions, including submissions by project members, require review. We | |
| use [GitHub pull requests](https://docs.github.com/articles/about-pull-requests) | |
| for this purpose. | |
| To assist with the review process, we provide an automated review tool that | |
| helps detect common anti-patterns, testing issues, and other best practices that | |
| are easy to miss. | |
| #### Using the automated review tool | |
| You can run the review tool in two ways: | |
| 1. **Using the helper script (Recommended):** We provide a script that | |
| automatically handles checking out the PR into a separate worktree, | |
| installing dependencies, building the project, and launching the review | |
| tool. | |
| ```bash | |
| ./scripts/review.sh <PR_NUMBER> [model] | |
| ``` | |
| **Warning:** If you run `scripts/review.sh`, you must have first verified | |
| that the code for the PR being reviewed is safe to run and does not contain | |
| data exfiltration attacks. | |
| **Authors are strongly encouraged to run this script on their own PRs** | |
| immediately after creation. This allows you to catch and fix simple issues | |
| locally before a maintainer performs a full review. | |
| **Note on Models:** By default, the script uses the latest Pro model | |
| (`gemini-3.1-pro-preview`). If you do not have enough Pro quota, you can run | |
| it with the latest Flash model instead: | |
| `./scripts/review.sh <PR_NUMBER> gemini-3-flash-preview`. | |
| 2. **Manually from within Gemini CLI:** If you already have the PR checked out | |
| and built, you can run the tool directly from the CLI prompt: | |
| ```text | |
| /review-frontend <PR_NUMBER> | |
| ``` | |
| Replace `<PR_NUMBER>` with your pull request number. Reviewers should use this | |
| tool to augment, not replace, their manual review process. | |
| ### Self-assigning and unassigning issues | |
| To assign an issue to yourself, simply add a comment with the text `/assign`. To | |
| unassign yourself from an issue, add a comment with the text `/unassign`. | |
| The comment must contain only that text and nothing else. These commands will | |
| assign or unassign the issue as requested, provided the conditions are met | |
| (e.g., an issue must be unassigned to be assigned). | |
| Please note that you can have a maximum of 3 issues assigned to you at any given | |
| time and that only | |
| [issues labeled "help wanted"](https://github.com/google-gemini/gemini-cli/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22help%20wanted%22) | |
| may be self-assigned. | |
| ### Pull request guidelines | |
| To help us review and merge your PRs quickly, please follow these guidelines. | |
| PRs that do not meet these standards may be closed. | |
| #### 1. Link to an existing issue | |
| All PRs should be linked to an existing issue in our tracker. This ensures that | |
| every change has been discussed and is aligned with the project's goals before | |
| any code is written. | |
| - **For bug fixes:** The PR should be linked to the bug report issue. | |
| - **For features:** The PR should be linked to the feature request or proposal | |
| issue that has been approved by a maintainer. | |
| If an issue for your change doesn't exist, we will automatically close your PR | |
| along with a comment reminding you to associate the PR with an issue. The ideal | |
| workflow starts with an issue that has been reviewed and approved by a | |
| maintainer. Please **open the issue first** and wait for feedback before you | |
| start coding. | |
| #### 2. Keep it small and focused | |
| We favor small, atomic PRs that address a single issue or add a single, | |
| self-contained feature. | |
| - **Do:** Create a PR that fixes one specific bug or adds one specific feature. | |
| - **Don't:** Bundle multiple unrelated changes (e.g., a bug fix, a new feature, | |
| and a refactor) into a single PR. | |
| Large changes should be broken down into a series of smaller, logical PRs that | |
| can be reviewed and merged independently. | |
| #### 3. Use draft PRs for work in progress | |
| If you'd like to get early feedback on your work, please use GitHub's **Draft | |
| Pull Request** feature. This signals to the maintainers that the PR is not yet | |
| ready for a formal review but is open for discussion and initial feedback. | |
| #### 4. Ensure all checks pass | |
| Before submitting your PR, ensure that all automated checks are passing by | |
| running `npm run preflight`. This command runs all tests, linting, and other | |
| style checks. | |
| #### 5. Update documentation | |
| If your PR introduces a user-facing change (e.g., a new command, a modified | |
| flag, or a change in behavior), you must also update the relevant documentation | |
| in the `/docs` directory. | |
| See more about writing documentation: | |
| [Documentation contribution process](#documentation-contribution-process). | |
| #### 6. Write clear commit messages and a good PR description | |
| Your PR should have a clear, descriptive title and a detailed description of the | |
| changes. Follow the [Conventional Commits](https://www.conventionalcommits.org/) | |
| standard for your commit messages. | |
| - **Good PR title:** `feat(cli): Add --json flag to 'config get' command` | |
| - **Bad PR title:** `Made some changes` | |
| In the PR description, explain the "why" behind your changes and link to the | |
| relevant issue (e.g., `Fixes #123`). | |
| ### Forking | |
| If you are forking the repository you will be able to run the Build, Test and | |
| Integration test workflows. However in order to make the integration tests run | |
| you'll need to add a | |
| [GitHub Repository Secret](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository) | |
| with a value of `GEMINI_API_KEY` and set that to a valid API key that you have | |
| available. Your key and secret are private to your repo; no one without access | |
| can see your key and you cannot see any secrets related to this repo. | |
| Additionally you will need to click on the `Actions` tab and enable workflows | |
| for your repository, you'll find it's the large blue button in the center of the | |
| screen. | |
| ### Development setup and workflow | |
| This section guides contributors on how to build, modify, and understand the | |
| development setup of this project. | |
| ### Setting up the development environment | |
| **Prerequisites:** | |
| 1. **Node.js**: | |
| - **Development:** Please use Node.js `~20.19.0`. This specific version is | |
| required due to an upstream development dependency issue. You can use a | |
| tool like [nvm](https://github.com/nvm-sh/nvm) to manage Node.js versions. | |
| - **Production:** For running the CLI in a production environment, any | |
| version of Node.js `>=20` is acceptable. | |
| 2. **Git** | |
| ### Build process | |
| To clone the repository: | |
| ```bash | |
| git clone https://github.com/google-gemini/gemini-cli.git # Or your fork's URL | |
| cd gemini-cli | |
| ``` | |
| To install dependencies defined in `package.json` as well as root dependencies: | |
| ```bash | |
| npm install | |
| ``` | |
| To build the entire project (all packages): | |
| ```bash | |
| npm run build | |
| ``` | |
| This command typically compiles TypeScript to JavaScript, bundles assets, and | |
| prepares the packages for execution. Refer to `scripts/build.js` and | |
| `package.json` scripts for more details on what happens during the build. | |
| ### Enabling sandboxing | |
| [Sandboxing](#sandboxing) is highly recommended and requires, at a minimum, | |
| setting `GEMINI_SANDBOX=true` in your `~/.env` and ensuring a sandboxing | |
| provider (e.g. `macOS Seatbelt`, `docker`, or `podman`) is available. See | |
| [Sandboxing](#sandboxing) for details. | |
| To build both the `gemini` CLI utility and the sandbox container, run | |
| `build:all` from the root directory: | |
| ```bash | |
| npm run build:all | |
| ``` | |
| To skip building the sandbox container, you can use `npm run build` instead. | |
| ### Running the CLI | |
| To start the Gemini CLI from the source code (after building), run the following | |
| command from the root directory: | |
| ```bash | |
| npm start | |
| ``` | |
| If you'd like to run the source build outside of the gemini-cli folder, you can | |
| utilize `npm link path/to/gemini-cli/packages/cli` (see: | |
| [docs](https://docs.npmjs.com/cli/v9/commands/npm-link)) or | |
| `alias gemini="node path/to/gemini-cli/packages/cli"` to run with `gemini` | |
| ### Running tests | |
| This project contains two types of tests: unit tests and integration tests. | |
| #### Unit tests | |
| To execute the unit test suite for the project: | |
| ```bash | |
| npm run test | |
| ``` | |
| This will run tests located in the `packages/core` and `packages/cli` | |
| directories. Ensure tests pass before submitting any changes. For a more | |
| comprehensive check, it is recommended to run `npm run preflight`. | |
| #### Integration tests | |
| The integration tests are designed to validate the end-to-end functionality of | |
| the Gemini CLI. They are not run as part of the default `npm run test` command. | |
| To run the integration tests, use the following command: | |
| ```bash | |
| npm run test:e2e | |
| ``` | |
| For more detailed information on the integration testing framework, please see | |
| the | |
| [Integration Tests documentation](https://geminicli.com/docs/integration-tests). | |
| ### Linting and preflight checks | |
| To ensure code quality and formatting consistency, run the preflight check: | |
| ```bash | |
| npm run preflight | |
| ``` | |
| This command will run ESLint, Prettier, all tests, and other checks as defined | |
| in the project's `package.json`. | |
| _ProTip_ | |
| after cloning create a git precommit hook file to ensure your commits are always | |
| clean. | |
| ```bash | |
| echo " | |
| # Run npm build and check for errors | |
| if ! npm run preflight; then | |
| echo "npm build failed. Commit aborted." | |
| exit 1 | |
| fi | |
| " > .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit | |
| ``` | |
| #### Formatting | |
| To separately format the code in this project, run the following command from | |
| the root directory: | |
| ```bash | |
| npm run format | |
| ``` | |
| This command uses Prettier to format the code according to the project's style | |
| guidelines. | |
| #### Linting | |
| To separately lint the code in this project, run the following command from the | |
| root directory: | |
| ```bash | |
| npm run lint | |
| ``` | |
| ### Coding conventions | |
| - Please adhere to the coding style, patterns, and conventions used throughout | |
| the existing codebase. | |
| - Consult | |
| [GEMINI.md](https://github.com/google-gemini/gemini-cli/blob/main/GEMINI.md) | |
| (typically found in the project root) for specific instructions related to | |
| AI-assisted development, including conventions for React, comments, and Git | |
| usage. | |
| - **Imports:** Pay special attention to import paths. The project uses ESLint to | |
| enforce restrictions on relative imports between packages. | |
| ### Debugging | |
| #### VS Code | |
| 0. Run the CLI to interactively debug in VS Code with `F5` | |
| 1. Start the CLI in debug mode from the root directory: | |
| ```bash | |
| npm run debug | |
| ``` | |
| This command runs `node --inspect-brk dist/gemini.js` within the | |
| `packages/cli` directory, pausing execution until a debugger attaches. You | |
| can then open `chrome://inspect` in your Chrome browser to connect to the | |
| debugger. | |
| 2. In VS Code, use the "Attach" launch configuration (found in | |
| `.vscode/launch.json`). | |
| Alternatively, you can use the "Launch Program" configuration in VS Code if you | |
| prefer to launch the currently open file directly, but 'F5' is generally | |
| recommended. | |
| To hit a breakpoint inside the sandbox container run: | |
| ```bash | |
| DEBUG=1 gemini | |
| ``` | |
| **Note:** If you have `DEBUG=true` in a project's `.env` file, it won't affect | |
| gemini-cli due to automatic exclusion. Use `.gemini/.env` files for gemini-cli | |
| specific debug settings. | |
| ### React DevTools | |
| To debug the CLI's React-based UI, you can use React DevTools. | |
| 1. **Start the Gemini CLI in development mode:** | |
| ```bash | |
| DEV=true npm start | |
| ``` | |
| 2. **Install and run React DevTools version 6 (which matches the CLI's | |
| `react-devtools-core`):** | |
| You can either install it globally: | |
| ```bash | |
| npm install -g react-devtools@6 | |
| react-devtools | |
| ``` | |
| Or run it directly using npx: | |
| ```bash | |
| npx react-devtools@6 | |
| ``` | |
| Your running CLI application should then connect to React DevTools. | |
|  | |
| ### Sandboxing | |
| #### macOS Seatbelt | |
| On macOS, `gemini` uses Seatbelt (`sandbox-exec`) under a `permissive-open` | |
| profile (see `packages/cli/src/utils/sandbox-macos-permissive-open.sb`) that | |
| denies operations by default, confining writes to the project folder while | |
| allowing broad file reads and outbound network traffic ("open") by default. You | |
| can switch to a `strict-open` profile (see | |
| `packages/cli/src/utils/sandbox-macos-strict-open.sb`) that restricts both reads | |
| and writes to the working directory while allowing outbound network traffic by | |
| setting `SEATBELT_PROFILE=strict-open` in your environment or `.env` file. | |
| Available built-in profiles are `permissive-{open,proxied}`, | |
| `restrictive-{open,proxied}`, and `strict-{open,proxied}` (see below for proxied | |
| networking). You can also switch to a custom profile | |
| `SEATBELT_PROFILE=<profile>` if you also create a file | |
| `.gemini/sandbox-macos-<profile>.sb` under your project settings directory | |
| `.gemini`. | |
| #### Container-based sandboxing (all platforms) | |
| For stronger container-based sandboxing on macOS or other platforms, you can set | |
| `GEMINI_SANDBOX=true|docker|podman|<command>` in your environment or `.env` | |
| file. The specified command (or if `true` then either `docker` or `podman`) must | |
| be installed on the host machine. Once enabled, `npm run build:all` will build a | |
| minimal container ("sandbox") image and `npm start` will launch inside a fresh | |
| instance of that container. The first build can take 20-30s (mostly due to | |
| downloading of the base image) but after that both build and start overhead | |
| should be minimal. Default builds (`npm run build`) will not rebuild the | |
| sandbox. | |
| Container-based sandboxing mounts the project directory (and system temp | |
| directory) with read-write access and is started/stopped/removed automatically | |
| as you start/stop Gemini CLI. Files created within the sandbox should be | |
| automatically mapped to your user/group on host machine. You can easily specify | |
| additional mounts, ports, or environment variables by setting | |
| `SANDBOX_{MOUNTS,PORTS,ENV}` as needed. You can also fully customize the sandbox | |
| for your projects by creating the files `.gemini/sandbox.Dockerfile` and/or | |
| `.gemini/sandbox.bashrc` under your project settings directory (`.gemini`) and | |
| running `gemini` with `BUILD_SANDBOX=1` to trigger building of your custom | |
| sandbox. | |
| #### Proxied networking | |
| All sandboxing methods, including macOS Seatbelt using `*-proxied` profiles, | |
| support restricting outbound network traffic through a custom proxy server that | |
| can be specified as `GEMINI_SANDBOX_PROXY_COMMAND=<command>`, where `<command>` | |
| must start a proxy server that listens on `:::8877` for relevant requests. See | |
| `docs/examples/proxy-script.md` for a minimal proxy that only allows `HTTPS` | |
| connections to `example.com:443` (e.g. `curl https://example.com`) and declines | |
| all other requests. The proxy is started and stopped automatically alongside the | |
| sandbox. | |
| ### Manual publish | |
| We publish an artifact for each commit to our internal registry. But if you need | |
| to manually cut a local build, then run the following commands: | |
| ``` | |
| npm run clean | |
| npm install | |
| npm run auth | |
| npm run prerelease:dev | |
| npm publish --workspaces | |
| ``` | |
| ## Documentation contribution process | |
| Our documentation must be kept up-to-date with our code contributions. We want | |
| our documentation to be clear, concise, and helpful to our users. We value: | |
| - **Clarity:** Use simple and direct language. Avoid jargon where possible. | |
| - **Accuracy:** Ensure all information is correct and up-to-date. | |
| - **Completeness:** Cover all aspects of a feature or topic. | |
| - **Examples:** Provide practical examples to help users understand how to use | |
| Gemini CLI. | |
| ### Getting started | |
| The process for contributing to the documentation is similar to contributing | |
| code. | |
| 1. **Fork the repository** and create a new branch. | |
| 2. **Make your changes** in the `/docs` directory. | |
| 3. **Preview your changes locally** in Markdown rendering. | |
| 4. **Lint and format your changes.** Our preflight check includes linting and | |
| formatting for documentation files. | |
| ```bash | |
| npm run preflight | |
| ``` | |
| 5. **Open a pull request** with your changes. | |
| ### Documentation structure | |
| Our documentation is organized using | |
| [sidebar.json](https://github.com/google-gemini/gemini-cli/blob/main/docs/sidebar.json) | |
| as the table of contents. When adding new documentation: | |
| 1. Create your markdown file **in the appropriate directory** under `/docs`. | |
| 2. Add an entry to `sidebar.json` in the relevant section. | |
| 3. Ensure all internal links use relative paths and point to existing files. | |
| ### Style guide | |
| We follow the | |
| [Google Developer Documentation Style Guide](https://developers.google.com/style). | |
| Please refer to it for guidance on writing style, tone, and formatting. | |
| #### Key style points | |
| - Use sentence case for headings. | |
| - Write in second person ("you") when addressing the reader. | |
| - Use present tense. | |
| - Keep paragraphs short and focused. | |
| - Use code blocks with appropriate language tags for syntax highlighting. | |
| - Include practical examples whenever possible. | |
| ### Linting and formatting | |
| We use `prettier` to enforce a consistent style across our documentation. The | |
| `npm run preflight` command will check for any linting issues. | |
| You can also run the linter and formatter separately: | |
| - `npm run lint` - Check for linting issues | |
| - `npm run format` - Auto-format markdown files | |
| - `npm run lint:fix` - Auto-fix linting issues where possible | |
| Please make sure your contributions are free of linting errors before submitting | |
| a pull request. | |
| ### Before you submit | |
| Before submitting your documentation pull request, please: | |
| 1. Run `npm run preflight` to ensure all checks pass. | |
| 2. Review your changes for clarity and accuracy. | |
| 3. Check that all links work correctly. | |
| 4. Ensure any code examples are tested and functional. | |
| 5. Sign the | |
| [Contributor License Agreement (CLA)](https://cla.developers.google.com/) if | |
| you haven't already. | |
| ### Need help? | |
| If you have questions about contributing documentation: | |
| - Check our [FAQ](https://geminicli.com/docs/resources/faq). | |
| - Review existing documentation for examples. | |
| - Open [an issue](https://github.com/google-gemini/gemini-cli/issues) to discuss | |
| your proposed changes. | |
| - Reach out to the maintainers. | |
| We appreciate your contributions to making Gemini CLI documentation better! | |