Files
wehub-resource-sync 6c9c7fe7f3
CI / integration tests (3.13) (push) Failing after 1s
Commit lint / pull request title (push) Has been skipped
Docs / links (push) Failing after 1s
CI / unit tests (3.13) (push) Failing after 1s
CI / lint (push) Failing after 1s
CI / integration tests (push) Failing after 1s
CI / package build (push) Failing after 1s
Commit lint / commit messages (push) Failing after 1s
CI / unit tests (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:24:24 +08:00

114 lines
5.0 KiB
Markdown

# Engineering Reference
> Companion docs: system design lives in [architecture.md](architecture.md);
> coding rules live in [../.claude/rules/](../.claude/rules/). This document
> is the contributor-facing reference for **building, testing, and shipping**
> a change — the toolchain, the CI gates, and the branch / commit conventions
> your pull request must satisfy.
## Toolchain
| Tool | Role |
|---|---|
| [uv](https://docs.astral.sh/uv/) | sole package manager (`uv sync`; do not use `pip install`) |
| [hatchling](https://hatch.pypa.io/) | wheel build backend (src layout under `src/everos`) |
| [ruff](https://docs.astral.sh/ruff/) | lint + format (replaces black / isort / flake8) |
| [import-linter](https://import-linter.readthedocs.io/) | enforces the DDD layer dependency direction |
| [pytest](https://docs.pytest.org/) | unit + integration tests |
| [pre-commit](https://pre-commit.com/) | local gate run before each commit |
| `Makefile` | single entry point for every command — CI invokes the same targets |
All tool configuration lives in a single `pyproject.toml` (ruff, pytest,
coverage, and the import-linter layer contracts) — there are no separate
`pylintrc` / `pytest.ini` / `.isort.cfg` files.
## Local development
```bash
make install # uv sync --frozen
make format # ruff fix + format
make lint # ruff check + format-check + import-linter + datetime/asset/name guards
make test # pytest tests/unit
make integration # pytest tests/integration
make cov # unit + integration with coverage (gate: 80%)
make ci # lint + test + integration — run this before pushing
make help # list every target
```
CI runs the **same** `make` targets, so a green `make ci` locally predicts a
green pipeline.
### Configuration
Settings load in ascending priority:
1. `src/everos/config/default.toml` — shipped with the package (lowest)
2. `<memory-root>/everos.toml` — user config (optional)
3. `EVEROS_*` environment variables (highest)
Run `everos init` to generate starter config and `everos config show` to
inspect the effective result. Full reference: [configuration.md](configuration.md).
## Quality gates
Each stage can independently fail a change; there is no `--no-verify` bypass.
```
1. Editor ruff (lint + format) on save
2. pre-commit ruff, trailing-whitespace / EOF, yaml & toml checks,
large-file & private-key guards, merge-conflict check,
and gitlint (commit-msg stage) — see "Commits" below
3. make ci lint + unit + integration — run before pushing
4. GitHub CI re-runs the same make targets on every pull request
5. Review 1 approval + all conversations resolved + all checks green
```
## Continuous integration
CI runs on GitHub Actions ([.github/workflows/](../.github/workflows/)). Every
pull request into `main` must pass:
| Check | Command | Guards |
|---|---|---|
| lint | `make lint` | ruff style, DDD layer direction (import-linter), datetime discipline, asset & deprecated-name guards |
| unit tests | `make test` | `tests/unit` |
| integration tests | `make integration` | `tests/integration` |
| package build | `make package` | the wheel builds and imports cleanly |
| docs | `make docs-check` | Markdown and internal-link validity |
| commit messages / PR title | `make check-commits` / `make check-pr-title` | Conventional Commits format |
`main` is a protected branch: no direct pushes; changes land through a
reviewed pull request with all checks green.
## Contributing workflow
- **Branch** off `main`, then open a pull request back into `main`.
- **Commits and the PR title** follow
[Conventional Commits](https://www.conventionalcommits.org/): `type(scope): subject`,
with the subject ≤ 72 characters and no leading emoji. Allowed types:
`feat`, `fix`, `refactor`, `test`, `docs`, `style`, `perf`, `chore`,
`build`, `ci`, `revert`. This is enforced both locally (gitlint, commit-msg
stage) and in CI.
- **Pull requests** use [.github/PULL_REQUEST_TEMPLATE.md](../.github/PULL_REQUEST_TEMPLATE.md)
(changes / scope / API impact / tests / checklist).
- **Issues** use the templates under [.github/ISSUE_TEMPLATE/](../.github/ISSUE_TEMPLATE/).
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full onboarding walkthrough.
> This repository also ships Claude Code configuration — coding rules under
> `.claude/rules/` and slash-command workflows under `.claude/skills/` — that
> encode the conventions above. It is optional convenience tooling: using
> Claude Code is not required to contribute, and the CI gates remain the
> source of truth.
## References
- Architecture: [architecture.md](architecture.md)
- Coding rules: [../.claude/rules/](../.claude/rules/)
- Contributor onboarding: [../CONTRIBUTING.md](../CONTRIBUTING.md)
- [uv](https://docs.astral.sh/uv/) ·
[ruff](https://docs.astral.sh/ruff/) ·
[import-linter](https://import-linter.readthedocs.io/) ·
[pre-commit](https://pre-commit.com/) ·
[Conventional Commits](https://www.conventionalcommits.org/)