Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions .claude/CLAUDE.md → .ai/AGENTS.md
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down
32 changes: 32 additions & 0 deletions .ai/config.json
Original file line number Diff line number Diff line change
@@ -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
}
}
}
28 changes: 28 additions & 0 deletions .ai/settings.json
Original file line number Diff line number Diff line change
@@ -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)"
]
}
}
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
46 changes: 24 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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
Expand All @@ -25,59 +22,64 @@ 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
rm -rf docs/6 && cp -r docs/master docs/6

.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:
Expand Down
11 changes: 10 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ services:
redis:
image: redis:6

node:
node-docs:
build:
context: .
dockerfile: node.dockerfile
Expand All @@ -40,3 +40,12 @@ services:
ports:
- 8081:8080
tty: true

node-tools:
build:
context: .
dockerfile: node.dockerfile
volumes:
Comment on lines +44 to +48

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add SELinux label disable for node-tools mount

On SELinux-enforcing hosts, bind-mounted project directories are not writable/readable from containers unless they are relabeled or the container runs with label:disable. This file already applies security_opt: [label:disable] to other bind-mounted services (php, node-docs), but node-tools omits it, so make setup/make ai-sync can fail with permission errors when lnai reads or writes files under /workdir.

Useful? React with 👍 / 👎.

- ./:/workdir
working_dir: /workdir
tty: true
4 changes: 3 additions & 1 deletion node.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
FROM node:18-slim
FROM node:22-slim

RUN npm install -g npm

ARG USER_ID
ARG GROUP_ID
Expand Down