Nitpicker へのコントリビューションを歓迎します。
# リポジトリをクローン
git clone https://github.com/d-zero-dev/nitpicker.git
cd nitpicker
# 依存関係をインストール(Yarn のみ使用、npm 厳禁)
corepack enable
yarn install --immutable
# 全パッケージをビルド
yarn build
# テスト実行
yarn test- Node.js 24 以上(Volta でバージョン管理推奨)
- Yarn 4.x(
corepack enableで自動有効化) - npm は使用しない: すべてのコマンドは
yarn経由で実行
mainブランチから feature ブランチを作成- ブランチ名:
feat/機能名,fix/バグ名,docs/ドキュメント名
- パッケージディレクトリに
cdしない: 常にリポジトリルートからコマンドを実行 - ビルドは
yarn buildのみ:npx tsc,yarn tsc等は禁止 - 対象を限定した操作: ビルド検証は
yarn buildで全パッケージ一括実行
# 全パッケージビルド
yarn build
# ユニットテスト
yarn test
# E2E テスト
yarn vitest run --config vitest.e2e.config.ts
# lint
yarn lint:checkConventional Commits に準拠:
feat(crawler): add retry logic for failed requests
fix(core): prevent analyze results from being silently empty
docs: update README with new CLI options
.commitlintrc で設定されていますが、現在 Git フックには組み込まれていません。CI やレビュー時にコミットメッセージを確認してください。
- 1ファイル1エクスポート: エクスポートする関数/クラスは1つのみ
index.ts禁止: モジュールの公開はpackage.jsonのexportsフィールドで行う- 型は
types.tsに集約: ドメインごとに専用types.tsを作成
- JSDoc 必須: すべての公開関数、クラス、interface、type に JSDoc を記述
interface優先:typeはユニオン型・交差型などtypeでしか定義できない場合のみ- パラメータ3つ以上: 名前付きオブジェクトにまとめる
- Vitest 4:
import { describe, it, expect } from 'vitest'を明示的に記述
- 1関数1ファイルにはユニットテスト必須
- テストファーストを推奨: バグ修正や明確な仕様の機能追加では、実装より先にテスト
console.logを使わない(Lanesが進捗表示を担当)definePlugin()でプラグインを定義eachPage/eachUrlコールバックでページ単位の分析を実装concurrencyの宣言: プラグインが返すオブジェクトにconcurrency: numberを含めると、Nitpickerが生成する専用WorkerPoolのサイズに使われる。省略時はos.cpus().length- 重いプラグイン(Chrome 起動・大規模パース等)は小さく: 例
analyze-lighthouseはconcurrency: 2。Chrome 1 プロセス ≒ 300〜500MB あるため CPU コア数並列だと簡単に数十 GB 消費する - 軽量な DOM 解析のみは省略可: JSDOM 単体なら CPU コア数並列でほぼ問題ない。
analyze-main-contents等は宣言不要 - 判断基準: 1 ページ処理時のメモリ消費 × 並列度 が 1〜2GB を超える見込みなら明示的に下げる
- 重いプラグイン(Chrome 起動・大規模パース等)は小さく: 例
packages/@nitpicker/report-google-sheets/src/data/create-*.ts に新規シートを追加する場合:
- 行送信は library 任せ:
createSheets()はsheet.appendRow(...data)で行を都度送る。チャンク化(2500 行ごとの自動 flush)と遅延セル検出は@d-zero/google-sheetsのSheetが内部で処理するため、新規シート側で意識する必要はない - 遅延セル (
createCellData(() => ...)) は使ってよい:appendRow()は遅延セルを含む行を検出すると自動的に buffered モードに切り替わり、明示的なflush()まで送信を保留する。Page List の「Internal Referrers」列がこの仕組みに乗っている - テストでガード: 各
create-*.spec.tsには「eachPage/eachResourceが返すセルがCell.prototype.provideに揃っているか(=eager のみ)」を検証するアサーションがある。streaming 経路の高速性を維持するため、遅延セルを使う必要のないシートでは引き続き eager のみで実装すること。Page List 側の spec は逆向きで、少なくとも 1 つの遅延セルが含まれることをアサートしている - 詳細は
ARCHITECTURE.mdの Report 章を参照
- マイナーバージョン(0.x.y → 0.x.z): 後方互換性を維持する。既存の公開 API、CLI オプション、アーカイブフォーマットを壊さない
- メジャーバージョン(0.x → 1.0 等): 破壊的変更を許容する。ただしマイグレーションガイドが必須
- マイグレーションガイドの要件:
- 影響を受ける API・設定・データ構造の一覧
- before → after の具体的な書き換え例
- 段階的な移行手順(一括移行が困難な場合の中間状態を含む)
- 非推奨化: 削除予定バージョンと移行先を JSDoc
@deprecatedタグに明記する
- 変更の目的を明確に記述
- テストを追加・更新
yarn build && yarn test && yarn lint:checkがパスすることを確認- 破壊的変更にはマイグレーションガイドを同梱(ガイドなし = マージ不可)
詳細は ARCHITECTURE.md を参照。
| パッケージ | 用途 | 参照 |
|---|---|---|
@d-zero/beholder |
Puppeteer ベースのスクレイパー | npm: @d-zero/beholder |
@d-zero/dealer |
並列処理・スケジューリング | npm: @d-zero/dealer |
@d-zero/shared |
共有ユーティリティ(サブパスエクスポート形式) | npm: @d-zero/shared |
@d-zero/roar |
CLI フレームワーク | npm: @d-zero/roar |
@d-zero/google-auth |
OAuth2 認証 | npm: @d-zero/google-auth |
@d-zero/google-sheets |
Google Sheets API クライアント | npm: @d-zero/google-sheets |
Apache 2.0 — 詳細は LICENSE を参照。