Skip to content

feat(ci): backend に pyright 型チェックを hard gate として導入#446

Merged
yusuke0610 merged 1 commit into
mainfrom
feat/pyright-ci
Jun 30, 2026
Merged

feat(ci): backend に pyright 型チェックを hard gate として導入#446
yusuke0610 merged 1 commit into
mainfrom
feat/pyright-ci

Conversation

@yusuke0610

@yusuke0610 yusuke0610 commented Jun 30, 2026

Copy link
Copy Markdown
Owner

概要

backend に pyright 型チェックを CI の必須チェック(hard gate)として導入する。TS は既に tsc -bnpm run build)で CI 型チェック済みのため、これにより BE/FE 両方が型チェックされる対称な状態になる。

導入にあたり既存の型エラー 93 件 → 0 件 を修正した。

変更点

CI / ツール

  • CI: .github/workflows/test.ymltest-backenduvx pyright@1.1.411 ステップを追加(Lint backend の直後)。deploy-gatetest-backend の結果を見るため自動的にゲート対象に入る。
  • ローカル: Makefiletypecheck-backend を追加し lint(= make ci)に組込み。docs/development.md / CLAUDE.md を更新。
  • pyright バージョンは CI と Makefile でピン留めを揃える1.1.411)。更新時は 2 箇所同期。
    • 注: nixpkgs 版とのドリフトを避けるため flake.nix には追加せず、両者とも uvx pyright@<ver> で統一。

型エラー 93→0 の主な修正

  • repositories/resume.py: 動的 payload 引数を dict[str, object]dict[str, Any] 化(22 件)
  • core/settings.py: get_cookie_samesite の戻り値を Literal["lax","strict","none"]
  • テスト: assert ... is not None による None narrowing / Project.model_validate({...}) 置換(test_schemas.py 17 件)
  • LLM SDK 境界(anthropic / openai / google)の castnotificationCursorResult cast

挙動・契約に関わる修正(レビュー注目点)

  • routers/blog/accounts.py: 到達不能だった except BlogAccountNotFoundErrorValueError サブクラスで先行 catch 済み・同じ 404/account_not_found)を削除。挙動は等価。
  • tests/test_pdf_generator.py: format_period(..., None, True) は docstring 契約(在籍中は end_date="")違反。本番は常に "" を渡すためテスト側を "" に修正(実装は不変)。

検証

  • make ci green: pyright 0 errors / backend 648 passed / web 365 passed + build 成功。

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Improved project date handling, including better support for current/in-progress periods and invalid end-date values.
    • Added safer handling when generating PDFs so failures are reported clearly instead of returning invalid output.
    • Tightened validation for several API responses and request flows to reduce unexpected runtime errors.
  • Chores

    • Added backend type-checking to development and CI workflows.
    • Updated tests to include additional safety checks and coverage for validation behavior.

CI(test-backend)とローカル(make typecheck-backend / make lint)に pyright を
追加し、Python の型エラーをビルドで検知する。TS は既に tsc -b で型チェック済みの
ため、BE/FE 両方が型チェックされる対称な状態にする。

- CI: test.yml の test-backend に uvx pyright@1.1.411 ステップを追加
  (deploy-gate は test-backend を見るため自動的にゲート対象に入る)
- ローカル: Makefile に typecheck-backend を追加し make lint に組込み。docs 更新
- 既存の型エラー 93 件を 0 に修正
  - resume.py の payload を dict[str, Any] 化、get_cookie_samesite を Literal 化
  - テストの None narrowing(assert is not None)/ Project.model_validate 置換
  - LLM SDK 境界の cast、notification の CursorResult cast 等
- 到達不能だった blog/accounts.py の except BlogAccountNotFoundError を削除(挙動等価)
- test_pdf_generator の契約違反(format_period に None)をテスト側で修正

pyright のバージョンは CI と Makefile でピン留めを揃える(drift 防止)。
スキル manifest/import スキャナの tuple/str 注釈も取り込み registry の型を解決。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation backend バックエンド test テスト追加・修正 agent DevForge Agent ci CI / ワークフロー feature 新機能 labels Jun 30, 2026
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1508064e-1d4d-40ac-964b-ba3da0d9a4ac

📥 Commits

Reviewing files that changed from the base of the PR and between eb42642 and 3332bc7.

📒 Files selected for processing (36)
  • .claude/CLAUDE.md
  • .github/workflows/test.yml
  • Makefile
  • backend/app/core/settings.py
  • backend/app/repositories/master_data.py
  • backend/app/repositories/notification.py
  • backend/app/repositories/resume.py
  • backend/app/routers/blog/accounts.py
  • backend/app/routers/github_link/endpoints.py
  • backend/app/services/agent/chat_service.py
  • backend/app/services/agent/llm/anthropic_client.py
  • backend/app/services/agent/llm/google_client.py
  • backend/app/services/agent/llm/openai_client.py
  • backend/app/services/agent/output_schema.py
  • backend/app/services/intelligence/skills/imports/go.py
  • backend/app/services/intelligence/skills/imports/js_ts.py
  • backend/app/services/intelligence/skills/imports/python.py
  • backend/app/services/intelligence/skills/imports/rust.py
  • backend/app/services/intelligence/skills/manifests/cargo_toml.py
  • backend/app/services/intelligence/skills/manifests/go_mod.py
  • backend/app/services/intelligence/skills/manifests/package_json.py
  • backend/app/services/intelligence/skills/manifests/pyproject.py
  • backend/app/services/intelligence/skills/manifests/requirements_txt.py
  • backend/app/services/pdf/generators/resume_generator.py
  • backend/tests/blog/test_accounts.py
  • backend/tests/blog/test_sync.py
  • backend/tests/conftest.py
  • backend/tests/security/test_mass_assignment.py
  • backend/tests/test_billing.py
  • backend/tests/test_database_libsql_binary.py
  • backend/tests/test_github_skills_api.py
  • backend/tests/test_pdf_generator.py
  • backend/tests/test_retry_flow.py
  • backend/tests/test_schemas.py
  • backend/tests/test_skill_import_scanners.py
  • docs/development.md
💤 Files with no reviewable changes (1)
  • backend/app/routers/blog/accounts.py

📝 Walkthrough

Walkthrough

Adds a pinned pyright (1.1.411) type-check step to CI and a new make typecheck-backend target, integrated into the lint workflow and documented. Resolves resulting type errors via annotations, casts, and pyright-ignore comments across backend repositories, routers, agent services, and import/manifest scanners. Updates tests with null-safety assertions and migrates schema tests to model_validate.

Changes

Backend pyright type-checking rollout

Layer / File(s) Summary
CI, Makefile, and docs wiring
.github/workflows/test.yml, Makefile, docs/development.md, .claude/CLAUDE.md
Adds a pinned pyright step to the test-backend CI job and a new typecheck-backend Makefile target wired into lint; documents the command and .venv prerequisite.
Settings and repository type fixes
backend/app/core/settings.py, backend/app/repositories/master_data.py, backend/app/repositories/notification.py, backend/app/repositories/resume.py
Narrows get_cookie_samesite return type with Literal/cast, suppresses override warnings in MTechnologyStackRepository, casts execute results to CursorResult[Any], broadens ResumeRepository payload typings to dict[str, Any], and filters None end-dates before max() in sort key computation.
Router and agent service type fixes
backend/app/routers/blog/accounts.py, backend/app/routers/github_link/endpoints.py, backend/app/services/agent/chat_service.py, backend/app/services/agent/llm/*.py, backend/app/services/agent/output_schema.py
Removes a redundant BlogAccountNotFoundError handler, validates cached GitHub link results via GitHubLinkResponse.model_validate, tightens _resolve_target_project with isinstance(target, ProjectTarget), and adds cast(Any, ...) at LLM SDK call sites and schema dict casting.
Scanner/manifest annotations and PDF fix
backend/app/services/intelligence/skills/imports/*.py, backend/app/services/intelligence/skills/manifests/*.py, backend/app/services/pdf/generators/resume_generator.py
Adds explicit type annotations to extensions/ecosystem/filenames class attributes across scanners/parsers; raises RuntimeError when PDF generation returns None.
Test suite null-safety and schema migration
backend/tests/blog/*.py, backend/tests/security/test_mass_assignment.py, backend/tests/test_billing.py, backend/tests/test_database_libsql_binary.py, backend/tests/test_github_skills_api.py, backend/tests/test_pdf_generator.py, backend/tests/test_retry_flow.py, backend/tests/test_schemas.py, backend/tests/test_skill_import_scanners.py, backend/tests/conftest.py
Adds assert ... is not None checks after repository lookups, casts Stripe event payloads, switches client fixture monkeypatching to setattr, adjusts a PDF period test input, and migrates several Project schema tests to model_validate.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~20 minutes

Possibly related PRs

  • yusuke0610/devforge#277: Both PRs modify ResumeRepository._project_sort_key end-date handling logic in backend/app/repositories/resume.py.
  • yusuke0610/devforge#421: Both PRs touch the /api/github-link/cache endpoint behavior in backend/app/routers/github_link/endpoints.py.
  • yusuke0610/devforge#445: Both PRs touch the same import-scanner modules (Go/JsTs/Python/Rust) under backend/app/services/intelligence/skills/imports/.

Poem

A rabbit hopped through pyright's gate,
Casting types both small and great,
No more None to catch us off guard,
Tests now stand their assertive guard. 🐇
Make typecheck-backend, hop hop, all clear! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 54.39% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding backend Pyright type checking as a required CI gate.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/pyright-ci

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent DevForge Agent backend バックエンド ci CI / ワークフロー documentation Improvements or additions to documentation feature 新機能 test テスト追加・修正

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant