Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 28 additions & 8 deletions .github/workflows/claude-pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
# 【このリポジトリは public】
# Secret 名は CLAUDE_CODE_AUTH_TOKEN、CLI が読む環境変数は CLAUDE_CODE_OAUTH_TOKEN。
# - Secret は fork からの PR には渡らない。下の if で同一リポジトリに限定する。
# - レビュー結果を PR に投稿すると誰でも読める。既定では投稿せず artifact 止まり。
# POST_TO_PR を true にすると投稿する。
# - **レビュー結果を PR に投稿する設定にしている(POST_TO_PR=true)。このリポジトリは
# public なので投稿内容は誰でも読める。** 認可の欠落など機微な指摘が出る可能性が
# あるため、公開して差し支えない内容かを運用で見ておくこと。
# 投稿を止めるには POST_TO_PR を false にする(artifact には残る)。
#
# 注: cloud-hosted の `claude ultrareview` は 2026-08 時点でこのアカウントでは
# 利用できなかった("Ultrareview is currently unavailable")。ここでは
Expand All @@ -25,12 +27,12 @@ on:
pr_number:
description: 'レビュー対象の PR 番号'
required: true
# TODO(試行中): 動作確認のため有効化。確認後は workflow_dispatch のみに戻す。
pull_request:
branches: ['**']
types: [opened, synchronize, reopened, ready_for_review]

env:
POST_TO_PR: 'false'
POST_TO_PR: 'true'
MODEL: 'sonnet'
MAX_DIFF_BYTES: '200000' # これを超える差分はレビューしない(分割が必要)

Expand All @@ -39,7 +41,8 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
if: github.event_name == 'workflow_dispatch' ||
github.event.pull_request.head.repo.full_name == github.repository
(github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.draft == false)
permissions:
contents: read
pull-requests: write
Expand Down Expand Up @@ -185,9 +188,26 @@ jobs:
with:
script: |
const fs = require('fs');
const MARK = '<!-- claude-pr-review -->';
let body = '(レビュー結果を生成できませんでした)';
try { body = fs.readFileSync('review.md', 'utf8'); } catch (e) {}
await github.rest.issues.createComment({
issue_number: context.issue.number, owner: context.repo.owner,
repo: context.repo.repo, body: body.slice(0, 60000),
body = MARK + '\n' + body.slice(0, 60000)
+ '\n\n<sub>差分のみを対象にした自動レビューです。'
+ '誤りが含まれることがあります。</sub>';
// 同じ PR に push するたびコメントが増えないよう、既存の1件を更新する
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.issue.number,
owner: context.repo.owner, repo: context.repo.repo, per_page: 100,
});
const mine = comments.find(c => c.body && c.body.includes(MARK));
if (mine) {
await github.rest.issues.updateComment({
comment_id: mine.id, owner: context.repo.owner,
repo: context.repo.repo, body,
});
} else {
await github.rest.issues.createComment({
issue_number: context.issue.number, owner: context.repo.owner,
repo: context.repo.repo, body,
});
}
36 changes: 28 additions & 8 deletions tools/api-inventory/ci/claude-pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
# 【このリポジトリは public】
# Secret 名は CLAUDE_CODE_AUTH_TOKEN、CLI が読む環境変数は CLAUDE_CODE_OAUTH_TOKEN。
# - Secret は fork からの PR には渡らない。下の if で同一リポジトリに限定する。
# - レビュー結果を PR に投稿すると誰でも読める。既定では投稿せず artifact 止まり。
# POST_TO_PR を true にすると投稿する。
# - **レビュー結果を PR に投稿する設定にしている(POST_TO_PR=true)。このリポジトリは
# public なので投稿内容は誰でも読める。** 認可の欠落など機微な指摘が出る可能性が
# あるため、公開して差し支えない内容かを運用で見ておくこと。
# 投稿を止めるには POST_TO_PR を false にする(artifact には残る)。
#
# 注: cloud-hosted の `claude ultrareview` は 2026-08 時点でこのアカウントでは
# 利用できなかった("Ultrareview is currently unavailable")。ここでは
Expand All @@ -25,12 +27,12 @@ on:
pr_number:
description: 'レビュー対象の PR 番号'
required: true
# TODO(試行中): 動作確認のため有効化。確認後は workflow_dispatch のみに戻す。
pull_request:
branches: ['**']
types: [opened, synchronize, reopened, ready_for_review]

env:
POST_TO_PR: 'false'
POST_TO_PR: 'true'
MODEL: 'sonnet'
MAX_DIFF_BYTES: '200000' # これを超える差分はレビューしない(分割が必要)

Expand All @@ -39,7 +41,8 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
if: github.event_name == 'workflow_dispatch' ||
github.event.pull_request.head.repo.full_name == github.repository
(github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.draft == false)
permissions:
contents: read
pull-requests: write
Expand Down Expand Up @@ -185,9 +188,26 @@ jobs:
with:
script: |
const fs = require('fs');
const MARK = '<!-- claude-pr-review -->';
let body = '(レビュー結果を生成できませんでした)';
try { body = fs.readFileSync('review.md', 'utf8'); } catch (e) {}
await github.rest.issues.createComment({
issue_number: context.issue.number, owner: context.repo.owner,
repo: context.repo.repo, body: body.slice(0, 60000),
body = MARK + '\n' + body.slice(0, 60000)
+ '\n\n<sub>差分のみを対象にした自動レビューです。'
+ '誤りが含まれることがあります。</sub>';
// 同じ PR に push するたびコメントが増えないよう、既存の1件を更新する
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.issue.number,
owner: context.repo.owner, repo: context.repo.repo, per_page: 100,
});
const mine = comments.find(c => c.body && c.body.includes(MARK));
if (mine) {
await github.rest.issues.updateComment({
comment_id: mine.id, owner: context.repo.owner,
repo: context.repo.repo, body,
});
} else {
await github.rest.issues.createComment({
issue_number: context.issue.number, owner: context.repo.owner,
repo: context.repo.repo, body,
});
}
10 changes: 5 additions & 5 deletions tools/api-inventory/scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,15 @@ python3 tools/api-inventory/scripts/build_checklist.py
export WEKO_API_INVENTORY_DIR=/path/to/weko-secret
./install.sh # スタックを起動しておく

tools/api-inventory/scripts/remeasure.sh # 未測定の P0/P1 を測る
tools/api-inventory/scripts/remeasure.sh # 未測定の P1/P2 を測る
tools/api-inventory/scripts/remeasure.sh --all-unmeasured # 未測定を全件
tools/api-inventory/scripts/remeasure.sh --nos 607,618 # no を直接指定
tools/api-inventory/scripts/remeasure.sh --read-only # GET/HEAD のみ(データを変えない)
tools/api-inventory/scripts/remeasure.sh --allow-writes # 書き込み系も測る(データが変わる)
```

**既定では書き込み系も実測するため実機のデータが変わる。** 著者DB・サイト情報・
ワークフローの状態などが書き換わるので、使い捨て環境で回すか、終了後に
`./install.sh` で作り直すこと。`--read-only` なら副作用はない
**既定は読み取り専用(GET/HEAD のみ)で副作用がない。** 書き込み系まで測るには
`--allow-writes` を明示する。実機のデータ(著者DB・サイト情報・ワークフローの状態)が
書き換わるため、使い捨て環境で回すか、終了後に `./install.sh` で作り直すこと。

反映は `apply_probe_results.py` が行い、**`dynamic_verified` が空の行だけ**を埋める。
既存の実測値(★実証など人手で精査した記述を含む)は残す。差し替えるときは
Expand Down
23 changes: 13 additions & 10 deletions tools/api-inventory/scripts/remeasure.sh
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#!/usr/bin/env bash
# 未測定/指定範囲のエンドポイントを実機で測り直し、台帳に反映する。
#
# ./remeasure.sh # dynamic_verified が空の P0/P1 を測る
# ./remeasure.sh # dynamic_verified が空の P1/P2 を測る
# ./remeasure.sh --all-unmeasured # 未測定を全件
# ./remeasure.sh --nos 607,618 # no を直接指定
# ./remeasure.sh --read-only # GET/HEAD だけ(データを変えない)
# ./remeasure.sh --allow-writes # 書き込み系も測る(実機データが変わる)
#
# 前提: $WEKO_API_INVENTORY_DIR(台帳) と WEKO スタックが起動していること。
#
# 【注意】既定では書き込み系も実測するため **実機のデータが変わります**。
# 著者DB・サイト情報・ワークフローの状態などが書き換わるので、
# 使い捨て環境で回すか、終了後に環境を作り直してください。
# 既定は **読み取り専用**(GET/HEAD のみ)で副作用がない。
# 書き込み系まで測るには --allow-writes を明示すること。実機のデータ
# (著者DB・サイト情報・ワークフローの状態など)が書き換わるため、
# 使い捨て環境で回すか、終了後に環境を作り直すこと。
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
: "${WEKO_API_INVENTORY_DIR:?台帳の場所を指定してください (export WEKO_API_INVENTORY_DIR=...)}"
Expand All @@ -20,12 +21,12 @@ WORK="${WORK:-$(mktemp -d)}"
mkdir -p "$WORK"
TSV="$WEKO_API_INVENTORY_DIR/weko3_api_list.tsv"

SCOPE=p01; WRITES=--allow-writes; NOS=""
SCOPE=p12; WRITES=""; NOS=""
while [ $# -gt 0 ]; do
case "$1" in
--all-unmeasured) SCOPE=all ;;
--nos) NOS="$2"; SCOPE=nos; shift ;;
--read-only) WRITES="" ;;
--allow-writes) WRITES=--allow-writes ;;
*) echo "不明な引数: $1" >&2; exit 2 ;;
esac; shift
done
Expand All @@ -35,7 +36,7 @@ python3 "$HERE/fixtures.py" --out "$WORK/fixtures.json"

echo "== 2. 対象の抽出 =="
case "$SCOPE" in
p01) awk -F'\t' 'NR>1 && $25 ~ /^P[01]/ && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;;
p12) awk -F'\t' 'NR>1 && $25 ~ /^P[12]$/ && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;;
all) awk -F'\t' 'NR>1 && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;;
nos) tr ',' '\n' <<< "$NOS" > "$WORK/nos.txt" ;;
esac
Expand All @@ -56,5 +57,7 @@ python3 "$HERE/reconcile.py" --gate > /dev/null && echo " reconcile: 差分な

echo
echo "成果物: $WORK/probe.json (明細)"
echo "※ 実機のデータが変わっています。継続利用する場合は fixtures.py が冪等なので"
echo " 再投入で復旧しますが、著者DB等の副作用は残ります。"
if [ -n "$WRITES" ]; then
echo "※ 書き込み系を実測したため実機のデータが変わっています。fixtures.py は冪等ですが"
echo " 著者DB等の副作用は残ります。クリーンな状態が要るなら ./install.sh で作り直してください。"
fi
Loading