한국어 | English
Thanks for your interest! AI-assisted contributions (issue creation, coding, reviews) are welcome.
git clone --recurse-submodules https://github.com/DanMeon/rhwp-python.git
cd rhwp-python
uv sync --no-install-project --group all
uv run maturin develop --release
uv run pytest tests/ -m "not slow"If those four commands succeed, you're ready to make changes. Branch off main, commit (Conventional Commits), push, open a PR.
Already cloned without submodules? Run git submodule update --init --recursive.
| You want to... | Also read | Notes |
|---|---|---|
| Fix a bug / add a test | — | Most common path — open PR against main |
| Add a Python API or LangChain feature | AGENTS.md (project rules) | Larger features may need a spec doc — ask in an issue first |
| Change the Rust core / parser | — | File an issue at edwardkim/rhwp; this repo only wraps |
| Edit existing documentation | docs/CONVENTIONS.md | A docs/*.md edit triggers lint auto via Claude Code hook (and CI). Don't touch frontmatter last_updated by hand — the hook does that |
| Add a new version spec | docs/CONVENTIONS.md | Use /new-spec <vX.Y.Z> <topic> Claude Code skill, or scaffold manually following CONVENTIONS § 새 spec 추가 절차 |
90%+ of PRs are the first row — you don't need to read the spec system policy.
All of these run in CI; running locally first saves a round trip:
uv run pytest tests/ -m "not slow"— must pass (use-m slowfor PDF tests)uv run ruff check python/ tests/ benches/— must passuv run pyright python/ tests/— must pass- After Rust changes (
src/*.rs): re-runuv run maturin develop --releasebefore pytest, pluscargo clippy --all-targets -- -D warnings - Docs touched?
uv run --no-project --with "typer>=0.12" python scripts/lint_docs.py docs/(also runs in CI asDocs lint)
- Python 3.10+,
T | None(notOptional[T]), PEP 561 typed - Rust 1.83+ (PyO3 0.28 MSRV). No new
unsafein the bindings layer
- Branch naming: PATCH =
<type>/<topic>(short-lived, merges tomain, e.g.fix/empty-paragraph). MINOR =feature/vX.Y.0(long-lived, isolates external contract changes across stages).<type>follows Conventional Commits (fix/chore/refactor/docs/build/ci/perf/test/revert) - Commit subject: lowercase
<type>: <description> - PR body follows .github/pull_request_template.md — Summary / Why / Related Issues
- Keep PRs focused — one feature or fix per PR
- For changes touching rhwp Rust core, open an issue on edwardkim/rhwp first; this repo only adds bindings
- Project rules + architecture: AGENTS.md — same content as
CLAUDE.md(symlink). Async patterns, GIL release rules, extras-gated test counting, etc. - Documentation policy: docs/CONVENTIONS.md — lifecycle (Living/Active/Draft/Frozen/Superseded), frontmatter schema, EARS notation, supersede chain
- Active spec index: docs/roadmap/README.md — what's GA, what's in progress, what's planned
- Upstream commit pin per release: the git submodule itself is authoritative —
git ls-tree <tag> external/rhwp, plus the prose note in CHANGELOG