From 1dea0dbb3321e0cab4757237afbf2337703e9d4e Mon Sep 17 00:00:00 2001 From: spawnia Date: Tue, 10 Feb 2026 12:02:42 +0100 Subject: [PATCH] chore: unify agent config with lnai and auto-sync setup --- .claude/CLAUDE.md => .ai/AGENTS.md | 11 ++++--- .ai/config.json | 32 +++++++++++++++++++++ .ai/settings.json | 28 ++++++++++++++++++ .gitignore | 9 ++++++ Makefile | 46 ++++++++++++++++-------------- docker-compose.yml | 11 ++++++- node.dockerfile | 4 ++- 7 files changed, 111 insertions(+), 30 deletions(-) rename .claude/CLAUDE.md => .ai/AGENTS.md (93%) create mode 100644 .ai/config.json create mode 100644 .ai/settings.json diff --git a/.claude/CLAUDE.md b/.ai/AGENTS.md similarity index 93% rename from .claude/CLAUDE.md rename to .ai/AGENTS.md index 801b84de36..34ca474efd 100644 --- a/.claude/CLAUDE.md +++ b/.ai/AGENTS.md @@ -1,6 +1,6 @@ -# CLAUDE.md +# AGENTS.md -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +This file provides guidance to coding agents when working with code in this repository. ## Project Overview @@ -12,13 +12,12 @@ It integrates `webonyx/graphql-php` with Laravel's ecosystem. The project uses Docker + Make for a reproducible development environment. ```bash -make setup # Initial setup: build containers, install dependencies -make # Run all checks before committing (fix, stan, test) +make setup # Initial setup: build containers, install dependencies, generate agent config +make it # Run all checks before committing (fix, stan, test) make fix # Auto-format code (rector, php-cs-fixer, prettier) make stan # Static analysis with PHPStan make test # Run PHPUnit tests make bench # Run PHPBench benchmarks -make php # Shell into PHP container ``` ### Running a Single Test @@ -90,7 +89,7 @@ Tests use `Tests\Utils\` namespace for test fixtures (Models, Queries, Mutations - PHPStan level 8 - php-cs-fixer with `mll-lab/php-cs-fixer-config` (risky rules) - `protected` over `private` for extensibility -- Never use `final` in `src/`, always in `tests/` +- Never use `final` in `src/`, always in `tests/` - Full namespace in PHPDoc (`@var \Full\Namespace\Class`), imports in code - Code elements with `@api` have stability guarantees between major versions diff --git a/.ai/config.json b/.ai/config.json new file mode 100644 index 0000000000..8591281ef4 --- /dev/null +++ b/.ai/config.json @@ -0,0 +1,32 @@ +{ + "tools": { + "claudeCode": { + "enabled": true, + "versionControl": false + }, + "opencode": { + "enabled": false, + "versionControl": false + }, + "cursor": { + "enabled": false, + "versionControl": false + }, + "copilot": { + "enabled": false, + "versionControl": false + }, + "windsurf": { + "enabled": false, + "versionControl": false + }, + "gemini": { + "enabled": false, + "versionControl": false + }, + "codex": { + "enabled": true, + "versionControl": false + } + } +} diff --git a/.ai/settings.json b/.ai/settings.json new file mode 100644 index 0000000000..99fbac2a3c --- /dev/null +++ b/.ai/settings.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://lnai.sh/schemas/settings.schema.json", + "permissions": { + "allow": [ + "Bash(docker compose up:*)", + "Bash(make setup)", + "Bash(make it)", + "Bash(make up)", + "Bash(make build)", + "Bash(make test)", + "Bash(make stan)", + "Bash(make fix)", + "Bash(make rector)", + "Bash(make php-cs-fixer)", + "Bash(make prettier)", + "Bash(make bench)", + "Bash(make docs)", + "Bash(make help)", + "Bash(make release)", + "Bash(make proto)", + "Bash(make proto/update-reports)" + ], + "deny": [ + "Bash(make php)", + "Bash(make node)" + ] + } +} diff --git a/.gitignore b/.gitignore index 4da3699244..06e14c1c94 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,12 @@ proto-tmp composer.phar composer.lock vendor + +# lnai +.ai/.lnai-manifest.json + +# lnai-generated +.claude/CLAUDE.md +.claude/settings.json +AGENTS.md +# end lnai-generated diff --git a/Makefile b/Makefile index 8f480d9877..198dcf4e17 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,3 @@ -dcphp=$$(echo "docker compose exec php") -dcnode=$$(echo "docker compose exec node") - .PHONY: it it: vendor fix stan test ## Run useful checks before commits @@ -9,7 +6,7 @@ help: ## Display this list of targets with descriptions @grep --extended-regexp '^[a-zA-Z0-9_-]+:.*?## .*$$' $(firstword $(MAKEFILE_LIST)) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: setup -setup: build docs/node_modules vendor ## Prepare the local environment +setup: build vendor docs/node_modules ai-sync ## Prepare the local environment .PHONY: build build: ## Build the local Docker containers @@ -25,40 +22,40 @@ fix: rector php-cs-fixer prettier ## Automatically refactor and format code .PHONY: rector rector: up ## Refactor code with Rector - ${dcphp} vendor/bin/rector process + docker compose exec php vendor/bin/rector process .PHONY: php-cs-fixer php-cs-fixer: up ## Format code with php-cs-fixer - ${dcphp} vendor/bin/php-cs-fixer fix + docker compose exec php vendor/bin/php-cs-fixer fix .PHONY: prettier prettier: up ## Format code with prettier - ${dcnode} yarn run prettify + docker compose exec node-docs yarn run prettify .PHONY: stan stan: up ## Run static analysis with PHPStan - ${dcphp} vendor/bin/phpstan --verbose + docker compose exec php vendor/bin/phpstan --verbose .PHONY: test test: up ## Run tests with PHPUnit - ${dcphp} vendor/bin/phpunit + docker compose exec php vendor/bin/phpunit .PHONY: bench bench: up ## Run benchmarks with PHPBench - ${dcphp} vendor/bin/phpbench run --report=aggregate + docker compose exec php vendor/bin/phpbench run --report=aggregate vendor: up composer.json ## Install composer dependencies - ${dcphp} composer update - ${dcphp} composer validate --strict - ${dcphp} composer normalize + docker compose exec php composer update + docker compose exec php composer validate --strict + docker compose exec php composer normalize .PHONY: php php: up ## Open an interactive shell into the PHP container - ${dcphp} bash + docker compose exec php bash .PHONY: node node: up ## Open an interactive shell into the Node container - ${dcnode} bash + docker compose exec node-docs bash .PHONY: release release: ## Prepare the docs for a new release @@ -66,18 +63,23 @@ release: ## Prepare the docs for a new release .PHONY: docs docs: up ## Render the docs in a development server - ${dcnode} yarn run start + docker compose exec node-docs yarn run start docs/node_modules: up docs/package.json docs/yarn.lock ## Install yarn dependencies - ${dcnode} yarn + docker compose exec node-docs yarn + +.PHONY: ai-sync +ai-sync: up ## Generate local agent configuration from .ai + # https://github.com/KrystianJonca/lnai/releases + docker compose exec node-tools npx --yes lnai@0.6.7 sync .PHONY: proto/update-reports proto/update-reports: - ${dcphp} curl --silent --show-error --fail --output src/Tracing/FederatedTracing/reports.proto https://usage-reporting.api.apollographql.com/proto/reports.proto - ${dcphp} sed --in-place 's/ \[(js_use_toArray) = true]//g' src/Tracing/FederatedTracing/reports.proto - ${dcphp} sed --in-place 's/ \[(js_preEncoded) = true]//g' src/Tracing/FederatedTracing/reports.proto - ${dcphp} sed --in-place '3 i option php_namespace = "Nuwave\\\\Lighthouse\\\\Tracing\\\\FederatedTracing\\\\Proto";' src/Tracing/FederatedTracing/reports.proto - ${dcphp} sed --in-place '4 i option php_metadata_namespace = "Nuwave\\\\Lighthouse\\\\Tracing\\\\FederatedTracing\\\\Proto\\\\Metadata";' src/Tracing/FederatedTracing/reports.proto + docker compose exec php curl --silent --show-error --fail --output src/Tracing/FederatedTracing/reports.proto https://usage-reporting.api.apollographql.com/proto/reports.proto + docker compose exec php sed --in-place 's/ \[(js_use_toArray) = true]//g' src/Tracing/FederatedTracing/reports.proto + docker compose exec php sed --in-place 's/ \[(js_preEncoded) = true]//g' src/Tracing/FederatedTracing/reports.proto + docker compose exec php sed --in-place '3 i option php_namespace = "Nuwave\\\\Lighthouse\\\\Tracing\\\\FederatedTracing\\\\Proto";' src/Tracing/FederatedTracing/reports.proto + docker compose exec php sed --in-place '4 i option php_metadata_namespace = "Nuwave\\\\Lighthouse\\\\Tracing\\\\FederatedTracing\\\\Proto\\\\Metadata";' src/Tracing/FederatedTracing/reports.proto .PHONY: proto proto: diff --git a/docker-compose.yml b/docker-compose.yml index 1cb20b6a15..9f5de00817 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,7 +26,7 @@ services: redis: image: redis:6 - node: + node-docs: build: context: . dockerfile: node.dockerfile @@ -40,3 +40,12 @@ services: ports: - 8081:8080 tty: true + + node-tools: + build: + context: . + dockerfile: node.dockerfile + volumes: + - ./:/workdir + working_dir: /workdir + tty: true diff --git a/node.dockerfile b/node.dockerfile index 0fce9d0550..fc2088e35f 100644 --- a/node.dockerfile +++ b/node.dockerfile @@ -1,4 +1,6 @@ -FROM node:18-slim +FROM node:22-slim + +RUN npm install -g npm ARG USER_ID ARG GROUP_ID