{"id":982,"date":"2026-08-23T23:42:09","date_gmt":"2026-08-23T23:42:09","guid":{"rendered":"https:\/\/alexanderramsey.com\/blog\/?p=982"},"modified":"2026-08-23T23:43:24","modified_gmt":"2026-08-23T23:43:24","slug":"laravel-herd-windows-development-stack-setup-tips-and-tricks","status":"publish","type":"post","link":"http:\/\/alexanderramsey.com\/blog\/?p=982","title":{"rendered":"Laravel Herd Windows Development Stack Setup, Tips, and Tricks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">THIS POST WAS GENERATED BY AI<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong># Windows Environment Setup &amp; Troubleshooting<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This document covers Windows-specific configuration and common issues when developing ClientBridge Laravel on Windows with Laravel Herd and Git Bash.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Table of Contents<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [Laravel Herd Configuration](#laravel-herd-configuration)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [Git Bash Compatibility](#git-bash-compatibility)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [Common Issues](#common-issues)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [Environment Setup](#environment-setup)<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Laravel Herd Configuration<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Overview<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Herd is a native Windows application that provides PHP, Composer, and related tools. It installs in the user&#8217;s home directory under `.config\/herd\/`.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Installation Location:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C:\\Users\\&lt;username&gt;\\.config\\herd\\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Key Directories:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**PHP Binaries:**<\/strong> `~\/.config\/herd\/bin\/php84\/` (version number may vary)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Herd Executables:**<\/strong> `~\/.config\/herd\/bin\/`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Composer:**<\/strong> `~\/.config\/herd\/bin\/composer.bat`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Included Tools<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Herd provides the following tools as Windows batch files (`.bat`):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; `php.bat` &#8211; PHP CLI<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; `composer.bat` &#8211; Composer dependency manager<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; `laravel.bat` &#8211; Laravel installer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; `herd.bat` &#8211; Herd management CLI<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Git Bash Compatibility<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### The Problem<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Git Bash on Windows cannot execute `.bat` (batch) files directly through standard shell aliases. This causes issues when trying to use Herd-provided tools like Composer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$ composer &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash: composer: command not found<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### The Solution<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a `~\/.bashrc` file with bash functions that wrap the batch files using `cmd \/\/c`:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**File Location:**<\/strong> `C:\\Users\\&lt;username&gt;\\.bashrc`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Contents:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Laravel Herd Aliases &#8211; please do not remove these lines<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias php=&#8221;php.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias herd=&#8221;herd.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias laravel=&#8221;laravel.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Composer function for Git Bash compatibility<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer() {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; cmd \/\/c &#8220;C:\\Users\\alexr\\.config\\herd\\bin\\composer.bat $*&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">export -f composer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Why This Works:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Simple aliases work for PHP, Herd, and Laravel because they&#8217;re in the system PATH<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Composer requires a function because we need to pass arguments (`$*`) to the batch file<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. `cmd \/\/c` executes a Windows command and returns to bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. The double slash `\/\/` prevents Git Bash from converting to a Unix path<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5. `export -f composer` makes the function available to subshells<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Making It Permanent<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To load `.bashrc` automatically on every Git Bash session, create a `~\/.bash_profile`:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**File Location:**<\/strong> `C:\\Users\\&lt;username&gt;\\.bash_profile`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Contents:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Load .bashrc if it exists<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if [ -f ~\/.bashrc ]; then<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; source ~\/.bashrc<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Manual Loading<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you don&#8217;t want to create `.bash_profile`, you can manually load the configuration in each session:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">source ~\/.bashrc<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Common Issues<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: &#8220;Target class [<\/strong>auth<strong>] does not exist&#8221; After Git Pull<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> Running `php artisan` commands fails with &#8220;Target class [auth] does not exist&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> The `bootstrap\/app.php` file contains an unguarded call to `auth()` in the exceptions context that executes before Laravel&#8217;s authentication system is fully bootstrapped during CLI commands. This often occurs after git pulls when changes revert previous fixes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong> Guard the `auth()` call in `bootstrap\/app.php`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ \u274c PROBLEMATIC CODE (causes CLI failures)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$exceptions-&gt;context(fn () =&gt; [<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;user_id&#8217; =&gt; auth()-&gt;id() ?? null,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;env&#8217; =&gt; app()-&gt;environment(),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">]);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ \u2705 FIXED CODE (safe for CLI)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$exceptions-&gt;context(fn () =&gt; [<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;user_id&#8217; =&gt; (function () {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; try {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return function_exists(&#8216;auth&#8217;) &amp;&amp; app()-&gt;bound(&#8216;auth&#8217;) ? auth()-&gt;id() : null;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; } catch (\\Throwable $e) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; })(),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;env&#8217; =&gt; app()-&gt;environment(),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">]);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Prevention:**<\/strong> Always guard early auth calls in bootstrap files with existence checks and try\/catch blocks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: &#8220;Class &#8216;Laravel\\Boost\\BoostServiceProvider&#8217; not found&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> Artisan commands fail with provider class not found errors after git pull or dependency changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> Composer autoload mappings are stale, or Laravel&#8217;s package discovery cache is outdated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution Steps:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. <strong>**Create Required Directories**<\/strong> (if missing):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir -p storage\/framework\/views storage\/logs bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. <strong>**Regenerate Autoload Files**<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload &#8211;optimize &#8211;no-scripts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. <strong>**Clear Laravel Caches**<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. <strong>**Regenerate Package Discovery**<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan package:discover &#8211;ansi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5. <strong>**Verify Provider Discovery**<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;var_export(class_exists(&#8216;Laravel\\\\Boost\\\\BoostServiceProvider&#8217;));&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: Composer Script Failures During Install<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> `composer install` or `composer dump-autoload` fails with &#8220;pre-autoload-dump event returned with error code 1&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> Composer scripts try to create directories that don&#8217;t exist or have permission issues during the pre-autoload-dump phase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Create directories manually first (prevents script failure)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir -p storage\/framework\/views storage\/framework\/cache storage\/framework\/sessions storage\/logs bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Then run composer install normally (script will now succeed)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer.bat install &#8211;optimize-autoloader<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Alternative if still failing &#8211; bypass scripts entirely:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload &#8211;optimize &#8211;no-scripts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear &amp;&amp; php artisan package:discover<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: MissingAppKeyException After Environment Changes<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> `MissingAppKeyException` errors in tests or application<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> The `APP_KEY` in `.env` is missing or invalid after environment changes or fresh pulls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan key:generate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Verification:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan config:show app.key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Should show: app.key &#8230;. base64:FBmJhkH6BD0AZ2UWtRosyN4Eaa372d2yuBUP79At1VU=<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: Login Redirects to Wrong URLs (e.g., \/admin\/leads\/partial)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> After login, users are redirected to AJAX endpoints or partial views instead of proper dashboards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> Laravel&#8217;s `redirect()-&gt;intended()` method stores the last attempted URL in the session. If users previously accessed partial views or AJAX endpoints, the login redirect uses those URLs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong> Clear intended URLs in the AuthenticatedSessionController:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">public function store(LoginRequest $request): RedirectResponse<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; $request-&gt;authenticate();<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; $request-&gt;session()-&gt;regenerate();<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; \/\/ Clear any intended URL to prevent unwanted redirects<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; $request-&gt;session()-&gt;forget(&#8216;url.intended&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; \/\/ Force direct redirect based on user role<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; $user = auth()-&gt;user();<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; if ($user-&gt;role === &#8216;company_administrator&#8217;) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; return redirect()-&gt;route(&#8216;admin.dashboard&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; } else {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; return redirect()-&gt;route(&#8216;dashboard&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Session Debugging:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Clear all sessions to eliminate stored URLs<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;DB::table(&#8216;sessions&#8217;)-&gt;truncate();&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check session count<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;echo &#8216;Session count: &#8216; . DB::table(&#8216;sessions&#8217;)-&gt;count();&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: PSR-4 Autoloading Standard Violations<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> &#8220;Class [Name] does not comply with psr-4 autoloading standard&#8221; during composer operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Example Fix:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ \u274c Missing namespace declaration<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&lt;?php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">use Tests\\TestCase;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">class EmailDeliverabilityTest extends TestCase<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/\/ \u2705 Proper namespace declaration<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&lt;?php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">namespace Tests\\Feature;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">use Tests\\TestCase;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">class EmailDeliverabilityTest extends TestCase<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: &#8220;composer: command not found&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Cause:**<\/strong> Git Bash cannot execute `.bat` files directly through aliases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong> Use the bash function approach documented above.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Verification:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$ composer &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Composer version 2.8.8 2025-04-04 16:56:46<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PHP version 8.4.7 (C:\\Users\\alexr\\.config\\herd\\bin\\php84\\php.exe)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: &#8220;php: command not found&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Cause:**<\/strong> Herd&#8217;s PHP bin directory is not in your PATH.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Check if Herd is running (system tray icon)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Restart Herd application<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Close and reopen Git Bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. Verify PATH includes: `~\/.config\/herd\/bin\/php84\/`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Check PATH:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo $PATH | grep -o &#8220;.config\/herd\/bin\/php84&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: Laravel commands fail with &#8220;Class not found&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Cause:**<\/strong> Autoloader is out of sync or dependencies are missing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer install<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan config:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan cache:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: CRLF vs LF line endings<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> Git warnings about CRLF\/LF conversions, scripts fail to execute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong> Configure Git to handle line endings properly:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># For this repository only<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git config core.autocrlf true<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Globally for all repositories<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git config &#8211;global core.autocrlf true<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Alternative:**<\/strong> Use `.gitattributes` file (already in project):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">* text=auto eol=lf<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">*.bat text eol=crlf<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: Permissions errors on storage\/logs<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Cause:**<\/strong> Windows file permissions differ from Unix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># These commands work in Git Bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">chmod -R 775 storage<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">chmod -R 775 bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Or use PHP to set permissions<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan storage:link<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: Symlinks not working<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Cause:**<\/strong> Windows requires administrator privileges to create symlinks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Run Git Bash as Administrator<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Or enable Developer Mode in Windows Settings<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Then run: `php artisan storage:link`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Environment Setup<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Required Environment Variables<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The following are set automatically by Herd but can be verified:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check PHP version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check Composer version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check Laravel installer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">laravel &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Verify PATH includes Herd<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo $PATH | grep herd<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Recommended Git Bash Configuration<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**<\/strong>`~\/.bashrc`<strong>:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Laravel Herd Aliases<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias php=&#8221;php.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias herd=&#8221;herd.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias laravel=&#8221;laravel.bat&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Composer function for Git Bash compatibility<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer() {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; cmd \/\/c &#8220;C:\\Users\\alexr\\.config\\herd\\bin\\composer.bat $*&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">export -f composer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Laravel Artisan alias<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias artisan=&#8221;php artisan&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Common shortcuts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias tinker=&#8221;php artisan tinker&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias migrate=&#8221;php artisan migrate&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias fresh=&#8221;php artisan migrate:fresh &#8211;seed&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Git shortcuts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias gs=&#8221;git status&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias gp=&#8221;git push&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">alias gl=&#8221;git log &#8211;oneline -10&#8243;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### VSCode Integration<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If using VSCode with Git Bash as the integrated terminal:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**settings.json:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;terminal.integrated.defaultProfile.windows&#8221;: &#8220;Git Bash&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;terminal.integrated.profiles.windows&#8221;: {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &#8220;Git Bash&#8221;: {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;path&#8221;: &#8220;C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;args&#8221;: [&#8220;-l&#8221;]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The `-l` flag ensures it loads as a login shell, which sources `~\/.bash_profile` and `~\/.bashrc`.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Development Workflow<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Starting Development<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. <strong>**Ensure Herd is running**<\/strong> (check system tray)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. <strong>**Open Git Bash**<\/strong> in project directory<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. <strong>**Load environment**<\/strong> (if not auto-loaded):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;source ~\/.bashrc<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. <strong>**Verify tools are available:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;php &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;composer &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5. <strong>**Start development:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;php artisan serve<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;# Or use Herd&#8217;s built-in server (automatic)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Deployment to VPS (Ubuntu\/Linux)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When deploying from Windows to Linux VPS, be aware of:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. <strong>**Line endings:**<\/strong> Ensure `.gitattributes` is properly configured<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. <strong>**Path differences:**<\/strong> Windows uses backslashes, Linux uses forward slashes<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. <strong>**Case sensitivity:**<\/strong> Linux filesystems are case-sensitive<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. <strong>**Permissions:**<\/strong> Linux requires specific file permissions (775 for storage, 644 for files)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5. <strong>**Batch files:**<\/strong> `.bat` files won&#8217;t work on Linux (use bash scripts instead)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Testing<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Run tests<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan test<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Or with Pest<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">.\/vendor\/bin\/pest<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Run specific test<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan test &#8211;filter=BookingTest<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Quick Recovery Checklist After Git Pull<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When encountering issues after `git pull` or major environment changes, follow this systematic approach:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 1. Verify Environment Basics<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check PHP availability<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php -v<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check Composer availability &nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer -V<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Verify you&#8217;re in the project root<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pwd<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Should show: \/c\/Users\/[username]\/Documents\/GitHub\/clientbridge-laravel<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 2. Fix Bootstrap Authentication Issues<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test basic artisan functionality<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan &#8211;version<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># If you get &#8220;Target class [auth] does not exist&#8221;:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check bootstrap\/app.php for unguarded auth() calls in exceptions context<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Apply the guarded auth solution documented above<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 3. Regenerate Dependencies &amp; Caches<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Create required directories (if missing)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir -p storage\/framework\/views storage\/logs bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Regenerate autoload (bypass scripts if they fail)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload &#8211;optimize &#8211;no-scripts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Clear and regenerate ALL Laravel caches<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Regenerate package discovery cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan package:discover &#8211;ansi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 4. Handle Database &amp; Application Keys<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Generate app key if missing (prevents MissingAppKeyException)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan key:generate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Run any pending migrations<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan migrate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Clear sessions if experiencing login redirect issues<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;DB::table(&#8216;sessions&#8217;)-&gt;truncate();&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 5. Build Frontend Assets<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Install\/update NPM dependencies<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm install<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Build production assets<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm run build<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 6. Reinstall Development Tools<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Reinstall Laravel Boost MCP server for VS Code integration<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan boost:install<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### 7. Final Verification Tests<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test artisan commands work<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan route:list | head -5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test class autoloading<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;var_export(class_exists(&#8216;Laravel\\\\Boost\\\\BoostServiceProvider&#8217;));&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test application key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan config:show app.key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test basic authentication (if logged in)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;echo auth()-&gt;check() ? &#8216;Auth working&#8217; : &#8216;Auth ready&#8217;;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Standard Troubleshooting Checklist<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For general development issues:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Is Herd running? (Check system tray)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Did you source `~\/.bashrc`? Run: `source ~\/.bashrc`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Is PHP in PATH? Run: `which php.bat`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Is Composer working? Run: `composer &#8211;version`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Are dependencies installed? Run: `composer install`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Is `.env` file present? Run: `ls -la .env`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Are permissions correct? Run: `ls -la storage\/`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Bootstrap issues? Check: `bootstrap\/app.php` for unguarded auth calls<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Clear caches: `php artisan optimize:clear`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Regenerate discovery: `php artisan package:discover`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Restart Herd application<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Close and reopen Git Bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Emergency Recovery Commands<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Full environment reset after major issues:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Complete recovery sequence (run in project root)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir -p storage\/framework\/views storage\/logs bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload &#8211;optimize &#8211;no-scripts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan package:discover &#8211;ansi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan key:generate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan migrate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm install &amp;&amp; npm run build<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan boost:install<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Debug specific issues:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Check authentication system<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;var_export([<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;auth_function_exists&#8217; =&gt; function_exists(&#8216;auth&#8217;),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;auth_bound&#8217; =&gt; app()-&gt;bound(&#8216;auth&#8217;),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;user_model_exists&#8217; =&gt; class_exists(&#8216;App\\\\Models\\\\User&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">]);&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Verify critical service providers are discovered<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;var_export([<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;boost_provider&#8217; =&gt; class_exists(&#8216;Laravel\\\\Boost\\\\BoostServiceProvider&#8217;),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;mcp_provider&#8217; =&gt; class_exists(&#8216;Laravel\\\\Mcp\\\\Server\\\\McpServiceProvider&#8217;),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8216;breeze_provider&#8217; =&gt; class_exists(&#8216;Laravel\\\\Breeze\\\\BreezeServiceProvider&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">]);&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Clear all caches and sessions completely<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear &amp;&amp; php artisan tinker &#8211;execute=&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; DB::table(&#8216;sessions&#8217;)-&gt;truncate();<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8216;All caches and sessions cleared.&#8217;;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Additional Resources<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Laravel Herd Documentation:**<\/strong> https:\/\/herd.laravel.com\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Git Bash Documentation:**<\/strong> https:\/\/git-scm.com\/docs<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Laravel Documentation:**<\/strong> https:\/\/laravel.com\/docs<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**Composer Documentation:**<\/strong> https:\/\/getcomposer.org\/doc\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Maintenance<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Updating Herd<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Herd auto-updates, but you can manually check:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Click Herd icon in system tray<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Select &#8220;Check for Updates&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Restart Herd after update<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. Verify PHP\/Composer versions: `php &#8211;version &amp;&amp; composer &#8211;version`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Updating Composer<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer self-update<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Changing PHP Version<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Herd supports multiple PHP versions:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Right-click Herd icon in system tray<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Select PHP version (8.1, 8.2, 8.3, 8.4)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Update `.bashrc` path if needed: `~\/.config\/herd\/bin\/php84\/` \u2192 `php83\/` etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Prevention Best Practices<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Before Git Pull<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Commit or stash local changes<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Note any custom environment configurations<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Backup `.env` file if it contains unique local settings<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### After Git Pull<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Run the Quick Recovery Checklist above<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Check `bootstrap\/app.php` for reverted auth guards<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Verify critical routes still work: `php artisan route:list | grep dashboard`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; [ ] Test login functionality to ensure proper redirects<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Code Practices<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. <strong>**Always guard early auth calls**<\/strong> in bootstrap contexts:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;\/\/ Safe pattern for bootstrap files<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8216;user_id&#8217; =&gt; (function () {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp;try {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return function_exists(&#8216;auth&#8217;) &amp;&amp; app()-&gt;bound(&#8216;auth&#8217;) ? auth()-&gt;id() : null;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp;} catch (\\Throwable $e) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return null;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;})(),<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. <strong>**Clear intended URLs**<\/strong> in login controllers:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;\/\/ Prevent unwanted redirects after authentication<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;$request-&gt;session()-&gt;forget(&#8216;url.intended&#8217;);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. <strong>**Use proper namespaces**<\/strong> in test files:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&lt;?php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;namespace Tests\\Feature; \/\/ Always include namespace<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4. <strong>**Regenerate caches**<\/strong> after dependency changes:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;composer dump-autoload &#8211;optimize<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;php artisan optimize:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;php artisan package:discover<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp;&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Script Automation<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Setup Script for New Windows Environments<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create `scripts\/setup-herd-gitbash.sh` (already exists in project):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#!\/bin\/bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Sets up Git Bash to work with Laravel Herd on Windows<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BASHRC=&#8221;$HOME\/.bashrc&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">HERD_BIN=&#8221;$HOME\/.config\/herd\/bin&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Add PATH export for Herd binaries<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if ! grep -q &#8220;export PATH.*herd\/bin&#8221; &#8220;$BASHRC&#8221; 2&gt;\/dev\/null; then<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;&#8221; &gt;&gt; &#8220;$BASHRC&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;# Laravel Herd PATH&#8221; &gt;&gt; &#8220;$BASHRC&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;export PATH=\\&#8221;\\$HOME\/.config\/herd\/bin:\\$PATH\\&#8221;&#8221; &gt;&gt; &#8220;$BASHRC&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;Added Herd bin to PATH&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">else<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;Herd PATH already configured&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Add aliases for .bat files<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ALIASES=(<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;alias php=&#8217;php.bat'&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;alias composer=&#8217;composer.bat'&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;alias herd=&#8217;herd.bat'&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;alias laravel=&#8217;laravel.bat'&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">for alias_cmd in &#8220;${ALIASES[@]}&#8221;; do<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; if ! grep -Fq &#8220;$alias_cmd&#8221; &#8220;$BASHRC&#8221; 2&gt;\/dev\/null; then<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; echo &#8220;$alias_cmd&#8221; &gt;&gt; &#8220;$BASHRC&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; echo &#8220;Added: $alias_cmd&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; else<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &nbsp; &nbsp; echo &#8220;Alias already exists: $alias_cmd&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; fi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">done<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;Setup complete! Run &#8216;source ~\/.bashrc&#8217; to apply changes.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Post-Pull Recovery Script<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider creating `scripts\/post-pull-recovery.sh`:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#!\/bin\/bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Automated recovery after git pull<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udd27 Starting post-pull recovery&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 1: Create required directories<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udcc1 Creating required directories&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir -p storage\/framework\/views storage\/logs bootstrap\/cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 2: Fix autoload issues<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udd04 Regenerating autoload&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">composer dump-autoload &#8211;optimize &#8211;no-scripts<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 3: Clear Laravel caches<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83e\uddf9 Clearing Laravel caches&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan optimize:clear<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 4: Regenerate package discovery<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udce6 Regenerating package discovery&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan package:discover &#8211;ansi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 5: Generate app key if missing<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udd11 Checking application key&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if ! php artisan config:show app.key | grep -q &#8220;base64:&#8221;; then<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; echo &#8220;Generating new application key&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; php artisan key:generate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fi<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 6: Run migrations<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83d\udcca Running migrations&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan migrate &#8211;force<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 7: Clear sessions<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83e\uddfc Clearing sessions&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">php artisan tinker &#8211;execute=&#8221;DB::table(&#8216;sessions&#8217;)-&gt;truncate(); echo &#8216;Sessions cleared&#8217;;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Step 8: Build frontend<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;\ud83c\udfa8 Building frontend assets&#8230;&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm install<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npm run build<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">echo &#8220;echo &#8220;\u2705 Recovery complete! Environment should now be ready.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Windows-Specific Directory Permission Issues<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>### Issue: &#8220;bootstrap\\cache directory must be present and writable&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Symptom:**<\/strong> Laravel fails with error: &#8220;The bootstrap\\cache directory must be present and writable.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Root Cause:**<\/strong> Windows file system permissions or read-only attributes prevent Laravel from writing to the bootstrap\/cache directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solutions (in order of preference):**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution 1 &#8211; Remove Read-Only Attribute (RECOMMENDED):**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># In PowerShell (no admin required)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">attrib -r +a .\\bootstrap\\cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution 2 &#8211; Create Directory with Proper Attributes:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># In PowerShell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">New-Item -Path &#8220;bootstrap\\cache&#8221; -ItemType Directory -Force<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">attrib -r +a .\\bootstrap\\cache<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution 3 &#8211; Grant Full Permissions:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># In PowerShell as Administrator<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">icacls &#8220;bootstrap\\cache&#8221; \/grant Everyone:F \/T<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Solution 4 &#8211; Use the Fix Script:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># In Git Bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash scripts\/fix-bootstrap-cache.sh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Verification:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Test write permissions<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">touch bootstrap\/cache\/test.tmp<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">rm bootstrap\/cache\/test.tmp<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>**Notes:**<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; The `attrib` command removes the read-only flag (`-r`) and sets the archive attribute (`+a`)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; This is often needed after cloning a repository on Windows<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; The issue can also occur after extracting a ZIP archive<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Antivirus software may sometimes interfere with directory creation<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>THIS POST WAS GENERATED BY AI # Windows Environment Setup &amp; Troubleshooting This document covers Windows-specific configuration and common issues when developing ClientBridge Laravel on Windows with Laravel Herd and Git Bash. ## Table of Contents &#8211; [Laravel Herd Configuration](#laravel-herd-configuration) &#8211; [Git Bash Compatibility](#git-bash-compatibility) &#8211; [Common Issues](#common-issues) &#8211; [Environment Setup](#environment-setup)<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-982","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=982"}],"version-history":[{"count":5,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/982\/revisions"}],"predecessor-version":[{"id":2391,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/982\/revisions\/2391"}],"wp:attachment":[{"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=982"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/alexanderramsey.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}