コンテンツにスキップ

推奨設定例(非Pythonプロジェクト)

TypeScript/JS・Rust・.NETプロジェクト向けの推奨構成例。 設定して実行するところから始める場合ははじめにを参照。

共通のポイントは以下のとおり。

  • preset = "latest": 各時点での推奨ツール構成。 ドキュメント系(textlint / markdownlint / actionlint / typos / pre-commit)は言語カテゴリゲートに属さず、 プリセットでtrueになっているツールがそのまま有効化される
  • 言語カテゴリゲートの詳細は設定項目を参照
  • uvx pyfltr: pyfltrをdev依存に含めないため、uvxで都度取得して実行する
  • 言語固有のツール + ドキュメント系lint(textlint / markdownlint / prettier)を組み合わせる
    • textlint / markdownlintの設定例(.textlintrc.yaml.markdownlint-cli2.yaml)は 推奨設定例を参照
  • bin-runnerの既定は"mise"。actionlint等のネイティブバイナリツールはmise経由で呼び出されるため、mise導入を推奨
  • 個別ツールをPATH直接実行へ戻すには{command}-runner = "direct"または{command}-pathを指定する (ツール別設定を参照)
  • タスクランナー(Makefile / mise.toml)の設定例は推奨設定例の「タスクランナー」を参照

TypeScript/JS専用プロジェクト

pyproject.toml:

[tool.uv]
exclude-newer = "1 day"

[tool.pyfltr]
preset = "latest"
javascript = true
js-runner = "pnpm"

extend-exclude = [
    ".svelte-kit",
    "node_modules",
    "dist",
    "build",
]

.pre-commit-config.yaml:

  - repo: local
    hooks:
      - id: pyfltr
        name: pyfltr
        entry: uvx pyfltr fast
        types_or: [javascript, jsx, ts, tsx, json, css, yaml, markdown]
        require_serial: true
        language: system

ポイント:

  • javascript = true: JS/TS系ツール一式(eslint / biome / oxlint / prettier / tsc / vitest)が プリセットのゲートを通過して有効化される
  • js-runner = "pnpm": pnpmワークスペース経由でJS系ツールを呼ぶ
    • textlint-packagesは無視される
  • eslintとoxlintを併用すると、eslint非対応のルールをoxlintが補完できる(oxlintはRust製で高速)
  • tsc: TypeScript型チェックを実行する
    • svelte-checkなどフレームワーク固有のチェッカーと併用する場合は、いずれか一方のみ有効化する
  • vitest: vitest-args = ["run", "--passWithNoTests"]が既定のため追加引数を指定する必要はない
  • 使わないツールは個別に{command} = falseで無効化できる
  • svelte-checkなどフレームワーク固有のツールはカスタムコマンドで追加する (カスタムコマンド例の「svelte-check」を参照)
  • 依存の脆弱性監査は任意で追加できる(既定無効)。 js-runnerに合わせてpnpm-audit / npm-audit / yarn-auditのいずれかを有効化する
[tool.pyfltr]
pnpm-audit = true
# ネットワーク不調時に失敗ではなく警告として扱う場合
# pnpm-audit-severity = "warning"

pnpm audit / npm audit / yarn auditpackage.jsonを対象にJavaScript依存の既知脆弱性を検査する。 外部脆弱性データベースへ問い合わせるためネットワーク接続が必須で結果が変動する。 yarn berry(2+)利用時はyarn-audit-args = ["npm", "audit", "--json"]へ上書きする。

監査結果はコード変更と無関係に変動するため、コミット毎ではなく定期実行に向く。 監査ツールのみをまとめて実行する場合は--commands=auditを指定し、scheduleトリガーの専用ワークフローへ切り出す構成を推奨する。 SARIF出力とgithub/codeql-action/upload-sarifを組み合わせると、 同一の脆弱性が1件のアラートに集約され、重複通知を回避できる。

Rustプロジェクト

cargo fmt / cargo clippy / cargo test / cargo denyと、 ドキュメント系lint(textlint / markdownlint-cli2 / prettier)をpyfltrに一元化する例。 言語カテゴリはすべてopt-inのため、非Rustプロジェクトでcargo系が実行されることはない。

pyproject.toml:

[tool.uv]
exclude-newer = "1 day"

[tool.pyfltr]
preset = "latest"
rust = true
js-runner = "pnpm"
# prettier はドキュメント系を pnpm で実行するために個別に opt-in する
# (javascript ゲートは開けず、Rust 専用プロジェクトで不要な JS 系 linter / tester を実行しない)
prettier = true

extend-exclude = [
    "target",
    "node_modules",
    "dist",
]

プロジェクト固有の許可語がある場合は[tool.typos]セクションも追記する (詳細は推奨設定例の「typosの許可語設定」を参照)。

mise.toml例(cargo系をmise経由で固定バージョン・固定コンポーネントで起動):

[tools]
# rust backend経由でcargo fmt / cargo clippyを確実に解決するためcomponentsを明示する
rust = { version = "1.83.0", components = "rustfmt,clippy" }
# cargo-denyはmise core registry非収録のためaquaレジストリ経由で取得する
"aqua:EmbarkStudios/cargo-deny" = "latest"

mise設定にrustの記述がある場合、バージョン固定・components指定がそのまま反映されるため cargo-fmt-version等をpyfltr側で別途明示する二重管理は不要。 PATH上のcargoを使いたい場合はcargo-fmt-runner = "direct"等を指定する。

.pre-commit-config.yaml(ローカルフックでuvx pyfltr fastを呼ぶ):

  - repo: local
    hooks:
      - id: pyfltr
        name: pyfltr
        entry: uvx pyfltr fast
        types_or: [rust, markdown, toml, yaml, javascript, ts]
        require_serial: true
        language: system

ポイント:

  • pyfltr fast: fix段を内蔵するため、 linterのautofix(cargo-clippy --fixmarkdownlint --fix等)→ formatter → 軽量linterの順で実行される
  • pyfltr run: formatter差分を自動修正し、linter/tester通過で成功する(ローカル開発向け)
  • pyfltr ci: formatter差分も含めて失敗扱いにする(CI向け)
  • js-runner = "pnpm": pnpmワークスペース経由でJS系ツールを呼ぶ
    • textlint-packagesは無視される
  • タスクランナーの設定例は推奨設定例の「タスクランナー」を参照

.NETプロジェクト

dotnet format / dotnet build / dotnet testと、ドキュメント系lintをpyfltrに一元化する例。 Rustプロジェクト節の構成を基準に、cargo系コマンドをdotnet系に置き換える。

mise.toml例(dotnet SDKをmise経由で固定バージョンで起動):

[tools]
dotnet = "9.0.100"

mise設定にdotnetの記述がある場合、バージョン固定がそのまま反映されるため dotnet-format-version等をpyfltr側で別途明示する二重管理は不要。 direct実行へ戻したい場合はdotnet-format-runner = "direct"等を指定する。 direct実行時、pyfltrは環境変数DOTNET_ROOT配下のdotnet実行ファイルを優先する。

pyproject.toml:

[tool.uv]
exclude-newer = "1 day"

[tool.pyfltr]
preset = "latest"
dotnet = true
js-runner = "pnpm"
# prettier はドキュメント系を pnpm で実行するために個別に opt-in する
# (javascript ゲートは開けず、.NET 専用プロジェクトで不要な JS 系 linter / tester を実行しない)
prettier = true

extend-exclude = [
    "bin",
    "obj",
    "publish",
    "node_modules",
]

.pre-commit-config.yaml:

  - repo: local
    hooks:
      - id: pyfltr
        name: pyfltr
        entry: uvx pyfltr fast
        types_or: [c#, csproj, sln, msbuild, editorconfig, markdown, toml, yaml]
        require_serial: true
        language: system

ポイント:

  • types_orにC#関連のタグ(c#csprojslnmsbuildeditorconfig)を含める
    • dotnet系コマンドはpass-filenames = falseでプロジェクト全体をチェックするが、 pre-commitはtypes_orに一致するファイルがコミットに含まれないとhook自体を起動しない
    • identifyライブラリのタグ名はcsharpではなくc#であることに注意
  • dotnet-build: ビルドエラーをlint段階で検出するためlinterとして分類している
  • dotnet-format: formatterとして常時書き込みモードで動作する
  • タスクランナーの設定例は推奨設定例の「タスクランナー」を参照