[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7936":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":34,"discoverSource":35},7936,"pronto","prontolabs\u002Fpronto","prontolabs","Quick automated code review of your changes","",null,"Ruby",2669,249,36,10,0,2,29.19,"MIT License",false,"master",true,[24,25,26,27,28,29,30],"automated-analysis","automated-review","bitbucket","formatter","gitlab","linters","review","2026-06-12 02:01:46","# Pronto\n\n[![Gem Version](https:\u002F\u002Fbadge.fury.io\u002Frb\u002Fpronto.svg)](http:\u002F\u002Fbadge.fury.io\u002Frb\u002Fpronto)\n[![Build Status](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto\u002Factions\u002Fworkflows\u002Fspecs.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto\u002Factions\u002Fworkflows\u002Fspecs.yml)\n\n**Pronto** runs analysis quickly by checking only the relevant changes. Created to\nbe used on [GitHub pull requests](#github-integration), but also works [locally](#local-changes) and integrates with [GitLab](#gitlab-integration) and [Bitbucket](#bitbucket-integration).\nPerfect if you want to find out quickly if a branch introduces changes that conform\nto your [styleguide](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-rubocop), [are DRY](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-flay), [don't introduce security holes](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-brakeman) and [more](#runners).\n\n![Pronto demo](pronto.gif \"\")\n\n_This README might be ahead of the latest release. Find the README for v0.11.5 [here](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto\u002Fblob\u002Fv0.11.5\u002FREADME.md)._\n\n* [Installation](#installation)\n* [Usage](#usage)\n    * [Local Changes](#local-changes)\n    * [GitHub Integration](#github-integration)\n    * [GitLab Integration](#gitlab-integration)\n    * [Bitbucket Integration](#bitbucket-integration)\n* [Configuration](#configuration)\n* [Runners](#runners)\n* [Articles](#articles)\n* [Changelog](#changelog)\n* [Copyright](#copyright)\n\n## Installation\n\n**Pronto**'s installation is standard for a Ruby gem:\n\n```sh\n$ gem install pronto\n```\n\nYou'll also want to install some [runners](#runners) to go along with the main gem:\n\n```sh\n$ gem install pronto-rubocop\n$ gem install pronto-flay\n```\n\nIf you'd rather install Pronto using `bundler`, you don't need to require it,\nunless you're gonna run it from Ruby (via Rake task, for example):\n\n```ruby\ngem 'pronto'\ngem 'pronto-rubocop', require: false\ngem 'pronto-flay', require: false\n```\n\n## Usage\n\nPronto runs the checks on a diff between the current HEAD and the provided commit-ish (default is master).\n\n> [!NOTE]\n> If the default branch is NOT `master`, invoke `pronto run -c=\u003Cbranch>` OR set the `default_commit` config value.\n\n### Local Changes\n\nNavigate to the repository you want to run Pronto on, and:\n\n```sh\ngit checkout feature\u002Fbranch\n\n# Analyze diff of committed changes on current branch and master:\npronto run\n\n# Analyze changes in git staging area\npronto run --staged\n\n# Analyze diff of uncommitted changes and master:\npronto run --unstaged\n\n# Analyze *all* changes since the *initial* commit (may take some time):\npronto run --commit=$(git log --pretty=format:%H | tail -1)\n```\n\nJust run `pronto` without any arguments to see what Pronto is capable of.\n\nAvailable Options\n\n| Command flag      | Description                                                 |\n|:------------------|:------------------------------------------------------------|\n| `--exit-code`     | Exits with non-zero code if there were any warnings\u002Ferrors. |\n| `-c\u002F--commit`     | Commit for the diff.                                        |\n| `--staged`        | Analyze changes in git staging area                         |\n| `--unstaged`      | Analyze changes made, but not in git staging area           |\n| `-r\u002F--runner`     | Run only the passed runners.                                |\n| `-f\u002F--formatters` | Pick output formatters.                                     |\n\n### GitHub Integration\n\nYou can run Pronto as a step of your CI builds and get the results as comments\non GitHub commits using `GithubFormatter` or `GithubPullRequestFormatter`.\n\nAdd Pronto runners you want to use to your Gemfile:\n\nSet the PRONTO_GITHUB_ACCESS_TOKEN environment variable or value in `.pronto.yml` to\n[OAuth token](https:\u002F\u002Fhelp.github.com\u002Farticles\u002Fcreating-an-access-token-for-command-line-use) that has access to the repository.\n\nThen just run it:\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github -c origin\u002Fmaster\n```\n\nIf you want comments to appear on pull request diff, instead of commit:\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_pr -c origin\u002Fmaster\n```\n\nIf you want review to appear on pull request diff, instead of separate comments:\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_pr_review -c origin\u002Fmaster\n```\n\nAll the **N** pending comments will be now separated into **X** number of PR reviews.\nThe number of the PR reviews will be controlled by an additional environment variable or with the help of a config setting.\nThis way, by a single pronto run, all the comments will be published to the PR, but divided into small reviews\nin order to avoid the rate limit of the providers.\n\n```\nX = N \u002F {PRONTO_WARNINGS_PER_REVIEW || warnings_per_review || 30})\n```\n\nNote: In case no environment variable or config setting is specified in `.pronto.yml`,\n      a default value of `30` will be used.\n\n```sh\n$ PRONTO_WARNINGS_PER_REVIEW=30 PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_pr_review -c origin\u002Fmaster\n```\n\nUse `GithubStatusFormatter` to submit [commit status](https:\u002F\u002Fgithub.com\u002Fblog\u002F1227-commit-status-api):\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_status -c origin\u002Fmaster\n```\n\nIf you want to show a one single status for all runners, instead of status per runner:\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token pronto run -f github_combined_status -c origin\u002Fmaster\n```\n\nIt's possible to combine multiple formatters.\nTo get both pull request comments and commit status summary use:\n\n```sh\n$ PRONTO_GITHUB_ACCESS_TOKEN=token PRONTO_PULL_REQUEST_ID=id pronto run -f github_status github_pr -c origin\u002Fmaster\n```\n\nAs an alternative, you can also set up a rake task:\n\n```ruby\nPronto::GemNames.new.to_a.each { |gem_name| require \"pronto\u002F#{gem_name}\" }\n\nformatter = Pronto::Formatter::GithubFormatter.new # also possible: GithubPullRequestFormatter, GithubPullRequestReviewFormatter\nstatus_formatter = Pronto::Formatter::GithubStatusFormatter.new\nformatters = [formatter, status_formatter]\nPronto.run('origin\u002Fmaster', '.', formatters)\n```\n\n#### GitHub Actions Integration\n\nYou can also run Pronto as a GitHub action.\n\nHere's an example `.github\u002Fworkflows\u002Fpronto.yml` workflow file using the `github_status` and `github_pr` formatters and running on each GitHub PR, with `pronto-rubocop` as the runner:\n\n\n```yml\nname: Pronto\non: [pull_request]\n\njobs:\n  pronto:\n\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v2\n      - run: |\n          git fetch --no-tags --prune --depth=10 origin +refs\u002Fheads\u002F*:refs\u002Fremotes\u002Forigin\u002F*\n      - name: Setup Ruby\n        uses: ruby\u002Fsetup-ruby@v1\n      - name: Setup pronto\n        run: gem install pronto pronto-rubocop\n      - name: Run Pronto\n        run: pronto run -f github_status github_pr -c origin\u002F${{ github.base_ref }}\n        env:\n          PRONTO_PULL_REQUEST_ID: ${{ github.event.pull_request.number }}\n          PRONTO_GITHUB_ACCESS_TOKEN: \"${{ github.token }}\"\n```\ncheck Wiki on [GitHub Actions Integration](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto\u002Fwiki\u002FGitHub-Actions-Integration) for more info.\n\n### GitLab Integration\n\nYou can run Pronto as a step of your CI builds and get the results as comments\non GitLab commits using `GitlabFormatter`.\n\n**note: this requires at least GitLab v7.5.0**\n\nSet the `PRONTO_GITLAB_API_ENDPOINT` environment variable or value in `.pronto.yml` to\nyour API endpoint URL. If you are using Gitlab.com's hosted service your\nendpoint will be set by default.\nSet the `PRONTO_GITLAB_API_PRIVATE_TOKEN` environment variable or value in `.pronto.yml`\nto your Gitlab private token which you can find in your account settings.\n\nThen just run it:\n\n```sh\n$ PRONTO_GITLAB_API_PRIVATE_TOKEN=token pronto run -f gitlab -c origin\u002Fmaster\n```\n\n**note: this requires at least Gitlab 11.6+**\n\nMerge request integration:\n\n```sh\n$ PRONTO_GITLAB_API_PRIVATE_TOKEN=token PRONTO_PULL_REQUEST_ID=id pronto run -f gitlab_mr -c origin\u002Fmaster\n```\n\nOn GitLabCI, make sure to run Pronto in a [merge request pipeline](https:\u002F\u002Fdocs.gitlab.com\u002Fce\u002Fci\u002Fmerge_request_pipelines\u002F):\n\n```yml\nlint:\n  image: ruby:3.3.0 # change to your app's ruby version\n  variables:\n    PRONTO_GITLAB_API_ENDPOINT: \"$CI_API_V4_URL\" # this already contains the correct url for your GitLab instance\n    PRONTO_GITLAB_API_PRIVATE_TOKEN: $ACCESS_TOKEN # configure as a variable in Gitlab CI settings; you might use a \"Project Access Token\" with api scope instead of your private one\n\n    # Without this variable, GitLab only fetches with git depth set to a fixed amount (by default 20 on newer projects, 50 on older ones).\n    # This would make pronto fail with the errror \"revspec 'origin\u002F{target_branch}\", because it would not know of the target Branch.\n    # It would also make pronto unable to compare changes with more than that amount of commits. E.g. running on 25 new commits would just return all problems, instead of only the ones in your changes.\n    GIT_DEPTH: 0\n  only:\n    - merge_requests\n  script:\n    - apt-get update && apt-get install -y cmake # Install cmake required for rugged gem (Pronto depends on it)\n    - bundle install\n    # Run pronto on branch of current merge request, comparing to the merge requests target branch\n    - bundle exec pronto run -f gitlab_mr -c origin\u002F$CI_MERGE_REQUEST_TARGET_BRANCH_NAME\n```\n\n\n\n### Bitbucket Integration\n\nYou can run Pronto as a step of your CI builds and get the results as comments\non Bitbucket commits using `BitbucketFormatter` or `BitbucketPullRequestFormatter`.\n\nAdd Pronto runners you want to use to your Gemfile:\n\nSet the PRONTO_BITBUCKET_USERNAME and PRONTO_BITBUCKET_PASSWORD environment variables or values in `.pronto.yml`.\n\nThen just run it:\n\n```sh\n$ PRONTO_BITBUCKET_USERNAME=user PRONTO_BITBUCKET_PASSWORD=pass pronto run -f bitbucket -c origin\u002Fmaster\n```\n\nor, if you want comments to appear on pull request diff, instead of commit:\n\n```sh\n$ PRONTO_BITBUCKET_USERNAME=user PRONTO_BITBUCKET_PASSWORD=pass pronto run -f bitbucket_pr -c origin\u002Fmaster\n```\n\n## Configuration\n\nThe behavior of Pronto can be controlled via the `.pronto.yml` configuration\nfile. It can either be placed in the working directory (*) or specified using\nthe environment variable `PRONTO_CONFIG_FILE`.\n\n(*) The working directory is where you run the command from, which is typically\nyour project directory.\n\nIf this file cannot be found, then the default configuration in\n[Pronto::ConfigFile::EMPTY](lib\u002Fpronto\u002Fconfig_file.rb) applies.\n\nThe file has the following format:\n\n```yaml\nall:\n  exclude:\n    - 'spec\u002F**\u002F*'\n# exclude files for single runner\neslint:\n  exclude:\n    - 'app\u002Fassets\u002F**\u002F*'\ndefault_commit: 'main' # set this if your repo differs from master\ngithub:\n  slug: prontolabs\u002Fpronto\n  access_token: B26354\n  api_endpoint: https:\u002F\u002Fapi.github.com\u002F\n  web_endpoint: https:\u002F\u002Fgithub.com\u002F\ngitlab:\n  slug: 1234567 # gitlab's project ID\n  api_private_token: 46751\n  api_endpoint: https:\u002F\u002Fapi.vinted.com\u002Fgitlab\nbitbucket:\n  slug: prontolabs\u002Fpronto\n  username: user\n  password: pass\n  web_endpoint: https:\u002F\u002Fbitbucket.org\u002F\nmax_warnings: 150\nwarnings_per_review: 30\nverbose: false\nrunners: [rubocop, eslint] # only listed runners will be executed\nskip_runners: [reek] # all, except listed runners will be executed\n```\n\nAll properties that can be specified via `.pronto.yml`, can also be specified\nvia environment variables. Their names will be the upcased path to the property.\nFor example: `PRONTO_GITHUB_SLUG` or `PRONTO_GITLAB_API_PRIVATE_TOKEN`. Environment variables\nwill always take precedence over values in configuration file.\n\n| Property              | Description                                                                          |\n|-----------------------|--------------------------------------------------------------------------------------|\n| `max_warnings`        | Limits the amount of warnings. Returns all warnings if option is skipped.            |\n| `runners`             | Runs only listed runners. Runs everything if option is skipped.                      |\n| `skip_runners`        | All, except listed runners will be executed. Runs everything if option is skipped.   |\n| `verbose`             | Outputs more information when set to `true`.                                         |\n| `warnings_per_review` | Limits the amount of warnings per review. Returns all warnings if option is skipped. |\n| `default_commit`      | Commit-ish `pronto run` will execute runners against.                                |\n\n### Message format\n\nPronto allows you to configure the format of the messages that are produced. You\ncan set a default format that will be used by all formatters, or you can\nconfigure a separate format per formatter, if you are using several.\n\nTo change the default format:\n\n```yaml\nformat: \"%{runner} %{level} %{msg}\"\n```\n\nTo add the title of the Runner to the GitHub Pull Request formatter only:\n\n```yaml\ngithub_pr:\n  format: \"%{runner} - %{msg}\"\n```\n\nThe available values to be interpolated into the message are:\n\n| Key          | Description    |\n|--------------|----------------|\n| `path`       | File path.     |\n| `line`       | Line number.   |\n| `level`      | Message level. |\n| `msg`        | Message.       |\n| `commit_sha` | SHA.           |\n| `runner`     | Runner name.   |\n\nThe following values are available only to the text formatter:\n\n| Key              | Description              |\n|------------------|--------------------------|\n| `color_level`    | Colorized message level. |\n| `color_location` | Colorized location.      |\n\n## Runners\n\nPronto can run various tools and libraries, as long as there's a runner for it.\nCurrently available:\n\n* [pronto-bigfiles](https:\u002F\u002Fgithub.com\u002Fapiology\u002Fpronto-bigfiles)\n* [pronto-biome](https:\u002F\u002Fgithub.com\u002FSbastien\u002Fpronto-biome)\n* [pronto-blacklist](https:\u002F\u002Fgithub.com\u002Fpbstriker38\u002Fpronto-blacklist)\n* [pronto-brakeman](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-brakeman)\n* [pronto-checkstyle](https:\u002F\u002Fgithub.com\u002Fseikichi\u002Fpronto-checkstyle)\n* [pronto-coffeelint](https:\u002F\u002Fgithub.com\u002Fsiebertm\u002Fpronto-coffeelint)\n* [pronto-clang_format](https:\u002F\u002Fgithub.com\u002Fmicjabbour\u002Fpronto-clang_format)\n* [pronto-clang_tidy](https:\u002F\u002Fgithub.com\u002Fmicjabbour\u002Fpronto-clang_tidy)\n* [pronto-clippy](https:\u002F\u002Fgithub.com\u002Fhauleth\u002Fpronto-clippy)\n* [pronto-credo](https:\u002F\u002Fgithub.com\u002Fcarakan\u002Fpronto-credo)\n* [pronto-dialyxir](https:\u002F\u002Fgithub.com\u002FApelsinka223\u002Fpronto-dialyxir)\n* [pronto-dialyzer](https:\u002F\u002Fgithub.com\u002Fiurifq\u002Fpronto-dialyzer)\n* [pronto-dirty_words](https:\u002F\u002Fgithub.com\u002Fkevinjalbert\u002Fpronto-dirty_words)\n* [pronto-dogma](https:\u002F\u002Fgithub.com\u002Fiurifq\u002Fpronto-dogma)\n* [pronto-erb_lint](https:\u002F\u002Fgithub.com\u002Ftleish\u002Fpronto-erb_lint)\n* [pronto-eslint](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-eslint) (uses [eslintrb](https:\u002F\u002Fgithub.com\u002Fzendesk\u002Feslintrb))\n* [pronto-eslint_npm](https:\u002F\u002Fgithub.com\u002Fdoits\u002Fpronto-eslint_npm) (uses eslint installed from npm)\n* [pronto-fasterer](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-fasterer)\n* [pronto-findbugs](https:\u002F\u002Fgithub.com\u002Fseikichi\u002Fpronto-findbugs)\n* [pronto-flake8](https:\u002F\u002Fgithub.com\u002Fscoremedia\u002Fpronto-flake8)\n* [pronto-flay](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-flay)\n* [pronto-flow](https:\u002F\u002Fgithub.com\u002Fkevinjalbert\u002Fpronto-flow)\n* [pronto-foodcritic](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-foodcritic)\n* [pronto-goodcheck](https:\u002F\u002Fgithub.com\u002Faergonaut\u002Fpronto-goodcheck)\n* [pronto-haml](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-haml)\n* [pronto-hlint](https:\u002F\u002Fgithub.com\u002Ffretlink\u002Fpronto-hlint\u002F) (uses Haskell code suggestions [hlint](https:\u002F\u002Fgithub.com\u002Fndmitchell\u002Fhlint))\n* [pronto-infer](https:\u002F\u002Fgithub.com\u002Fseikichi\u002Fpronto-infer)\n* [pronto-inspec](https:\u002F\u002Fgithub.com\u002Fstiller-leser\u002Fpronto-inspec)\n* [pronto-jscs](https:\u002F\u002Fgithub.com\u002Fspajus\u002Fpronto-jscs)\n* [pronto-jshint](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-jshint)\n* [pronto-json](https:\u002F\u002Fgithub.com\u002Fdeees\u002Fpronto-json)\n* [pronto-luacheck](https:\u002F\u002Fgithub.com\u002Fseikichi\u002Fpronto-luacheck)\n* [pronto-perl_lint](https:\u002F\u002Fgithub.com\u002Fbells17\u002Fpronto-perl_lint)\n* [pronto-phpcs](https:\u002F\u002Fgithub.com\u002FEllisV\u002Fpronto-phpcs)\n* [pronto-phpmd](https:\u002F\u002Fgithub.com\u002FEllisV\u002Fpronto-phpmd)\n* [pronto-phpstan](https:\u002F\u002Fgithub.com\u002FPowerhamster\u002Fpronto-phpstan)\n* [pronto-poper](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-poper)\n* [pronto-punchlist](https:\u002F\u002Fgithub.com\u002Fapiology\u002Fpronto-punchlist)\n* [pronto-rails_best_practices](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-rails_best_practices)\n* [pronto-rails_data_schema](https:\u002F\u002Fgithub.com\u002Fmbajur\u002Fpronto-rails_data_schema)\n* [pronto-rails_schema](https:\u002F\u002Fgithub.com\u002Fraimondasv\u002Fpronto-rails_schema)\n* [pronto-reek](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-reek)\n* [pronto-rubocop](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-rubocop)\n* [pronto-scss](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-scss)\n* [pronto-shellcheck](https:\u002F\u002Fgithub.com\u002Fpclalv\u002Fpronto-shellcheck)\n* [pronto-slim](https:\u002F\u002Fgithub.com\u002Fnysthee\u002Fpronto-slim)\n* [pronto-slim_lint](https:\u002F\u002Fgithub.com\u002Fibrahima\u002Fpronto-slim_lint)\n* [pronto-sorbet](https:\u002F\u002Fgithub.com\u002Fteamsimplepay\u002Fpronto-sorbet)\n* [pronto-spell](https:\u002F\u002Fgithub.com\u002Fprontolabs\u002Fpronto-spell)\n* [pronto-standardrb](https:\u002F\u002Fgithub.com\u002Fjulianrubisch\u002Fpronto-standardrb)\n* [pronto-stylelint](https:\u002F\u002Fgithub.com\u002Fkevinjalbert\u002Fpronto-stylelint)\n* [pronto-swiftlint](https:\u002F\u002Fgithub.com\u002Fajanauskas\u002Fpronto-swiftlint)\n* [pronto-tailor](https:\u002F\u002Fgithub.com\u002Fajanauskas\u002Fpronto-tailor)\n* [pronto-textlint](https:\u002F\u002Fgithub.com\u002Fseikichi\u002Fpronto-textlint)\n* [pronto-tslint_npm](https:\u002F\u002Fgithub.com\u002Feprislac\u002Fpronto-tslint_npm)\n* [pronto-yamllint](https:\u002F\u002Fgithub.com\u002Fpauliusm\u002Fpronto-yamllint)\n* [pronto-undercover](https:\u002F\u002Fgithub.com\u002Fgrodowski\u002Fpronto-undercover)\n* [pronto-xmllint](https:\u002F\u002Fgithub.com\u002Fpauliusm\u002Fpronto-xmllint)\n\n## Articles\n\nArticles to help you to get started:\n\n* [Effortless Code Conventions Review for Pull Request Changes](https:\u002F\u002Fjtway.co\u002Feffortless-code-review-for-pull-request-changes-241206b1cb04)\n* [Automating code review with Pronto (and friends)](http:\u002F\u002Feverydayrails.com\u002F2015\u002F02\u002F17\u002Fpronto-ruby-code-review.html)\n* [Setup Pronto with CircleCI](https:\u002F\u002Fmedium.com\u002F@MaximAbramchuk\u002Fcircleci-github-pr-commenting-ruby-scss-coffeescript-javascript-git-and-etc-fbcbe2a378a5#.gk5f14p3j)\n* [Continuous Static Analysis using Pronto](http:\u002F\u002Fcodingfearlessly.com\u002F2014\u002F11\u002F06\u002Fcontinuous-static-analysis\u002F)\n* [Pronto and git hooks](http:\u002F\u002Felliotthilaire.net\u002Fgem-pronto-and-git-hooks\u002F)\n* [How to end fruitless dev discussions about your project’s code style?](https:\u002F\u002Fmedium.com\u002Fappaloosa-store-engineering\u002Fhow-to-end-fruitless-dev-discussions-about-your-project-s-code-style-245070bff6d4)\n* [Free automated code reviews using Pronto](https:\u002F\u002Fhovancik.net\u002Fblog\u002F2016\u002F04\u002F11\u002Ffree-automated-code-reviews-using-pronto\u002F)\n* [Automated Elixir code review with Github, Credo and Travis CI](https:\u002F\u002Fmedium.com\u002Ffazibear\u002Fautomated-elixir-code-review-with-github-credo-and-travis-ci-986cd56b8f02)\n* [Running Rubocop before git commit](https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20181225040512\u002Fhttps:\u002F\u002Fchristoph.luppri.ch\u002Farticles\u002Fcode-quality\u002Frunning-rubocop-before-git-commit\u002F)\n* [Pronto, Codeship and GitHub for automatic code review](http:\u002F\u002Fabinoam.tl1n.com\u002Fpronto-codeship-and-github-for-automatic-code-review\u002F)\n* [How to automatically review your PRs for style violations with Pronto and RuboCop](https:\u002F\u002Fchristoph.luppri.ch\u002Fhow-to-automatically-review-your-prs-for-style-violations-with-pronto-and-rubocop)\n* [Create your own Pronto Runner](https:\u002F\u002Fkevinjalbert.com\u002Fcreate-your-own-pronto-runner\u002F)\n* [Make Code Reviews A Little Bit Better With Automation](https:\u002F\u002Fmedium.com\u002Fjimmy-farrell\u002Fmake-codes-reviews-a-little-bit-better-with-automation-35640df08a62)\n* [Stop shipping untested Ruby code with undercover](https:\u002F\u002Fmedium.com\u002Ffuturedev\u002Fstop-shipping-untested-ruby-code-with-undercover-1edc963be4a6)\n* [Automatic code review with Pronto and GitHub Actions](https:\u002F\u002Feverydayrails.com\u002F2021\u002F05\u002F29\u002Fpronto-github-actions-code-quality.html)\n* [Integrate Pronto with Gitlab CI for Rails App](https:\u002F\u002Fprabinpoudel.com.np\u002Farticles\u002Fintegrate-pronto-with-gitlab-ci-for-rails-app\u002F)\n\nMake a Pull Request to add something you wrote or found useful.\n\n## Changelog\n\n**Pronto**'s changelog is available [here](CHANGELOG.md).\n\n## Copyright\n\nCopyright (c) 2013-2025 Mindaugas Mozūras. See [LICENSE](LICENSE) for further details.\n","Pronto 是一个用于快速自动化代码审查的工具，特别针对代码变更进行检查。它支持多种代码分析器（如风格指南、DRY原则检查、安全漏洞检测等），并能与GitHub、GitLab和Bitbucket集成，适用于持续集成\u002F持续部署环境中的代码质量保证。该工具基于Ruby开发，安装简单且配置灵活，用户可以根据需要选择不同的分析器来满足特定的代码规范要求。无论是本地开发还是云端代码仓库管理，Pronto都能有效帮助开发者在提交代码前发现潜在问题，提高团队协作效率。","2026-06-11 03:15:08","top_language"]