From 3196b25b1c2e3d6a086109eb857b5785134f679d Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Thu, 15 Oct 2026 17:38:17 +0100 Subject: [PATCH] Initial Commit --- AGENTS.md | 168 ------------------------------------------- IMAGE_SETUP.md | 13 ---- LODGE_SETUP.md | 22 ------ README-PAGESPEED.txt | 18 ----- 4 files changed, 221 deletions(-) delete mode 100644 AGENTS.md delete mode 100644 IMAGE_SETUP.md delete mode 100644 LODGE_SETUP.md delete mode 100644 README-PAGESPEED.txt diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 3f9edd2..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,168 +0,0 @@ - -=== foundation rules === - -# Laravel Boost Guidelines - -The Laravel Boost guidelines are specifically curated by Laravel maintainers for this application. These guidelines should be followed closely to ensure the best experience when building Laravel applications. - -## Foundational Context - -This application is a Laravel application running on PHP 8.5. You are an expert with the Laravel ecosystem. Always use the APIs that match the installed major version of each package — do not assume a version. - -Before relying on a package's API, confirm its installed version: -- PHP packages: run `composer show --direct` to list direct dependencies with versions, or `composer show ` for a single package. -- JS packages: check `package.json` for the installed versions. - -## Skills Activation - -This project has domain-specific skills available in `**/skills/**`. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. - -## Conventions - -- You must follow all existing code conventions used in this application. When creating or editing a file, check sibling files for the correct structure, approach, and naming. -- Use descriptive names for variables and methods. For example, `isRegisteredForDiscounts`, not `discount()`. -- Check for existing components to reuse before writing a new one. - -## Verification Scripts - -- Do not create verification scripts or tinker when tests cover that functionality and prove they work. Unit and feature tests are more important. - -## Application Structure & Architecture - -- Stick to existing directory structure; don't create new base folders without approval. -- Do not change the application's dependencies without approval. - -## Frontend Bundling - -- If the user doesn't see a frontend change reflected in the UI, it could mean they need to run `npm run build`, `npm run dev`, or `composer run dev`. Ask them. - -## Documentation Files - -- You must only create documentation files if explicitly requested by the user. - -## Replies - -- Be concise in your explanations - focus on what's important rather than explaining obvious details. - -=== boost rules === - -# Laravel Boost - -## Tools - -- Laravel Boost is an MCP server with tools designed specifically for this application. Prefer Boost tools over manual alternatives like shell commands or file reads. -- Use `database-query` to run read-only queries against the database instead of writing raw SQL in tinker. -- Use `database-schema` to inspect table structure before writing migrations or models. -- Use `get-absolute-url` to resolve the correct scheme, domain, and port for project URLs. Always use this before sharing a URL with the user. -- Use `browser-logs` to read browser logs, errors, and exceptions. Only recent logs are useful, ignore old entries. - -## Searching Documentation (IMPORTANT) - -- Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. -- Pass a `packages` array to scope results when you know which packages are relevant. -- Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. -- Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. - -### Search Syntax - -1. Use words for auto-stemmed AND logic: `rate limit` matches both "rate" AND "limit". -2. Use `"quoted phrases"` for exact position matching: `"infinite scroll"` requires adjacent words in order. -3. Combine words and phrases for mixed queries: `middleware "rate limit"`. -4. Use multiple queries for OR logic: `queries=["authentication", "middleware"]`. - -## Project Rules - -- This project contains committed, area-grouped rules in `.ai/rules` when that directory exists (settled decisions, non-obvious traps, standing constraints). Framework and package guidelines that only apply to specific paths (testing, frontend, components) also live there, under `.ai/rules/boost` — this is not just recorded decisions, it is load-bearing guidance you have not seen inline. Before you enter plan mode or create/edit any file, you MUST first: open @.ai/rules/index.md (it maps file globs to rule files), read every rule file whose globs cover the path(s) in scope, and run `grep -rin 'keyword' .ai/rules` to catch what a path match alone misses. Do not write code until you have read and are following every matching rule. If `.ai/rules` does not exist, continue without it. -- Record durable rules with `record-rule` so the next agent or teammate inherits them instead of working them out again. Pass a `glob` (e.g. `app/Http/Controllers/**`), a short `title`, and a few-line `note`. Always use `record-rule`, never your native memory or notes tool — native memory is personal and session-scoped; only `.ai/rules` is shared with the team and persists in the repo. - -## Artisan - -- Run Artisan commands directly via the command line (e.g., `php artisan route:list`). Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. -- Inspect routes with `php artisan route:list`. Filter with: `--method=GET`, `--name=users`, `--path=api`, `--except-vendor`, `--only-vendor`. -- Read configuration values using dot notation: `php artisan config:show app.name`, `php artisan config:show database.default`. Or read config files directly from the `config/` directory. - -## Tinker - -- Execute PHP in app context for debugging and testing code. Do not create models without user approval, prefer tests with factories instead. Prefer existing Artisan commands over custom tinker code. -- Always use single quotes to prevent shell expansion: `php artisan tinker --execute 'Your::code();'` - - Double quotes for PHP strings inside: `php artisan tinker --execute 'User::where("active", true)->count();'` - -=== php rules === - -# PHP - -- Always use curly braces for control structures, even for single-line bodies. -- Use PHP 8 constructor property promotion: `public function __construct(public GitHub $github) { }`. Do not leave empty zero-parameter `__construct()` methods unless the constructor is private. -- Use explicit return type declarations and type hints for all method parameters: `function isAccessible(User $user, ?string $path = null): bool` -- Use TitleCase for Enum keys: `FavoritePerson`, `BestLake`, `Monthly`. -- Prefer PHPDoc blocks over inline comments. Only add inline comments for exceptionally complex logic. -- Use array shape type definitions in PHPDoc blocks. - -=== deployments rules === - -# Deployment - -- Laravel can be deployed using [Laravel Cloud](https://cloud.laravel.com/), which is the fastest way to deploy and scale production Laravel applications. - -=== tests rules === - -# Test Enforcement - -- Every change must be programmatically tested. Write a new test or update an existing test, then run the affected tests to make sure they pass. -- Run the minimum number of tests needed to ensure code quality and speed. Use `php artisan test --compact` with a specific filename or filter. - -=== laravel/core rules === - -# Do Things the Laravel Way - -- Use `php artisan make:` commands to create new files (i.e. migrations, controllers, models, etc.). You can list available Artisan commands using `php artisan list` and check their parameters with `php artisan [command] --help`. -- If you're creating a generic PHP class, use `php artisan make:class`. -- Pass `--no-interaction` to all Artisan commands to ensure they work without user input. You should also pass the correct `--options` to ensure correct behavior. - -### Model Creation - -- When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using `php artisan make:model --help` to check the available options. - -## APIs & Eloquent Resources - -- For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention. - -## URL Generation - -- When generating links to other pages, prefer named routes and the `route()` function. - -## Testing - -- When creating models for tests, use the factories for the models. Check if the factory has custom states that can be used before manually setting up the model. -- Faker: Use methods such as `$this->faker->word()` or `fake()->randomDigit()`. Follow existing conventions whether to use `$this->faker` or `fake()`. -- When creating tests, make use of `php artisan make:test [options] {name}` to create a feature test, and pass `--unit` to create a unit test. Most tests should be feature tests. - -## Vite Error - -- If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `npm run build` or ask the user to run `npm run dev` or `composer run dev`. - -=== livewire/core rules === - -# Livewire - -- Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. -- You can use Alpine.js for client-side interactions instead of JavaScript frameworks. -- Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. - -=== pint/core rules === - -# Laravel Pint Code Formatter - -- If you have modified any PHP files, you must run `vendor/bin/pint --dirty --format agent` before finalizing changes to ensure your code matches the project's expected style. -- Do not run `vendor/bin/pint --test --format agent`, simply run `vendor/bin/pint --format agent` to fix any formatting issues. - -=== pest/core rules === - -## Pest - -- This project uses Pest for testing. Create tests: `php artisan make:test --pest {name}`. -- The `{name}` argument should not include the test suite directory. Use `php artisan make:test --pest SomeFeatureTest` instead of `php artisan make:test --pest Feature/SomeFeatureTest`. -- Run tests: `php artisan test --compact` or filter: `php artisan test --compact --filter=testName`. -- Do NOT delete tests without approval. - - diff --git a/IMAGE_SETUP.md b/IMAGE_SETUP.md deleted file mode 100644 index fa77b8d..0000000 --- a/IMAGE_SETUP.md +++ /dev/null @@ -1,13 +0,0 @@ -# Cresta 31 automatic image optimisation - -The original 11 PNG photos remain in the repository, but the public-facing homepage uses optimised WebP versions in `public/images/lodge/{hero,gallery,thumb}`. The hero is 1920px maximum, gallery images 1200px, and thumbnails 480px. - -## New uploads - -1. Install GD with WebP support on the production host: `sudo apt install php8.5-gd && sudo systemctl restart php8.5-fpm`. -2. Deploy these changes, then run `cd /var/www/cresta31/current && php artisan migrate --force`. -3. Verify `php artisan storage:link` and that `public/storage` resolves to `shared/storage/app/public` through Deployer's shared storage symlink. -4. Sign in using the account matching `LODGE_ADMIN_EMAIL` in `.env`; open `/admin/bookings` and upload images under **Lodge photographs**. -5. New uploads automatically generate 1600px gallery and 480px thumbnail WebP images in the shared `storage/app/public/lodge` directory, and appear on the public homepage. They persist across Deployer releases. - -Requirements: PHP GD WebP support, writable shared storage, and configured database. The 15 MB per-file and 10-files-per-request limits are application limits; `upload_max_filesize` and `post_max_size` in PHP-FPM must be high enough (e.g. 16M and 160M) for maximum-size batches. The initial 11 static photographs are not managed by the upload UI. diff --git a/LODGE_SETUP.md b/LODGE_SETUP.md deleted file mode 100644 index 4bb9d85..0000000 --- a/LODGE_SETUP.md +++ /dev/null @@ -1,22 +0,0 @@ -# Cresta 31 lodge booking website - -Built on the supplied Laravel 13 / Livewire starter project. Includes the 11 supplied lodge images, public gallery, date search, pricing, guest request form, conflict checking, booking references and a restricted admin booking list. - -## Installation - -1. Configure PHP 8.3+ and Composer, Node.js, and a MySQL or PostgreSQL database. -2. Run `composer install` (the original project depends on a private MPBA Git repository; access is required). -3. Copy `.env.example` to `.env`; set `APP_URL`, `APP_KEY` (with `php artisan key:generate`) and `DB_*` values. -4. Set `LODGE_NIGHTLY_RATE_PENCE=17500`, `LODGE_MAX_GUESTS=6`, and `LODGE_ADMIN_EMAIL=your-admin-email@example.com` in `.env`. -5. Run `php artisan migrate`, `npm ci`, `npm run build`. -6. Create a Laravel user with the same email as `LODGE_ADMIN_EMAIL` via your normal registration process, then sign in and visit `/admin/bookings`. -7. Serve Laravel's `public/` directory with your web server. - -## Important before taking real bookings - -- The £175 nightly rate and 6-guest capacity are **placeholders**. Set actual rates and capacity. -- This build accepts booking **requests** and blocks overlapping pending/confirmed stays; owners confirm them manually. It does **not** process payments, send booking emails, or integrate an external calendar. Do not advertise online payment or automatic confirmation. -- Booking status pages are accessible to anyone with the long random reference; avoid sharing references publicly. -- For production, configure backups, mail notifications, cancellation policy, terms, privacy information, accurate property description, and availability blocks for owner stays. -- Review photographs and add verified property details (address, facilities, check-in/out times, policies). -- The starter archive included an `.env` file, which was intentionally excluded to avoid distributing secrets. diff --git a/README-PAGESPEED.txt b/README-PAGESPEED.txt deleted file mode 100644 index d955530..0000000 --- a/README-PAGESPEED.txt +++ /dev/null @@ -1,18 +0,0 @@ -Cresta 31 PageSpeed patch — 15 October 2026 - -Based on website(3).zip supplied earlier (not on your subsequent local edits). - -Changes: -- Both frontend view paths: remove render-blocking Google Fonts and use local system/Georgia fonts; preload CSS hero image at high priority; main landmark; contrast and focus improvements; accurate image dimensions. -- 11 gallery thumbnails: cropped/resized to 320x240, re-encoded as WebP. -- Separate 640x480 intro image so full-size gallery photo-02 remains untouched. - -Apply in local repo, review diffs before commit: - unzip -o Cresta31_pagespeed_fix.zip -d /Volumes/Developer/Applications/CostalEscape/website - php artisan view:clear - -Notes: -- Lighthouse LCP hero is CSS background. Preload ensures early discovery without restructuring the hero. -- Cloudflare beacon script is injected by Cloudflare Web Analytics / Browser Insights, not by these Blade files. Disable it in Cloudflare if you do not need it. -- Run Lighthouse again after deployment. Performance scores vary and are not guaranteed. -- If local frontend templates were changed after website(3).zip, merge changes instead of overwriting them.