一時ディレクトリ (tmp/scratchpad) からの Artifact publish を拒否し ~/Documents/claude-artifacts への保存へ誘導する

個人用のdotfiles設定リポジトリです。 パッケージ管理と Homebrew 管理は別の nix-config リポジトリで行い、このリポジトリは主にシェルやアプリ設定を管理します。
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd ~/dotfiles
cd ~/nix-config
darwin-rebuild switch --flake .#<nix-configで定義したホスト名>
./install.sh
既存の設定ファイルは~/backupディレクトリにバックアップされます。
install.sh: dotfilesのシンボリックリンク作成スクリプトMANUAL_APPS.md: 手動インストールが必要なアプリケーション一覧.config/: 各種アプリケーションの設定ファイル.zshrc: Zshシェルの設定.gitconfig: Git設定.tmux.conf: tmux設定.claude/: Claude Code の設定.codex/: Codex の設定hooks/index.ts 23 lines1import type { Register } from "claude-code";
2
3const ARCHIVE_DIR = "~/Documents/claude-artifacts";
4
5// scratchpad (/private)/tmp 配下は セッション終了で消えるため配信元にさせない
6const EPHEMERAL = /^\/(private\/)?(tmp|var\/folders)\//;
7
8type ArtifactArgs = { action?: string; file_path?: string; asset?: boolean };
9
10export const register: Register = (on) => {
11 // 生成型の tool union に Artifact が無いため RegExp matcher で束縛する
12 on("tool.call", { tool: /^Artifact$/ }, (_$, e, next) => {
13 const args = e as unknown as ArtifactArgs;
14 const isPublish = (args.action ?? "publish") === "publish" && !args.asset;
15 if (isPublish && args.file_path && EPHEMERAL.test(args.file_path)) {
16 return {
17 deny: `一時ディレクトリからの publish は禁止。ファイルを ${ARCHIVE_DIR}/ へ内容が分かる kebab-case 名で保存し直し、そこから publish し直すこと (セッション終了後もソースを残すため)。`,
18 };
19 }
20 return next(e);
21 });
22};
23