waaseyaa / framework
Waaseyaa monorepo — a modern, entity-first, AI-native CMS
Requires
- php: >=8.3
- symfony/console: ^7.0
- waaseyaa/access: @dev
- waaseyaa/ai-agent: @dev
- waaseyaa/ai-pipeline: @dev
- waaseyaa/ai-schema: @dev
- waaseyaa/ai-vector: @dev
- waaseyaa/api: @dev
- waaseyaa/cache: @dev
- waaseyaa/cli: @dev
- waaseyaa/config: @dev
- waaseyaa/database-legacy: @dev
- waaseyaa/entity: @dev
- waaseyaa/entity-storage: @dev
- waaseyaa/field: @dev
- waaseyaa/foundation: @dev
- waaseyaa/i18n: @dev
- waaseyaa/mcp: @dev
- waaseyaa/media: @dev
- waaseyaa/menu: @dev
- waaseyaa/node: @dev
- waaseyaa/path: @dev
- waaseyaa/plugin: @dev
- waaseyaa/queue: @dev
- waaseyaa/routing: @dev
- waaseyaa/ssr: @dev
- waaseyaa/state: @dev
- waaseyaa/taxonomy: @dev
- waaseyaa/telescope: @dev
- waaseyaa/typed-data: @dev
- waaseyaa/user: @dev
- waaseyaa/validation: @dev
- waaseyaa/workflows: @dev
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- waaseyaa/testing: @dev
- dev-main
- v0.1.0
- v0.1.0-alpha.144
- v0.1.0-alpha.143
- v0.1.0-alpha.142
- v0.1.0-alpha.141
- dev-dependabot/npm_and_yarn/packages/admin/typescript-6.0.3
- dev-dependabot/composer/phpstan/phpstan-2.1.50
- dev-feat/1292-token-endpoint
- dev-fix/1265-surface-map-dispositions
- dev-feat/1289-oidc-nonce
- dev-feat/1284-authorize-endpoint
- dev-feat/1283-auth-code-repo
- dev-feat/1282-oidc-client-entity
- dev-admin-dist/update
- dev-dependabot/npm_and_yarn/mcp/hono-4.12.14
- dev-dependabot/npm_and_yarn/tools/spec-retrieval/hono-4.12.14
- dev-dependabot/composer/friendsofphp/php-cs-fixer-3.95.1
- dev-dependabot/composer/phpstan/phpstan-2.1.49
- dev-dependabot/npm_and_yarn/packages/admin/happy-dom-20.9.0
- dev-dependabot/github_actions/softprops/action-gh-release-3
- dev-recovery/restore-monorepo-main
- dev-feat/northcloud-package
- dev-release/composer-workflow
- dev-feat/nuxt-surface-proxy
- dev-feat/dotenv-loading
- dev-feat/app-controller-router
- dev-feat/1093-sovereignty-profile
- dev-fix/1076-remove-dead-listeners
- dev-fix/1061-ssr-test-app-url
- dev-feat/727-oauth-email-verified
- dev-feat/737-debug-header-middleware
- dev-feat/732-request-context-processor
- dev-fix/768-wire-database-rate-limiter
- dev-fix/1046-app-url-validation
- dev-issue-998-governance-bootstrap-pr
- dev-issue-1000-drift-scan
- dev-m10-batch-d5-main
- dev-m10-batch-d4-main
- dev-m10-batch-d3-main
- dev-m10-batch-d2-clean
- dev-m10-batch-d5
- dev-m10-batch-d4
- dev-m10-batch-d3
- dev-m10-batch-d2
- dev-m10-batch-d1
- dev-fix/797-801-use-api-composable
- dev-fix/799-broaden-json-body-parsing
- dev-refactor/798-remove-dead-mailer
- dev-worktree-agent-a7328aad
- dev-fix/743-sqlite-default-path
- dev-test/581-api-coverage
- dev-test/580-entity-storage-coverage
- dev-fix/750-missing-path-repos
- dev-feat/auth-phase2
- dev-fix/783-vitest-failures
- dev-feat/oauth-provider-foundation
- dev-test/579-payload-validator-edge-cases
- dev-test/579-ingestion-logger-prune-edge-cases
- dev-test/579-invalid-envelope-exception-tests
- dev-test/579-ingestion-error-code-tests
- dev-test/579-ingestion-error-tests
- dev-test/579-envelope-dto-tests
- dev-test/578-relationship-entity
- dev-worktree-agent-a7a0a04f
- dev-test/579-validation-result-edge-cases
- dev-test/579-payload-validator-contract
- dev-worktree-agent-a1f2dd3a
- dev-p0/layer-enforcement
- dev-feat/461-elder-self-identification
- dev-feat/512-revision-system
- dev-fix/534-graphql-total-count
- dev-fix/dbal-quote-alias
- dev-fix/dbal-quote-table-names
- dev-test/dbal-integration-tests
- dev-chore/remove-database-legacy
- dev-feat/dbal-kernel-migration
- dev-feat/dbal-database
- dev-design/dbal-migration
- dev-audit/dbal-migration
- dev-feat/464-migration-package-flag
- dev-test/435-graphql-unit-tests
- dev-feat/432-schema-caching
- dev-feat/433-disable-introspection
- dev-docs/436-document-graphql
- dev-feat/430-clean-package-vendors
- dev-fix/428-remove-admin-bridge
- dev-fix/471-entity-reference-migration
- dev-fix/446-entity-reference-fallback
- dev-fix/443-444-filter-validation
- dev-feat/csrf-json-and-node-graphql-fields
- dev-feat/graphql-schema-validation
- dev-feat/admin-host-contracts
- dev-feat/admin-bridge-package
- dev-feat/admin-packaging-ci
- dev-feat/packagist-0.1-normalization
- dev-chore/packagist-approval-dp2
- dev-chore/packagist-approval
- dev-fix/341-proxy-config
- dev-fix/326-middleware-ordering
- dev-fix/380-hydration-mismatch
- dev-feat/344-error-vue
- dev-release/v1.0-rc
- dev-fix/333-readmes-final
- dev-fix/322-334-ssr-twig-final
- dev-fix/329-exception-handler-final
- dev-fix/327-access-policies-final
- dev-fix/373-auth-review-fixes
- dev-fix/admin-auth-ui-330
- dev-fix/package-readmes-333
- dev-fix/v1.0-322-ssr-twig-rendering
- dev-fix/admin-hydration-errors-325
- dev-fix/v1.0-327-access-policies
- dev-fix/v1.0-329-exception-handler
- dev-fix/v1.0-328-ssr-admin-link
- dev-feature/telescope-codified-context
- dev-fix/playwright-dashboard-user-selector-78d8405c
- dev-chore/ci-release-automation
- dev-release/v1.0-automation
- dev-fix/v1.0-315-foundation-path-dep
- dev-chore/v1.0-release-automation
- dev-fix/v1.0-319-license-file
- dev-fix/v1.0-316-validation-entity-dep
- dev-fix/v1.0-320-csrf-mcp
- dev-fix/321-single-tenant
- dev-fix/blocker-314-return-type
- dev-fix/blocker-318-stored-xss
- dev-fix/blocker-317-csrf-writes
- dev-release/v1.0-issues
This package is auto-updated.
Last update: 2026-04-18 22:33:43 UTC
README
A modern, entity-first, AI-native content management framework built on PHP 8.4+ and Symfony 7.
Waaseyaa replaces Drupal's legacy runtime with a clean, modular architecture organized as independent Composer packages. Every subsystem — entities, fields, config, caching, routing, access control — is a standalone package with explicit interfaces, no global state, and no hidden coupling.
Features
- Entity-first architecture — Content types, users, config, and taxonomy are all entities with a unified persistence pipeline
- JSON:API + GraphQL — Dual API layer auto-generated from entity type definitions
- AI-native — Entity schemas automatically generate MCP tools, enabling AI agents to create, query, and manage content
- Modular monorepo — 52 independent packages organized in 7 architectural layers
- Nuxt 3 admin SPA — Vue 3 + TypeScript admin interface with i18n support
- In-memory testable — Every subsystem has in-memory implementations for fast, isolated testing
- Zero Drupal dependency — Clean-room implementation inspired by Drupal's entity model, built on Symfony components
Requirements
- PHP 8.4 or later
- Composer 2.x
- SQLite 3 (default) or MySQL/PostgreSQL via Doctrine DBAL
Quick Start
The composer create-project target below installs the published Waaseyaa project skeleton package (waaseyaa/waaseyaa). This repository is the waaseyaa/framework monorepo that supplies the underlying framework packages.
composer create-project waaseyaa/waaseyaa my-site
cd my-site
./vendor/bin/phpunit
bin/waaseyaa serve
The scaffold now creates tests/Unit and tests/Integration, so the default PHPUnit command is usable immediately. For static or marketing-style sites, you can start from the clean scaffold, add a SiteServiceProvider, PageController, Twig templates, and a small regression test before wiring deploy infrastructure.
Create your first content:
curl -X POST http://localhost:8080/api/note \ -H "Content-Type: application/vnd.api+json" \ -d '{ "data": { "type": "note", "attributes": { "title": "Hello, Waaseyaa", "body": "My first note." } } }'
Waaseyaa ships with a built-in core.note content type that is always available at boot. To define custom content types, see the waaseyaa/node package as a reference.
Fresh App Workflow
Use this minimal sequence for a new public-facing site:
composer create-project waaseyaa/waaseyaa my-site --stability=dev
cd my-site
./vendor/bin/phpunit
php bin/waaseyaa optimize:manifest
bin/waaseyaa serve
When turning the scaffold into a site:
- Add a failing integration test for your public routes and rendered HTML.
- Register your site provider in
composer.jsonunderextra.waaseyaa.providers. - Add your
PageController,SiteServiceProvider, shared Twig layout, and site templates. - Re-run PHPUnit and
php bin/waaseyaa optimize:manifest. - Add repo-local deployment files (
deploy.php,.github/workflows/*) only after the site passes locally.
Architecture
Waaseyaa is structured as 7 architectural layers with strict downward-only dependencies:
Layer 6 Interfaces cli, admin, admin-surface, graphql, mcp, ssr,
telescope, deployer, inertia
Layer 5 AI ai-schema, ai-agent, ai-vector, ai-pipeline
Layer 4 API api, routing
Layer 3 Services workflows, search, notification, billing, github
Layer 2 Content Types node, taxonomy, media, path, menu, note, relationship
Layer 1 Core Data entity, entity-storage, access, user, config, field, auth
Layer 0 Foundation foundation, cache, plugin, typed-data, database-legacy,
testing, i18n, queue, scheduler, state, validation,
mail, http-client, ingestion
Three meta-packages provide convenient installation:
| Meta-package | Includes |
|---|---|
waaseyaa/core |
Foundation + Core Data |
waaseyaa/cms |
Core + Content Types + API + CLI |
waaseyaa/full |
CMS + AI + GraphQL + SSR + Admin |
Entity Persistence Pipeline
All content follows a single, consistent pipeline:
Entity (extends EntityBase or ContentEntityBase)
-> EntityType registered via EntityTypeManager
-> EntityStorageDriverInterface (SqlStorageDriver)
-> EntityRepository (hydration, events, validation)
-> DatabaseInterface (Doctrine DBAL)
CLI
Waaseyaa includes a comprehensive CLI built on Symfony Console:
bin/waaseyaa install # Set up database and initial config bin/waaseyaa serve # Start the dev server bin/waaseyaa migrate # Run pending migrations bin/waaseyaa entity-type:list # List registered entity types bin/waaseyaa entity:create node # Create an entity interactively bin/waaseyaa schema:check # Detect schema drift bin/waaseyaa health:check # Run diagnostic health checks bin/waaseyaa optimize:manifest # Rebuild attribute-discovery manifest bin/waaseyaa config:export # Export config to sync directory bin/waaseyaa config:import # Import config from sync directory
Code generation scaffolding:
bin/waaseyaa make:entity # Generate a content entity class bin/waaseyaa make:entity-type # Generate an entity type class bin/waaseyaa make:policy # Generate an access policy class bin/waaseyaa make:provider # Generate a service provider class bin/waaseyaa make:migration # Generate a migration file bin/waaseyaa make:plugin # Generate a plugin class bin/waaseyaa make:listener # Generate an event listener class bin/waaseyaa make:job # Generate a queue job class
Testing
# All tests ./vendor/bin/phpunit # Unit tests only ./vendor/bin/phpunit --testsuite Unit # Integration tests only ./vendor/bin/phpunit --testsuite Integration # Single package ./vendor/bin/phpunit packages/entity/tests/ # Pattern matching ./vendor/bin/phpunit --filter EntityRepository
Code quality:
composer cs-check # Check code style (PHP-CS-Fixer dry-run) composer cs-fix # Auto-fix code style composer phpstan # Static analysis (level 5, PHPStan 2)
Key Design Principles
- No global state. Every service receives its dependencies through constructor injection.
- Interface-first. Public APIs are defined as interfaces. Implementations are swappable.
- In-memory testable. Every subsystem has in-memory implementations for fast, isolated testing.
- Layered architecture. Each layer only depends on layers below it. No circular dependencies.
- AI-native. Entity schemas automatically generate MCP tools, enabling AI agents to interact with content through structured tool calls.
Contributing
Contributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.
# Clone the repository git clone https://github.com/waaseyaa/framework.git cd framework composer install # Run the full test suite ./vendor/bin/phpunit # Check code style composer cs-check
License
GPL-2.0-or-later. See LICENSE.txt.