This file provides guidance to AI coding assistants working with code in this repository.
composer i
npm ciSee package.json scripts for all available commands (build, dev, watch, lint, stylelint, test:unit, test:e2e, etc.).
Available composer commands:
composer cs:check # Check code style
composer cs:fix # Fix code style
composer psalm # Run static analysis
composer test:unit # Run unit tests
composer test:integration # Run integration tests
composer openapi # Generate OpenAPI specSee composer.json for all available commands.
- Backend: PHP (see
appinfo/info.xmlfor version requirements), Nextcloud app framework, Horde IMAP/MIME/SMTP libraries. Namespace:OCA\Mail\. - Frontend: Vue 2, Pinia, Vue Router 3, CKEditor 5, bundled with webpack.
Layered: Controllers → Services → DB Mappers.
Controller/— Thin HTTP handlers; business logic lives in services.Service/— Core logic. Key areas: account management, IMAP sync, mail sending (SMTP), drafts/outbox, S/MIME encryption, ML-based importance classification, AI integrations (thread summaries, follow-up detection).Db/— NextcloudQBMapper-based mappers and entity models.IMAP/— Low-level IMAP via Horde.IMAPClientFactorycreates authenticated clients;MessageMapperfetches raw messages.BackgroundJob/— Nextcloud background jobs for IMAP sync, ML training, outbox sending, etc.Listener/— Event listeners hooked to domain events fromlib/Events/.Contracts/— Interfaces defining main service boundaries (IMailManager,IMailTransmission, etc.).Migration/— Database migrations.
Single-page Vue 2 app. All routes render through views/Home.vue.
store/mainStore.js— Central Pinia store (accounts, mailboxes, messages, preferences), split intoactions.jsandgetters.js. Separate stores for outbox and mail filters.service/— JS services that call the PHP REST API.components/— Vue components (composer, envelope list, thread view, settings, etc.).router.js— Routes for mailbox, thread, outbox, and setup views.
- Registration:
appinfo/info.xmlregisters background jobs, CLI commands, settings pages, navigation entries, and repair steps.AppInfo/Application.phpregisters event listeners and other services via the Nextcloud bootstrap API. - Events: Domain events in
lib/Events/are dispatched after state changes;lib/Listener/reacts to them. - Mozart: Some vendor packages are namespaced into
lib/Vendor/to avoid conflicts. - REUSE & SPDX: Every file requires an SPDX license header. New files must use
AGPL-3.0-or-later, neverAGPL-3.0-only. Header format:/* * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */
- OpenAPI:
ResponseDefinitions.phpdocuments API types; runcomposer openapito regenerate the spec.
Located in tests/Unit/ with structure mirroring lib/.
- Use arrange-act-assert structure with blank lines separating each phase (no literal comments)
- Mock dependencies via
$this->createMock(Interface::class) - Setup mocks in
setUp()for common fixtures
composer test:unit # Run all unit tests
composer test:unit -- tests/Unit/Service/HtmlTest.php # Run specific test file
composer test:unit -- --filter="TestClassName" # Run tests matching filterDo NOT commit changes unless explicitly asked to do so.
After completing code changes:
- Verify your work is complete and tests pass
- Make sure there is no trailing whitespace
- Leave changes in working directory or staged (do not commit)
- Provide a summary of what was changed and why
- Suggest a commit message using Conventional Commits format
- There is a contributing doc with suggestions
- The user will review and commit when ready
All commits must include two lines at the end:
- Agent/model attribution:
AI-assisted: <agent> (model) - DCO sign-off: Use
git commit -sto add automatically
When committing, use: git commit -m "message" -s
This ensures the sign-off includes your configured Git user email.
Example:
fix(deps): Update package dependencies
- Updated package X to latest stable version
- Verified all tests pass
AI-assisted: OpenCode (Claude Haiku 4.5)
Signed-off-by: Name <email>