Implement the CORE feature area as standard QQQ tables: site, domain, redirect, redirect type, page, page type, page section, page section type, snippet, menu and menu item. Add the CMS app with Sites, Pages and Navigation homes, CmsFeature flags with dependency validation, per-table permissions with CmsRole bundles and openReads, a startup schema check (FAIL_FAST, DEGRADED, SKIP), a prefix-parameterized Liquibase changelog and the Postgres DDL. Add unit tests, Postgres-backed Testcontainers install and runtime-identity tests, and a local demo server used to produce the docs screenshots. Build against the published QQQ 4.1 BOM (4.1.0-RC.21), add the test-scope Postgres, Javalin, frontend-next and Testcontainers dependencies, and enforce checkstyle at validate. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
3.1 KiB
CLAUDE.md
This file provides guidance to Claude Code when working with code in this repository.
Project Overview
QBit CMS: QQQ QBit: a headless CMS (sites, pages, menus, blog, media, projects, photos and publishing) as standard QQQ tables, extracted from the kof22 website. Design: QRun-IO/qqq#1083 (decisions D1 to D17, all accepted). Implementation in progress.
Build Commands
./mvnw compile # Compile (always use the wrapper: Maven 3.10 cannot read the parent POM)
./mvnw test # Unit tests
./mvnw verify # Unit tests + JaCoCo gate (70% instructions, 90% classes)
Architecture
Entry point: CmsQBitProducer implements QBitMetaDataProducer<CmsQBitConfig> in com.kingsrook.qbits.cms. The producer builds every table, possible-value source, app and widget itself (no package scanning); CmsFeature flags switch feature areas on and off. The schema is a prefix-parameterized Liquibase changelog the host includes and runs (src/main/resources/qbit-cms/db/changelog/); the qbit never runs DDL.
Packages:
CmsQBitConfig,CmsFeature,CmsTables(logical names and table definitions),CmsRuntime,CmsSchemaCheck(startup check),CmsStartupMode.core/model: CORE entities. TheirTABLE_NAMEand possible-value source names are logical; the builder adds the prefix.metadata:CmsTableBuilder(tables, possible values, joins, child lists, associations, permission rules),CmsAppBuilderandCmsAreas(apps and homes).home:CmsHomeRendererandCmsHtml(one renderer for every home; reads run withPermissionEnforcement.ENFORCE).security:CmsRole,CmsSecurity,CmsOpenReadsPermissionChecker.- Schema:
src/main/resources/qbit-cms/db/changelog/qbit-cms.changelog.yaml. Its changesets are append-only once released, anddocs/ddl/postgres.sqlis generated from it.
Naming (owner rule)
- Tables are lowercase snake_case prefixed with the full qbit name:
cms_<name>. The QQQ table name and the backend (SQL) name are identical; possible-value sources take the table name. - Permissions use the full qbit name:
cms.<table>.<action>andcms.<action>(for examplecms.cms_page.edit,cms.publish). - Qbit data lives in standard, visible QQQ tables, secured by permissions and record security locks, never hidden.
- Processes run as table or record actions, never in the nav.
Code Style
- 3-space indentation, opening braces on the next line,
return (x);. - Javadoc flower-box comments (
/*****with**lines) on every class and method. - Fluent setters (
withX()). - Wrapper types (
Integer,Boolean) in config and entities.
Dependencies
- Java 21.
- Parent
com.kingsrook:qbit-build-parent:2.0.0(qqq 4.0.0). The default-activeqqq-snapshotprofile importsqqq-bom-pom:4.1.0-RC.4ahead of it, as in qbit-quick-search (ADR-0007). Remove that activation when the parent moves to 4.1. - Tests: JUnit 5, AssertJ.
Release
- CircleCI qqq-orb 0.6.8.
developpublishes SNAPSHOTs.- A
release/*branch publishes RCs (the orb bumps the version). - A
v*tag publishes the release.