git checkout develop && git pull
git checkout -b feature/my-feature
# make changes, commit, push
git push -u origin feature/my-feature
# open PR targeting develop
| Prefix | Use for |
|---|---|
feature/{name} |
New features |
fix/{name} |
Bug fixes |
docs/{name} |
Documentation changes |
Marko uses Conventional Commits.
<type>[(<scope>)][!]: <description>
| Type | Purpose |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation |
refactor |
Code restructure, no behavior change |
test |
Tests only |
ci |
CI/CD configuration |
chore |
Build, deps, maintenance |
Append ! for breaking changes: feat(auth)!: remove legacy driver.
- Title must follow commit format — e.g.
feat(cache): add Redis driver - Reference issues with
Closes #Nin the PR body - All tests must pass:
./vendor/bin/pest --parallel - Lint must pass:
./vendor/bin/phpcs
Labels are applied automatically from the PR title prefix:
| Prefix | Label |
|---|---|
fix |
bug |
feat |
enhancement |
docs |
documentation |
refactor |
refactor |
test |
testing |
ci |
ci |
chore |
maintenance |
type! |
breaking (added alongside type label) |
From a clean develop branch:
./bin/release.sh <version> # e.g. ./bin/release.sh 1.2.0The script handles everything: merges develop into main, runs tests, tags, pushes, creates a GitHub Release with auto-generated notes, and returns develop to sync with main. Version format is X.Y.Z — no v prefix.
See .claude/code-standards.md for PHP-specific conventions (strict types, constructor promotion, type declarations, etc.).