Claude Codeで業務画面を即席Excel風に切り替える演出ガイド

  • URLをコピーしました!
目次

Claude Code ユーザーが日常でぶつかる悩み

Claude Code での開発作業は、集中しているとつい時間や周囲の状況を忘れてしまいがちです。とくにリモートワークやオフィスでの作業中、ふとしたタイミングで「今この画面、見られたくないな…」という瞬間が訪れることがあります。そんなとき、即座に画面を切り替えたり、作業内容をカモフラージュしたいというニーズは意外と多いものです。
また、AI coding workflow の中で通知や演出、OS連携を活用したい場面も増えています。Claude Code の context や repository understanding を活かしつつ、ちょっとした遊び心や秘密主義を両立させる工夫が求められています。

  • コードやリポジトリのディレクトリ構造を整理中、誰かが背後を通った瞬間に「今は見られたくない」と思うことがある
  • onboarding や長時間の session で、作業内容が本来の業務と違うことを隠したくなるシーンがある
  • monorepo で複数パッケージをまたいで作業していると、他のメンバーに「今どこ見てるの?」と聞かれて答えづらいことがある
  • AI coding workflow の context 管理や path management に集中していると、急な来客や画面共有で「ヤバい!」となることがある
  • repository understanding の途中で、開発者同士でちょっとしたいたずらや演出を楽しみたい瞬間がある

このような「通知・演出・OS連携」カテゴリの悩みは、真面目な作業の裏側にあるリアルな“あるある”です。Claude Code ユーザーならではの文脈や、context・directory 管理の最中に起こる「一瞬の逃げ場」が求められています。

この Skill が一言でいうと何を解決するか

一言サマリ: 作業中に“あっヤバい!”という瞬間Skill。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • 急な来客や画面共有時に、Claude Code の作業画面を一瞬で“それっぽいExcel”風のウィンドウに切り替えられる
  • AI coding workflow の最中でも、秘密主義と遊び心を両立した context 切り替え演出ができる
  • onboarding や session 再開時に、周囲に本当の作業内容を見せずに済む安心感が得られる
  • repository や directory の構造を把握していても、Skill発動で一時的に“真面目な業務風”画面を装える
  • monorepo での package 跨ぎや、長時間の作業中にも、ワンタッチでフェイク画面に切り替えられる柔軟性
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/claude-code/boss-key-fake-excel .claude/skills/boss-key-fake-excel

実行したらこうなる (3つの利用シーン)

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。

シーン1: session 開始時 (CLAUDE.md と組み合わせて)


# /boss-key-fake-excel
> 画面を一時的にExcel風に切り替えて

[Skill] boss-key-fake-excel 発動中...
フェイクExcelウィンドウを前面に表示しました。
元のClaude Code セッションはバックグラウンドで維持されています。
終了するには任意のキーを押すか、/boss-key-fake-excel を再実行してください。
(フェイクExcel画面例: "売上管理_2024.xlsx" シートが表示されています)

シーン2: monorepo / package 跨ぎ作業時


> packages/core から packages/utils に移動したタイミングで /boss-key-fake-excel

[Skill] boss-key-fake-excel 発動
monorepo 構造を一時的に隠し、Excel風ウィンドウを表示しました。
"部署別集計2023" シートのような画面が前面に出ています。
作業復帰は /boss-key-fake-excel で解除可能です。

シーン3: お遊び的な使い方


> ちょっと休憩、画面を真面目っぽくして

[Skill] boss-key-fake-excel を実行しました。
"会議出席者リスト.xlsx" のようなフェイク画面を表示しています。
周囲からは普通のExcel作業に見えます。
再度コマンド実行で元の作業画面に戻ります。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる Skill発動で一時的に作業をカモフラージュ、重要なやりとりを守れる

発動方式

明示呼び出し (/boss-key-fake-excel) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

.claude/skills/boss-key-fake-excel/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.claude/skills/boss-key-fake-excel/
├── SKILL.md
├── scripts/
│   └── boss_key_fake_excel.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/boss_key_fake_excel.py 瞬時にExcel風フェイク画面を表示するBossKeyスクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: boss-key-fake-excel
description: 作業中に“あっヤバい!”という瞬間や監督者の気配を感じた際、即座に本Skillを発動し、ターミナルやエディタ画面をExcel風フェイク画面に切り替えて視線を欺きます。boss、監査、急な来客などのキーワードで発動。
---

# 機能概要
boss-key-fake-excelは、開発者や作業者が“見られたくない”作業中に、瞬時に本物そっくりのExcel風フェイク画面を表示してカモフラージュできるSkillです。ターミナルやエディタの画面を、業務用Excelのウィンドウ画像に切り替え、監督者や同僚の目をごまかします。遊び心と秘密主義を両立し、真面目なフリをしたい場面や、開発者同士のジョークにも最適です。

# 使い方
明示的な呼び出しは `/boss-key-fake-excel` コマンドで実行します。暗黙的には「ボスが来た」「監査」「やばい」「切り替え」「フェイクExcel」などのキーワードで発動します。発動時、現在の作業画面を隠し、OSのウィンドウ上にExcel風のダミー画面を表示します。終了はウィンドウ右上の「×」ボタン、またはCtrl+Q等のショートカットで元の作業に戻ります。

# 出力例
```
$ python boss_key_fake_excel.py
[INFO] Fake Excel window launched. Press Ctrl+Q or close window to return.
[DEBUG] Screenshot of current desktop saved to: /tmp/bosskey_backup_20240610_101500.png
[INFO] Excel-style window closed. Restoring previous state.
```

# 注意点
本SkillはローカルのPython環境とGUIライブラリ(tkinter, PIL等)が必要です。実際のExcelデータやファイル操作は行いません。フェイク画面は画像生成であり、編集や保存は不可。ウィンドウマネージャやOSによっては動作に制限がある場合があります。セキュリティ上の重要データは保護されません。

# 参考資料
参考設計や実装例は `references/design_notes.md` を参照。公式Pythonドキュメント(tkinter, PIL)も活用しています。
- https://docs.python.org/ja/3/library/tkinter.html
- https://pillow.readthedocs.io/en/stable/

scripts/boss_key_fake_excel.py

import sys
import os
import argparse
import datetime
import threading
from tkinter import Tk, Canvas, PhotoImage, NW, Label, Button
from PIL import Image, ImageDraw, ImageFont, ImageTk, ImageGrab

FAKE_EXCEL_BG = (245, 245, 245)
EXCEL_GREEN = (0, 176, 80)
HEADER_BG = (222, 234, 246)
GRID_COLOR = (200, 200, 200)
FONT_PATH = None  # Use default font

FAKE_TITLE = "Microsoft Excel - sales_report.xlsx"

class BossKeyFakeExcel:
    def __init__(self):
        self.root = None
        self.img = None
        self.photo = None
        self.screenshot_path = None

    def take_screenshot(self):
        now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        tmp_path = f"/tmp/bosskey_backup_{now}.png"
        try:
            img = ImageGrab.grab()
            img.save(tmp_path)
            self.screenshot_path = tmp_path
            print(f"[DEBUG] Screenshot of current desktop saved to: {tmp_path}")
        except Exception as e:
            print(f"[WARN] Screenshot failed: {e}")

    def generate_fake_excel_img(self, width=1280, height=720, rows=18, cols=12):
        img = Image.new('RGB', (width, height), FAKE_EXCEL_BG)
        draw = ImageDraw.Draw(img)
        # Title bar
        draw.rectangle([0, 0, width, 40], fill=EXCEL_GREEN)
        font = self.get_font(18, bold=True)
        draw.text((12, 8), FAKE_TITLE, fill='white', font=font)
        # Fake window buttons
        draw.ellipse([width-90, 10, width-70, 30], fill=(232,17,35))  # Close
        draw.ellipse([width-65, 10, width-45, 30], fill=(255,185,0))  # Maximize
        draw.ellipse([width-40, 10, width-20, 30], fill=(0,120,215))  # Minimize
        # Ribbon
        draw.rectangle([0, 40, width, 90], fill=HEADER_BG)
        ribbon_font = self.get_font(14)
        draw.text((20, 55), "ファイル  ホーム  挿入  ページレイアウト  数式  データ  校閲  表示", fill=(40,40,40), font=ribbon_font)
        # Sheet grid
        grid_top = 100
        grid_left = 60
        cell_w = (width - grid_left - 20) // cols
        cell_h = (height - grid_top - 40) // rows
        # Column headers
        header_font = self.get_font(12, bold=True)
        for c in range(cols):
            x = grid_left + c*cell_w
            draw.rectangle([x, grid_top-25, x+cell_w, grid_top], fill=HEADER_BG)
            col_label = chr(65+c)
            draw.text((x+cell_w//2-7, grid_top-22), col_label, fill=(0,0,0), font=header_font)
        # Row headers
        for r in range(rows):
            y = grid_top + r*cell_h
            draw.rectangle([0, y, grid_left, y+cell_h], fill=HEADER_BG)
            draw.text((grid_left//2-10, y+cell_h//2-8), str(r+1), fill=(0,0,0), font=header_font)
        # Draw grid
        for r in range(rows+1):
            y = grid_top + r*cell_h
            draw.line([grid_left, y, grid_left+cols*cell_w, y], fill=GRID_COLOR)
        for c in range(cols+1):
            x = grid_left + c*cell_w
            draw.line([x, grid_top, x, grid_top+rows*cell_h], fill=GRID_COLOR)
        # Fake data
        data_font = self.get_font(11)
        for r in range(rows):
            for c in range(cols):
                val = ""
                if c == 0 and r > 0:
                    val = f"商品{r}"
                elif r == 0 and c > 0:
                    val = ["売上","利益","数量","単価","原価","在庫","発注","納期","担当","備考","評価"][c-1] if c-1 < 11 else ""
                elif r > 0 and c > 0:
                    val = str(1000 + r*100 + c*10)
                if val:
                    x = grid_left + c*cell_w + 8
                    y = grid_top + r*cell_h + 6
                    draw.text((x, y), val, fill=(40,40,40), font=data_font)
        # Sheet tabs
        tab_y = grid_top + rows*cell_h + 10
        for i, name in enumerate(["Sheet1", "Sheet2", "集計"]):
            tab_x = grid_left + i*100
            draw.rectangle([tab_x, tab_y, tab_x+80, tab_y+28], fill=(255,255,255), outline=(150,150,150))
            draw.text((tab_x+18, tab_y+6), name, fill=(0,0,0), font=self.get_font(12))
        return img

    def get_font(self, size, bold=False):
        try:
            if FONT_PATH:
                return ImageFont.truetype(FONT_PATH, size)
            else:
                if bold:
                    return ImageFont.truetype("arialbd.ttf", size)
                else:
                    return ImageFont.truetype("arial.ttf", size)
        except:
            return ImageFont.load_default()

    def launch_window(self):
        self.root = Tk()
        self.root.title(FAKE_TITLE)
        width, height = 1280, 720
        self.root.geometry(f"{width}x{height}")
        self.root.resizable(False, False)
        self.img = self.generate_fake_excel_img(width, height)
        self.photo = ImageTk.PhotoImage(self.img)
        canvas = Canvas(self.root, width=width, height=height)
        canvas.pack()
        canvas.create_image(0, 0, anchor=NW, image=self.photo)
        # Close button
        close_btn = Button(self.root, text="×", command=self.root.quit, bg="#e81123", fg="white", font=("Arial", 12, "bold"))
        close_btn.place(x=width-40, y=5, width=30, height=30)
        # Keyboard shortcut
        self.root.bind('<Control-q>', lambda e: self.root.quit())
        self.root.protocol("WM_DELETE_WINDOW", self.root.quit)
        print("[INFO] Fake Excel window launched. Press Ctrl+Q or close window to return.")
        self.root.mainloop()
        print("[INFO] Excel-style window closed. Restoring previous state.")

    def run(self):
        self.take_screenshot()
        self.launch_window()


def main():
    parser = argparse.ArgumentParser(description="瞬時にExcel風フェイク画面を表示するBossKeyスクリプト")
    parser.add_argument('--log', action='store_true', help='起動・終了ログを出力')
    parser.add_argument('--screenshot-only', action='store_true', help='画面キャプチャのみ')
    args = parser.parse_args()
    bk = BossKeyFakeExcel()
    if args.screenshot_only:
        bk.take_screenshot()
        print(f"Screenshot saved to: {bk.screenshot_path}")
        return
    if args.log:
        print(f"[INFO] boss-key-fake-excel started at {datetime.datetime.now()}")
    bk.run()
    if args.log:
        print(f"[INFO] boss-key-fake-excel ended at {datetime.datetime.now()}")

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは「見られたくない作業を即座にカモフラージュする」ことを目的に設計されています。Excel風のウィンドウ画像を生成し、GUIで表示することで、監督者や同僚の視線を欺きます。

# 公式ドキュメント抜粋
- [tkinter](https://docs.python.org/ja/3/library/tkinter.html): 標準GUIライブラリ。クロスプラットフォーム。
- [Pillow](https://pillow.readthedocs.io/en/stable/): 画像生成・描画・保存。
- [ImageGrab](https://pillow.readthedocs.io/en/stable/reference/ImageGrab.html): 画面キャプチャ用。

# 利用例
- 急な上司の巡回時にターミナルやエディタを一瞬でExcel画面に切り替え
- 開発者同士のジョークやエンタメ用途
- オンライン会議中の画面共有で“真面目なフリ”を演出

# 注意点
- 本Skillはあくまで「演出用」。実際の業務データやセキュリティ保護は行いません。
- 一部のLinux環境や仮想環境ではImageGrabが動作しない場合があります。
- ウィンドウの最前面化やショートカットのカスタマイズはOS依存です。

# 設計方針
- 依存は標準GUI(tkinter)とPillowのみ
- 画像生成でリアルなExcel風UIを再現
- 画面キャプチャで元作業の復元性を担保
- シンプルなCLIと明快な終了方法

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Claude Code はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Claude Code がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/claude-code/boss-key-fake-excel .claude/skills/boss-key-fake-excel

.claude/skills/boss-key-fake-excel の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/boss-key-fake-excel
# SKILL.md, scripts/, references/, README.md があればOK

4. Claude Code を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は /boss-key-fake-excel と Skill 名で出てきます。

5. 動作確認

/boss-key-fake-excel で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、こちらが path を全部指定する手間を省きたい
  • session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい
  • package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎたい
  • long-running workflow 前: long context で重要箇所が薄まる前に snapshot を取りたい
  • 「今この画面を見られたくない」瞬間: 急な来客や画面共有時にワンタッチで画面を切り替えたい
  • 開発者同士のいたずらや演出: チーム内で遊び心を持って使いたい

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
  • directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
  • monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
  • irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
  • Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory
  • フェイク画面の見た目: “なんちゃってExcel”が本物っぽく見えるかは環境依存
  • OSごとの互換性: ウィンドウ制御や画像表示が一部OSで動作しない場合がある

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • ショートカット操作で即時にフェイク画面へ切り替わるか?
  • 元の作業画面へスムーズに戻れるか?
  • フェイク画面が“なんちゃってExcel”に本当に見えるか?
  • OSごとの動作差分はどの程度か?

実際に Claude Code で試した検証ログは Claude Codeで通知・演出・OS連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

関連タグで他のSkill記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次