[{"data":1,"prerenderedAt":712},["ShallowReactive",2],{"content-/claude-code-timestamp-hook-setup":3,"all-pages-for-dir":710,"og-image-/claude-code-timestamp-hook-setup":711},{"id":4,"title":5,"body":6,"category":690,"description":691,"extension":692,"meta":693,"navigation":694,"ogImage":695,"path":696,"project_name":697,"published":698,"publishedAt":699,"seo":700,"stem":701,"tags":702,"todo":708,"unpublished":698,"updatedAt":695,"__hash__":709},"pages/2026-03/2026-03-28/claude-code-timestamp-hook-setup.md","Claude Codeフックでタイムスタンプ注入 - 1Mコンテキスト長時間セッションの時刻把握",{"type":7,"value":8,"toc":680},"minimark",[9,14,18,21,25,28,32,35,42,224,227,231,244,300,303,307,310,330,333,337,344,463,466,469,472,636,639,648,651,654,657,676],[10,11,13],"h1",{"id":12},"claude-codeフックでタイムスタンプ注入","Claude Codeフックでタイムスタンプ注入",[15,16,17],"p",{},"Claude Codeの1Mコンテキストで長時間セッションを走らせていると、会話のどのあたりが何時頃の話だったか見失う。「PreToolUseフックにdateコマンドを仕込めば、あらゆるツール実行時にタイムスタンプが残る」というTipsを見かけて試したが、思った通りには動かなかった。フックの仕様を理解してUserPromptSubmitに切り替えるまでの記録。",[19,20],"hr",{},[22,23,24],"h2",{"id":24},"きっかけ",[15,26,27],{},"1Mコンテキストのセッションは数時間に及ぶことがある。途中で「さっきのエラー、何時頃だっけ」と遡りたくなっても、会話ログに時刻情報がない。claude-code-syncのDiscordで「PreToolUseフックにdateを入れると便利」というTipsが流れてきて、settings.local.jsonを開いた。",[22,29,31],{"id":30},"試行1-pretooluseフックにdateコマンドを追加","試行1: PreToolUseフックにdateコマンドを追加",[15,33,34],{},"PreToolUseフックでBashツール実行前にdateコマンドを走らせれば、コンテキストにタイムスタンプが入るはず。そのまま書いた。",[15,36,37,41],{},[38,39,40],"code",{},".claude/settings.local.json"," のhooksセクションに追加:",[43,44,49],"pre",{"className":45,"code":46,"language":47,"meta":48,"style":48},"language-json shiki shiki-themes vitesse-light vitesse-light","{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"date\"\n          }\n        ]\n      }\n    ]\n  }\n}\n","json","",[38,50,51,60,80,96,102,128,141,147,169,188,194,200,206,212,218],{"__ignoreMap":48},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"shFtX","{\n",[52,61,63,67,71,74,77],{"class":54,"line":62},2,[52,64,66],{"class":65},"sqvqQ","  \"",[52,68,70],{"class":69},"sz8Xr","hooks",[52,72,73],{"class":65},"\"",[52,75,76],{"class":58},":",[52,78,79],{"class":58}," {\n",[52,81,83,86,89,91,93],{"class":54,"line":82},3,[52,84,85],{"class":65},"    \"",[52,87,88],{"class":69},"PreToolUse",[52,90,73],{"class":65},[52,92,76],{"class":58},[52,94,95],{"class":58}," [\n",[52,97,99],{"class":54,"line":98},4,[52,100,101],{"class":58},"      {\n",[52,103,105,108,111,113,115,119,123,125],{"class":54,"line":104},5,[52,106,107],{"class":65},"        \"",[52,109,110],{"class":69},"matcher",[52,112,73],{"class":65},[52,114,76],{"class":58},[52,116,118],{"class":117},"sMJiu"," \"",[52,120,122],{"class":121},"sdGka","Bash",[52,124,73],{"class":117},[52,126,127],{"class":58},",\n",[52,129,131,133,135,137,139],{"class":54,"line":130},6,[52,132,107],{"class":65},[52,134,70],{"class":69},[52,136,73],{"class":65},[52,138,76],{"class":58},[52,140,95],{"class":58},[52,142,144],{"class":54,"line":143},7,[52,145,146],{"class":58},"          {\n",[52,148,150,153,156,158,160,162,165,167],{"class":54,"line":149},8,[52,151,152],{"class":65},"            \"",[52,154,155],{"class":69},"type",[52,157,73],{"class":65},[52,159,76],{"class":58},[52,161,118],{"class":117},[52,163,164],{"class":121},"command",[52,166,73],{"class":117},[52,168,127],{"class":58},[52,170,172,174,176,178,180,182,185],{"class":54,"line":171},9,[52,173,152],{"class":65},[52,175,164],{"class":69},[52,177,73],{"class":65},[52,179,76],{"class":58},[52,181,118],{"class":117},[52,183,184],{"class":121},"date",[52,186,187],{"class":117},"\"\n",[52,189,191],{"class":54,"line":190},10,[52,192,193],{"class":58},"          }\n",[52,195,197],{"class":54,"line":196},11,[52,198,199],{"class":58},"        ]\n",[52,201,203],{"class":54,"line":202},12,[52,204,205],{"class":58},"      }\n",[52,207,209],{"class":54,"line":208},13,[52,210,211],{"class":58},"    ]\n",[52,213,215],{"class":54,"line":214},14,[52,216,217],{"class":58},"  }\n",[52,219,221],{"class":54,"line":220},15,[52,222,223],{"class":58},"}\n",[15,225,226],{},"結果: 何も起きない。タイムスタンプがコンテキストに現れない。",[22,228,230],{"id":229},"試行2-windows環境のdateコマンド問題","試行2: Windows環境のdateコマンド問題",[15,232,233,234,236,237,239,240,243],{},"Git Bash環境なのでLinuxの",[38,235,184],{},"が使えるはず――と思ったが、フックの実行環境ではWindows版の",[38,238,184],{},"が呼ばれている可能性を疑った。",[38,241,242],{},"bash -c \"date\"","でラップしてみた。",[43,245,247],{"className":45,"code":246,"language":47,"meta":48,"style":48},"{\n  \"type\": \"command\",\n  \"command\": \"bash -c \\\"date\\\"\"\n}\n",[38,248,249,253,271,296],{"__ignoreMap":48},[52,250,251],{"class":54,"line":55},[52,252,59],{"class":58},[52,254,255,257,259,261,263,265,267,269],{"class":54,"line":62},[52,256,66],{"class":65},[52,258,155],{"class":69},[52,260,73],{"class":65},[52,262,76],{"class":58},[52,264,118],{"class":117},[52,266,164],{"class":121},[52,268,73],{"class":117},[52,270,127],{"class":58},[52,272,273,275,277,279,281,283,286,290,292,294],{"class":54,"line":82},[52,274,66],{"class":65},[52,276,164],{"class":69},[52,278,73],{"class":65},[52,280,76],{"class":58},[52,282,118],{"class":117},[52,284,285],{"class":121},"bash -c ",[52,287,289],{"class":288},"snbK4","\\\"",[52,291,184],{"class":121},[52,293,289],{"class":288},[52,295,187],{"class":117},[52,297,298],{"class":54,"line":98},[52,299,223],{"class":58},[15,301,302],{},"結果: これも動かない。タイムスタンプは表示されなかった。",[22,304,306],{"id":305},"仕様の壁-pretooluseのstdoutはコンテキストに入らない","仕様の壁: PreToolUseのstdoutはコンテキストに入らない",[15,308,309],{},"ここで手を止めて仕様を調べた。判明した事実:",[311,312,313,320,327],"ul",{},[314,315,316],"li",{},[317,318,319],"strong",{},"PreToolUseフックのstdoutは、Claudeのコンテキストに注入されない",[314,321,322,323,326],{},"フックの出力は ",[38,324,325],{},"Ctrl+O"," で開く詳細モードのUIにのみ表示される",[314,328,329],{},"つまりデバッグ用の表示であって、Claudeが「読める」情報にはならない",[15,331,332],{},"PreToolUseフックは「ツール実行を許可/拒否する」ためのゲートキーパーであって、コンテキストに情報を追加する仕組みではなかった。",[22,334,336],{"id":335},"試行3-userpromptsubmitフックに変更","試行3: UserPromptSubmitフックに変更",[15,338,339,340,343],{},"フックの種類を見直した。",[317,341,342],{},"UserPromptSubmitフック","は、ユーザーがメッセージを送信したタイミングで実行され、そのstdoutがsystem-reminderとしてコンテキストに注入される。",[43,345,347],{"className":45,"code":346,"language":47,"meta":48,"style":48},"{\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c \\\"date '+%Y-%m-%d %H:%M:%S'\\\"\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[38,348,349,353,365,378,382,394,398,416,439,443,447,451,455,459],{"__ignoreMap":48},[52,350,351],{"class":54,"line":55},[52,352,59],{"class":58},[52,354,355,357,359,361,363],{"class":54,"line":62},[52,356,66],{"class":65},[52,358,70],{"class":69},[52,360,73],{"class":65},[52,362,76],{"class":58},[52,364,79],{"class":58},[52,366,367,369,372,374,376],{"class":54,"line":82},[52,368,85],{"class":65},[52,370,371],{"class":69},"UserPromptSubmit",[52,373,73],{"class":65},[52,375,76],{"class":58},[52,377,95],{"class":58},[52,379,380],{"class":54,"line":98},[52,381,101],{"class":58},[52,383,384,386,388,390,392],{"class":54,"line":104},[52,385,107],{"class":65},[52,387,70],{"class":69},[52,389,73],{"class":65},[52,391,76],{"class":58},[52,393,95],{"class":58},[52,395,396],{"class":54,"line":130},[52,397,146],{"class":58},[52,399,400,402,404,406,408,410,412,414],{"class":54,"line":143},[52,401,152],{"class":65},[52,403,155],{"class":69},[52,405,73],{"class":65},[52,407,76],{"class":58},[52,409,118],{"class":117},[52,411,164],{"class":121},[52,413,73],{"class":117},[52,415,127],{"class":58},[52,417,418,420,422,424,426,428,430,432,435,437],{"class":54,"line":149},[52,419,152],{"class":65},[52,421,164],{"class":69},[52,423,73],{"class":65},[52,425,76],{"class":58},[52,427,118],{"class":117},[52,429,285],{"class":121},[52,431,289],{"class":288},[52,433,434],{"class":121},"date '+%Y-%m-%d %H:%M:%S'",[52,436,289],{"class":288},[52,438,187],{"class":117},[52,440,441],{"class":54,"line":171},[52,442,193],{"class":58},[52,444,445],{"class":54,"line":190},[52,446,199],{"class":58},[52,448,449],{"class":54,"line":196},[52,450,205],{"class":58},[52,452,453],{"class":54,"line":202},[52,454,211],{"class":58},[52,456,457],{"class":54,"line":208},[52,458,217],{"class":58},[52,460,461],{"class":54,"line":214},[52,462,223],{"class":58},[15,464,465],{},"結果: 成功。メッセージを送信するたびに、system-reminderとしてタイムスタンプがコンテキストに入るようになった。",[22,467,468],{"id":468},"最終的な設定",[15,470,471],{},"UserPromptSubmitフックには、既存のVOICEVOX音声再生フックと並べてdate hookを配置した。",[43,473,475],{"className":45,"code":474,"language":47,"meta":48,"style":48},"{\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"powershell -WindowStyle Hidden -File C:/scripts/play-sound.ps1\"\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash -c \\\"date '+%Y-%m-%d %H:%M:%S'\\\"\"\n          }\n        ]\n      }\n    ]\n  }\n}\n",[38,476,477,481,493,505,509,521,525,543,560,565,569,587,609,613,617,621,626,631],{"__ignoreMap":48},[52,478,479],{"class":54,"line":55},[52,480,59],{"class":58},[52,482,483,485,487,489,491],{"class":54,"line":62},[52,484,66],{"class":65},[52,486,70],{"class":69},[52,488,73],{"class":65},[52,490,76],{"class":58},[52,492,79],{"class":58},[52,494,495,497,499,501,503],{"class":54,"line":82},[52,496,85],{"class":65},[52,498,371],{"class":69},[52,500,73],{"class":65},[52,502,76],{"class":58},[52,504,95],{"class":58},[52,506,507],{"class":54,"line":98},[52,508,101],{"class":58},[52,510,511,513,515,517,519],{"class":54,"line":104},[52,512,107],{"class":65},[52,514,70],{"class":69},[52,516,73],{"class":65},[52,518,76],{"class":58},[52,520,95],{"class":58},[52,522,523],{"class":54,"line":130},[52,524,146],{"class":58},[52,526,527,529,531,533,535,537,539,541],{"class":54,"line":143},[52,528,152],{"class":65},[52,530,155],{"class":69},[52,532,73],{"class":65},[52,534,76],{"class":58},[52,536,118],{"class":117},[52,538,164],{"class":121},[52,540,73],{"class":117},[52,542,127],{"class":58},[52,544,545,547,549,551,553,555,558],{"class":54,"line":149},[52,546,152],{"class":65},[52,548,164],{"class":69},[52,550,73],{"class":65},[52,552,76],{"class":58},[52,554,118],{"class":117},[52,556,557],{"class":121},"powershell -WindowStyle Hidden -File C:/scripts/play-sound.ps1",[52,559,187],{"class":117},[52,561,562],{"class":54,"line":171},[52,563,564],{"class":58},"          },\n",[52,566,567],{"class":54,"line":190},[52,568,146],{"class":58},[52,570,571,573,575,577,579,581,583,585],{"class":54,"line":196},[52,572,152],{"class":65},[52,574,155],{"class":69},[52,576,73],{"class":65},[52,578,76],{"class":58},[52,580,118],{"class":117},[52,582,164],{"class":121},[52,584,73],{"class":117},[52,586,127],{"class":58},[52,588,589,591,593,595,597,599,601,603,605,607],{"class":54,"line":202},[52,590,152],{"class":65},[52,592,164],{"class":69},[52,594,73],{"class":65},[52,596,76],{"class":58},[52,598,118],{"class":117},[52,600,285],{"class":121},[52,602,289],{"class":288},[52,604,434],{"class":121},[52,606,289],{"class":288},[52,608,187],{"class":117},[52,610,611],{"class":54,"line":208},[52,612,193],{"class":58},[52,614,615],{"class":54,"line":214},[52,616,199],{"class":58},[52,618,619],{"class":54,"line":220},[52,620,205],{"class":58},[52,622,624],{"class":54,"line":623},16,[52,625,211],{"class":58},[52,627,629],{"class":54,"line":628},17,[52,630,217],{"class":58},[52,632,634],{"class":54,"line":633},18,[52,635,223],{"class":58},[15,637,638],{},"メッセージ送信のたびに:",[640,641,642,645],"ol",{},[314,643,644],{},"音声が再生される（応答開始の通知）",[314,646,647],{},"タイムスタンプがsystem-reminderとしてコンテキストに入る",[22,649,650],{"id":650},"確認方法",[15,652,653],{},"動作しているかは、Claudeに「現在のsystem-reminderの内容を教えて」と聞くか、会話ログの中にタイムスタンプ付きのsystem-reminderが挟まっているかで確認できる。",[22,655,656],{"id":656},"学び",[311,658,659,665,670,673],{},[314,660,661,664],{},[317,662,663],{},"PreToolUseフック",": ツール実行の許可/拒否が目的。stdoutはUI表示のみでコンテキストには入らない",[314,666,667,669],{},[317,668,342],{},": ユーザー入力時に実行され、stdoutがsystem-reminderとしてコンテキストに注入される",[314,671,672],{},"フックの種類によってstdoutの扱いが違う。「出力がどこに流れるか」を把握してからフックを選ぶ必要がある",[314,674,675],{},"1Mコンテキストの長時間セッションで、タイムスタンプが入った途端に「あのエラーは14時頃だった」とスクロールして探し当てられるようになった",[677,678,679],"style",{},"html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sqvqQ, html code.shiki .sqvqQ{--shiki-default:#99841877;--shiki-dark:#99841877}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}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 .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}",{"title":48,"searchDepth":62,"depth":62,"links":681},[682,683,684,685,686,687,688,689],{"id":24,"depth":62,"text":24},{"id":30,"depth":62,"text":31},{"id":229,"depth":62,"text":230},{"id":305,"depth":62,"text":306},{"id":335,"depth":62,"text":336},{"id":468,"depth":62,"text":468},{"id":650,"depth":62,"text":650},{"id":656,"depth":62,"text":656},"dev","Claude CodeのPreToolUseフックにdateコマンドを仕込んでタイムスタンプを注入しようとしたが、stdoutがコンテキストに入らない仕様と判明。UserPromptSubmitフックに切り替えて成功するまでの試行錯誤を記録","md",{},true,null,"/claude-code-timestamp-hook-setup","claude-code-tools",false,"2026-03-28T00:00:00.000Z",{"title":5,"description":691},"2026-03/2026-03-28/claude-code-timestamp-hook-setup",[703,704,705,706,707],"Claude Code","フック","タイムスタンプ","1Mコンテキスト","開発環境","memo","DzY8EKNu2SpYpIv9gm_SKUxlxLYz12nzdXjhS8UdoHA",[],"https://log.eurekapu.com/og/blog/claude-code-timestamp-hook-setup.png?v=2026-03-28T00%3A00%3A00.000Z&title=Claude%20Code%E3%83%95%E3%83%83%E3%82%AF%E3%81%A7%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E6%B3%A8%E5%85%A5%20-%201M%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%E6%99%82%E9%96%93%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%99%82%E5%88%BB%E6%8A%8A%E6%8F%A1&author=Kei%20Komatsu&sig=ce459443e4d40d89",1782528821595]