herdr Windowsベータ導入とFeliCa勤怠構想、Claude Code警告の退治まで — 開発ツールと環境整備の一日

開発misc-dev

herdr Windowsベータ導入とFeliCa勤怠構想、Claude Code警告の退治まで — 開発ツールと環境整備の一日

今日は新しいコードを書くより、道具と環境を整える日になった。朝イチで Claude Code の起動画面に見慣れない警告が居座っているのを見つけ、午前は herdr の Windows ベータを導入して記事化し、Amazon で「FeliCa カードのつもりで見ていたカード」が実はチップ無しだと判明する寄り道を経て勤怠管理の構想を固め、午後は非公開記事のパンくずのずれを直させ、夕方には dev サーバーの死活確認までやった。

今日の流れを先にまとめると、こうなる。

  • 朝: Claude Code 起動時の permission 警告の原因調査と settings.json 修正
  • 午前: herdr の Windows ベータを導入 → 公開記事化 → 学習ゲート経由でコミット
  • 午前: FeliCa カード探しで「チップ無し PVC カード」の罠を回避 → RC-S380 勤怠構想を記事化
  • 午後: 非公開記事のパンくずを「非公開」階層に分ける修正
  • 夕方: dev サーバー停止の切り分け(database is locked 再発疑い → シロ)

herdr の Windows ベータを導入して公開記事にした

herdr は AI コーディングエージェント用のターミナルワークスペースマネージャで、以前から Windows で試したかったもの。herdr の公式インストールドキュメントを起点に、「この手順どおりでいいのか、世の中のベストプラクティスはどうなっているのか」を Claude Code に一通り検索させてから導入した。

進め方は「調べる → 入れる → 検証する → 記事にする」の順。

  • 公式 docs・GitHub・国内外の記事を突き合わせて、導入手順の妥当性を先に確認させた
  • install.ps1 は実行前に中身を精読させた(何をどこに置くスクリプトかを把握してから走らせる)
  • インストール後はバージョン確認と配置の実物確認まで実施
  • Claude Code 統合(エージェントの状態検知の精度を上げるフック)も追加。settings.json に入る差分を検証してから有効化し、サーバーのスモークテストまで通した

導入の一部始終は独立した公開記事 herdr を Windows ベータで導入した にまとめてコミット済み。コミット時には学習ゲート(/learn)を通した。クイズ4問中、初回は3問正解で、「HERDR_ENV ガード」の1問だけ解説を読み直してから再出題で合格。herdr の中核価値・ジャンクション更新設計・フックのガード・Windows プレビュー制限の4概念が学習論点として登録された。

白無地PVCカードの罠から、RC-S380 勤怠システム構想へ

安い FeliCa カードを探していて、Amazon で見つけた10枚セットのカードを Claude Code に確認させたら、返ってきた答えに手が止まった。「IC チップが一切入っていない、ただの白無地 PVC カード」。見た目は交通系カードとそっくりでも、中身は印刷用の無地カードだった。ログイン済み Chrome で商品ページを開かせて商品説明まで読ませたので、思い込みで買う事故を未然に防げた。

そこから話が転がった。手持ちの Sony のリーダー(RC-S380 系)とタブレットを組み合わせれば、勤怠管理システムを自作できるのではと気づき、実売相場と構成を調べさせた。

  • FeliCa Lite-S カードは10枚1,480円〜、1枚あたり約150円が相場
  • RC-S380 は Python の nfcpy で一番実績のある機種。Windows PC に繋いでカードの IDm を読む打刻アプリが最短ルート
  • ただし Android タブレットに RC-S380 を直接繋ぐのは非対応なので、打刻はPC側・タブレットは別の役割、と構成を分担する必要がある

最初は「タブレットとリーダーで一体の打刻端末」を漠然と想像していたが、機種名を伝えたら「RC-S380 なら好都合、ただしタブレット直結は非対応」と構成の前提を正されて、机上の空論になる前に軌道修正できた。

この検討内容も公開記事 FeliCa Lite-S と PaSoRi RC-S380 で勤怠打刻を自作する構成 にまとめさせた。Codex レビューと日本語校閲、dev 環境での描画確認まで通した状態で保存してある。買う前に構成を記事の形で固めておけば、カードを発注する段になって迷わない。

Claude Code 起動時の permission 警告を退治した

朝、別リポジトリで Claude Code を立ち上げたら、今日になって初めてこの警告が出た。

Permission allow rule (..\..\.claude\settings.json):
Write(.claude/**) is not matched by file permission checks — only Edit(path) rules are.
Use Edit(.claude/**) instead (Edit rules cover all file-editing tools).

正体を調べさせると、エラーではなく起動時の警告で、動作への実害はなし。グローバル設定の許可ルール Write(.claude/**) が「ファイル編集系の permission チェックにマッチしない書き方」になっていて、Edit(path) 形式のルールしか効かない、という通知だった。つまりこの Write ルールは置いてあっても何の許可にも効いていない「死にルール」で、昨日まで警告すら出ていなかった。今日になって初めて出たので、Claude Code のバージョンアップで検知が入った(あるいは挙動が変わった)可能性が高い。

修正は update-config スキル経由でやらせた。設定ファイルの allow リストには死にルール "Write(.claude/**)" のすぐ下に有効な "Edit(.claude/**)" が既にあったので、死にルールを1行削除するだけ。JSON が壊れていないかの検証まで済ませて、許可の挙動は何も変えずに警告だけ消えた。放置しても動くが、起動するたびに同じ警告文を目でスキップする生活を続けるより、原因ごと消してしまうほうが安い。

非公開記事のパンくずを「非公開」階層に分けさせた

午後、非公開(unpublished)記事を確認していて、パンくずリストが「Home / 一覧 / 記事」と公開ブログの一覧に繋がっているのに気づいた。非公開記事から「一覧」に戻ると公開側に飛ばされてしまう。ここはちゃんと非公開一覧として分けてほしい、と指摘して修正させた。

原因は、Breadcrumb コンポーネントが route.path しか知らず、記事の unpublished フラグを受け取る口がないこと。修正は次の分担になった。

  • breadcrumbs.tsisUnpublished オプションを追加し、「一覧」の直後に「非公開」(/blog/unpublished)を挟む。非公開一覧ページ自身では二重挿入しないガード付き
  • Breadcrumb.vueunpublished プロパティを追加
  • [...slug].vue から記事のフラグを渡す
  • 非公開扱いにしている既存の Vue ページにも同じ対応を横展開
if (options.isUnpublished === true && !isUnpublishedIndexPath) {
  items.push({ label: '非公開', path: '/blog/unpublished' });
}

テストは途中で3件失敗したが、内容を確認させて修正し、breadcrumbs.test.ts に非公開系のケースを追加して全件パス。ブラウザでも「Home / 一覧 / 非公開 / 記事」に分かれた描画を確認してもらった。途中で dev 環境へのナビゲーションがタイムアウトする場面もあったが、コンテンツの再インデックス中だったようでリトライで通った。

夕方、dev サーバーが落ちた — database is locked 再発疑いはシロ

夕方、バックグラウンドで動かしていた Nuxt dev サーバーのタスクが落ちた。このリポジトリでは以前「database is locked」(Nuxt Content の SQLite ロック)に悩まされた経緯があるので、まずその再発を疑って出力ログを確認させた。結果はシロ。エラーの再発はなく、再起動後は localhost:3000 が 200 を返すところまで確認できた。

その後「タスクが killed された」という通知も来たが、これは停止されたのがタスクのラッパープロセスだけで、17時過ぎに再起動した Nuxt 本体の子プロセスは生き残って正常に応答している状態だった。見た目の「失敗」通知と実際のサーバーの生死が食い違うことがある、というのは覚えておきたい挙動。通知の文言で慌てる前に、ポートの応答という一次情報で確かめる。

学び

  • 起動時の警告は「実害がないか」と「なぜ今日から出たのか」をセットで調べる。今回はバージョンアップによる検知強化の可能性が高く、死にルール1行の削除で解決した
  • permission ルールのファイル編集系は Edit(path) 形式に寄せる。Write(...) の allow ルールはファイル permission チェックにマッチしない
  • 「FeliCa カードっぽい見た目」と「FeliCa カード」は別物。商品説明まで読ませてから買う
  • パンくずのようなナビゲーション部品は route.path だけでは文脈(公開/非公開)を判定できない。ページ側からフラグを渡す口を作る
  • バックグラウンドタスクの「killed」通知はラッパープロセスの停止のこともある。サーバー本体の死活はポートへの応答で確かめる