Skip to content

build: EXE_SUFFIX 抽象化で .exe ハードコードを解消 (WP-13) - #304

Merged
aloekun merged 8 commits into
masterfrom
build/exe-suffix-abstraction
Jul 19, 2026
Merged

build: EXE_SUFFIX 抽象化で .exe ハードコードを解消 (WP-13)#304
aloekun merged 8 commits into
masterfrom
build/exe-suffix-abstraction

Conversation

@aloekun

@aloekun aloekun commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Summary

  • .exe ハードコード(build/実行 scripts 15+ 箇所 + Rust 機能箇所)を OS 非依存化し、全クラウド(Linux)対応の土台を作る(WP-13)
  • ビルド成果物コピー cp *.exe を Node 製 scripts/deploy-artifacts.mjs に置換し、Git usr/bin の cp PATH 依存も構造解消
  • 実行系 pnpm scripts を scripts/run-artifact.mjs ランチャー経由に(suffix 解決 + 引数忠実転送。--help/-h//? は fail-closed 拒否で exe-help-block ガードを担保)
  • settings テンプレートを / 区切り + {{EXE_SUFFIX}} に統一し、生成を scripts/build-hooks-settings.mjs へ切り出し(JSON 妥当性検証 + 関数リプレーサで $ 誤展開を防止)
  • Rust の実行時 exe パス解決を std::env::consts::EXE_SUFFIX 化(cli-pr-monitor / cli-push-runner / exe-help-block regex)
  • (同梱)docs(weekly-review): 2026-07-19 findings 採用 + ADR-059 dogfood #303 post-merge feedback の F2/F3 を docs/todo 系列に採用登録

Context

  • Why: harness-improvement-plan.md WP-13。.exe ハードコードが Linux/クラウドセッション対応の障壁であり、その解消が後続の全クラウド対応(WP-15/16)の前提となる土台。
  • Trigger: WP-13。WP-12 までの完了を確認したうえで着手。
  • Scope decision:
    • プラン策定(2026-07-04)後のコード進化で当初想定の Rust 箇所(protected_files / polling_exe)は stale 化しており、実際の機能的 .exe を精査して置換した。
    • hooks-config.toml の quality_gate cmd(cmd.exe 経由)と push-runner-config.toml の exe_path はデプロイ config でソース hardcode ではないため、WP-15 の Linux config 生成へ委譲。
    • docs(weekly-review): 2026-07-19 findings 採用 + ADR-059 dogfood #303 の F2/F3 採用登録コミット(7c1762e8)は commit 本文の「次セッションの PR に混ぜる」意図に従い同梱。
  • Review fixes: ローカルレビュー(Claude エージェント + ローカル LLM)を実施。指摘のうち launcher の exe-help-block ガード迂回(Medium)と settings 生成の $ 誤展開(Low)を修正として反映。

Validation

  • pnpm push pre-push-review: verdict=APPROVE(security + simplicity、findings なし、2026-07-20)
  • quality_gate 全 PASS(pnpm lint / test / build、cargo clippy --workspace --all-targets --all-features -D warnings、cargo test、ignored tests)
  • cargo test(影響 crate): cli-pr-monitor / cli-push-runner / hooks-pre-tool-validate = 248 / 256 / 232 pass
  • pnpm build:all: 全 15 crate を deploy-artifacts.mjs 経由でビルド + 配布成功(exit 0)
  • pnpm deploy:hooks: 一時ターゲットで smoke(11 exe コピー + settings 生成)
  • 手動 smoke: forward-slash 絶対パス exe が Windows で実行可能を実測 + 配布後 session の PreToolUse hook 実発火 + launcher の --help/-h 拒否(exit 2)
  • Linux 実機での hook 発火 / cargo test / push dry-run(WP-15 で検証予定)

References

Summary by CodeRabbit

  • 新機能

    • Windows以外でも実行ファイルを利用できるようになり、OSに応じて拡張子を自動解決します。
    • ビルド成果物の配置・起動を共通化し、実行時のエラー確認を改善しました。
    • 設定ファイル生成時にパスを正規化し、JSONの妥当性を検証します。
  • バグ修正

    • 実行ファイル名の固定.exe参照による、非Windows環境での起動問題を解消しました。
    • ヘルプ引数の検出を拡張し、拡張子なしの実行ファイルにも対応しました。
  • ドキュメント

    • OS依存の実行改善内容と関連タスクの進捗を更新しました。

aloekun and others added 8 commits July 20, 2026 01:59
PR #303 の post-merge feedback から採用候補 2 件を docs/todo 系列に登録:
- 334 (Tier 1): docs/todo*.md 本文の順位番号表記を検出する custom lint rule
  (ADR-033 使用禁止規定の仕組み化。将来の展望に検討済み明記も未実装 約3ヶ月、Effort S)
- 335 (Tier 2): post-merge-feedback の transcript 分析を cli-merge-pipeline 生成の
  summary index に置換 (session-analysis facet の 25K token limit 衝突を構造的に回避)

F1 (preamble 一貫性 lint) は未採用でレポート 303.md に残置。詳細は todo14.md、
priority 行は todo-summary #334/#335。push はせず次セッションの PR に混ぜる。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
package.json の build:* スクリプトが使っていた `cp target/release/<name>.exe .claude/`
を Node 製の scripts/deploy-artifacts.mjs に置換する。process.platform から実行
ファイル拡張子 (.exe / なし) を解決してコピーするため、(1) `.exe` の Windows 決め打ち
(2) Git for Windows の usr/bin (cp.exe) を PATH に要求する既知の罠、の 2 点を構造的に
解消する。WP-13「EXE_SUFFIX 抽象化」step 1。挙動は Windows 上で従来と同一 (退行なし)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
push / create-pr / mark-notified / merge-pr / check-ci / lint:docs の `.\.claude\<name>.exe`
直接呼び出しを scripts/run-artifact.mjs 経由に置換する。ランチャーは process.platform から
実行ファイル拡張子を解決し、spawnSync (shell 非経由) で子プロセスを起動、終了コードを
そのまま伝播する (`&&` チェーン・exit 7 の empty @ 判定を維持)。引数は配列で忠実に転送する
ため、cli-pr-monitor の `--body` 再結合ロジックは透過的に機能する。WP-13 step 2。
pnpm 経由の呼び出し名 (create-pr / merge-pr 等) は不変のため ADR-028 ゲートに影響しない。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ADR-005)

settings.local.json.template の exe パスを {{PROJECT_DIR}}/.claude/<name>{{EXE_SUFFIX}} 形式へ
変更し、パス区切りを / に統一する。forward-slash の絶対パス exe は Windows でも実行可能
(& "C:/…/x.exe" / cmd /c の双方で exit 0、配布後 session の PreToolUse hook 実発火も確認) であり、
JSON エスケープ不要で Linux にもそのまま通る。

変更点: 生成ロジックを scripts/build-hooks-settings.mjs へ切り出し、{{EXE_SUFFIX}} 置換と
生成物の JSON 妥当性検証 (fail-closed) を追加した (壊れた settings で hooks が無言で無効化される
ADR-005 冒頭の事故を防ぐ)。deploy-hooks.ts も同一解決 (forward-slash + EXE_SUFFIX) に追従し、
コピー対象 exe を crate 名 + EXE_SUFFIX で組み立てる。ADR-005 に amendment を追記。WP-13 step 3。
Windows 上の生成・配布は退行なし (実測)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tep 4)

Rust ソースの `.exe` ハードコードのうち、実行時に子 exe を解決する機能的な箇所を
OS 依存の EXE_SUFFIX ベースに置換する (Windows は .exe、Linux は拡張子なしで解決)。
プラン策定 (2026-07-04) 後のコード進化で対象は当初想定の hooks-pre-tool-validate から
移動しており、実際の機能的 .exe を精査して置換した。

対象: cli-pr-monitor の classifier_exe_path / checker_exe_path (兄弟 exe 解決)、
wakeup 再起動コマンドの exe fallback (review_recheck / rate_limit signal 計 3 箇所)、
cli-push-runner の lint_screen デフォルト exe パス (cfg で platform 分岐)、
hooks-pre-tool-validate の exe-help-block regex (`.exe` を optional 化し拡張子なしの
Linux バイナリも block)。classifier_exe_path テストと polling_exe テストを EXE_SUFFIX /
Linux 形式で追加・更新。cargo test 全 pass (248/256/232)、clippy clean、Windows 退行なし。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
harness-improvement-plan.md の全体表 WP-13 行を 未着手 → 実装済 に更新し、詳細セクションに
実装サマリの blockquote を追記。build/実行 scripts の mjs 化、settings の / 区切り + EXE_SUFFIX 化、
Rust の機能的 exe 解決の EXE_SUFFIX 化と、スコープ補正 (プランの protected_files/polling_exe 記述の
stale 化)・スコープ外 (config TOML の cmd.exe 依存は WP-15 へ)・受け入れ基準の実測結果・完了条件を記録。
「cp PATH 依存は WP-13 で解消」の既知の罠も解消済みに更新。lint:docs / markdownlint pass。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
local-review (security-auditor Medium) 指摘への対応。ランチャー経由の呼び出し
(node scripts/run-artifact.mjs <name> --help) は PreToolUse の exe-help-block ガードの
command-start アンカーに掛からず、--help が実 exe に転送され merge 本体等が起動する
(PR #109 / ADR-030 の SIGPIPE 事故ベクタ)。ランチャー側で forwarded 引数に help フラグ
(--help/-h/?) があれば exit 2 で拒否し、ガードと同じ意図を新経路でも担保する。
--help/-h とも拒否・通常起動は非退行を実測。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
local-review (security-auditor Low) 指摘への対応。String.replace(regex, projectDir)
は置換値中の $& / $prime / $backtick / $1 等を特殊解釈するため、リポジトリ絶対パスに
該当列が含まれると生成される settings のパスが破損し、hooks が無言で無効化される
(決定論ゲートの fail-OPEN) 恐れがある。JSON.parse 検証は構造破損しか捕捉しない。
build-hooks-settings.mjs と deploy-hooks.ts の両方で置換値を関数リプレーサ (() => value)
に変え、リテラルとして扱う。settings 再生成・tsc は非退行を実測。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

.exe の固定参照を EXE_SUFFIX に置き換え、成果物のデプロイ・起動、フック設定生成、Rust の実行ファイル解決を OS 非依存化しました。関連するテスト、ADR、改善計画、TODO 文書も更新されています。

Changes

実行ファイルのデプロイと起動

Layer / File(s) Summary
成果物のデプロイ・実行経路
package.json, scripts/deploy-artifacts.mjs, scripts/run-artifact.mjs
ビルド成果物のコピーと CLI 実行を Node スクリプトへ移行し、OS 別の実行ファイル拡張子、引数転送、終了コード伝播を実装しました。

フック設定と Rust 実装

Layer / File(s) Summary
フック設定のテンプレート解決
.claude/settings.local.json.template, scripts/build-hooks-settings.mjs, scripts/deploy-hooks.ts
{{EXE_SUFFIX}} と正規化した {{PROJECT_DIR}} を使って設定を生成・配布し、生成 JSON を検証します。
Rust の実行ファイル解決と help 判定
src/cli-pr-monitor/src/..., src/cli-push-runner/src/..., src/hooks-pre-tool-validate/src/...
関連実行ファイル名と PARK signal のフォールバックを std::env::consts::EXE_SUFFIX 対応にし、拡張子なしバイナリの help ブロック判定を追加しました。

設計・計画文書

Layer / File(s) Summary
実装状況と後続タスクの記録
docs/adr/adr-005-hooks-path-resolution-with-template.md, docs/harness-improvement-plan.md, docs/todo-summary.md, docs/todo14.md
EXE_SUFFIX 対応の仕様・完了状況と、順位番号 lint および summary index 化のタスクを文書化しました。

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PackageScripts
  participant DeployArtifacts
  participant RunArtifact
  participant ClaudeArtifacts
  PackageScripts->>DeployArtifacts: 成果物名を指定
  DeployArtifacts->>ClaudeArtifacts: OS 別サフィックスでコピー
  PackageScripts->>RunArtifact: 成果物名と引数を指定
  RunArtifact->>ClaudeArtifacts: 対応する実行ファイルを起動
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 変更内容の主旨である .exe ハードコード解消と EXE_SUFFIX 抽象化を的確に表しており、タイトルとして十分具体的です。
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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 build/exe-suffix-abstraction

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.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: issue_comment (created) / 実行 run
  • CI: CodeRabbit チェックのみ pending(Review in progress、待機はしない方針のため現時点の情報で分析)。他の必須 CI チェックは gh pr checks に表示なし。mergeStateStatus=UNSTABLE はこの pending チェックに起因すると推測
  • レビュー状況: CodeRabbit = レビュー進行中(「Currently processing new changes...」のプレースホルダコメントのみ、findings 未生成)。人間レビュー = なし(reviews API 応答は空配列)。インライン指摘 = なし
  • Verdict: approved(暫定 — CodeRabbit のレビューが未完了のため、現時点で actionable な指摘が存在しないことのみを根拠とする暫定判定。レビュー完了後に再監視が必要)

Applicable Findings (Critical / High / Major)

該当なし(レビュー指摘が 0 件のため)

Applicable Findings (Medium 以下)

該当なし

Filtered (not applicable)

該当なし

次のアクション

  • CodeRabbit のレビュー完了を待って、findings が生成され次第あらためて本 workflow(または次回の issue_comment イベント)で再分析すること
  • PR body 記載の Validation 項目のうち「Linux 実機での hook 発火 / cargo test / push dry-run」は WP-15 に委譲済みで本 PR のスコープ外(意図的な scope decision、ADR-005 amendment と整合)
  • 現時点で CI/レビューとも blocking な問題は検出されていないため、人間側のアクションは特に不要(CodeRabbit 完了待ちのみ)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@docs/harness-improvement-plan.md`:
- Around line 235-236: 見出しの「実装済
(2026-07-20)」を、実際の完了日が確認できる場合はその日付に修正し、7月20日が予定日なら「予定」と明記してください。実装済みと未来日付を同時に示さないよう、進捗状態と日付を整合させてください。
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 19452783-04e8-45a6-9383-869e946c927b

📥 Commits

Reviewing files that changed from the base of the PR and between 824cbbd and d959d53.

📒 Files selected for processing (16)
  • .claude/settings.local.json.template
  • docs/adr/adr-005-hooks-path-resolution-with-template.md
  • docs/harness-improvement-plan.md
  • docs/todo-summary.md
  • docs/todo14.md
  • package.json
  • scripts/build-hooks-settings.mjs
  • scripts/deploy-artifacts.mjs
  • scripts/deploy-hooks.ts
  • scripts/run-artifact.mjs
  • src/cli-pr-monitor/src/classifier_runner.rs
  • src/cli-pr-monitor/src/runner.rs
  • src/cli-pr-monitor/src/stages/poll/rate_limit_signal.rs
  • src/cli-pr-monitor/src/stages/poll/review_recheck_signal.rs
  • src/cli-push-runner/src/config/lint_screen.rs
  • src/hooks-pre-tool-validate/src/presets/safety/polling_exe.rs

Comment thread docs/harness-improvement-plan.md
@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: CodeRabbit チェック = pass(Review completed)。analyze チェックは本監視ジョブ自身であり in_progress(完了後に解消される見込み)。他に必須 CI チェックは gh pr checks に表示なし。mergeStateStatus=UNSTABLE は本ジョブの pending に起因すると推測
  • レビュー状況: CodeRabbit = レビュー完了、Actionable comments 1 件(Minor)。人間レビュー = なし(reviews API に CodeRabbit の COMMENTED レビュー1件のみ)
  • Verdict: user_decision(Minor severity の applicable な指摘のみ — auto-fix 対象外、人間判断待ち)

Applicable Findings (Critical / High / Major)

該当なし

Applicable Findings (Medium 以下)

# File (Line) Reviewer Issue Recommended Action
1 docs/harness-improvement-plan.md (235-236) CodeRabbit (Minor) 「実装済 (2026-07-20)」の日付が現在日 (2026-07-19) より未来で、「実装済み」と矛盾している 実際の完了日を確認できればその日付に修正、7/20 が予定日なら「予定」と明記して進捗と日付の整合を取る

Filtered (not applicable)

該当なし

次のアクション

  • Minor/Quick-win 指摘のため必須ブロッカーではないが、docs/harness-improvement-plan.md:235-236 の日付表記を実際の完了日 or 「予定」に修正することを推奨(マージ前後どちらでも可)
  • analyze チェック(本ジョブ)の完了を待って mergeStateStatusUNSTABLE から解消されることを確認する
  • 現時点で Critical/High/Major の applicable な指摘は無く、CI の実質的なブロッカーも無いため、上記 Minor 指摘の対応方針を決め次第マージ判断は人間側で進めて差し支えない

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: CodeRabbit チェック = pass(Review completed)。analyze チェックは本監視ジョブ自身であり pending(完了後に解消される見込み)。他に必須 CI チェックは gh pr checks に表示なし
  • レビュー状況: CodeRabbit = レビュー完了、当初 Actionable 1件(Minor, docs/harness-improvement-plan.md:235-236)を提起→PR作成者 aloekun が反論(19:55:42、2026-07-20 は執筆時点のJST日付であり未来日付ではない旨、かつ「実装済」≠「完了」で完了条件は保留中と説明)→CodeRabbit がこれを是認し指摘を撤回(19:55:55、<review_comment_withdrawn>)。人間レビューはこの aloekun のコメント返信のみで、独立した承認/変更要求レビューではない
  • Verdict: approved(前回分析時点で唯一の applicable 指摘だった Minor 項目が、作成者の反論を経て CodeRabbit 自身により撤回されたため、残存する applicable な指摘は 0 件)

Applicable Findings (Critical / High / Major)

該当なし

Applicable Findings (Medium 以下)

該当なし(旧 #1「実装済 (2026-07-20)」の日付整合性指摘は CodeRabbit により撤回済み)

Filtered (not applicable)

該当なし

次のアクション

  • 前回報告した Minor 指摘(日付整合性)は解消済みのため、追加対応は不要
  • analyze チェック(本ジョブ)の完了を待って mergeStateStatusUNSTABLE から解消されることを確認する
  • 現時点で Critical/High/Major/Medium の applicable な指摘・CI ブロッカーは無く、マージ判断は人間側で進めて差し支えない

@aloekun
aloekun merged commit 23501ce into master Jul 19, 2026
3 of 4 checks passed
@aloekun
aloekun deleted the build/exe-suffix-abstraction branch July 19, 2026 19:58
aloekun added a commit that referenced this pull request Jul 20, 2026
pr-monitor.yml バックストップが CodeRabbit の投稿 (ack / rate-limit 通知含む) ごとに
「🤖 PR Monitor 分析」コメントを再投稿していた問題を修正 (PR #287 で 5 件、#304 で 3 件、
#307 で 5 件実観測)。原因は重複ガードが LLM prompt 内 (助言層) にしかなく、トリガー事象
(新規コメントの存在) 自身が prompt の skip 条件を無効化するトートロジーだったこと。

- jobs.analyze.if: に決定論ガードを追加 (ADR-042: 助言層 -> 決定論層):
  - issue_comment は CR walkthrough/summary マーカーを含み、かつ rate-limit placeholder
    でないもののみ起動する positive allowlist。ack / rate-limit 通知 / command invocation
    を一括除外 (denylist より確実)。マーカーは live PR #304/#307 の生 body で実検証。
  - CLOSED/MERGED PR では起動しない (issue.state / pull_request.state == 'open')。
- prompt 手順 2 を「新規コメントの有無」から「分析価値のある新情報の有無」へ書換え、
  ack/rate-limit/自身の分析コメントは新情報に数えない旨を明示。決定論層の二層目に降格。
- 先頭設計メモに経緯を記録。

検証: YAML parse + paren balance を node で確認、pnpm lint:docs OK。
残 (post-merge): workflow_dispatch スモーク + 実 PR dogfood 確認 (todo17.md 順位 319)。

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant