waaseyaa / framework
Waaseyaa monorepo — a modern, entity-first, AI-native CMS
Requires
- php: >=8.5 <8.6
- ext-pdo_sqlite: *
- ext-sodium: *
- ext-sqlite3: *
- dragonmantank/cron-expression: ^3.0
- symfony/console: ^8.0
- symfony/dotenv: ^8.0
- symfony/html-sanitizer: ^8.0
- waaseyaa/access: v0.1.0-alpha.300
- waaseyaa/admin-surface: v0.1.0-alpha.300
- waaseyaa/ai-pipeline: v0.1.0-alpha.300
- waaseyaa/ai-schema: v0.1.0-alpha.300
- waaseyaa/ai-tools: v0.1.0-alpha.300
- waaseyaa/ai-vector: v0.1.0-alpha.300
- waaseyaa/analytics: v0.1.0-alpha.300
- waaseyaa/api: v0.1.0-alpha.300
- waaseyaa/attachment: v0.1.0-alpha.300
- waaseyaa/auth: v0.1.0-alpha.300
- waaseyaa/billing: v0.1.0-alpha.300
- waaseyaa/bimaaji: v0.1.0-alpha.300
- waaseyaa/cache: v0.1.0-alpha.300
- waaseyaa/cli: v0.1.0-alpha.300
- waaseyaa/config: v0.1.0-alpha.300
- waaseyaa/database-legacy: v0.1.0-alpha.300
- waaseyaa/debug: v0.1.0-alpha.300
- waaseyaa/deployer: v0.1.0-alpha.300
- waaseyaa/entity: v0.1.0-alpha.300
- waaseyaa/entity-storage: v0.1.0-alpha.300
- waaseyaa/error-handler: v0.1.0-alpha.300
- waaseyaa/field: v0.1.0-alpha.300
- waaseyaa/foundation: v0.1.0-alpha.300
- waaseyaa/frankenphp: v0.1.0-alpha.300
- waaseyaa/geo: v0.1.0-alpha.300
- waaseyaa/github: v0.1.0-alpha.300
- waaseyaa/graphql: v0.1.0-alpha.300
- waaseyaa/groups: v0.1.0-alpha.300
- waaseyaa/http-client: v0.1.0-alpha.300
- waaseyaa/i18n: v0.1.0-alpha.300
- waaseyaa/inertia: v0.1.0-alpha.300
- waaseyaa/ingestion: v0.1.0-alpha.300
- waaseyaa/listing: v0.1.0-alpha.300
- waaseyaa/mail: v0.1.0-alpha.300
- waaseyaa/media: v0.1.0-alpha.300
- waaseyaa/menu: v0.1.0-alpha.300
- waaseyaa/mercure: v0.1.0-alpha.300
- waaseyaa/migration: v0.1.0-alpha.300
- waaseyaa/node: v0.1.0-alpha.300
- waaseyaa/note: v0.1.0-alpha.300
- waaseyaa/notification: v0.1.0-alpha.300
- waaseyaa/oauth-provider: v0.1.0-alpha.300
- waaseyaa/page-builder: v0.1.0-alpha.300
- waaseyaa/path: v0.1.0-alpha.300
- waaseyaa/plugin: v0.1.0-alpha.300
- waaseyaa/publishing: v0.1.0-alpha.300
- waaseyaa/queue: v0.1.0-alpha.300
- waaseyaa/relationship: v0.1.0-alpha.300
- waaseyaa/routing: v0.1.0-alpha.300
- waaseyaa/scheduler: v0.1.0-alpha.300
- waaseyaa/search: v0.1.0-alpha.300
- waaseyaa/seo: v0.1.0-alpha.300
- waaseyaa/site-contract: v0.1.0-alpha.300
- waaseyaa/ssr: v0.1.0-alpha.300
- waaseyaa/state: v0.1.0-alpha.300
- waaseyaa/structured-import: v0.1.0-alpha.300
- waaseyaa/taxonomy: v0.1.0-alpha.300
- waaseyaa/telescope: v0.1.0-alpha.300
- waaseyaa/typed-data: v0.1.0-alpha.300
- waaseyaa/user: v0.1.0-alpha.300
- waaseyaa/validation: v0.1.0-alpha.300
- waaseyaa/workflows: v0.1.0-alpha.300
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.50
- infection/infection: ^0.34
- nesbot/carbon: ^3.0
- opis/json-schema: ^2.6
- phpstan/phpstan: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^13.0
- sendgrid/sendgrid: ^8.1
- shipmonk/composer-dependency-analyser: ^1.8
- shipmonk/dead-code-detector: ^1.1
- symfony/filesystem: ^8.0
- symfony/process: ^8.0
- waaseyaa/ai-agent: v0.1.0-alpha.300
- waaseyaa/ai-observability: v0.1.0-alpha.300
- waaseyaa/engagement: v0.1.0-alpha.300
- waaseyaa/genealogy: v0.1.0-alpha.300
- waaseyaa/mcp: v0.1.0-alpha.300
- waaseyaa/messaging: v0.1.0-alpha.300
- waaseyaa/oidc: v0.1.0-alpha.300
- waaseyaa/testing: v0.1.0-alpha.300
- waaseyaa/wayfinding: v0.1.0-alpha.300
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v0.1.0-alpha.300
- v0.1.0-alpha.299
- v0.1.0-alpha.298
- v0.1.0-alpha.297
- v0.1.0-alpha.296
- v0.1.0-alpha.295
- v0.1.0-alpha.294
- v0.1.0-alpha.293
- v0.1.0-alpha.292
- v0.1.0-alpha.291
- v0.1.0-alpha.290
- v0.1.0-alpha.289
- v0.1.0-alpha.288
- v0.1.0-alpha.287
- v0.1.0-alpha.286
- v0.1.0-alpha.285
- v0.1.0-alpha.284
- v0.1.0-alpha.283
- v0.1.0-alpha.282
- v0.1.0-alpha.281
- v0.1.0-alpha.280
- v0.1.0-alpha.279
- v0.1.0-alpha.278
- v0.1.0-alpha.277
- v0.1.0-alpha.276
- v0.1.0-alpha.275
- v0.1.0-alpha.274
- v0.1.0-alpha.273
- v0.1.0-alpha.272
- v0.1.0-alpha.271
- v0.1.0-alpha.270
- v0.1.0-alpha.269
- v0.1.0-alpha.268
- v0.1.0-alpha.267
- v0.1.0-alpha.266
- v0.1.0-alpha.265
- v0.1.0-alpha.264
- v0.1.0-alpha.263
- v0.1.0-alpha.262
- v0.1.0-alpha.261
- v0.1.0-alpha.260
- v0.1.0-alpha.259
- v0.1.0-alpha.258
- v0.1.0-alpha.257
- v0.1.0-alpha.256
- v0.1.0-alpha.255
- v0.1.0-alpha.254
- v0.1.0-alpha.253
- v0.1.0-alpha.252
- v0.1.0-alpha.251
- v0.1.0-alpha.250
- v0.1.0-alpha.249
- v0.1.0-alpha.248
- v0.1.0-alpha.247
- v0.1.0-alpha.246
- v0.1.0-alpha.245
- v0.1.0-alpha.244
- v0.1.0-alpha.243
- v0.1.0-alpha.242
- v0.1.0-alpha.241
- v0.1.0-alpha.240
- v0.1.0-alpha.239
- v0.1.0-alpha.238
- v0.1.0-alpha.237
- v0.1.0-alpha.236
- v0.1.0-alpha.235
- v0.1.0-alpha.234
- v0.1.0-alpha.233
- v0.1.0-alpha.232
- v0.1.0-alpha.231
- v0.1.0-alpha.230
- v0.1.0-alpha.229
- v0.1.0-alpha.228
- v0.1.0-alpha.227
- v0.1.0-alpha.226
- v0.1.0-alpha.225
- v0.1.0-alpha.224
- v0.1.0-alpha.223
- v0.1.0-alpha.222
- v0.1.0-alpha.221
- v0.1.0-alpha.220
- v0.1.0-alpha.219
- v0.1.0-alpha.218
- v0.1.0-alpha.217
- v0.1.0-alpha.216
- v0.1.0-alpha.215
- v0.1.0-alpha.214
- v0.1.0-alpha.213
- v0.1.0-alpha.212
- v0.1.0-alpha.211
- v0.1.0-alpha.210
- v0.1.0-alpha.209
- v0.1.0-alpha.208
- v0.1.0-alpha.207
- v0.1.0-alpha.206
- v0.1.0-alpha.205
- v0.1.0-alpha.204
- v0.1.0-alpha.203
- v0.1.0-alpha.202
- v0.1.0-alpha.201
- v0.1.0-alpha.200
- v0.1.0-alpha.199
- v0.1.0-alpha.198
- v0.1.0-alpha.197
- v0.1.0-alpha.196
- v0.1.0-alpha.195
- v0.1.0-alpha.194
- v0.1.0-alpha.193
- v0.1.0-alpha.192
- v0.1.0-alpha.191
- v0.1.0-alpha.190
- v0.1.0-alpha.189
- v0.1.0-alpha.188
- v0.1.0-alpha.187
- v0.1.0-alpha.186
- v0.1.0-alpha.185
- v0.1.0-alpha.184
- v0.1.0-alpha.183
- v0.1.0-alpha.182
- v0.1.0-alpha.181
- v0.1.0-alpha.180
- v0.1.0-alpha.179
- v0.1.0-alpha.178
- v0.1.0-alpha.177
- v0.1.0-alpha.176
- v0.1.0-alpha.175
- v0.1.0-alpha.174
- v0.1.0-alpha.173
- v0.1.0-alpha.172
- v0.1.0-alpha.171
- v0.1.0-alpha.170
- v0.1.0-alpha.144
- v0.1.0-alpha.143
- v0.1.0-alpha.142
- v0.1.0-alpha.141
- dev-fix/2786-schema-authority
- dev-docs/2643-oidc-status-claude
- dev-docs/2636-2638-stale-spec-deferrals
- dev-fix/2542-provenance-nfr-measures-work
- dev-feat/2544-legacy-password-upgrade
- dev-fix/2517-agent-asset-authorization
- dev-fix/2553-lossless-mutation-echo
- dev-fix/2561-mcp-error-code-allocation
- dev-fix/2594-route-declared-refusal-envelope
- dev-feat/2596-dev-runtime-consumer
- dev-feat/2591-split-main-media
- dev-fix/2161-admin-surface-refusal-wire-status
This package is auto-updated.
Last update: 2026-09-02 16:15:16 UTC
README
Governance: see MAINTAINERS.md for the current maintainer roster and SUCCESSION.md for the framework's continuity plan across Tiers 0–4.
A modern, entity-first, AI-native content management framework built on PHP 8.5 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 — 62 active packages (plus 3 meta-packages:
core,cms,full) organized in 7 architectural layers; see CLAUDE.md for the full layer table - 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.5 <8.6(latest available 8.5 patch) ext-sodium(required transitively bywaaseyaa/oidc→lcobucci/jwtfor JWT signing)- exact Composer 2.x feature line recorded in the S1 contract (currently 2.10)
- SQLite
>=3.40 <4for the S1 profile
S1 is one application node with one authoritative SQLite database on a local,
non-network filesystem. An optional second SQLite file may hold only a
non-authoritative, rebuildable search projection. File connections verify WAL,
foreign keys, and a 5000 ms busy timeout. Invalid DSN, URI, UNC, and device
paths fail with S1-DB001; production refuses :memory:.
The complete boundaries are S1 support and lifecycle and the S1 SQLite topology. S1 consumer certification is still pending its named downstream evidence. H1, MySQL/PostgreSQL, remote/shared filesystems, WebKit/Safari, and unlisted web runtimes are not supported claims.
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 and AI coding agents should follow the anchor-issue + design-first workflow: multi-PR efforts open a GitHub anchor issue, and design/specs land in docs/specs/ before implementation. Human-oriented entry points: CLAUDE.md and AGENTS.md.
- PRs: Fill
.github/pull_request_template.md—Closes #NorPart of #N, with#Nin the title. - GitHub issues: Lightweight — no enforced milestone or taxonomy. M11 governed work still uses the governed-change template as the filing front door.
# 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.