Before jumping in, please open a discussion to talk through the idea first. It helps make sure it fits the project and avoids wasted time or overlap. The goal is to keep the project simple to run and easy to use with each release, so it's important to think carefully about each new feature.
When suggesting or submitting new features, consider whether they’re likely to be useful to others. Open source projects often serve a wide range of users with different needs. Try to think beyond your own use case.
- Pull requests should target the
devbranch - Changes must pass the full test suite before being reviewed
- One pull request per feature or fix
- Update documentation if your change affects how the project is used
- Add tests for any new features
- Use clear, focused commits with meaningful messages
- Follow the existing coding style
Please run composer ci before you open a pull request. It is the same command CI runs, so if it passes locally it should pass there too.
It bundles a few things:
composer rectorandcomposer pintcheck code stylecomposer phpcschecks PSR-12composer phpstanruns static analysis (level 10)composer test:type-coverageruns the type coverage tests (100% required)composer testruns the Pest test suite
If style checks complain, composer fix will fix what it can automatically. To run just the tests, use composer test.
CI runs all three of these, so please run them before you open a pull request:
npm run lintfor ESLintnpm run formatfor Prettiernpm run typecheckfor TypeScript and Vue types
The first two have a matching fix command: npm run lint:fix and npm run format:fix.
If typecheck says it cannot find @/actions/... or @/routes/..., run npm run build to generate them.
ESLint takes care of two things for you. Blocks go in the order <script>, <template>, <style>. Compiler macros go at the top of <script setup>, in this order: defineOptions, defineModel, defineProps, defineEmits, defineSlots. defineExpose goes last, at the bottom of the block.
Below the macros, we group declarations so that nothing depends on something declared further down:
- Compiler macros:
defineProps,defineEmits,defineModel - Injected context:
usePage(),inject(),useSlots() - Pinia stores:
useVaultStore(),useLayoutStore() - Shared composables:
useModalManager(),useToast(),useScreenSize() - Local state:
ref(),reactive(), template refs,useRequest() - Derived state:
computed()and plain derived constants - Functions and event handlers
- Watchers
- Lifecycle hooks:
onMounted(),onUnmounted() provide()anddefineExpose()
Steps 2 to 10 are a convention rather than a lint rule, so it is something to watch for in review. Sometimes the order genuinely cannot work and that is fine.
- Fork the repository
- Create a new branch from
dev - Make your changes with focused commits
- Add tests, run
composer test, and make sure it passes - Submit a pull request to the
devbranch
As the maintainer, it is my responsibility to ensure that all submissions meet the project's quality standards and goals. If you are contributing, I assume good intent and hope for straightforward and constructive interactions.