Skip to content

ci: add GitHub Actions workflow with split lint/type/build/test jobs#2

Merged
otomatty merged 5 commits into
mainfrom
claude/plan-ci-pipeline-NPHgf
May 8, 2026
Merged

ci: add GitHub Actions workflow with split lint/type/build/test jobs#2
otomatty merged 5 commits into
mainfrom
claude/plan-ci-pipeline-NPHgf

Conversation

@otomatty
Copy link
Copy Markdown
Owner

@otomatty otomatty commented May 8, 2026

Lint, typecheck, build, and test are run as separate jobs across the
TS/React, Rust (Tauri), and Python sidecar stacks so failures surface
per-stack. Tauri bundle build runs on main push and manual dispatch only;
PRs use cargo check to keep CI time bounded.

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC

Summary by CodeRabbit

  • Chores

    • CIを追加・強化:リンティング、型チェック、ビルド、テストを並列実行し、パッケージングを自動化(プッシュ/PR/手動トリガ対応)
    • .tsbuildinfo を無視する .gitignore 追記
  • Refactor

    • 多数のUIコンポーネントや内部ロジックを軽微に整形・簡潔化(動作は不変)
  • Style

    • ESLint設定とスタイル定義を刷新・正規化(フォント・カラートークン・アニメーション整形)
  • Chores / Python

    • Python処理のタイムスタンプ扱いと標準ストリームの取り扱いを改善し安定性向上

Lint, typecheck, build, and test are run as separate jobs across the
TS/React, Rust (Tauri), and Python sidecar stacks so failures surface
per-stack. Tauri bundle build runs on main push and manual dispatch only;
PRs use cargo check to keep CI time bounded.

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC
@gemini-code-assist
Copy link
Copy Markdown

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 8, 2026

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0dc87d73-fb5e-4e57-8603-51fc2a18f913

📥 Commits

Reviewing files that changed from the base of the PR and between 351b1fc and 74e2eff.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (2)
  • package.json
  • src-tauri/src/python_proc.rs

📝 Walkthrough

Walkthrough

CIワークフローを追加し(lint/typecheck/build/test、クロスプラットフォームTauriビルド含む)、ESLint構成をフラット設定へ移行、TypeScript/Vite設定と多数のUI/CSS/小さい実装フォーマットを適用しました。Python stub のタイムスタンプ生成も修正しています。

変更内容

CI パイプライン ワークフロー セットアップ

層 / ファイル(複数) 概要
ワークフロー メタデータと設定
.github/workflows/ci.yml
CI トリガー(pull_request、main へのプッシュ、手動実行)、プルリクエスト向けの並行実行キャンセル、グローバル環境変数(Node 20、Python 3.12、Rust stable)を定義します。
コード品質チェック
.github/workflows/ci.yml
TypeScript(npm lint + Prettier)、Rust(rustfmt + clippy、Tauri システム依存関係をインストール、警告をエラー扱い)、Python(ruff + black via uv)のリントジョブを追加します。
型チェック
.github/workflows/ci.yml
TypeScript(tsc -b)と Python(mypy recognition common、CI内で torch 依存の mortal を除外する旨の注記)の型チェックジョブを追加します。
ビルド コンパイル
.github/workflows/ci.yml
Web ビルド(npm build、dist アーティファクト アップロード)と Rust コンパイル チェック(cargo check --all-targets、Tauri システム依存関係をインストール)ジョブを追加します。
クロスプラットフォーム Tauri ビルド
.github/workflows/ci.yml
Windowsを含むマトリクスで Tauri ビルドを実行(PR ではスキップ条件あり)。Web ビルドと Rust チェックに依存して実行されます。
テスト実行
.github/workflows/ci.yml
TypeScript(Vitest via npm test)、Rust(cargo test --all-targets)、Python(pytest -q via uv sync)のテストジョブを追加します。

ESLint と依存関係

層 / ファイル(複数) 概要
ESLint フラット構成追加
eslint.config.js
フラット設定を追加し、TypeScript/React 向けの言語オプション、React Hooks/React Refresh プラグイン、unused var ルール等を設定。
旧構成削除/依存更新
.eslintrc.cjs, package.json
従来の .eslintrc.cjs を削除してフラット設定へ移行。@eslint/js を devDependencies に追加し @typescript-eslint を更新。

TypeScript ビルド設定と .gitignore

層 / ファイル(複数) 概要
tsconfig とビルド出力
tsconfig.json, tsconfig.node.json, .gitignore
tsconfig.json の include を src に限定。tsconfig.node.json を composite/emitDeclarationOnly 向けに更新し tsBuildInfo/outDir を指定。*.tsbuildinfo.gitignore に追加。

Vite 設定

層 / ファイル(複数) 概要
Vite export 変更
vite.config.ts
defineConfig(async () => ({ ... })) から直接 defineConfig({ ... }) へ変更し、@ts-expect-error ベースの suppression を削除。

Tauri バックエンド小修正

層 / ファイル(複数) 概要
コマンド/起動処理の整形
src-tauri/src/*.rs
app.store(...) 初期化や .add_migrations(...) 登録などの呼び出しを一行化する等のフォーマット調整。InferenceBackendDefault derive を追加。署名や挙動の変更はありません。

Rust: Python subprocess helper

層 / ファイル(複数) 概要
Python プロセス管理
src-tauri/src/python_proc.rs
stdin/stdout JSON-lines 経由で長時間動作する Python サブプロセスを spawn/send/recv/kill する PythonProcess とエラー列挙型を導入。stderr を親プロセスに継承するよう変更。

Python stub

層 / ファイル(複数) 概要
タイムスタンプ生成修正
python/mortal/main.py
stub のレスポンスで datetime.now(UTC).isoformat() を使うように変更(従来は timezone.utc を使用)。

UI / CSS / 小さなコード整形群

層 / ファイル(複数) 概要
フォーマット/マイクロリファクタ
src/**, src/index.css, src/lib/*
多数のコンポーネント・スクリーン・ユーティリティで JSX/TS/スタイルの改行・インポート・小さい表現の簡素化を適用。外部 API シグネチャや振る舞いを変える変更は含まれていません。

Sequence Diagram(s)

sequenceDiagram
  participant GitHub
  participant Actions
  participant Runner
  participant ArtifactStore
  GitHub->>Actions: push / pull_request / workflow_dispatch
  Actions->>Runner: start jobs (lint,typecheck,build,test)
  Runner->>ArtifactStore: upload dist artifact
  Runner->>Runner: run tauri build (conditional)
Loading

推定レビュー工数

🎯 3 (Moderate) | ⏱️ ~20 分

Possibly related issues

Possibly related PRs

  • otomatty/collabo-connect#2: 両方とも .github/workflows/ci.yml の追加/変更を行っています。
  • otomatty/learn-chat-connect#15: .github/workflows/ci.yml を追加している点で関連があります。
  • otomatty/zedi#492: Tauri/バックエンド周りやフロントエンド・バックエンドの関連モジュールに共通点があります。

ウサギの詩 🐰

CIの森でぴょんと舞うよ🐇
リントが鳴り テストが跳ねる🎶
フォーマット揃え 道を整え🛣️
ビルドの光がみんなを呼ぶ✨
マージのごちそうへ レッツゴー!🍵

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.58% 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 and specifically describes the main change: adding a GitHub Actions CI workflow with parallel jobs organized by lint/type/build/test stages.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 158-160: YAML inline maps like `{ name: linux, os: ubuntu-latest
}` are triggering the linter due to extra spaces; update each inline map entry
(`{ name: linux, os: ubuntu-latest }`, `{ name: macos, os: macos-latest }`, `{
name: windows, os: windows-latest }`) to remove the spaces so they read
`{name:linux,os:ubuntu-latest}`, `{name:macos,os:macos-latest}`,
`{name:windows,os:windows-latest}` to satisfy the linter.
- Around line 24-234: Multiple `uses:` entries (e.g., actions/checkout@v4,
actions/setup-node@v4, dtolnay/rust-toolchain@stable, Swatinem/rust-cache@v2,
astral-sh/setup-uv@v3, actions/upload-artifact@v4) are referenced by tags and
should be pinned to specific commit SHAs to avoid unexpected upstream changes;
update each `uses:` occurrence in the workflow to the corresponding
action@<commit-sha> for reproducibility, replace every tag-based reference
(search for the exact strings above) with the canonical commit SHA from the
action's repository, and add/enable Dependabot config for the `github-actions`
package-ecosystem so updates are reviewed and applied automatically.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b7f688e9-50fd-47a8-91b9-f3a36c84a129

📥 Commits

Reviewing files that changed from the base of the PR and between 4e5acaa and 349537b.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml

Comment thread .github/workflows/ci.yml
Comment on lines +24 to +234
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run lint
- run: npx prettier --check "src/**/*.{ts,tsx,css,json}"

lint-rust:
name: Lint (Rust)
runs-on: ubuntu-latest
defaults:
run:
working-directory: src-tauri
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install Tauri system deps
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libgtk-3-dev \
libsoup-3.0-dev \
libjavascriptcoregtk-4.1-dev
- run: cargo fmt --all -- --check
- run: cargo clippy --all-targets -- -D warnings

lint-python:
name: Lint (Python)
runs-on: ubuntu-latest
defaults:
run:
working-directory: python
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
with:
enable-cache: true
cache-dependency-glob: python/uv.lock
- run: uv sync --extra dev
- run: uv run ruff check .
- run: uv run black --check .

# ---------- Type check ----------
typecheck-ts:
name: Typecheck (TypeScript)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npx tsc -b

typecheck-python:
name: Typecheck (Python)
runs-on: ubuntu-latest
defaults:
run:
working-directory: python
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
with:
enable-cache: true
cache-dependency-glob: python/uv.lock
- run: uv sync --extra dev
# mortal は torch 依存のため CI では除外
- run: uv run mypy recognition common

# ---------- Build ----------
build-web:
name: Build (Web)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: web-dist
path: dist
retention-days: 7

build-rust-check:
name: Build (Rust check)
runs-on: ubuntu-latest
defaults:
run:
working-directory: src-tauri
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install Tauri system deps
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libgtk-3-dev \
libsoup-3.0-dev \
libjavascriptcoregtk-4.1-dev
- run: cargo check --all-targets

build-tauri:
name: Build (Tauri ${{ matrix.platform.name }})
# PR では実行しない (cargo check で代替)。main push か手動のみ。
if: github.event_name != 'pull_request'
needs: [build-web, build-rust-check]
strategy:
fail-fast: false
matrix:
platform:
- { name: linux, os: ubuntu-latest }
- { name: macos, os: macos-latest }
- { name: windows, os: windows-latest }
runs-on: ${{ matrix.platform.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install Tauri system deps (Linux)
if: matrix.platform.name == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libgtk-3-dev \
libsoup-3.0-dev \
libjavascriptcoregtk-4.1-dev
- run: npm ci
- run: npm run tauri:build

# ---------- Test ----------
test-ts:
name: Test (TypeScript / Vitest)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm test

test-rust:
name: Test (Rust / cargo test)
runs-on: ubuntu-latest
defaults:
run:
working-directory: src-tauri
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install Tauri system deps
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libgtk-3-dev \
libsoup-3.0-dev \
libjavascriptcoregtk-4.1-dev
- run: cargo test --all-targets

test-python:
name: Test (Python / pytest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: python
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
with:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 目的: SHA pin されていない uses を一覧化して確認
# 期待: 未pin の行が出力される(修正後は 0 件)
rg -nP '^\s*-\s*uses:\s*[^@\s]+@(?!(?:[a-f0-9]{40})\b)[^\s]+' .github/workflows/ci.yml

Repository: otomatty/jantama-ai

Length of output: 1191


uses: ステートメントを commit SHA にピン留めしてください

21 個の uses: ステートメント(actions/checkout@v4dtolnay/rust-toolchain@stable など)がバージョンタグで参照されており、上流の予期しない変更に影響を受けるリスクがあります。再現性と改ざん耐性のため、commit SHA へピン留めしてください。Dependabot の github-actions で定期的な更新推奨です。

修正例
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@eef61447b9ff4aafe5dcd72e0e56e3c9bc5e221a

-      - uses: dtolnay/rust-toolchain@stable
+      - uses: dtolnay/rust-toolchain@1482605bfc5719ff41411a05e6243f3e87da7365a
🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 158-158: too many spaces inside braces

(braces)


[error] 158-158: too many spaces inside braces

(braces)


[error] 159-159: too many spaces inside braces

(braces)


[error] 159-159: too many spaces inside braces

(braces)


[error] 160-160: too many spaces inside braces

(braces)


[error] 160-160: too many spaces inside braces

(braces)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 24 - 234, Multiple `uses:` entries
(e.g., actions/checkout@v4, actions/setup-node@v4,
dtolnay/rust-toolchain@stable, Swatinem/rust-cache@v2, astral-sh/setup-uv@v3,
actions/upload-artifact@v4) are referenced by tags and should be pinned to
specific commit SHAs to avoid unexpected upstream changes; update each `uses:`
occurrence in the workflow to the corresponding action@<commit-sha> for
reproducibility, replace every tag-based reference (search for the exact strings
above) with the canonical commit SHA from the action's repository, and
add/enable Dependabot config for the `github-actions` package-ecosystem so
updates are reviewed and applied automatically.

Comment thread .github/workflows/ci.yml Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 349537b70e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/ci.yml Outdated
Comment on lines +158 to +160
- { name: linux, os: ubuntu-latest }
- { name: macos, os: macos-latest }
- { name: windows, os: windows-latest }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Restrict Tauri bundle matrix to supported platforms

build-tauri runs npm run tauri:build on Linux, macOS, and Windows for push/workflow_dispatch, but this repo’s Tauri config is Windows-installer-only (bundle.targets is msi/nsis). That means the Linux and macOS matrix legs will fail during bundling even when application code is healthy, causing red CI on every main push. Limit this job to Windows (or pass platform-specific bundle targets) so non-Windows runners don’t execute an unsupported packaging path.

Useful? React with 👍 / 👎.

- lint-rust: apply cargo fmt across src-tauri
- lint-python: replace timezone.utc with datetime.UTC alias (UP017)
- typecheck/build:
  - move vite.config.ts solely under tsconfig.node.json (composite project)
  - drop async wrapper and unused @ts-expect-error in vite.config.ts
  - add /// <reference types="vitest" /> for the test field
- lint-ts: migrate ESLint to v9 flat config (eslint.config.js)
  - add @eslint/js, globals, typescript-eslint dev deps
  - remove legacy .eslintrc.cjs
- prettier: format src/** to satisfy the new prettier --check step
- gitignore: ignore *.tsbuildinfo

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@eslint.config.js`:
- Line 31: The config uses import.meta.dirname for tsconfigRootDir which
requires Node ≥20.11; either declare that requirement in package.json by adding
an "engines": {"node": ">=20.11"} entry, or replace import.meta.dirname with the
Node-compatible pattern using fileURLToPath(new URL(".", import.meta.url));
update eslint.config.js to use fileURLToPath/import.meta.url if you prefer
broader compatibility, or add the engines field to package.json to enforce the
Node version for all developers.

In `@src/index.css`:
- Line 1: The `@import` statement in src/index.css uses the url(...) notation
which violates the Stylelint import-notation rule; replace the url(...) form
with a plain string import by changing the `@import` line to use a quoted string
(e.g., `@import` "https://fonts.googleapis.com/...?") so Stylelint accepts it and
keep the same font query parameters; update the `@import` line only and leave the
rest of the file unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: fa982534-19b1-4d37-82e8-105cf20fe3af

📥 Commits

Reviewing files that changed from the base of the PR and between 349537b and 7948ba4.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (28)
  • .eslintrc.cjs
  • .gitignore
  • eslint.config.js
  • package.json
  • python/mortal/main.py
  • src-tauri/src/commands.rs
  • src-tauri/src/lib.rs
  • src/App.tsx
  • src/components/CandidateList.tsx
  • src/components/DangerSafeBlock.tsx
  • src/components/ErrorBody.tsx
  • src/components/HandRow.tsx
  • src/components/HeroLayout.tsx
  • src/components/IdleBody.tsx
  • src/components/MonitorButton.tsx
  • src/components/PrimaryGlyph.tsx
  • src/components/ReasonBlock.tsx
  • src/components/StatusBar.tsx
  • src/components/Tile.tsx
  • src/index.css
  • src/lib/scenarios.ts
  • src/lib/tauriCommands.ts
  • src/screens/MainScreen.tsx
  • src/screens/SettingsScreen.tsx
  • src/state/appState.ts
  • tsconfig.json
  • tsconfig.node.json
  • vite.config.ts
💤 Files with no reviewable changes (1)
  • .eslintrc.cjs

Comment thread eslint.config.js
Comment thread src/index.css
@@ -1,4 +1,4 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap');
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# import-notation 違反候補を確認(修正後はヒットしない想定)
rg -n '^\s*@import\s+url\(' src/index.css

Repository: otomatty/jantama-ai

Length of output: 201


@import の記法を Stylelint ルールに合わせてください

Line 1 の import-notation ルール違反です。url(...) ではなく文字列指定に変更すると lint エラーを回避できます。

🔧 提案差分
-@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap");
+@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap";
🧰 Tools
🪛 Stylelint (17.10.0)

[error] 1-1: Expected "url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap")" to be ""https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;900&family=JetBrains+Mono:wght@400;500&display=swap"" (import-notation)

(import-notation)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/index.css` at line 1, The `@import` statement in src/index.css uses the
url(...) notation which violates the Stylelint import-notation rule; replace the
url(...) form with a plain string import by changing the `@import` line to use a
quoted string (e.g., `@import` "https://fonts.googleapis.com/...?") so Stylelint
accepts it and keep the same font query parameters; update the `@import` line only
and leave the rest of the file unchanged.

claude added 2 commits May 8, 2026 05:51
- commands.rs: drop unused Manager import
- types.rs: replace manual Default impl with #[derive(Default)] + #[default]
- python_proc.rs: allow dead_code at module level (Phase D scaffolding)

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC
- restrict build-tauri to windows-latest only (tauri.conf.json bundle.targets
  is msi/nsis, so the macOS/Linux matrix legs would always fail on main push)
- declare engines.node >=20.11 to formalize the requirement of
  import.meta.dirname used in eslint.config.js

Skipped (intentionally):
- pinning all actions to commit SHAs (better handled with Dependabot in a
  follow-up; not breaking CI today)
- yamllint braces and stylelint import-notation (not configured in this CI)

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src-tauri/src/python_proc.rs (1)

50-55: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

stderrがパイプされているが読み取られていないため、プロセスがブロックする可能性があります。

stderrStdio::piped()に設定していますが、PythonProcess構造体ではstderrを保持も読み取りもしていません。Pythonプロセスがstderrに書き込むと(ログ、警告、トレースバックなど)、バッファが満杯になった時点でプロセスがブロックし、デッドロックが発生する可能性があります。

Phase Dのスケルトンコードであることを考慮すると、Stdio::null()(破棄)またはStdio::inherit()(親プロセスのstderrに出力)の使用を推奨します。

🐛 提案される修正

オプション1(推奨): stderrを破棄

     let mut child = Command::new(python_path)
         .args(args)
         .stdin(Stdio::piped())
         .stdout(Stdio::piped())
-        .stderr(Stdio::piped())
+        .stderr(Stdio::null())
         .spawn()?;

オプション2: 親プロセスのstderrに継承

     let mut child = Command::new(python_path)
         .args(args)
         .stdin(Stdio::piped())
         .stdout(Stdio::piped())
-        .stderr(Stdio::piped())
+        .stderr(Stdio::inherit())
         .spawn()?;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src-tauri/src/python_proc.rs` around lines 50 - 55, The spawned child sets
stderr to Stdio::piped() but the PythonProcess struct never holds or reads
stderr, which can deadlock; update the Command invocation that creates `child`
(the call using `Command::new(python_path).args(args)`) to not pipe stderr—use
`Stdio::null()` to discard stderr (or `Stdio::inherit()` if you want it to go to
the parent) instead of `Stdio::piped()`, or alternatively store and read the
child's stderr in the `PythonProcess` struct if you intend to capture it.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@package.json`:
- Line 37: package.json currently contains both the typescript-eslint meta
package and the individual packages, causing duplication and version mismatch;
remove the individual packages "@typescript-eslint/parser" and
"@typescript-eslint/eslint-plugin" (or alternatively remove the
"typescript-eslint" meta package and align individual packages to 8.59.2) so
only one source is present; prefer keeping the "typescript-eslint" meta package
for flat config, ensure the remaining entry version is 8.59.2, and update
package.json dependencies/devDependencies accordingly (look for
"typescript-eslint", "@typescript-eslint/parser", and
"@typescript-eslint/eslint-plugin" to locate the entries).

---

Outside diff comments:
In `@src-tauri/src/python_proc.rs`:
- Around line 50-55: The spawned child sets stderr to Stdio::piped() but the
PythonProcess struct never holds or reads stderr, which can deadlock; update the
Command invocation that creates `child` (the call using
`Command::new(python_path).args(args)`) to not pipe stderr—use `Stdio::null()`
to discard stderr (or `Stdio::inherit()` if you want it to go to the parent)
instead of `Stdio::piped()`, or alternatively store and read the child's stderr
in the `PythonProcess` struct if you intend to capture it.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 14e9b6f2-2d89-4496-b5fd-a6745d994e45

📥 Commits

Reviewing files that changed from the base of the PR and between 7948ba4 and 351b1fc.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • package.json
  • src-tauri/src/commands.rs
  • src-tauri/src/python_proc.rs
  • src-tauri/src/types.rs

Comment thread package.json
- package.json: drop @typescript-eslint/{parser,eslint-plugin} individual deps
  (the typescript-eslint meta package already brings them in transitively;
  removing the duplicates eliminates the 8.14 vs 8.59 version mismatch)
- python_proc.rs: switch child stderr from Stdio::piped() to Stdio::inherit()
  so the buffer cannot deadlock when nothing in PythonProcess reads it

https://claude.ai/code/session_01WSAGRj9p6dadwc1Ld5pbUC
@otomatty otomatty merged commit 507fe5e into main May 8, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants