Skip to content

chore: sync node/pnpm versions across mise, package.json, and workflows#2223

Merged
s-hirano-ist merged 3 commits intomainfrom
claude/sync-version-updates-zxhmt
Apr 19, 2026
Merged

chore: sync node/pnpm versions across mise, package.json, and workflows#2223
s-hirano-ist merged 3 commits intomainfrom
claude/sync-version-updates-zxhmt

Conversation

@s-hirano-ist
Copy link
Copy Markdown
Owner

@s-hirano-ist s-hirano-ist commented Apr 19, 2026

  • Workflows now read node version from .mise.toml via node-version-file
  • Add engines.node to package.json so Vercel tracks the same source
  • Group node/pnpm updates from mise + npm managers into one Renovate PR

Eliminates version drift between .mise.toml (24.15.0) and workflows
(previously hardcoded 24.14.1). Future Renovate bumps will update
.mise.toml, package.json engines.node, and packageManager in a single PR.

Summary by CodeRabbit

リリースノート

Chores

  • GitHub Actionsワークフロー全体でNode.jsバージョンの管理方法を、ハードコード値から設定ファイルベースの動的読み込みに更新しました。
  • パッケージメタデータにNode.js 24.xの対応バージョンを明示的に指定しました。
  • 依存関係管理ツールの設定を更新し、Node.jsおよびpnpmの更新をグループ化するルールを追加しました。

- Workflows now read node version from .mise.toml via node-version-file
- Add engines.node to package.json so Vercel tracks the same source
- Group node/pnpm updates from mise + npm managers into one Renovate PR

Eliminates version drift between .mise.toml (24.15.0) and workflows
(previously hardcoded 24.14.1). Future Renovate bumps will update
.mise.toml, package.json engines.node, and packageManager in a single PR.
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 19, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
s-private Ready Ready Preview, Comment Apr 19, 2026 5:26am

@github-actions
Copy link
Copy Markdown

Warning

actionlint の新しいバージョンがリリースされています。更新してください。
https://github.com/rhysd/actionlint/releases

  • 現在のバージョン: 1.7.11
  • 最新のバージョン: 1.7.12

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 19, 2026

Warning

Rate limit exceeded

@s-hirano-ist has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 40 minutes and 28 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 40 minutes and 28 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 42546a5a-640f-4760-8cf1-1e549c699131

📥 Commits

Reviewing files that changed from the base of the PR and between 0d38cb5 and 8c40f66.

📒 Files selected for processing (12)
  • .github/renovate.json5
  • .github/workflows/ci.yaml
  • .github/workflows/docs.yaml
  • .github/workflows/jscpd.yaml
  • .github/workflows/license-check.yaml
  • .github/workflows/memlab.yaml
  • .github/workflows/mutation-test.yaml
  • .github/workflows/prisma-deploy.yaml
  • .github/workflows/release-please.yaml
  • .github/workflows/update-reports.yaml
  • .mise.toml
  • .nvmrc

Walkthrough

Node.js のバージョン管理を硬直的な指定から、リポジトリの .mise.toml ファイルを参照する動的な読み込みに変更しました。Renovate の設定に node と pnpm の更新グループルールを追加し、package.json に Node.js 24.x のエンジン制約を明示しました。

Changes

Cohort / File(s) Summary
GitHub ワークフロー
.github/workflows/ci.yaml, .github/workflows/docs.yaml, .github/workflows/jscpd.yaml, .github/workflows/license-check.yaml, .github/workflows/memlab.yaml, .github/workflows/mutation-test.yaml, .github/workflows/prisma-deploy.yaml, .github/workflows/release-please.yaml, .github/workflows/update-reports.yaml
各ワークフローの Node.js セットアップステップで、硬直的なバージョン指定(node-version: "24.14.1")を .mise.toml ファイルからの読み込み(node-version-file: ".mise.toml")に統一。他の step ロジックと caching は無変更。
リポジトリ設定
.github/renovate.json5
node と pnpm の依存関係を mise または npm マネージャで管理する場合、それらを単一のグループ化ルール(groupName: 'node and pnpm'minimumReleaseAge: '2 days')でまとめる packageRules エントリを新規追加。
パッケージメタデータ
package.json
engines フィールドを追加し、サポート対象のランタイムを Node.js 24.x に明示。他のスクリプトと依存関係は変更なし。

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 mise から読むバージョン、統一されて
ワークフロー一つになり、確かになる
24.x の約束、renovate が守る
設定と共に、進むコードよ

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective: synchronizing Node/pnpm versions across mise, package.json, and workflows. All file changes (renovate.json5, multiple workflows, and package.json) support this central theme.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/sync-version-updates-zxhmt

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 and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Apr 19, 2026

Deploying s-private with  Cloudflare Pages  Cloudflare Pages

Latest commit: 8c40f66
Status: ✅  Deploy successful!
Preview URL: https://7f6b01bb.s-private.pages.dev
Branch Preview URL: https://claude-sync-version-updates.s-private.pages.dev

View logs

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

♻️ Duplicate comments (5)
.github/workflows/mutation-test.yaml (1)

29-34: ⚠️ Potential issue | 🔴 Critical

Mutation test workflow でも .mise.toml の直接指定は避けてください。

node-version-file: ".mise.toml"setup-node 側で TOML として解釈されないため、Node セットアップが失敗し得ます。node-version へ抽出済みの 24.15.0 を渡す方式に変更してください。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/mutation-test.yaml around lines 29 - 34, In the "Install
Node.js" GitHub Actions step using actions/setup-node@..., remove the
unsupported node-version-file: ".mise.toml" entry and instead set node-version:
"24.15.0" (hard-coded extracted value) so the action receives a concrete Node
version; update the step that contains node-version-file to use node-version and
delete the node-version-file line.
.github/workflows/update-reports.yaml (1)

21-24: ⚠️ Potential issue | 🔴 Critical

.mise.toml の直接指定はこの workflow でも危険です。

node-version-file.mise.tomlnode = "..." を TOML として読まないため、月次レポート更新が Node セットアップで失敗し得ます。.mise.toml から値だけを抽出して node-version に渡す形へ揃えてください。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/update-reports.yaml around lines 21 - 24, `.mise.toml` を直接
`node-version-file` に渡しているため TOML の `node = "..."` を正しく解釈できず失敗する可能性があります。GitHub
Actions の `uses: actions/setup-node@...` 呼び出しを修正し、`.mise.toml` から `node = "..."`
の値だけを抽出して `node-version` に渡すように変更してください(例: `run` ステップで `grep`/`sed`/`python`
等を使って `.mise.toml` からバージョン文字列を取得し、その出力を `setup-node` の `node-version`
入力に渡す)。対象となる識別子: actions/setup-node, node-version-file, node-version,
.mise.toml.
.github/workflows/license-check.yaml (1)

25-30: ⚠️ Potential issue | 🔴 Critical

License check も Node セットアップで失敗する可能性があります。

.mise.tomlactions/setup-node@v6node-version-file が期待する plain version / .tool-versions / package.json 形式ではないため、node = "24.15.0" をそのまま渡さない形にしてください。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/license-check.yaml around lines 25 - 30, The setup step
uses actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f with
node-version-file: ".mise.toml", but setup-node expects a plain version or
supported file formats; replace this by extracting the node version from
.mise.toml and passing it via the node-version input (or point node-version-file
to a supported file). Concretely: add a preceding step that reads/parses the
node = "24.15.0" value from .mise.toml (e.g., grep/sed or a short script) and
saves it as an output or env var, then change the Install Node.js step to use
node-version: ${{ steps.<extract-step>.outputs.node_version }} (or node-version:
"${{ env.NODE_VERSION }}"), leaving cache and cache-dependency-path as-is; do
not pass the raw .mise.toml file to node-version-file.
.github/workflows/memlab.yaml (1)

25-30: ⚠️ Potential issue | 🔴 Critical

Memlab workflow も Node バージョン解決で止まる可能性があります。

actions/setup-node@v6node-version-file.mise.toml を TOML として parse しないため、この指定では node = "24.15.0" が有効な semver として扱われません。.mise.toml から値を抽出して node-version に渡す修正を適用してください。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/memlab.yaml around lines 25 - 30, The workflow step named
"Install Node.js" currently uses the node-version-file input which does not
parse .mise.toml; replace that by extracting the node value from .mise.toml into
an environment variable and pass that to the setup action via node-version. Add
a prior run step that greps/parses the node field (e.g. grep -Po
'node\s*=\s*"(.*?)"' or similar) and writes the extracted version to $GITHUB_ENV
as NODE_VERSION, then update the "Install Node.js" step (the uses:
actions/setup-node@...) to remove node-version-file and use node-version: ${{
env.NODE_VERSION }} so the actual "node = \"24.15.0\"" value from .mise.toml is
passed correctly.
.github/workflows/prisma-deploy.yaml (1)

28-33: ⚠️ Potential issue | 🔴 Critical

ここも .mise.tomlnode-version-file に直接渡すと失敗し得ます。

actions/setup-node@v6.mise.toml の TOML 構文を Node バージョンファイルとして解釈しないため、Prisma deploy が Node セットアップ時点で止まるリスクがあります。jscpd.yaml と同様に、事前ステップで .mise.toml から 24.15.0 だけを抽出して node-version に渡してください。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/prisma-deploy.yaml around lines 28 - 33, 現在の workflow は
actions/setup-node の node-version-file に .mise.toml を渡しており失敗する可能性があります; 事前に
.mise.toml から Node バージョン文字列(例: "24.15.0")だけを抽出するステップを追加して、その抽出結果を
actions/setup-node の node-version に渡すよう修正してください (参照フィールド: node-version-file →
node-version, アクション: actions/setup-node@v6); 具体的には新しい step を追加して .mise.toml
をパース/grep してバージョン値を出力し、outputs または env 経由で後続の setup step に渡すようにしてください。
🧹 Nitpick comments (1)
.github/workflows/ci.yaml (1)

1-4: 既存 FIXME: Node バージョン指定の一元化について。

ファイル先頭の # FIXME: refactor for multiple declaration and cache にあるとおり、本 PR でも各ジョブ(build / biome / eslint / knip / test / storybook / docs)で setup-node のブロックが 7 箇所重複しています。本 PR の目的(バージョンドリフト解消)とも親和性が高いので、将来的には composite action か reusable workflow に切り出し、node-version-file: ".mise.toml" と pnpm セットアップ・キャッシュ設定を 1 箇所に集約することを検討してください。今回の変更自体は問題ありません。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yaml around lines 1 - 4, 複数ジョブで重複している setup-node
ブロックを集約してください: 現状 build / biome / eslint / knip / test / storybook / docs
の各ジョブに同一の setup-node ステップが7箇所あるので、将来的には reusable workflow か composite action
に切り出して一元化し、setup-node に node-version-file: ".mise.toml" を渡す形に統一し(pnpm
セットアップとキャッシュ設定もその共通化されたステップに含める)、各ジョブからはその共通ワークフロー/アクションを呼び出すだけにしてください。
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/jscpd.yaml:
- Around line 23-28: The workflow currently passes .mise.toml into
actions/setup-node via node-version-file which the action's parser can't read;
replace that by adding a step (e.g., id: extract-node-version) that reads
.mise.toml and extracts the version with a simple shell regex (example: grep -Po
'node\s*=\s*"\K[^"]+' .mise.toml) and writes it to $GITHUB_OUTPUT as
node_version, then update the actions/setup-node step (the "Install Node.js"
step using actions/setup-node@53b8394) to remove node-version-file and instead
use with: node-version: ${{ steps.extract-node-version.outputs.node_version }}
(keep cache and cache-dependency-path as-is).

In @.github/workflows/release-please.yaml:
- Around line 50-53: The workflow step using
actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f currently sets
node-version-file: ".mise.toml", but setup-node v6 does not support .mise.toml;
update that step to point node-version-file to a supported file (e.g., ".nvmrc"
or ".node-version") or switch the step to use an alternative action such as
jdx/mise-action to read .mise.toml, ensuring you change the node-version-file
value or replace the action invocation accordingly.

---

Duplicate comments:
In @.github/workflows/license-check.yaml:
- Around line 25-30: The setup step uses
actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f with
node-version-file: ".mise.toml", but setup-node expects a plain version or
supported file formats; replace this by extracting the node version from
.mise.toml and passing it via the node-version input (or point node-version-file
to a supported file). Concretely: add a preceding step that reads/parses the
node = "24.15.0" value from .mise.toml (e.g., grep/sed or a short script) and
saves it as an output or env var, then change the Install Node.js step to use
node-version: ${{ steps.<extract-step>.outputs.node_version }} (or node-version:
"${{ env.NODE_VERSION }}"), leaving cache and cache-dependency-path as-is; do
not pass the raw .mise.toml file to node-version-file.

In @.github/workflows/memlab.yaml:
- Around line 25-30: The workflow step named "Install Node.js" currently uses
the node-version-file input which does not parse .mise.toml; replace that by
extracting the node value from .mise.toml into an environment variable and pass
that to the setup action via node-version. Add a prior run step that
greps/parses the node field (e.g. grep -Po 'node\s*=\s*"(.*?)"' or similar) and
writes the extracted version to $GITHUB_ENV as NODE_VERSION, then update the
"Install Node.js" step (the uses: actions/setup-node@...) to remove
node-version-file and use node-version: ${{ env.NODE_VERSION }} so the actual
"node = \"24.15.0\"" value from .mise.toml is passed correctly.

In @.github/workflows/mutation-test.yaml:
- Around line 29-34: In the "Install Node.js" GitHub Actions step using
actions/setup-node@..., remove the unsupported node-version-file: ".mise.toml"
entry and instead set node-version: "24.15.0" (hard-coded extracted value) so
the action receives a concrete Node version; update the step that contains
node-version-file to use node-version and delete the node-version-file line.

In @.github/workflows/prisma-deploy.yaml:
- Around line 28-33: 現在の workflow は actions/setup-node の node-version-file に
.mise.toml を渡しており失敗する可能性があります; 事前に .mise.toml から Node バージョン文字列(例:
"24.15.0")だけを抽出するステップを追加して、その抽出結果を actions/setup-node の node-version
に渡すよう修正してください (参照フィールド: node-version-file → node-version, アクション:
actions/setup-node@v6); 具体的には新しい step を追加して .mise.toml をパース/grep
してバージョン値を出力し、outputs または env 経由で後続の setup step に渡すようにしてください。

In @.github/workflows/update-reports.yaml:
- Around line 21-24: `.mise.toml` を直接 `node-version-file` に渡しているため TOML の `node
= "..."` を正しく解釈できず失敗する可能性があります。GitHub Actions の `uses: actions/setup-node@...`
呼び出しを修正し、`.mise.toml` から `node = "..."` の値だけを抽出して `node-version`
に渡すように変更してください(例: `run` ステップで `grep`/`sed`/`python` 等を使って `.mise.toml`
からバージョン文字列を取得し、その出力を `setup-node` の `node-version` 入力に渡す)。対象となる識別子:
actions/setup-node, node-version-file, node-version, .mise.toml.

---

Nitpick comments:
In @.github/workflows/ci.yaml:
- Around line 1-4: 複数ジョブで重複している setup-node ブロックを集約してください: 現状 build / biome /
eslint / knip / test / storybook / docs の各ジョブに同一の setup-node ステップが7箇所あるので、将来的には
reusable workflow か composite action に切り出して一元化し、setup-node に node-version-file:
".mise.toml" を渡す形に統一し(pnpm
セットアップとキャッシュ設定もその共通化されたステップに含める)、各ジョブからはその共通ワークフロー/アクションを呼び出すだけにしてください。
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 2e16b735-1154-4d94-b529-8681c609fd87

📥 Commits

Reviewing files that changed from the base of the PR and between b51131a and 0d38cb5.

📒 Files selected for processing (11)
  • .github/renovate.json5
  • .github/workflows/ci.yaml
  • .github/workflows/docs.yaml
  • .github/workflows/jscpd.yaml
  • .github/workflows/license-check.yaml
  • .github/workflows/memlab.yaml
  • .github/workflows/mutation-test.yaml
  • .github/workflows/prisma-deploy.yaml
  • .github/workflows/release-please.yaml
  • .github/workflows/update-reports.yaml
  • package.json

Comment on lines 23 to 28
- name: Install Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "24.14.1"
node-version-file: ".mise.toml"
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
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 | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== .mise.toml =="
sed -n '1,40p' .mise.toml

echo "== actions/setup-node README: node-version-file examples =="
curl -fsSL https://raw.githubusercontent.com/actions/setup-node/v6/README.md \
  | sed -n '/node-version-file/,+4p'

echo "== actions/setup-node parser implementation =="
curl -fsSL https://raw.githubusercontent.com/actions/setup-node/v6/src/util.ts \
  | tr ';' '\n' \
  | sed -n '/getNodeVersionFromFile/,/printEnvDetailsAndSetOutput/p'

Repository: s-hirano-ist/s-private

Length of output: 3262


.mise.tomlsetup-nodenode-version-file として直接読めません。

actions/setup-node@v6 の parser は .mise.tomlnode = "24.15.0" 形式に対応していません。パーサーの実装では:

  1. JSON として解析を試みる(失敗)
  2. 正規表現 /^(?:node(js)?\s+)?v?(?<version>[^\s]+)$/m でテキスト解析を試みる

この正規表現は node 24.15.0 のような形式を期待していますが、.mise.tomlnode = "24.15.0" はマッチしません(= と引用符の存在)。その結果、パーサーはファイル全体を版文字列として返し、workflow は失敗します。

修正案: `.mise.toml` から Node バージョンを抽出して渡す
+      - name: Read Node.js version from .mise.toml
+        id: node-version
+        shell: bash
+        run: |
+          node_version="$(grep '^node = ' .mise.toml | cut -d'"' -f2)"
+          test -n "$node_version"
+          echo "version=$node_version" >> "$GITHUB_OUTPUT"
+
       - name: Install Node.js
         uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
         with:
-          node-version-file: ".mise.toml"
+          node-version: ${{ steps.node-version.outputs.version }}
           cache: pnpm
           cache-dependency-path: pnpm-lock.yaml
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Install Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: "24.14.1"
node-version-file: ".mise.toml"
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
- name: Read Node.js version from .mise.toml
id: node-version
shell: bash
run: |
node_version="$(grep '^node = ' .mise.toml | cut -d'"' -f2)"
test -n "$node_version"
echo "version=$node_version" >> "$GITHUB_OUTPUT"
- name: Install Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: ${{ steps.node-version.outputs.version }}
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/jscpd.yaml around lines 23 - 28, The workflow currently
passes .mise.toml into actions/setup-node via node-version-file which the
action's parser can't read; replace that by adding a step (e.g., id:
extract-node-version) that reads .mise.toml and extracts the version with a
simple shell regex (example: grep -Po 'node\s*=\s*"\K[^"]+' .mise.toml) and
writes it to $GITHUB_OUTPUT as node_version, then update the actions/setup-node
step (the "Install Node.js" step using actions/setup-node@53b8394) to remove
node-version-file and instead use with: node-version: ${{
steps.extract-node-version.outputs.node_version }} (keep cache and
cache-dependency-path as-is).

Comment thread .github/workflows/release-please.yaml
setup-node cannot parse .mise.toml (TOML format); it was misreading
[env] as the node version. Move node/pnpm to .tool-versions (asdf
format), which setup-node reads natively and mise also reads by
default. Keep doppler/agent-browser/env in .mise.toml.

Enable the asdf manager in Renovate and include it in the
node-and-pnpm grouping so updates still land in a single PR.
@github-actions
Copy link
Copy Markdown

Warning

actionlint の新しいバージョンがリリースされています。更新してください。
https://github.com/rhysd/actionlint/releases

  • 現在のバージョン: 1.7.11
  • 最新のバージョン: 1.7.12

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 19, 2026

✅ Code Duplication Report

Summary

Metric Value
Total Lines 23,683
Duplicate Lines 0
Duplication Rate 0.00%
Threshold 10%
Duplicate Blocks 49

✅ Code duplication rate is within the acceptable threshold.

📊 Detailed Report

Console Output


> s-private@3.7.1 jscpd /home/runner/work/s-private/s-private
> jscpd

Clone found (typescript):
 - /home/runner/work/s-private/s-private/packages/core/shared-kernel/events/system-error-event.ts [51:15 - 64:2] (13 lines, 87 tokens)
   /home/runner/work/s-private/s-private/packages/core/shared-kernel/events/system-warning-event.ts [50:17 - 63:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-input.stories.tsx [5:10 - 14:5] (9 lines, 149 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx [5:13 - 14:5]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-input-with-button.stories.tsx [13:20 - 20:5] (7 lines, 107 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx [5:13 - 12:9]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [6:18 - 15:13] (9 lines, 149 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx [5:13 - 14:5]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [197:18 - 208:6] (11 lines, 95 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [168:18 - 179:6]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [230:18 - 245:8] (15 lines, 134 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [168:18 - 212:7]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [45:16 - 56:2] (11 lines, 90 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [21:8 - 32:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [56:9 - 71:13] (15 lines, 84 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [32:2 - 45:16]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [71:13 - 90:19] (19 lines, 139 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [21:8 - 64:15]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [108:5 - 119:19] (11 lines, 72 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx [50:2 - 61:15]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/dropdown-menu.stories.tsx [37:16 - 51:5] (14 lines, 106 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/dropdown-menu.stories.tsx [21:8 - 35:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/drawer.stories.tsx [92:6 - 104:11] (12 lines, 123 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/drawer.stories.tsx [38:6 - 51:15]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/dialog.stories.tsx [67:14 - 82:3] (15 lines, 138 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/dialog.stories.tsx [23:8 - 38:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/command.stories.tsx [89:2 - 108:14] (19 lines, 133 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/command.stories.tsx [27:2 - 46:8]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/ui/card.stories.tsx [39:14 - 49:3] (10 lines, 89 tokens)
   /home/runner/work/s-private/s-private/packages/ui/ui/card.stories.tsx [19:8 - 29:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/generic-form-wrapper.stories.tsx [31:19 - 41:2] (10 lines, 86 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx [26:18 - 36:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/generic-form-wrapper.stories.tsx [293:12 - 306:6] (13 lines, 78 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/generic-form-wrapper.stories.tsx [259:14 - 272:5]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/packages/ui/forms/generic-form-wrapper.stories.tsx [308:2 - 326:2] (18 lines, 164 tokens)
   /home/runner/work/s-private/s-private/packages/ui/forms/generic-form-wrapper.stories.tsx [273:10 - 291:2]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/app/api/images/[contentType]/[id]/route.ts [13:2 - 21:11] (8 lines, 91 tokens)
   /home/runner/work/s-private/s-private/app/src/app/api/books/images/[contentType]/[path]/route.ts [12:2 - 20:7]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/layouts/nav/footer.stories.tsx [126:17 - 140:13] (14 lines, 118 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/layouts/nav/footer.stories.tsx [102:15 - 116:11]

Clone found (javascript):
 - /home/runner/work/s-private/s-private/app/src/components/common/layouts/cards/image-card-stack.tsx [23:13 - 44:9] (21 lines, 130 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/layouts/cards/link-card-stack.tsx [21:13 - 42:5]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/forms/actions/delete-button-with-modal.stories.tsx [95:16 - 107:7] (12 lines, 125 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/forms/actions/delete-button-with-modal.stories.tsx [75:2 - 87:8]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [99:22 - 104:15] (5 lines, 82 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [89:19 - 94:20]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [109:17 - 114:17] (5 lines, 82 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [89:19 - 94:20]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [119:16 - 124:15] (5 lines, 82 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/features/search/search-card.stories.tsx [89:19 - 94:20]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/common/display/image/image-stack.tsx [139:24 - 154:7] (15 lines, 173 tokens)
   /home/runner/work/s-private/s-private/app/src/components/common/display/image/image-stack.tsx [95:16 - 110:6]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/app/[locale]/book/[slug]/page.tsx [8:56 - 21:25] (13 lines, 101 tokens)
   /home/runner/work/s-private/s-private/app/src/app/[locale]/note/[slug]/page.tsx [8:40 - 21:19]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/app/[locale]/(dumper)/images/page.tsx [10:37 - 23:10] (13 lines, 117 tokens)
   /home/runner/work/s-private/s-private/app/src/app/[locale]/(dumper)/images/viewer/page.tsx [5:41 - 18:14]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/images/repositories/images-query-repository.ts [36:7 - 47:5] (11 lines, 83 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/notes/repositories/notes-query-repository.ts [33:9 - 44:6]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/images/repositories/images-query-repository.ts [51:10 - 66:7] (15 lines, 125 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/notes/repositories/notes-query-repository.ts [45:2 - 60:7]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/books/repositories/books-query-repository.ts [50:10 - 62:5] (12 lines, 90 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/notes/repositories/notes-query-repository.ts [32:6 - 44:6]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/books/repositories/books-query-repository.ts [81:9 - 98:2] (17 lines, 142 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/images/repositories/images-query-repository.ts [51:7 - 62:2]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/articles/repositories/articles-query-repository.ts [47:6 - 58:11] (11 lines, 83 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/notes/repositories/notes-query-repository.ts [33:9 - 44:6]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/infrastructures/articles/repositories/articles-query-repository.ts [66:11 - 82:2] (16 lines, 126 tokens)
   /home/runner/work/s-private/s-private/app/src/infrastructures/notes/repositories/notes-query-repository.ts [46:10 - 68:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/images/server/images-counter.stories.tsx [17:21 - 37:2] (20 lines, 124 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-counter.stories.tsx [15:20 - 36:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/books/server/viewer-body.stories.tsx [11:50 - 23:14] (12 lines, 102 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/viewer-body.stories.tsx [4:50 - 16:15]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/books/server/books-stack.stories.tsx [47:37 - 65:15] (18 lines, 108 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-stack.stories.tsx [68:28 - 86:13]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/books/server/books-stack.stories.tsx [69:2 - 86:15] (17 lines, 96 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-stack.stories.tsx [90:19 - 107:13]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/books/server/books-counter.stories.tsx [15:20 - 36:2] (21 lines, 125 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-counter.stories.tsx [15:20 - 36:2]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/books/client/books-form.tsx [13:2 - 23:9] (10 lines, 84 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/client/note-form.tsx [13:2 - 23:8]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/articles/server/articles-stack.tsx [1:1 - 11:14] (10 lines, 90 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-stack.tsx [1:1 - 11:11]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/articles/server/articles-stack.stories.tsx [85:20 - 120:10] (35 lines, 208 tokens)
   /home/runner/work/s-private/s-private/app/src/components/articles/server/articles-stack.stories.tsx [42:8 - 77:6]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/components/articles/server/articles-counter.stories.tsx [15:23 - 36:2] (21 lines, 125 tokens)
   /home/runner/work/s-private/s-private/app/src/components/notes/server/notes-counter.stories.tsx [15:20 - 36:2]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/application-services/books/get-books.ts [11:50 - 23:26] (12 lines, 109 tokens)
   /home/runner/work/s-private/s-private/app/src/application-services/notes/get-notes.ts [11:50 - 23:25]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/application-services/books/delete-books.core.ts [36:16 - 49:17] (13 lines, 107 tokens)
   /home/runner/work/s-private/s-private/app/src/application-services/notes/delete-note.core.ts [36:15 - 49:17]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/application-services/articles/load-more-articles.ts [1:1 - 9:20] (8 lines, 94 tokens)
   /home/runner/work/s-private/s-private/app/src/application-services/notes/load-more-notes.ts [1:1 - 9:17]

Clone found (typescript):
 - /home/runner/work/s-private/s-private/app/src/application-services/articles/delete-article.core.ts [36:18 - 49:20] (13 lines, 107 tokens)
   /home/runner/work/s-private/s-private/app/src/application-services/notes/delete-note.core.ts [36:15 - 49:17]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/app/error.tsx [3:17 - 18:5] (15 lines, 110 tokens)
   /home/runner/work/s-private/s-private/app/src/app/global-error.tsx [5:13 - 20:5]

Clone found (tsx):
 - /home/runner/work/s-private/s-private/app/src/app/error.tsx [23:5 - 36:2] (13 lines, 126 tokens)
   /home/runner/work/s-private/s-private/app/src/app/global-error.tsx [27:7 - 40:3]

┌────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format     │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ typescript │ 151            │ 10311       │ 46481        │ 12           │ 149 (1.45%)      │ 1244 (2.68%)      │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ tsx        │ 153            │ 11156       │ 73809        │ 36           │ 492 (4.41%)      │ 4114 (5.57%)      │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ javascript │ 102            │ 2216        │ 13064        │ 1            │ 21 (0.95%)       │ 130 (1%)          │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total:     │ 406            │ 23683       │ 133354       │ 49           │ 662 (2.8%)       │ 5488 (4.12%)      │
└────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 49 clones.
time: 888.938ms

Duplicate Code Blocks

Duplicate 1

  • Lines: 14
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/core/shared-kernel/events/system-error-event.ts:51-64
  • Second occurrence: /home/runner/work/s-private/s-private/packages/core/shared-kernel/events/system-warning-event.ts:50-63

Duplicate 2

  • Lines: 10
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-input.stories.tsx:5-14
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx:5-14

Duplicate 3

  • Lines: 8
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-input-with-button.stories.tsx:13-20
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx:5-12

Duplicate 4

  • Lines: 10
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx:6-15
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-textarea.stories.tsx:5-14

Duplicate 5

  • Lines: 12
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx:197-208
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx:168-179

Duplicate 6

  • Lines: 16
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx:230-245
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/forms/fields/form-dropdown-input.stories.tsx:168-212

Duplicate 7

  • Lines: 12
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:45-56
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:21-32

Duplicate 8

  • Lines: 16
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:56-71
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:32-45

Duplicate 9

  • Lines: 20
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:71-90
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:21-64

Duplicate 10

  • Lines: 12
  • Tokens: N/A
  • First occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:108-119
  • Second occurrence: /home/runner/work/s-private/s-private/packages/ui/ui/pagination.stories.tsx:50-61

... and 39 more duplicate blocks. Run pnpm jscpd locally for the full report.


📦 Full Report: Download the complete jscpd report from GitHub Actions Artifacts

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 19, 2026

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 90.49% 1457 / 1610
🔵 Statements 90.32% 1568 / 1736
🔵 Functions 87.67% 427 / 487
🔵 Branches 74.9% 567 / 757
File CoverageNo changed files found.
Generated in workflow #3023 for commit 8c40f66 by the Vitest Coverage Report Action

Cloudflare Workers Builds detects .tool-versions and tries to install
via asdf, but the node/pnpm asdf plugins are not preinstalled in the
build image, causing the build to fail immediately.

Switch to .nvmrc for the node version, which Cloudflare Workers Builds
and actions/setup-node both read natively. Move pnpm back into
.mise.toml [tools] (Cloudflare reads pnpm via corepack from
package.json's packageManager field, so no .nvmrc-equivalent is needed
for it).

Enable mise's idiomatic_version_file_enable_tools = ["node"] so mise
keeps reading .nvmrc for local dev. Update Renovate to use the nvm
manager instead of asdf in the node-and-pnpm grouping.
@github-actions
Copy link
Copy Markdown

Warning

actionlint の新しいバージョンがリリースされています。更新してください。
https://github.com/rhysd/actionlint/releases

  • 現在のバージョン: 1.7.11
  • 最新のバージョン: 1.7.12

@s-hirano-ist s-hirano-ist merged commit 0610965 into main Apr 19, 2026
21 checks passed
@s-hirano-ist s-hirano-ist deleted the claude/sync-version-updates-zxhmt branch April 19, 2026 05:27
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