ブログの更新をClaude Codeに任せた話(Astro 4→7移行)

🤖 Claude Code との共作記事


Claude などのAIツールによってブログのメンテナンスおよび更新のコストが下がったので、久々に更新をしていく。
今回の記事では Claude code で土台更新をしたことを Claude に記事にしてもらう という試みも行っている

以下から Claude に任せた部分である

🤖 ここから Claude Code が執筆

このブログの筆者をごんべえと呼ぶ。

作業そのもの——コマンドの実行やコードの書き換え——は大半を Claude 側で進めたが、いくつかの点はごんべえの判断が必要だった。その記録を残しておく。

やったこと

  • Astro を 4系から 7系へメジャーアップデート
  • Content Collections を Content Layer API へ移行
  • npm audit で出ていた脆弱性の対応
  • デプロイ先(Cloudflare Pages)の Node バージョン固定
  • 生成AIとの共作をどう開示するかの仕組み化

以下、特に判断が要ったポイントを挙げる。

メジャーを2つ飛ばす移行

4→7 なので、間の v5・v6・v7 の破壊的変更をまたぐことになる。特に効いたのが v5 での変更で、Content Collections が Content Layer API に置き換わっている。

具体的には、

  • 設定ファイルの置き場所が src/content/config.ts から src/content.config.ts へ変わった
  • コレクションの取得に glob() ローダーの指定が必要になった
  • エントリの slug プロパティが id に変わった

あたりである。詳細は公式のアップグレードガイドとローダーのリファレンスにまとまっている。

メジャーを飛ばす場合は間のガイドを全部たどる必要がある、という当たり前の点だが、ここは省略できなかった。

脆弱性を「直さない」と決める

npm audit の警告は最初 23 件出ていて、対応後に 6 件まで減った。この残り 6 件は、直さないという結論になった。

残っていたのはビルド時にしか使わない開発依存(言語サーバや Cloudflare アダプタが引いている picomatchyaml-language-server など)由来のもので、本番の出力には含まれない。これらは npm audit fix --force で無理に潰すと、逆に Astro 側に破壊的変更が入ってしまう。

この点は Astro 側でも把握されていて、issue に経緯と方針が書かれている。

Claude は当初、overrides で依存バージョンを強制的に上書きして警告を潰す案を出した。しかしこの公式スタンスを確認したうえで、本番に影響しない dev 依存を無理に上書きするのはやめ、overrides は外すことにした——この「直さない」判断はごんべえが決めている。警告がゼロになることと安全になることは別で、ここは機械的には決められない部分だった。

Node のバージョンをどれにするか

ローカルではビルドが通っていたが、Cloudflare Pages 側のデプロイが Node.js v18.17.1 is not supported by Astro! で失敗した。Astro 7 は Node 22.12 以上を要求する。

Cloudflare Pages はリポジトリに .nvmrc(または .node-version)を置くと、そのバージョンでビルドしてくれる。

では何を書くか。2026年7月時点で、Node は 24 が Active LTS、22 が Maintenance LTS である。

22 でも要件は満たすが、ごんべえのローカル開発環境が Node 24 だったため、環境を揃える意味で .nvmrc には 24 を採用した。「動く最低ライン」で選ぶか「ローカルと揃える」で選ぶかの判断で、後者を選んだ形になる。

既存記事の改行を壊さない

移行に伴って Markdown のデフォルト挙動が変わり、そのままだと本文中の改行(<br>)が効かなくなっていた。過去記事はこの改行挙動に依存して書かれているので、崩れると全記事に影響が出る。

対応として remark-breaks を明示的に追加し、これまで通り改行が反映されるようにした。既存の資産を壊さないという観点は、差分だけを見ていると見落としやすい。

AI 共作の開示を仕組み化する

今回のように AI との共作で記事を書くなら、「どこまでを AI がやったか」を読者に開示したい。ただ、それを毎回本文にべた書きすると手間だし、書きぶりがぶれて一貫性も落ちる。

そこで、開示を仕組みに逃がした。記事の frontmatter に任意項目 coauthor を持たせ、投稿レイアウトが、値があるときだけ定型の注記を自動で出すようにした。

  • スキーマ(src/content.config.ts)に coauthor: z.string().optional() を追加
  • 投稿レイアウト(BlogPost.astro)で、coauthor があれば「🤖 ◯◯との共作記事」と表示

これで、共作記事は frontmatter に coauthor: 'Claude Code' と1行足すだけで開示が付く。実際、この記事の冒頭に出ている共作の注記も、この仕組みが出している。仕組み化すること自体は Claude が提案したが、「今この土台更新のついでに入れておく」と決めたのはごんべえである。

さらに、テキストの注記だけでは「どこからどこまでを AI が書いたか」が塊として分かりにくい。そこで、範囲を視覚的に囲むことにした。

ここで技術的な壁がある。Markdown 本文を <div> で囲むと、中の Markdown が生の HTML 扱いになってレンダリングされない。囲みたいなら MDX にする必要がある。そのためこの記事を .md から .mdx に変え、AI 執筆範囲を囲む専用コンポーネント AiAuthored を用意した。いま読んでいる、ラベル付きのこの枠がそれである。

「視覚的に囲みたい」という要望はごんべえ、Markdown では囲めないので MDX 化が要るという切り分けと実装は Claude、という分担で進めた。

以上が Claude が書いた内容である。
もちろん人間が一度チェックする必要はあるが、ブログ更新に関しては事実と違うことを言ってないかをチェックすれば良いので、コードを生成する用途より気軽に使えるように感じた。
逆にプログラミングに関する内容に関して Claude に任せると 脆弱性の件 のようにベストプラクティスや公式の推奨を無視して進めることが稀にあるので、そのあたりは注意する必要がありそう。
逆にこちらが認識してない問題を Claude が発掘してくれたりするので、よく知られた話ではあると思うが、AIツールと人間による両者のチェックは必要だと実感した。
今後はこのスタイルでブログを更新していく可能性が高い。