A release-readiness QA pass over the whole product. The commits split into defects a user would hit and gates that were reporting green while measuring nothing. ## Fixes that change behaviour Rate limiting was bypassable on every install: TRUST_PROXY defaulted to true, so request.ip came from a client-set header and a forged X-Forwarded-For got past the login limiter. The default is now a private-network trust list. A transient Postgres outage stranded in-flight jobs, leaving finished output on disk with no row pointing at it. A reconciler now resolves those rows and adopts the bytes rather than dropping the work. A Redis connection that moved to a new address wedged every read-blocked consumer, so completions stopped signalling while health still answered 200. Socket timeouts plus subscriber pings recover it. Installing more than one AI bundle left the shared venv multi-versioned and silently broke three tools. The installer now reconciles distributions to one version each. Converting an image to JXL at quality 1 through 4 returned a 500, because libjxl 0.7 rejects the distance those values compute. The quality is floored at what the encoder honours. A missing ffmpeg was also reported to the user as a corrupt upload; it now says the engine is unavailable. RAW uploads reached an unpatched LibRaw on arm64, so it is built from source at 0.22.2, and the release scan was split so it can fail on an unfixed critical instead of hiding it behind ignore-unfixed. ## Gates that could not fail Two mutation lanes ran zero mutants because Stryker crawled the gitignored docs build; coverage discarded its whole report on any failing test; the lint gate skipped root tests, scripts, and two workspaces; and several generated matrices counted a host missing ffmpeg as a passing tool. Each now measures what it claims. Full evidence and the outstanding release items are tracked locally and are not part of this branch.
7.9 KiB
description, i18n_source_hash, i18n_provenance, i18n_output_hash, i18n_hash_version
| description | i18n_source_hash | i18n_provenance | i18n_output_hash | i18n_hash_version |
|---|---|---|---|---|
| SnapOtter への貢献方法。バグ報告、機能リクエスト、プルリクエスト、CLA の要件について。 | 6c920a5f83e0 | human | 0ccc9f538229 | 2 |
貢献する
貢献に関心を持っていただきありがとうございます。このガイドでは、参加方法、受け付ける内容、そして始め方について説明します。
貢献の方法
Issue(セットアップ不要)
- バグ報告 - 何か壊れていますか?再現手順を添えて バグ報告 を作成してください。
- 機能リクエスト - アイデアがありますか?ディスカッション を始めれば、コミュニティが意見を出したり賛成票を投じたりできます。
- 翻訳の問題 - 誤った翻訳や欠落した翻訳を見つけましたか?翻訳の Issue を作成してください。
- ドキュメントの問題 - ドキュメントに問題がありますか?ドキュメントの Issue を作成してください。
コード(CLA が必要)
以下のプルリクエストを受け付けています。
| 種類 | プロセス |
|---|---|
| バグ修正 | そのまま PR を作成(該当する Issue があればリンク) |
| 新しい翻訳 | そのまま PR を作成(翻訳ガイド を参照) |
| ドキュメントの改善 | そのまま PR を作成 |
| テストカバレッジの改善 | そのまま PR を作成 |
| 新しいツールや機能 | まず ディスカッション を始めます。承認されたアイデアは、コードを書く前にメンテナが追跡用の Issue に変換します |
| リファクタリングやアーキテクチャの変更 | まず ディスカッション を始め、コードを書く前にメンテナの承認を待ちます |
受け付けないもの
- CI/CD ワークフロー、リリース設定、リンター/コンパイラ設定への変更
- 署名済みの コントリビューターライセンス契約 がない PR
- 変更が 400 行を超える PR(大きな作業は小さな PR に分割してください)
- 事前に議論・承認されていない機能
- 事前の議論なしの
packages/ai/への変更
コントリビューターライセンス契約
最初の PR をマージする前に、個人向け CLA に署名していただく必要があります。これは一度きりの要件です。
理由: SnapOtter はデュアルライセンス(AGPLv3 + 商用)です。CLA は、あなたの貢献を両方のライセンスで配布する権利を当社に付与します。あなたは自分の作業に対する著作権を完全に保持します。
方法: 最初の PR を作成すると、CLA Assistant ボットがリンク付きのコメントを投稿します。そのリンクをクリックし、契約内容を確認して、GitHub アカウントで署名してください。30 秒で完了します。
雇用主のために貢献しており、雇用主があなたの作業の IP 権利を保持している場合は、送信前に contact@snapotter.com までご連絡いただき、法人向け CLA を手配してください。
始め方
前提条件
- Node.js 22.22 以上
- pnpm 9 以上
- Python 3.11 以上(AI ツールのみ)
- Docker(オプション、完全な統合テスト用)
セットアップ
# Fork and clone
git clone https://github.com/<your-username>/snapotter.git
cd snapotter
# Start Postgres + Redis for local dev
docker compose -f docker-compose.dev.yml up -d
# Install dependencies
pnpm install
# Start dev servers (web on :1351, API on :13490)
pnpm dev
チェックの実行
PR を送信する前に、すべてのチェックがローカルで通ることを確認してください。
pnpm lint # Biome lint + format check
pnpm typecheck # TypeScript across monorepo
pnpm test # Vitest unit + integration tests
プルリクエストのプロセス
- リポジトリをフォークし、
main(feat/my-featureまたはfix/issue-123)からブランチを作成します - Conventional Commits を使って、焦点を絞ったレビューしやすいコミットで変更を加えます
- 変更に対するテストを追加または更新します
- ローカルで
pnpm lint && pnpm typecheck && pnpm testを実行します mainに対して PR を作成し、テンプレートを記入します- 求められたら CLA に署名します
- CI が通り、メンテナがレビューするのを待ちます
レビューについての期待
- PR には 7 日以内に応答することを目指しています
- 小さく焦点を絞った PR ほど早くレビューされます
- 7 日経っても返事がない場合は、スレッドに一言コメントしてください
- 変更を依頼したり、別のアプローチを提案したり、プロジェクトの方向性に沿わない場合は PR をクローズしたりすることがあります
PR がマージされた後
あなたの貢献は次のリリースに含まれ、変更履歴にクレジットされます。
Good first issue
取り組めるものを探していますか?初心者向けのタスクは good first issues を、コミュニティの協力を歓迎するより大きな項目は help wanted を確認してください。
コードスタイル
- Biome がフォーマットとリントを担当します(ダブルクォート、セミコロン、2 スペースインデント)
- pre-commit フックがステージされたファイルに対して
biome check --writeを自動的に実行します - リンターが警告した場合は、コードを修正してください(Biome の設定は変更しないでください)
- すべての場所で ES モジュール(
import/export) - Conventional Commits:
feat:、fix:、refactor:、docs:、test:、chore:
アーキテクチャの詳細については、開発者ガイド を参照してください。
セキュリティ
セキュリティ脆弱性については、公開の PR や Issue を作成しないでください。 GitHub Security Advisories を通じて非公開で報告するか、contact@snapotter.com までメールしてください。詳細は SECURITY.md を参照してください。