[{"data":1,"prerenderedAt":503},["ShallowReactive",2],{"content-/tests-deploy-and-misc-articles":3,"all-pages-for-dir":501,"og-image-/tests-deploy-and-misc-articles":502},{"id":4,"title":5,"body":6,"category":482,"description":483,"extension":484,"meta":485,"navigation":486,"ogImage":487,"path":488,"project_name":489,"published":490,"publishedAt":491,"seo":492,"stem":493,"tags":494,"todo":487,"unpublished":490,"updatedAt":487,"__hash__":500},"pages/2026-05/2026-05-15/tests-deploy-and-articles.md","テスト失敗修正・Cloudflareデプロイの日本語コミットメッセージ問題・公開記事3本",{"type":7,"value":8,"toc":463},"minimark",[9,13,26,31,36,46,49,152,155,159,174,194,201,204,223,227,230,248,252,255,263,274,278,281,293,341,354,365,369,372,376,386,390,397,401,408,412,426,430,456,459],[10,11,5],"h1",{"id":12},"テスト失敗修正cloudflareデプロイの日本語コミットメッセージ問題公開記事3本",[14,15,16,17,21,22,25],"p",{},"朝に ",[18,19,20],"code",{},"pnpm test:run"," を流したら赤い行がずらりと並んだ。終わってみればテストを123件パスさせ、本番が静かに404を返していたwrangler問題を ",[18,23,24],{},"code: 8000111"," 一本に絞り込んで潰し、ついでに公開記事を3本書いてもらった。判断は自分、実行はClaude Code、という分担に最後まで戻ってきた一日。",[27,28,30],"h2",{"id":29},"_1-テスト失敗修正グループa-prefecture-quiz由来","1. テスト失敗修正（グループA: prefecture-quiz由来）",[32,33,35],"h3",{"id":34},"a-1-keydown-ハンドラに修飾キーガードを足すだけで15件パス","A-1: keydown ハンドラに修飾キーガードを足すだけで15件パス",[14,37,38,41,42,45],{},[18,39,40],{},"find-prefecture.vue"," と ",[18,43,44],{},"shogi-board-demo.vue"," で keydown ショートカットがOSの修飾キーと食い合っていることに気づいた。テストの再現コードはCtrl+Rやcmd+Rを叩いてリロードを試すと、ページ内のショートカットが先に反応してしまう。",[14,47,48],{},"修正は1行だけ入れてもらった。",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-ts shiki shiki-themes vitesse-light vitesse-light","const onKeyDown = (e: KeyboardEvent) => {\n  if (e.altKey || e.ctrlKey || e.metaKey) return\n  // 既存のショートカット処理\n}\n","ts","",[18,57,58,98,139,146],{"__ignoreMap":55},[59,60,63,67,71,75,78,82,85,89,92,95],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"stQ0i","const ",[59,68,70],{"class":69},"senZ8","onKeyDown",[59,72,74],{"class":73},"shFtX"," =",[59,76,77],{"class":73}," (",[59,79,81],{"class":80},"s4oTP","e",[59,83,84],{"class":73},": ",[59,86,88],{"class":87},"sSkh3","KeyboardEvent",[59,90,91],{"class":73},")",[59,93,94],{"class":73}," =>",[59,96,97],{"class":73}," {\n",[59,99,101,105,107,109,112,115,118,120,122,125,127,129,131,134,136],{"class":61,"line":100},2,[59,102,104],{"class":103},"sHkkW","  if",[59,106,77],{"class":73},[59,108,81],{"class":80},[59,110,111],{"class":73},".",[59,113,114],{"class":80},"altKey",[59,116,117],{"class":65}," || ",[59,119,81],{"class":80},[59,121,111],{"class":73},[59,123,124],{"class":80},"ctrlKey",[59,126,117],{"class":65},[59,128,81],{"class":80},[59,130,111],{"class":73},[59,132,133],{"class":80},"metaKey",[59,135,91],{"class":73},[59,137,138],{"class":103}," return\n",[59,140,142],{"class":61,"line":141},3,[59,143,145],{"class":144},"sxvE3","  // 既存のショートカット処理\n",[59,147,149],{"class":61,"line":148},4,[59,150,151],{"class":73},"}\n",[14,153,154],{},"これで15件まとめてパス。コードの中身は触らず、入口で「修飾キーが押されていたら即座に降りる」だけ。",[32,156,158],{"id":157},"a-2-ogメタタグ不足で26件失敗-usequizseometa-に集約","A-2: OGメタタグ不足で26件失敗 → useQuizSeoMeta に集約",[14,160,161,162,165,166,169,170,173],{},"残りはOGメタタグの不足。prefecture-quiz の16ページに加え、security-cases系5ページの ",[18,163,164],{},"ogUrl"," も欠けていた。1ページずつ ",[18,167,168],{},"useSeoMeta"," を手書きしていく案は捨て、共通 composable ",[18,171,172],{},"useQuizSeoMeta"," を切り出してもらう方針にした。",[175,176,177,185,188],"ul",{},[178,179,180,181,184],"li",{},"composable側で ",[18,182,183],{},"title / description / ogUrl / ogImage"," を一気に組み立てる",[178,186,187],{},"各ページは1行追加するだけで済む",[178,189,190,191,193],{},"テスト側も ",[18,192,172],{}," の呼び出しを認識するように拡張",[14,195,196,197,200],{},"副作用がページに散らばっていたのが、薄いシェル1つに集約された。全16ページでconsoleエラーゼロを確認し、計123件パス。コミットは ",[18,198,199],{},"5d4b3c06","。",[32,202,203],{"id":203},"途中で踏んだ小さな罠",[14,205,206,207,210,211,214,215,217,218,222],{},"TypeScriptの ",[18,208,209],{},"!"," で narrowing を逃げる箇所がいくつか残っていて、",[18,212,213],{},"sed"," で一括置換してもらおうとしたが、テンプレリテラル内に ",[18,216,209],{}," を含む箇所まで巻き込みそうになって途中で止めた。結局、変換は手作業で2箇所だけ。",[219,220,221],"strong",{},"安易な置換は型と表現の境目を見ない","、というのを思い出した。",[27,224,226],{"id":225},"_2-cloudflareデプロイで日本語コミットメッセージ問題","2. Cloudflareデプロイで日本語コミットメッセージ問題",[32,228,229],{"id":229},"本番が静かに404を返していた",[14,231,232,235,236,239,240,243,244,247],{},[18,233,234],{},"pnpm dev"," でローカルは元気に動いているのに、",[18,237,238],{},"log.eurekapu.com/prefecture-quiz"," の目次ページにアクセスすると404が出ることに気づいた。今日のデプロイはGitHub Actionsを切ってあるので、ローカルから ",[18,241,242],{},"pnpm deploy:cloudflare"," を回すフローのはず。ところがログを見ると、",[219,245,246],{},"今日のデプロイは全部失敗していた","。表向きの \"Success\" だけ拾って終わっていた自分が悪い。",[32,249,251],{"id":250},"原因-wrangler-が-utf-8-で死んでいた","原因: wrangler が UTF-8 で死んでいた",[14,253,254],{},"5/14に「wrangler が途中で異常終了するから tee で stderr を残せ」と自分でメモを残しておいた。前日のメモが今日効いた。それに従って stderr を拾ってもらったところ、エラー本体が出てきた。",[50,256,261],{"className":257,"code":259,"language":260},[258],"language-text","code: 8000111\n\"Invalid commit message: not valid UTF-8\"\n","text",[18,262,259],{"__ignoreMap":55},[14,264,265,266,269,270,273],{},"wrangler 4.68.1（自分が使っていたバージョン）は、Cloudflareにデプロイメタデータを送るときに ",[18,267,268],{},"git log -1"," の結果を勝手にコミットメッセージとして拾う。",[219,271,272],{},"Windows上の git log は日本語コミットメッセージをShift_JIS的なバイト列で吐く","ことがあって、それが UTF-8 として検証に落ちる、という構図だと特定できた。最新は 4.91.0。",[32,275,277],{"id":276},"解決-asciiメッセージを明示する","解決: ASCIIメッセージを明示する",[14,279,280],{},"2段構えで対処することにした。",[282,283,284,287],"ol",{},[178,285,286],{},"wrangler を 4.91.0 にアップデート",[178,288,289,292],{},[18,290,291],{},"--commit-message"," フラグでASCIIを明示する",[50,294,298],{"className":295,"code":296,"language":297,"meta":55,"style":55},"language-bash shiki shiki-themes vitesse-light vitesse-light","wrangler pages deploy ./dist \\\n  --project-name=eurekapu-log \\\n  --commit-message=\"redeploy 2026-05-15 16:32 5d4b3c06\"\n","bash",[18,299,300,319,326],{"__ignoreMap":55},[59,301,302,305,309,312,315],{"class":61,"line":62},[59,303,304],{"class":69},"wrangler",[59,306,308],{"class":307},"sdGka"," pages",[59,310,311],{"class":307}," deploy",[59,313,314],{"class":307}," ./dist",[59,316,318],{"class":317},"snbK4"," \\\n",[59,320,321,324],{"class":61,"line":100},[59,322,323],{"class":317},"  --project-name=eurekapu-log",[59,325,318],{"class":317},[59,327,328,331,335,338],{"class":61,"line":141},[59,329,330],{"class":317},"  --commit-message=",[59,332,334],{"class":333},"sMJiu","\"",[59,336,337],{"class":307},"redeploy 2026-05-15 16:32 5d4b3c06",[59,339,340],{"class":333},"\"\n",[14,342,343,346,347,350,351,200],{},[18,344,345],{},"redeploy \u003CYYYY-MM-DD HH:mm> \u003C短縮SHA>"," の形に揃えた。日付と時刻とSHAだけならASCII範囲に収まる。4.91.0 へのアップグレードと ",[18,348,349],{},"scripts/measure-deploy.ps1"," の更新は Claude Code に任せて、次から同じ穴に落ちないようにした。コミットは ",[18,352,353],{},"16318eba",[14,355,356,357,360,361,364],{},"本番に当て直して ",[18,358,359],{},"/prefecture-quiz"," の目次が出ることを確認。",[219,362,363],{},"「デプロイ成功」と「ページが配信されている」は別物","で、log を見ていなかった自分が悪い、というのを今日の教訓に置いた。",[27,366,368],{"id":367},"_3-公開記事3本","3. 公開記事3本",[14,370,371],{},"合間に書いてもらった検証記事3本。",[32,373,375],{"id":374},"cli-anythinghkudscli-anythingの実態","CLI-Anything（HKUDS/CLI-Anything）の実態",[14,377,378,379,382,383,200],{},"「全てのソフトウェアを操れる」と謳う GitHub リポジトリを見せられて、眉に唾を付けた。READMEとサンプルを Claude Code に読み込ませて整理させると、実体は ",[219,380,381],{},"「ソースコードとスクリプトAPIが公開されている一部のOSS GUIアプリ」"," を、Claude Code に書かせるラッパーでCLI化するプラグインだとわかった。Photoshopや市販アプリは当然対象外。「全てのソフト」は誇張で、現実は「スクリプタブルなOSSの薄いCLIラッパージェネレータ」、という結論を記事にしてもらった。置き場所は ",[18,384,385],{},"apps/web/content/2026-05/2026-05-15/cli-anything-doubt.md",[32,387,389],{"id":388},"notion-cli-ntn-は-notion-app-の代替ではない","Notion CLI ntn は Notion App の代替ではない",[14,391,392,393,396],{},"ntn は ",[219,394,395],{},"Notion API を叩く / Workers を作るためのCLI"," であって、Notionデスクトップアプリの代わりにはならない、というのが自分で触った感触。手元の用途で言うと、ZIPエクスポートを落として展開する作業を1コマンドにできる程度。デスクトップから乗り換える前提で触ると確実にがっかりする、という角度で独立記事にしてもらった。",[32,398,400],{"id":399},"playwright-chrome拡張-vs-chrome-devtools-mcp","Playwright Chrome拡張 vs Chrome DevTools MCP",[14,402,403,404,407],{},"Playwright Extension が Microsoft 公式かを確かめたくなって、リポジトリのオーナーを Claude Code に確認させた結果、公式と確定。用途は適材適所で、Playwright拡張は録画→コード生成、Chrome DevTools MCP は対話的な操作・検査が得意、と自分の中で整理した。ただ Chrome DevTools MCP も ",[18,405,406],{},"--remote-debugging-port=9223"," でChromeを起動すれば普段ログイン済みのプロファイルに繋がる。今このプロジェクトでまさにその構成で動かしている。",[27,409,411],{"id":410},"_4-小さな調査メモ","4. 小さな調査メモ",[175,413,414,420],{},[178,415,416,419],{},[219,417,418],{},"Bloomberg AI関連指数（SDH100RT, SDLLMTK 等 Silicon Data社）",": 完全無料の経路は無いと判断した。現実的にはSilicon Data CEO の Carmen Li（X: @carmenli）が定期的にXに数値を貼っていて、それを拾うのが一番速い、という結論。",[178,421,422,425],{},[219,423,424],{},"「裸足で走れるサンダル」探し",": Xのブックマーク CSV を Claude Code に検索させた結果、明石ガクトのリカバリーサンダル投稿しか引っ掛からなかった。Chrome履歴を眺めると runsunjapan.com（ワラーチ）がそれっぽいが、本命の特定までは届かず。",[27,427,429],{"id":428},"_5-今日の構図","5. 今日の構図",[175,431,432,438,450],{},[178,433,434,437],{},[219,435,436],{},"テスト失敗",": 違和感（赤い行）を拾うのと、原因の切り分け（keydownかOGメタか）は自分、置換と一括修正は Claude Code に任せた",[178,439,440,443,444,446,447,449],{},[219,441,442],{},"デプロイ問題",": 本番が404という気付きが起点 → wrangler のバージョンと ",[18,445,24],{}," の意味の絞り込みは Claude Code → 解決策（",[18,448,291],{}," 固定）の採用判断は自分",[178,451,452,455],{},[219,453,454],{},"公開記事3本",": 「これは怪しい/これは違うのでは」という直感が起点 → READMEや仕様の読み込みと文章化は Claude Code に書かせた",[14,457,458],{},"判断する係と実行する係をしっかり分けて回すと、こういう「テスト・デプロイ・記事3本」みたいな雑多な一日でも荷物を残さずに畳める。",[460,461,462],"style",{},"html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}",{"title":55,"searchDepth":100,"depth":100,"links":464},[465,470,475,480,481],{"id":29,"depth":100,"text":30,"children":466},[467,468,469],{"id":34,"depth":141,"text":35},{"id":157,"depth":141,"text":158},{"id":203,"depth":141,"text":203},{"id":225,"depth":100,"text":226,"children":471},[472,473,474],{"id":229,"depth":141,"text":229},{"id":250,"depth":141,"text":251},{"id":276,"depth":141,"text":277},{"id":367,"depth":100,"text":368,"children":476},[477,478,479],{"id":374,"depth":141,"text":375},{"id":388,"depth":141,"text":389},{"id":399,"depth":141,"text":400},{"id":410,"depth":100,"text":411},{"id":428,"depth":100,"text":429},"dev","pnpm test:run の失敗を keydown ガードと useQuizSeoMeta で潰し、本番が404のままだったwranglerデプロイを4.91.0更新と --commit-message で復旧、ついでに公開記事3本を書いた一日","md",{},true,null,"/tests-deploy-and-misc-articles","mdx-playground",false,"2026-05-15T00:00:00.000Z",{"title":5,"description":483},"2026-05/2026-05-15/tests-deploy-and-articles",[495,496,497,304,498,499],"testing","vitest","cloudflare-pages","prefecture-quiz","seo","Mw_5o9Ns75666U_eVWZqhwVaq7-CuBAB_xQrbCO0S_0",[],"https://log.eurekapu.com/og/blog/tests-deploy-and-misc-articles.png?v=2026-05-15T00%3A00%3A00.000Z&title=%E3%83%86%E3%82%B9%E3%83%88%E5%A4%B1%E6%95%97%E4%BF%AE%E6%AD%A3%E3%83%BBCloudflare%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E5%95%8F%E9%A1%8C%E3%83%BB%E5%85%AC%E9%96%8B%E8%A8%98%E4%BA%8B3%E6%9C%AC&author=Kei%20Komatsu&sig=ac8c17d583189dd2",1782528836812]