Thanks for your interest in this Claude Code skill. This document covers the conventions used in the repo so contributions land cleanly.
.claude-plugin/marketplace.json Marketplace catalog
plugins/laravel-spatie-event-sourcing/.claude-plugin/plugin.json Plugin manifest
plugins/laravel-spatie-event-sourcing/skills/laravel-spatie-event-sourcing/
The skill itself (SKILL.md, references, stubs, scripts)
examples/ Worked examples
docs/ Human-readable documentation
scripts/ Repo-level scripts (e.g. build-skill.sh)
.github/workflows/ CI
See CLAUDE.md for a fuller architectural overview.
- Fork and branch from
main. - Make your changes (see conventions below).
- Open a pull request. CI will run
shellcheckon any.shchanges automatically. - Update
CHANGELOG.mdunder[Unreleased]— every notable change must be tracked.
Direct pushes to main are reserved for maintainers and should still go through PRs whenever practical.
Stubs in assets/templates/*.stub and the patterns documented in references/tdd-patterns.md (and other reference files) must stay in sync. If you change a test pattern in a reference file, update the corresponding stub, and vice versa. This is mandated in CLAUDE.md and is the kind of drift that breaks code generation silently.
These are the rules the skill enforces and that any contribution touching them should preserve:
- Events use past-tense names (
OrderPlaced, notOrderUpdated). - One reactor per side effect.
- Projectors are sync by default; only opt into queued projectors when there's a clear reason.
- Tests are written first (TDD). Stub additions should ship with a matching test pattern.
- Generated code lives under
app/Domain/<Context>/in the target project.
Keep plugins/laravel-spatie-event-sourcing/skills/laravel-spatie-event-sourcing/SKILL.md under 500 lines. Detail belongs in references/; the main file is a prompt, not a manual.
Format:
type: short subject line (max 50 chars)
Detailed body paragraph explaining what and why (not how).
Rules:
- First line under 50 characters.
- Use a heredoc for multi-line commit messages.
- Never include "Generated with Claude Code", "Co-Authored-By: Claude", or any other Claude attribution in commits, PR descriptions, or release notes.
- Follows Keep a Changelog.
- Add entries under
[Unreleased]as you go. - On release, the maintainer renames
[Unreleased]to[X.Y.Z] - YYYY-MM-DDand starts a fresh empty[Unreleased]section above it.
- Ensure
[Unreleased]reflects everything in the release. - Run
scripts/build-skill.shand verifygit statusis clean (no stale.skill). - Rename
[Unreleased]→[X.Y.Z] - YYYY-MM-DDinCHANGELOG.md. - Commit, then
git tag -a vX.Y.Z -m "..."andgit push --tags. - The
releaseworkflow rebuilds.skilland attaches it to the GitHub release automatically.
Pre-release tags (-rc, -beta, -alpha suffix) are auto-marked as pre-releases on GitHub.
Before pushing:
scripts/build-skill.sh— rebuilds the.skillarchive; verify it still matches the canonical skill contents underplugins/.claude plugin validate . --strictandclaude plugin validate ./plugins/laravel-spatie-event-sourcing --strict— validate the marketplace and plugin manifests.shellcheck scripts/build-skill.sh plugins/laravel-spatie-event-sourcing/skills/laravel-spatie-event-sourcing/scripts/verify-setup.sh— if you haveshellcheckinstalled locally. CI runs this for you on*.shchanges either way.
The evals/evals.json file defines expected skill behavior. There is currently no automated eval runner — evals are read by humans (and Claude) as a behavioral contract. An eval runner is on the backlog; contributions welcome.
Open a GitHub issue if anything in this document is unclear or out of date.