<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Artur DefToExplore</title>
    <description>The latest articles on DEV Community by Artur DefToExplore (@deftoexplore).</description>
    <link>https://dev.to/deftoexplore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3533484%2F61c3fc82-df98-4c44-a8f1-2d5436888360.jpg</url>
      <title>DEV Community: Artur DefToExplore</title>
      <link>https://dev.to/deftoexplore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deftoexplore"/>
    <language>en</language>
    <item>
      <title>pr-checkmate: Stop Debating Style and Start Coding</title>
      <dc:creator>Artur DefToExplore</dc:creator>
      <pubDate>Thu, 20 Nov 2025 14:46:54 +0000</pubDate>
      <link>https://dev.to/deftoexplore/pr-checkmate-stop-debating-style-and-start-coding-ij</link>
      <guid>https://dev.to/deftoexplore/pr-checkmate-stop-debating-style-and-start-coding-ij</guid>
      <description>&lt;p&gt;&lt;strong&gt;Stop wasting time on code reviews discussing semicolons and spacing. Automate everything with PR CheckMate.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem We All Face
&lt;/h2&gt;

&lt;p&gt;Picture this: It's Monday morning. Your team just opened a pull request. Within minutes, review comments start rolling in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please add a semicolon here"&lt;br&gt;
"Run Prettier on this file"&lt;br&gt;
"Did you check the spelling in the README?"&lt;br&gt;
"ESLint is complaining about unused variables"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sound familiar? 😅&lt;/p&gt;

&lt;p&gt;Developers end up spending time on &lt;strong&gt;mechanical tasks&lt;/strong&gt; instead of solving real problems. The review process slows down. People get frustrated. And the worst part? These issues are &lt;strong&gt;completely preventable&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of Manual Code Quality Checks
&lt;/h2&gt;

&lt;p&gt;Consider what happens in a typical day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; writes a feature → pushes code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; notices formatting issues → requests changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; runs Prettier manually → commits again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; finds a typo in documentation → another round&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; fixes it → push again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipeline&lt;/strong&gt; finally runs ESLint → more failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat 3-4 times&lt;/strong&gt; before merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not one PR anymore — that's chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing PR CheckMate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/pr-checkmate" rel="noopener noreferrer"&gt;www.npmjs.com/package/pr-checkmate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PR CheckMate is an npm package that &lt;strong&gt;bundles all your code quality tools&lt;/strong&gt; into one zero-config solution:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ESLint&lt;/strong&gt; — catches code issues and style violations&lt;br&gt;
✅ &lt;strong&gt;Prettier&lt;/strong&gt; — auto-formats your entire codebase&lt;br&gt;
✅ &lt;strong&gt;Dependency Checks&lt;/strong&gt; — alerts you to suspicious package.json changes&lt;br&gt;
✅ &lt;strong&gt;cspell&lt;/strong&gt; — catches spelling mistakes in code and docs&lt;br&gt;
✅ &lt;strong&gt;Scans for secrets using&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Package Vulnerabilities Check&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Auto-commit&lt;/strong&gt; — fixes issues and commits automatically&lt;/p&gt;

&lt;p&gt;No more manual setup. No more forgetting to run formatters. Just install once and let it work.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation &amp;amp; Setup (2 minutes)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Install PR CheckMate
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; pr-checkmate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. You don't need to install ESLint, Prettier, or cspell separately. PR CheckMate includes them all.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Initialize Configuration
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pr-checkmate init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You'll be prompted to specify your source path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Where is your project source code? (Use arrow keys)
❯ src 
  app 
  Enter manually
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a &lt;code&gt;pr-checkmate.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourcePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: (Optional) Customize Configuration
&lt;/h3&gt;

&lt;p&gt;PR CheckMate ships with sensible defaults, but you can customize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESLint rules&lt;/strong&gt; — add your &lt;code&gt;.eslintrc.js&lt;/code&gt; or &lt;code&gt;eslint.config.mjs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier config&lt;/strong&gt; — add your &lt;code&gt;.prettierrc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spellcheck dictionary&lt;/strong&gt; — add your &lt;code&gt;cspell.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have local configs, PR CheckMate automatically detects and uses them. Otherwise, it uses bundled defaults.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Checks Locally
&lt;/h2&gt;

&lt;p&gt;Before pushing, run checks locally to catch issues early:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run all checks&lt;/span&gt;
npx pr-checkmate all

&lt;span class="c"&gt;# Run specific checks&lt;/span&gt;
npx pr-checkmate lint         &lt;span class="c"&gt;# ESLint only&lt;/span&gt;
npx pr-checkmate prettier     &lt;span class="c"&gt;# Format code&lt;/span&gt;
npx pr-checkmate deps         &lt;span class="c"&gt;# Check dependencies&lt;/span&gt;
npx pr-checkmate spellcheck   &lt;span class="c"&gt;# Spell check&lt;/span&gt;
npx pr-checkmate security.    &lt;span class="c"&gt;# Security scan&lt;/span&gt;
npx pr-checkmate npm-audit.   &lt;span class="c"&gt;# Package vulnerabilities check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real Example Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 Running job: all
🔍 Running ESLint...
📋 Using local ESLint config
✅ ESLint passed

📦 Checking dependencies...
✅ Dependencies OK

🎨 Running Prettier...
📋 Using local Prettier config
✅ Prettier completed

🔤 Running spellcheck...
📦 Using pr-checkmate cspell config
✅ Spellcheck passed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrating with GitHub Actions
&lt;/h2&gt;

&lt;p&gt;This is where the magic happens. Set up automated checks on every pull request:&lt;/p&gt;

&lt;h3&gt;
  
  
  Create &lt;code&gt;.github/workflows/pr-quality.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 PR Quality Checks&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;quality-checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📥 Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📦 Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 Run PR CheckMate&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Triggers on every pull request to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;develop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Checks out your code&lt;/li&gt;
&lt;li&gt;Sets up Node.js with caching (faster builds!)&lt;/li&gt;
&lt;li&gt;Installs dependencies&lt;/li&gt;
&lt;li&gt;Runs &lt;strong&gt;all&lt;/strong&gt; PR CheckMate checks&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;Now every PR is automatically validated. No manual intervention needed:&lt;/p&gt;

&lt;p&gt;✅ Lint check passed&lt;br&gt;
✅ Dependency check passed&lt;br&gt;
✅ Prettier formatting verified&lt;br&gt;
✅ Spellcheck passed&lt;br&gt;
✅ Scans for secrets using&lt;br&gt;
✅ Package Vulnerabilities Check&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If any check fails&lt;/strong&gt;, the PR is blocked until issues are fixed. This happens before code review even begins.&lt;/p&gt;
&lt;h2&gt;
  
  
  Advanced: Auto-fix and Auto-commit
&lt;/h2&gt;

&lt;p&gt;Want PR CheckMate to fix issues automatically? Create a more advanced workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Auto-fix Code Issues&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;auto-fix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📥 Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.head_ref }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📦 Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 Run PR CheckMate&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate prettier&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;💾 Commit changes&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "PR CheckMate Bot"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "bot@checkmate.dev"&lt;/span&gt;
          &lt;span class="s"&gt;git add -A&lt;/span&gt;
          &lt;span class="s"&gt;if ! git diff --cached --quiet; then&lt;/span&gt;
            &lt;span class="s"&gt;git commit -m "style: auto-format code with Prettier"&lt;/span&gt;
            &lt;span class="s"&gt;git push&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs Prettier on every PR&lt;/li&gt;
&lt;li&gt;Auto-commits formatting fixes&lt;/li&gt;
&lt;li&gt;Pushes changes back to the PR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more back-and-forth on formatting! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before PR CheckMate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PR opened → 1st review → "add semicolons" → developer fixes → 2nd review 
→ "run prettier" → developer fixes → 3rd review → "spellcheck readme" 
→ developer fixes → 4th review → finally approved ❌ Takes 2-3 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After PR CheckMate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PR opened → Automated checks run → All issues fixed → ✅ Ready to review
→ Code review in 15 minutes → Merged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Each Tool Does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 ESLint (Linting)
&lt;/h3&gt;

&lt;p&gt;Catches code issues before they cause bugs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ ESLint catches these:&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Should use const/let&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;    &lt;span class="c1"&gt;// Should use ===&lt;/span&gt;
&lt;span class="nx"&gt;unused_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Unused variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎨 Prettier (Formatting)
&lt;/h3&gt;

&lt;p&gt;Enforces consistent style automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before Prettier&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;// After Prettier&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📦 Dependency Check
&lt;/h3&gt;

&lt;p&gt;Alerts to suspicious &lt;code&gt;package.json&lt;/code&gt; changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Added&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;packages?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;⚠️&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Flag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;review&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"random-package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔤 cspell (Spellcheck)
&lt;/h3&gt;

&lt;p&gt;Catches typos in code, docs, and JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ "Dependancies" → ✅ "Dependencies"
❌ "occured" → ✅ "Occurred"
❌ "seperate" → ✅ "Separate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration: Customizing Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Your Own ESLint Config
&lt;/h3&gt;

&lt;p&gt;Just create an &lt;code&gt;eslint.config.mjs&lt;/code&gt; in your project root. PR CheckMate will use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// eslint.config.mjs&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/eslint-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/no-explicit-any&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Prettier Config
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.prettierrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"semi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"singleQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trailingComma"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"printWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Spellcheck Dictionary
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;cspell.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"words"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mycompany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"TypeScript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ESLint"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignorePaths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/dist/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Do I need to install ESLint, Prettier, and cspell separately?&lt;/strong&gt;&lt;br&gt;
A: No! PR CheckMate bundles them all. Just install pr-checkmate and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What if I already have ESLint configured?&lt;/strong&gt;&lt;br&gt;
A: PR CheckMate detects your local config and uses it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use this in monorepos?&lt;/strong&gt;&lt;br&gt;
A: Yes! Specify different source paths using &lt;code&gt;pr-checkmate.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does it slow down my CI/CD pipeline?&lt;/strong&gt;&lt;br&gt;
A: No. Most checks complete in seconds. It's faster than manual reviews!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I skip certain checks?&lt;/strong&gt;&lt;br&gt;
A: Yes, disable them in your workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run only linting&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate lint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Q: What Node versions are supported?&lt;/strong&gt;&lt;br&gt;
A: Node 18.0.0 and above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm install --save-dev pr-checkmate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initialize:&lt;/strong&gt; &lt;code&gt;npx pr-checkmate init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test locally:&lt;/strong&gt; &lt;code&gt;npx pr-checkmate all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add to CI:&lt;/strong&gt; Copy the GitHub Actions workflow above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Enjoy automatic code quality checks! 🎉&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Code quality shouldn't require manual effort. ESLint, Prettier, and spellchecks should just work automatically, before code review even begins.&lt;/p&gt;

&lt;p&gt;PR CheckMate eliminates the friction. Your team can focus on what matters: &lt;strong&gt;solving problems&lt;/strong&gt;, not debating semicolons.&lt;/p&gt;

&lt;p&gt;Try it today. Your pull request reviews will never be the same.&lt;/p&gt;




</description>
      <category>cicd</category>
      <category>devtols</category>
      <category>automation</category>
      <category>eslint</category>
    </item>
    <item>
      <title>Automating Code Quality: Stop Debating Style and Start Coding</title>
      <dc:creator>Artur DefToExplore</dc:creator>
      <pubDate>Thu, 20 Nov 2025 11:02:16 +0000</pubDate>
      <link>https://dev.to/deftoexplore/automating-code-quality-stop-automating-code-quality-stop-debating-style-and-start-coding-1mo1</link>
      <guid>https://dev.to/deftoexplore/automating-code-quality-stop-automating-code-quality-stop-debating-style-and-start-coding-1mo1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Stop wasting time on code reviews discussing semicolons and spacing. Automate everything with PR CheckMate.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem We All Face
&lt;/h2&gt;

&lt;p&gt;Picture this: It's Monday morning. Your team just opened a pull request. Within minutes, review comments start rolling in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please add a semicolon here"&lt;br&gt;
"Run Prettier on this file"&lt;br&gt;
"Did you check the spelling in the README?"&lt;br&gt;
"ESLint is complaining about unused variables"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sound familiar? 😅&lt;/p&gt;

&lt;p&gt;Developers end up spending time on &lt;strong&gt;mechanical tasks&lt;/strong&gt; instead of solving real problems. The review process slows down. People get frustrated. And the worst part? These issues are &lt;strong&gt;completely preventable&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of Manual Code Quality Checks
&lt;/h2&gt;

&lt;p&gt;Consider what happens in a typical day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; writes a feature → pushes code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; notices formatting issues → requests changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; runs Prettier manually → commits again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; finds a typo in documentation → another round&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer&lt;/strong&gt; fixes it → push again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipeline&lt;/strong&gt; finally runs ESLint → more failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat 3-4 times&lt;/strong&gt; before merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not one PR anymore — that's chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing PR CheckMate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/pr-checkmate" rel="noopener noreferrer"&gt;www.npmjs.com/package/pr-checkmate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PR CheckMate is an npm package that &lt;strong&gt;bundles all your code quality tools&lt;/strong&gt; into one zero-config solution:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;ESLint&lt;/strong&gt; — catches code issues and style violations&lt;br&gt;
✅ &lt;strong&gt;Prettier&lt;/strong&gt; — auto-formats your entire codebase&lt;br&gt;
✅ &lt;strong&gt;Dependency Checks&lt;/strong&gt; — alerts you to suspicious package.json changes&lt;br&gt;
✅ &lt;strong&gt;cspell&lt;/strong&gt; — catches spelling mistakes in code and docs&lt;br&gt;
✅ &lt;strong&gt;Auto-commit&lt;/strong&gt; — fixes issues and commits automatically&lt;/p&gt;

&lt;p&gt;No more manual setup. No more forgetting to run formatters. Just install once and let it work.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation &amp;amp; Setup (2 minutes)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Install PR CheckMate
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; pr-checkmate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. You don't need to install ESLint, Prettier, or cspell separately. PR CheckMate includes them all.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Initialize Configuration
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pr-checkmate init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You'll be prompted to specify your source path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Where is your project source code? (Use arrow keys)
❯ src 
  app 
  Enter manually
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a &lt;code&gt;pr-checkmate.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourcePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: (Optional) Customize Configuration
&lt;/h3&gt;

&lt;p&gt;PR CheckMate ships with sensible defaults, but you can customize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESLint rules&lt;/strong&gt; — add your &lt;code&gt;.eslintrc.js&lt;/code&gt; or &lt;code&gt;eslint.config.mjs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier config&lt;/strong&gt; — add your &lt;code&gt;.prettierrc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spellcheck dictionary&lt;/strong&gt; — add your &lt;code&gt;cspell.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have local configs, PR CheckMate automatically detects and uses them. Otherwise, it uses bundled defaults.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Checks Locally
&lt;/h2&gt;

&lt;p&gt;Before pushing, run checks locally to catch issues early:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run all checks&lt;/span&gt;
npx pr-checkmate all

&lt;span class="c"&gt;# Run specific checks&lt;/span&gt;
npx pr-checkmate lint         &lt;span class="c"&gt;# ESLint only&lt;/span&gt;
npx pr-checkmate prettier     &lt;span class="c"&gt;# Format code&lt;/span&gt;
npx pr-checkmate deps         &lt;span class="c"&gt;# Check dependencies&lt;/span&gt;
npx pr-checkmate spellcheck   &lt;span class="c"&gt;# Spell check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real Example Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 Running job: all
🔍 Running ESLint...
📋 Using local ESLint config
✅ ESLint passed

📦 Checking dependencies...
✅ Dependencies OK

🎨 Running Prettier...
📋 Using local Prettier config
✅ Prettier completed

🔤 Running spellcheck...
📦 Using pr-checkmate cspell config
✅ Spellcheck passed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrating with GitHub Actions
&lt;/h2&gt;

&lt;p&gt;This is where the magic happens. Set up automated checks on every pull request:&lt;/p&gt;

&lt;h3&gt;
  
  
  Create &lt;code&gt;.github/workflows/pr-quality.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 PR Quality Checks&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;quality-checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📥 Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📦 Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 Run PR CheckMate&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Triggers on every pull request to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;develop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Checks out your code&lt;/li&gt;
&lt;li&gt;Sets up Node.js with caching (faster builds!)&lt;/li&gt;
&lt;li&gt;Installs dependencies&lt;/li&gt;
&lt;li&gt;Runs &lt;strong&gt;all&lt;/strong&gt; PR CheckMate checks&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;Now every PR is automatically validated. No manual intervention needed:&lt;/p&gt;

&lt;p&gt;✅ Lint check passed&lt;br&gt;
✅ Dependency check passed&lt;br&gt;
✅ Prettier formatting verified&lt;br&gt;
✅ Spellcheck passed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If any check fails&lt;/strong&gt;, the PR is blocked until issues are fixed. This happens before code review even begins.&lt;/p&gt;
&lt;h2&gt;
  
  
  Advanced: Auto-fix and Auto-commit
&lt;/h2&gt;

&lt;p&gt;Want PR CheckMate to fix issues automatically? Create a more advanced workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Auto-fix Code Issues&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;auto-fix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📥 Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.head_ref }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔧 Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;📦 Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🔍 Run PR CheckMate&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate prettier&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;💾 Commit changes&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "PR CheckMate Bot"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "bot@checkmate.dev"&lt;/span&gt;
          &lt;span class="s"&gt;git add -A&lt;/span&gt;
          &lt;span class="s"&gt;if ! git diff --cached --quiet; then&lt;/span&gt;
            &lt;span class="s"&gt;git commit -m "style: auto-format code with Prettier"&lt;/span&gt;
            &lt;span class="s"&gt;git push&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs Prettier on every PR&lt;/li&gt;
&lt;li&gt;Auto-commits formatting fixes&lt;/li&gt;
&lt;li&gt;Pushes changes back to the PR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more back-and-forth on formatting! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before PR CheckMate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PR opened → 1st review → "add semicolons" → developer fixes → 2nd review 
→ "run prettier" → developer fixes → 3rd review → "spellcheck readme" 
→ developer fixes → 4th review → finally approved ❌ Takes 2-3 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After PR CheckMate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PR opened → Automated checks run → All issues fixed → ✅ Ready to review
→ Code review in 15 minutes → Merged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Each Tool Does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 ESLint (Linting)
&lt;/h3&gt;

&lt;p&gt;Catches code issues before they cause bugs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ ESLint catches these:&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Should use const/let&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;    &lt;span class="c1"&gt;// Should use ===&lt;/span&gt;
&lt;span class="nx"&gt;unused_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Unused variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎨 Prettier (Formatting)
&lt;/h3&gt;

&lt;p&gt;Enforces consistent style automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before Prettier&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;// After Prettier&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📦 Dependency Check
&lt;/h3&gt;

&lt;p&gt;Alerts to suspicious &lt;code&gt;package.json&lt;/code&gt; changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Added&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;packages?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;⚠️&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Flag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;review&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"random-package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔤 cspell (Spellcheck)
&lt;/h3&gt;

&lt;p&gt;Catches typos in code, docs, and JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;❌ "Dependancies" → ✅ "Dependencies"
❌ "occured" → ✅ "Occurred"
❌ "seperate" → ✅ "Separate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration: Customizing Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Your Own ESLint Config
&lt;/h3&gt;

&lt;p&gt;Just create an &lt;code&gt;eslint.config.mjs&lt;/code&gt; in your project root. PR CheckMate will use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// eslint.config.mjs&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/eslint-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tsPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/no-explicit-any&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Prettier Config
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.prettierrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"semi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"singleQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trailingComma"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"printWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Spellcheck Dictionary
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;cspell.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"words"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"mycompany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"TypeScript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ESLint"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignorePaths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"**/dist/**"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Do I need to install ESLint, Prettier, and cspell separately?&lt;/strong&gt;&lt;br&gt;
A: No! PR CheckMate bundles them all. Just install pr-checkmate and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What if I already have ESLint configured?&lt;/strong&gt;&lt;br&gt;
A: PR CheckMate detects your local config and uses it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use this in monorepos?&lt;/strong&gt;&lt;br&gt;
A: Yes! Specify different source paths using &lt;code&gt;pr-checkmate.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does it slow down my CI/CD pipeline?&lt;/strong&gt;&lt;br&gt;
A: No. Most checks complete in seconds. It's faster than manual reviews!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I skip certain checks?&lt;/strong&gt;&lt;br&gt;
A: Yes, disable them in your workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run only linting&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx pr-checkmate lint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Q: What Node versions are supported?&lt;/strong&gt;&lt;br&gt;
A: Node 18.0.0 and above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm install --save-dev pr-checkmate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initialize:&lt;/strong&gt; &lt;code&gt;npx pr-checkmate init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test locally:&lt;/strong&gt; &lt;code&gt;npx pr-checkmate all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add to CI:&lt;/strong&gt; Copy the GitHub Actions workflow above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Enjoy automatic code quality checks! 🎉&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Code quality shouldn't require manual effort. ESLint, Prettier, and spellchecks should just work automatically, before code review even begins.&lt;/p&gt;

&lt;p&gt;PR CheckMate eliminates the friction. Your team can focus on what matters: &lt;strong&gt;solving problems&lt;/strong&gt;, not debating semicolons.&lt;/p&gt;

&lt;p&gt;Try it today. Your pull request reviews will never be the same.&lt;/p&gt;




</description>
      <category>cicd</category>
      <category>devtools</category>
      <category>automation</category>
      <category>eslint</category>
    </item>
    <item>
      <title>🚀 Built a Full CI/CD Pipeline with Playwright + Docker + Allure in Just 2 Days</title>
      <dc:creator>Artur DefToExplore</dc:creator>
      <pubDate>Thu, 13 Nov 2025 06:31:44 +0000</pubDate>
      <link>https://dev.to/deftoexplore/built-a-full-cicd-pipeline-with-playwright-docker-allure-in-just-2-days-155m</link>
      <guid>https://dev.to/deftoexplore/built-a-full-cicd-pipeline-with-playwright-docker-allure-in-just-2-days-155m</guid>
      <description>&lt;p&gt;When I started this project, my goal was simple:&lt;br&gt;
👉 to build a universal, self-contained CI/CD test pipeline that could run anywhere — locally or in the cloud — with just one command.&lt;/p&gt;

&lt;p&gt;💡 The Idea&lt;br&gt;
I wanted to connect everything a modern QA engineer needs into one reproducible environment:&lt;/p&gt;

&lt;p&gt;Playwright (TypeScript) → for end-to-end UI tests&lt;br&gt;
Docker → for clean, isolated execution&lt;br&gt;
Allure &amp;amp; Playwright HTML reports → for beautiful test results&lt;br&gt;
A shared NPM SDK library → for reusable logic and faster scaling&lt;/p&gt;

&lt;p&gt;💬 In short — a full test platform that’s portable, modular, and ready to grow.&lt;br&gt;
``&lt;br&gt;
🧩 The Architecture&lt;br&gt;
This setup consists of two repositories that work together:&lt;/p&gt;

&lt;p&gt;🧠 1. &lt;a href="https://www.npmjs.com/package/sdk_automation" rel="noopener noreferrer"&gt;sdk_automation&lt;/a&gt;&lt;br&gt;
Published as an NPM package → sdk_automation on npm&lt;br&gt;
This SDK contains all shared test logic — API helpers, MongoDB connectors, data generators, and utilities — covered by Jest unit tests for reliability.&lt;br&gt;
Think of it as the “brains” of your automation.&lt;/p&gt;

&lt;p&gt;🧪 2. &lt;a href="https://github.com/Mybono/qa-portfolio" rel="noopener noreferrer"&gt;qa-portfolio&lt;/a&gt;&lt;br&gt;
This repository is the Playwright E2E test environment.&lt;/p&gt;

&lt;p&gt;It uses:&lt;br&gt;
Dockerfile + docker-compose.yml → for reproducible builds&lt;br&gt;
Playwright test runner → for UI automation&lt;br&gt;
Allure &amp;amp; HTML reports → for rich visual reporting&lt;br&gt;
A single entry point command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose up --build -d; docker compose exec -w /work/playwright_ts playwright_ts sh -c "npm install &amp;amp;&amp;amp; npx playwright test --reporter=html"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This builds, runs, and serves the full test report — no manual setup, no global dependencies.&lt;/p&gt;

&lt;p&gt;⚙️ What Happens Under the Hood&lt;br&gt;
When you run:&lt;br&gt;
docker compose up --build&lt;br&gt;
Here’s what happens step-by-step:&lt;br&gt;
Docker builds the Playwright image&lt;br&gt;
The SDK (npm package) installs automatically&lt;br&gt;
Tests run inside the container using Playwright&lt;br&gt;
HTML report is generated after completion&lt;br&gt;
The report is auto-served via serve on port 8080&lt;br&gt;
You can open it locally with:&lt;br&gt;
&lt;code&gt;start ./playwright_ts/playwright-report/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpr573bd61w8wgqfzi9w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpr573bd61w8wgqfzi9w.jpg" alt="Playwright HTML Test Report showing executed tests, passed and failed cases, and detailed results" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🐳 Run from Docker Hub You can run the full Playwright + Docker + Allure CI/CD pipeline directly from Docker Hub — no cloning, no setup, just one command&lt;br&gt;
&lt;code&gt;docker run --rm -it mybono/qa-portfolio:latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ One command → full CI/CD simulation.&lt;br&gt;
Works on Windows, macOS, and Linux.&lt;br&gt;
📊 The Result&lt;br&gt;
Reusable SDK with strongly-typed logic&lt;br&gt;
Automated E2E tests running in isolation&lt;br&gt;
Beautiful Allure &amp;amp; Playwright reports&lt;br&gt;
Fully reproducible Dockerized pipeline&lt;br&gt;
Here’s a quick look at the Playwright HTML report output:&lt;/p&gt;

&lt;p&gt;🧱 Tech Stack Overview&lt;br&gt;
Layer   Technology  Purpose&lt;br&gt;
Core    Playwright + TypeScript UI testing framework&lt;br&gt;
SDK Node.js NPM Package Shared logic and helpers&lt;br&gt;
Reports Allure / Playwright HTML    Test reporting&lt;br&gt;
Environment Docker + docker-compose CI/CD containerization&lt;br&gt;
DB  MongoDB (via Docker)    Test data layer&lt;/p&gt;

&lt;p&gt;🧠 Lessons Learned&lt;br&gt;
💡 1. Decouple test logic from frameworks — SDKs make scaling painless.&lt;br&gt;
⚙️ 2. Docker ensures parity between local, CI, and cloud environments.&lt;br&gt;
📊 3. Reports are key to visibility, not just decoration.&lt;br&gt;
🚀 4. CI/CD begins with architecture — not Jenkins.&lt;/p&gt;

&lt;p&gt;🔮 Next Steps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Playwright on Python for multi-language support&lt;/li&gt;
&lt;li&gt;ADD Slack notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⭐ Star It, Fork It, Break It (Then Fix It)&lt;br&gt;
If you like the idea — star the repos and join the journey!&lt;br&gt;
🧩 &lt;a href="https://github.com/Mybono/qa-portfolio" rel="noopener noreferrer"&gt;qa-portfolio &lt;/a&gt;&lt;br&gt;
📦 &lt;a href="https://www.npmjs.com/package/sdk_automation" rel="noopener noreferrer"&gt;sdk_automation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qa</category>
      <category>cicd</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Artur DefToExplore</dc:creator>
      <pubDate>Tue, 28 Oct 2025 16:48:40 +0000</pubDate>
      <link>https://dev.to/deftoexplore/-3gb</link>
      <guid>https://dev.to/deftoexplore/-3gb</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/deftoexplore/why-stable-e2e-and-integration-tests-matter-and-how-to-achieve-it-with-docker-and-a-slim-database-88h" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3c7zteq4hh2pbeky6nd.png" height="800" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/deftoexplore/why-stable-e2e-and-integration-tests-matter-and-how-to-achieve-it-with-docker-and-a-slim-database-88h" rel="noopener noreferrer" class="c-link"&gt;
            Why Stable E2E and Integration Tests Matter — and How to Achieve It with Docker and a Slim Database Copy - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Run tests in isolated Docker Compose stacks using a preview image of your app and a slim database...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devops</category>
      <category>testing</category>
      <category>docker</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Why Stable E2E and Integration Tests Matter — and How to Achieve It with Docker and a Slim Database Copy</title>
      <dc:creator>Artur DefToExplore</dc:creator>
      <pubDate>Sat, 27 Sep 2025 10:53:24 +0000</pubDate>
      <link>https://dev.to/deftoexplore/why-stable-e2e-and-integration-tests-matter-and-how-to-achieve-it-with-docker-and-a-slim-database-88h</link>
      <guid>https://dev.to/deftoexplore/why-stable-e2e-and-integration-tests-matter-and-how-to-achieve-it-with-docker-and-a-slim-database-88h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Run tests in isolated Docker Compose stacks using a preview image of your app and a &lt;em&gt;slim&lt;/em&gt; database copy seeded with only the entities you actually need. This drastically reduces flakiness, shortens run times, and restores trust in your test suite.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;End-to-end (E2E) and integration tests are essential for maintaining confidence in your product. They validate critical user flows and system interactions. But when tests are flaky—intermittently failing for non-code reasons—they block releases, waste debugging hours, and erode trust.&lt;/p&gt;

&lt;p&gt;This article shows a practical approach to stabilizing tests by running them inside Docker against a dedicated preview image of your application, connected to a &lt;strong&gt;slimmed-down copy&lt;/strong&gt; of your database. The result is deterministic, fast, and repeatable test runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Unstable Tests
&lt;/h2&gt;

&lt;p&gt;Common sources of flakiness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared environments&lt;/strong&gt;: Tests hit a master/shared database that is large and constantly changing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncontrolled data dependencies&lt;/strong&gt;: Required entities go missing or drift over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavy databases&lt;/strong&gt;: Full clones are slow to snapshot, restore, and migrate, especially in CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment drift&lt;/strong&gt;: Library versions, services, or feature flags differ between dev/CI/prod.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Solution: Isolated Docker Environment + Slim Database Copy
&lt;/h2&gt;

&lt;p&gt;We improve stability by isolating everything per test run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preview Docker image&lt;/strong&gt; of the app (built from the current branch/PR).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated database container&lt;/strong&gt; (fresh per run) with a small, &lt;em&gt;known-good&lt;/em&gt; dataset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic seeding&lt;/strong&gt;: A repeatable seed that contains only the minimum required entities and relationships.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Benefits: stable data, predictable behavior, faster setup, and fewer false negatives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference Setup (Docker Compose)
&lt;/h2&gt;

&lt;p&gt;Below is a minimal Compose file for a web app and a Postgres database. Adapt the service names, ports, and env variables to your stack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3.9"
services:
  app:
    image: ghcr.io/your-org/your-app:${GIT_SHA:-preview}
    depends_on:
      - db
    environment:
      NODE_ENV: test
      DATABASE_URL: postgres://testuser:testpass@db:5432/testdb
    ports:
      - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 5s
      timeout: 2s
      retries: 20

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
      POSTGRES_DB: testdb
    ports:
      - "5433:5432"
    volumes:
      - db_data_test:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"]
      interval: 5s
      timeout: 2s
      retries: 20

volumes:
  db_data_test:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building a Preview Image
&lt;/h3&gt;

&lt;p&gt;Build the preview image in CI from the current branch and tag it with the commit SHA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Example Node app
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci

FROM node:20-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app .
EXPOSE 8080
CMD ["node", "dist/server.js"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Deterministic Seeding: a Slim DB Copy
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;slim&lt;/em&gt; copy is &lt;strong&gt;not&lt;/strong&gt; a full clone of master/prod. It is a curated dataset containing only the tables/rows needed for your test scenarios—users, roles, feature flags, minimal catalog data, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example (Postgres) seed
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Minimal roles
INSERT INTO roles (id, name) VALUES 
  ('00000000-0000-0000-0000-000000000001', 'admin'),
  ('00000000-0000-0000-0000-000000000002', 'user')
ON CONFLICT (id) DO NOTHING;

-- Test user
INSERT INTO users (id, email, role_id, created_at)
VALUES ('10000000-0000-0000-0000-000000000001', 'testuser@example.com',
        '00000000-0000-0000-0000-000000000002', NOW())
ON CONFLICT (id) DO NOTHING;

-- Feature flags (only those required by flows under test)
INSERT INTO feature_flags (key, enabled)
VALUES ('checkout_v2', true)
ON CONFLICT (key) DO UPDATE SET enabled = EXCLUDED.enabled;

-- Domain entities essential for E2E flows
INSERT INTO products (id, name, price_cents)
VALUES (1, 'Sample Product', 1999)
ON CONFLICT (id) DO NOTHING;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Applying migrations and seeding in CI
&lt;/h3&gt;

&lt;p&gt;Use a simple Makefile to orchestrate lifecycle steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.PHONY: up migrate seed test down

up:
    docker compose -f docker-compose.test.yml up -d --wait

migrate:
    # Replace with your migration tool, e.g., Prisma, Knex, Flyway, Liquibase
    docker compose -f docker-compose.test.yml exec -T app npm run migrate:up

seed:
    docker compose -f docker-compose.test.yml exec -T db \
      psql -U testuser -d testdb &amp;lt; seed/slim-seed.sql

# Example: Playwright/Cypress/WDIO/etc.
test:
    docker compose -f docker-compose.test.yml exec -T app npm run test:e2e

down:
    docker compose -f docker-compose.test.yml down -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in CI (GitHub Actions example):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: e2e
on: [pull_request]

jobs:
  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build preview image
        run: |
          docker build -t ghcr.io/your-org/your-app:${{ github.sha }} .
      - name: Start stack
        run: |
          GIT_SHA=${{ github.sha }} make up
      - name: Migrate &amp;amp; seed
        run: |
          make migrate
          make seed
      - name: Run tests
        run: |
          make test
      - name: Teardown
        if: always()
        run: |
          make down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Generating a Slim Copy from a Large DB (Optional)
&lt;/h2&gt;

&lt;p&gt;If you must derive your slim dataset from a large source, don’t clone everything. Extract only the minimal rows and maintain referential integrity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy A: Hand-crafted seed (recommended)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write idempotent &lt;code&gt;INSERT&lt;/code&gt; statements for the handful of entities you need.&lt;/li&gt;
&lt;li&gt;Keep it in version control and review changes with tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategy B: Selective dump (Postgres example)
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;pg_dump&lt;/code&gt; with include lists and filters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dump schema only (fast migrations)&lt;/span&gt;
pg_dump &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--schema-only&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-owner&lt;/span&gt; &lt;span class="nt"&gt;--no-privileges&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; schema.sql

&lt;span class="c"&gt;# Dump minimal data for specific tables&lt;/span&gt;
pg_dump &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-only&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;roles &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;feature_flags &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;products &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--column-inserts&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; minimal-data.sql

&lt;span class="nb"&gt;cat &lt;/span&gt;schema.sql minimal-data.sql &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; seed/slim-seed.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strategy C: Programmatic export
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write a small script (Node/TS) that queries only the rows/columns needed and emits SQL/JSON fixtures.&lt;/li&gt;
&lt;li&gt;Enforce &lt;strong&gt;stable IDs&lt;/strong&gt; (UUIDs) for deterministic references across runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Keep seeds small (&amp;lt; a few hundred rows). If a test needs new data, expand the seed incrementally and add an assertion to prove it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Running Tests Inside the Stack
&lt;/h2&gt;

&lt;p&gt;Your test runner (e.g., Playwright, Cypress, WebdriverIO, Jest-integration) should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wait for app and DB health checks.&lt;/li&gt;
&lt;li&gt;Use a single, known &lt;code&gt;BASE_URL&lt;/code&gt; (e.g., &lt;code&gt;http://app:8080&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create transient test data per spec when necessary, or reuse the seeded fixtures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example Playwright config snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: {
    baseURL: process.env.BASE_URL || 'http://localhost:8080',
    trace: 'retain-on-failure',
    video: 'retain-on-failure',
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:8080 npx playwright &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting Flakiness: A Short Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt;: Replace arbitrary &lt;code&gt;wait&lt;/code&gt;s with explicit waits for network/DOM state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt;: Ensure seeds are applied and idempotent; reset DB between specs if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolation&lt;/strong&gt;: No tests should depend on state from previous tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clocks&lt;/strong&gt;: Mock time if flows are time-dependent (tokens, expirations, cron).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External APIs&lt;/strong&gt;: Stub/mirror third-party calls; don’t let them fail your CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries&lt;/strong&gt;: Use &lt;strong&gt;test-level&lt;/strong&gt; retries sparingly and only for known flaky endpoints.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Stable tests are the foundation of reliable delivery. By running E2E/integration tests in Docker against a &lt;em&gt;preview&lt;/em&gt; app image and a &lt;em&gt;slim&lt;/em&gt; database copy, you eliminate data drift and environment coupling. Your suites become faster, more deterministic, and far easier to trust.&lt;/p&gt;

&lt;p&gt;In real-world practice, teams that adopted this approach saw a &lt;strong&gt;sharp drop in test failures&lt;/strong&gt; caused by data or environment issues, and at the same time achieved a &lt;strong&gt;significant boost in test execution speed&lt;/strong&gt;. Faster feedback cycles and fewer false alarms translate directly into developer productivity and higher confidence in releases.&lt;/p&gt;

&lt;p&gt;If your team is battling flaky tests, try this approach. Start with a tiny, hand-crafted seed; automate migrations; and keep everything in Compose. The upfront effort pays back quickly in saved engineering time and safer releases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Impact (Metrics Example)
&lt;/h2&gt;

&lt;p&gt;Here’s a simplified before/after snapshot many teams observe when switching to Docker + slim DB copies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before (shared DB)&lt;/th&gt;
&lt;th&gt;After (slim DB in Docker)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average E2E run time&lt;/td&gt;
&lt;td&gt;~45 min&lt;/td&gt;
&lt;td&gt;~18 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flaky test failures&lt;/td&gt;
&lt;td&gt;20–30% of runs&lt;/td&gt;
&lt;td&gt;&amp;lt;5% of runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer confidence&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even approximate metrics like these make a strong case in articles and internal presentations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix: MongoDB Variant (Bonus)
&lt;/h2&gt;

&lt;p&gt;For MongoDB, swap Postgres services/commands with Mongo images and &lt;code&gt;mongorestore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3.9"
services:
  app:
    image: ghcr.io/your-org/your-app:${GIT_SHA:-preview}
    environment:
      MONGODB_URI: mongodb://testuser:testpass@mongo:27017/testdb?authSource=admin
    depends_on:
      - mongo

  mongo:
    image: mongo:7
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: testuser
      MONGO_INITDB_ROOT_PASSWORD: testpass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seed example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# JSON or bsondump fixtures kept small and versioned&lt;/span&gt;
mongorestore &lt;span class="nt"&gt;--uri&lt;/span&gt; &lt;span class="s2"&gt;"mongodb://testuser:testpass@localhost:27018/testdb?authSource=admin"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--drop&lt;/span&gt; ./seed/mongo/slim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devops</category>
      <category>testing</category>
      <category>docker</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
