This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is Webtool 4.2 - the new release of the linguistic annotation and FrameNet management system.
This project currently uses a local development setup with Vite running directly on the host machine.
Frontend Development:
yarn dev- Start Vite development server with hot reload (current setup)npm run dev- Alternative to yarn devyarn install- Install Node.js dependenciesnpm run build- Build production assets
php artisan serve- Start development serverphp artisan migrate- Run database migrationsphp artisan tinker- Open interactive shellcomposer install- Install PHP dependenciesvendor/bin/phpunit- Run tests
- Laravel App: http://localhost:8001 (
FORWARD_PHP_PORT=8001) - Reverb WebSocket: http://localhost:8080 (
FORWARD_REVERB_PORT=8080) - Redis: localhost:6379 (
FORWARD_REDIS_PORT=6379)
This is a Laravel 12 application with a custom Query Builder that extends Laravel's capabilities for linguistic data management.
app/- Laravel application codeHttp/Controllers/- Route controllers using PHP attributes for routingServices/- Business logic layer for annotation, reports, and data processingData/- Data transfer objects and form validationRepositories/- Data access layer abstractionsUI/- User interface with Visual components and Blade template views
resources/- Frontend assets and Javascript apppublic/scripts/- Third-party JavaScript libraries (jQuery EasyUI, JointJS, etc.)config/webtool.php- Application-specific configuration and menu structure
Uses a Laravel Authentication and Authorization classes. Can integrate with Auth0 for external authentication.
- Uses Laravel Blade templates with custom UI components
- Vite for asset compilation with LESS preprocessing
- Uses Fomantic-UI CSS components and AlpineJS libraries
- JointJS for graph visualizations (frame relations, semantic networks)
- HTMX for dynamic content updates
Database Schema (file database/webtool42_script.sql):
The schema is designed around linguistic annotation and FrameNet concepts:
Core Linguistic Entities:
frame- Semantic frames with multilingual descriptionsframeelement- Frame elements (FEs) with coreness types and color codingconstruction- Grammatical constructions with abstract patternsconstructionelement- Construction elements with constraintslu(Lexical Units) - Words that evoke frameslexicon- Lexical entries with morphological information
Annotation System:
annotationset- Groups annotations for sentences/documentsannotation- Individual annotations linking text spans to semantic elementsstaticobject- Static multimodal annotations (images)dynamicobject- Dynamic multimodal annotations (video)
Content Management:
corpus- Text corpora organizationdocument- Individual documents within corporasentence- Sentence-level segmentationimage/video- Multimodal content for annotation
User & Task Management:
user- User accounts with authenticationusertask- Task assignments for annotation projectsuser_group- Role-based access control
Semantic Relations:
entityrelation- Generic relation frameworkrelationtype- Types of semantic relations (inheritance, subframe, etc.)- Views like
view_frame_relationprovide structured access to semantic networks
Key Views:
view_*tables provide optimized queries for complex linguistic data relationships- Include multilingual support and efficient access patterns for annotation interfaces
- Annotation Tools: Multiple annotation modes (static/dynamic, full-text, deixis, bounding boxes)
- Linguistic Data Management: Frames, constructions, lexical units, semantic types
- Visualization: Interactive graphs for semantic networks and frame relations
- Multimodal Support: Video and image annotation capabilities
- Export Systems: XML export with XSD validation for linguistic data interchange
Uses PHPUnit for testing. Run tests with vendor/bin/phpunit.
- Main app configuration in
config/webtool.php - Environment variables in
.envfile - Database configuration supports multiple connections defined in
config/database.php
- Framework Foundation: Uses Fomantic-UI (Semantic UI) as the primary CSS framework - maintain framework defaults for consistency, accessibility, and maintainability
- LESS-Based Styling: All customizations use LESS variables, not CSS custom properties
- Primary theme customization:
resources/css/fomantic-ui/site/globals/site.variables - Entity-specific colors:
resources/css/colors/entities.less(frames, lexical units, frame elements, etc.) - Component styling: Organized in
resources/css/components/andresources/css/layout/
- Primary theme customization:
- Specialized Academic Context: Design should reflect the specialized nature of linguistic annotation tools while maintaining usability
- Respect Framework Patterns: Enhance Fomantic-UI components rather than replacing them
- Strategic Customization: Focus enhancements on domain-specific needs (linguistic notation, annotation workflows)
- Consistency First: Use established LESS variables and color schemes before creating new ones
- Accessibility: Maintain framework's built-in accessibility features when customizing
IMMEDIATELY after implementing any front-end change:
- Identify what changed - Review the modified app/UI and resources folders
- Navigate to affected pages - Use
mcp__playwright__browser_navigateto visit each changed view - Verify framework consistency - Ensure changes work with Fomantic-UI patterns
- Validate feature implementation - Ensure the change fulfills the user's specific request
- Check LESS compilation - Verify custom variables compile correctly with framework
- Capture evidence - Take full page screenshot at desktop viewport (1440px) of each changed view
- Check for errors - Run
mcp__playwright__browser_console_messages
This verification ensures changes meet design standards and maintain framework integrity.
Invoke the @agent-design-review subagent for thorough design validation when:
- Completing significant UI/UX features
- Before finalizing PRs with visual changes
- Needing comprehensive accessibility and responsiveness testing
- Evaluating framework customization approaches
===
=== foundation rules ===The Laravel Boost guidelines are specifically curated by Laravel maintainers for this application. These guidelines should be followed closely to enhance the user's satisfaction building Laravel applications.
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.
- php - 8.4.12
- laravel/framework (LARAVEL) - v12
- laravel/octane (OCTANE) - v2
- laravel/prompts (PROMPTS) - v0
- laravel/reverb (REVERB) - v1
- pestphp/pest (PEST) - v3
- phpunit/phpunit (PHPUNIT) - v11
- laravel/mcp (MCP) - v0
- laravel/pint (PINT) - v1
- laravel/sail (SAIL) - v1
- alpinejs (ALPINEJS) - v3
- laravel-echo (ECHO) - v1
- tailwindcss (TAILWINDCSS) - v3
- 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, naming.
- Use descriptive names for variables and methods. For example,
isRegisteredForDiscounts, notdiscount(). - Check for existing components to reuse before writing a new one.
- Do not create verification scripts or tinker when tests cover that functionality and prove it works. Unit and feature tests are more important.
- Stick to existing directory structure - don't create new base folders without approval.
- Do not change the application's dependencies without approval.
- 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, orcomposer run dev. Ask them.
- Be concise in your explanations - focus on what's important rather than explaining obvious details.
- You must only create documentation files if explicitly requested by the user.
=== boost rules ===
- Laravel Boost is an MCP server that comes with powerful tools designed specifically for this application. Use them.
- Use the
list-artisan-commandstool when you need to call an Artisan command to double check the available parameters.
- Whenever you share a project URL with the user you should use the
get-absolute-urltool to ensure you're using the correct scheme, domain / IP, and port.
- You should use the
tinkertool when you need to execute PHP to debug code or query Eloquent models directly. - Use the
database-querytool when you only need to read from the database.
- You can read browser logs, errors, and exceptions using the
browser-logstool from Boost. - Only recent browser logs will be useful - ignore old logs.
- Boost comes with a powerful
search-docstool you should use before any other approaches. This tool automatically passes a list of installed packages and their versions to the remote Boost API, so it returns only version-specific documentation specific for the user's circumstance. You should pass an array of packages to filter on if you know you need docs for particular packages. - The 'search-docs' tool is perfect for all Laravel related packages, including Laravel, Inertia, Livewire, Filament, Tailwind, Pest, Nova, Nightwatch, etc.
- You must use this tool to search for Laravel-ecosystem documentation before falling back to other approaches.
- Search the documentation before making code changes to ensure we are taking the correct approach.
- Use multiple, broad, simple, topic based queries to start. For example:
['rate limiting', 'routing rate limiting', 'routing']. - Do not add package names to queries - package information is already shared. For example, use
test resource table, notfilament 4 test resource table.
- You can and should pass multiple queries at once. The most relevant results will be returned first.
- Simple Word Searches with auto-stemming - query=authentication - finds 'authenticate' and 'auth'
- Multiple Words (AND Logic) - query=rate limit - finds knowledge containing both "rate" AND "limit"
- Quoted Phrases (Exact Position) - query="infinite scroll" - Words must be adjacent and in that order
- Mixed Queries - query=middleware "rate limit" - "middleware" AND exact phrase "rate limit"
- Multiple Queries - queries=["authentication", "middleware"] - ANY of these terms
=== php rules ===
- Always use curly braces for control structures, even if it has one line.
- Use PHP 8 constructor property promotion in
__construct().- public function __construct(public GitHub $github) { }
- Do not allow empty
__construct()methods with zero parameters.
- Always use explicit return type declarations for methods and functions.
- Use appropriate PHP type hints for method parameters.
- Prefer PHPDoc blocks over comments. Never use comments within the code itself unless there is something very complex going on.
- Add useful array shape type definitions for arrays when appropriate.
- Typically, keys in an Enum should be TitleCase. For example:
FavoritePerson,BestLake,Monthly.
=== laravel/core rules ===
- Use
php artisan make:commands to create new files (i.e. migrations, controllers, models, etc.). You can list available Artisan commands using thelist-artisan-commandstool. - If you're creating a generic PHP class, use
artisan make:class. - Pass
--no-interactionto all Artisan commands to ensure they work without user input. You should also pass the correct--optionsto ensure correct behavior.
- Always use proper Eloquent relationship methods with return type hints. Prefer relationship methods over raw queries or manual joins.
- Use Eloquent models and relationships before suggesting raw database queries
- Avoid
DB::; preferModel::query(). Generate code that leverages Laravel's ORM capabilities rather than bypassing them. - Generate code that prevents N+1 query problems by using eager loading.
- Use Laravel's query builder for very complex database operations.
- When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using
list-artisan-commandsto check the available options tophp artisan make:model.
- For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention.
- Always create Form Request classes for validation rather than inline validation in controllers. Include both validation rules and custom error messages.
- Check sibling Form Requests to see if the application uses array or string based validation rules.
- Use queued jobs for time-consuming operations with the
ShouldQueueinterface.
- Use Laravel's built-in authentication and authorization features (gates, policies, Sanctum, etc.).
- When generating links to other pages, prefer named routes and the
route()function.
- Use environment variables only in configuration files - never use the
env()function directly outside of config files. Always useconfig('app.name'), notenv('APP_NAME').
- 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()orfake()->randomDigit(). Follow existing conventions whether to use$this->fakerorfake(). - When creating tests, make use of
php artisan make:test [options] <name>to create a feature test, and pass--unitto create a unit test. Most tests should be feature tests.
- If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run
npm run buildor ask the user to runnpm run devorcomposer run dev.
=== laravel/v12 rules ===
- Use the
search-docstool to get version specific documentation. - Since Laravel 11, Laravel has a new streamlined file structure which this project uses.
- No middleware files in
app/Http/Middleware/. bootstrap/app.phpis the file to register middleware, exceptions, and routing files.bootstrap/providers.phpcontains application specific service providers.- No app\Console\Kernel.php - use
bootstrap/app.phporroutes/console.phpfor console configuration. - Commands auto-register - files in
app/Console/Commands/are automatically available and do not require manual registration.
- When modifying a column, the migration must include all of the attributes that were previously defined on the column. Otherwise, they will be dropped and lost.
- Laravel 11 allows limiting eagerly loaded records natively, without external packages:
$query->latest()->limit(10);.
- Casts can and likely should be set in a
casts()method on a model rather than the$castsproperty. Follow existing conventions from other models.
=== pest/core rules ===
- If you need to verify a feature is working, write or update a Unit / Feature test.
- All tests must be written using Pest. Use
php artisan make:test --pest <name>. - You must not remove any tests or test files from the tests directory without approval. These are not temporary or helper files - these are core to the application.
- Tests should test all of the happy paths, failure paths, and weird paths.
- Tests live in the
tests/Featureandtests/Unitdirectories. - Pest tests look and behave like this:
- Run the minimal number of tests using an appropriate filter before finalizing code edits.
- To run all tests:
php artisan test. - To run all tests in a file:
php artisan test tests/Feature/ExampleTest.php. - To filter on a particular test name:
php artisan test --filter=testName(recommended after making a change to a related file). - When the tests relating to your changes are passing, ask the user if they would like to run the entire test suite to ensure everything is still passing.
- When asserting status codes on a response, use the specific method like
assertForbiddenandassertNotFoundinstead of usingassertStatus(403)or similar, e.g.:
$response->assertSuccessful();
});
- Mocking can be very helpful when appropriate.
- When mocking, you can use the
Pest\Laravel\mockPest function, but always import it viause function Pest\Laravel\mock;before using it. Alternatively, you can use$this->mock()if existing tests do. - You can also create partial mocks using the same import or self method.
- Use datasets in Pest to simplify tests which have a lot of duplicated data. This is often the case when testing validation rules, so consider going with this solution when writing tests for validation rules.
=== pint/core rules ===
- You must run
vendor/bin/pint --dirtybefore finalizing changes to ensure your code matches the project's expected style. - Do not run
vendor/bin/pint --test, simply runvendor/bin/pintto fix any formatting issues.
=== tailwindcss/core rules ===
- Use Tailwind CSS classes to style HTML, check and use existing tailwind conventions within the project before writing your own.
- Offer to extract repeated patterns into components that match the project's conventions (i.e. Blade, JSX, Vue, etc..)
- Think through class placement, order, priority, and defaults - remove redundant classes, add classes to parent or child carefully to limit repetition, group elements logically
- You can use the
search-docstool to get exact examples from the official documentation when needed.
-
When listing items, use gap utilities for spacing, don't use margins.
SuperiorMichiganErie
- If existing pages and components support dark mode, new pages and components must support dark mode in a similar way, typically using
dark:.
=== tailwindcss/v3 rules ===
- Always use Tailwind CSS v3 - verify you're using only classes supported by this version.
=== tests rules ===
- 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 testwith a specific filename or filter.