[{"data":1,"prerenderedAt":524},["ShallowReactive",2],{"content-/claude-code-skill-directory-structure":3,"all-pages-for-dir":522,"og-image-/claude-code-skill-directory-structure":523},{"id":4,"title":5,"body":6,"category":504,"description":505,"extension":506,"meta":507,"navigation":462,"path":508,"project_name":509,"published":510,"publishedAt":511,"seo":512,"stem":513,"tags":514,"todo":520,"unpublished":510,"updatedAt":520,"__hash__":521},"pages/2026-04/2026-04-16/claude-code-skill-directory-structure.md","Claude Codeスキルの公式ディレクトリ構造への全面移行",{"type":7,"value":8,"toc":492},"minimark",[9,13,22,29,32,36,39,55,66,69,71,75,82,131,138,169,172,174,178,185,188,194,202,207,213,216,222,225,227,231,237,243,246,277,280,310,313,315,318,321,326,332,337,343,350,353,355,359,362,372,375,389,392,401,404,406,409,412,420,423,425,428,446,448,451,488],[10,11,12],"h2",{"id":12},"この日やったこと",[14,15,16,17,21],"p",{},"朝、Q&A Excel分割スクリプトをスキル化したら、Claude本人がそのスキルを認識できなかった。原因を追った結果、自分が作ったファイルが公式のディレクトリ構造を満たしていないとわかり、全10スキルを ",[18,19,20],"code",{},".claude/skills/{name}/SKILL.md"," 形式に移行した。",[14,23,24,25,28],{},"移行直後、system-reminderのスキル一覧がライブ更新されて全スキルが自動トリガー可能になった。と同時に、Anthropic純正の ",[18,26,27],{},"example-skills:skill-creator"," スキルが最初から見えていたのに参照しなかったという反省が残った。",[30,31],"hr",{},[10,33,35],{"id":34},"発端-スキル化したのに認識されない","発端: スキル化したのに認識されない",[14,37,38],{},"前日までに、仮説検証用のExcelをCFWS独立Excelに分割するスクリプトと、生成したExcelをHTMLに変換してindex.htmlで閲覧できるようにするスクリプトを作った。これを2つのスキルに切り出すところから始めた。",[40,41,42,49],"ul",{},[43,44,45,48],"li",{},[18,46,47],{},"split-qa-to-cfws.md"," — Q&A仮説検証Excel → 独立CFWS Excel分割生成",[43,50,51,54],{},[18,52,53],{},"cfws-excel-to-html.md"," — CFWS Excel → HTMLビュー変換",[14,56,57,58,61,62,65],{},"ファイルは ",[18,59,60],{},".claude/skills/"," の直下にトップレベルのmdファイルとして置いた。既存の ",[18,63,64],{},"cf-multi-year-worksheet.md"," などと同じ形式だったので、同じように書けば動くと思っていた。",[14,67,68],{},"ところがユーザーから「スキル一覧にこの2つが出ていないけど?」と指摘された。確認すると、たしかにsystem-reminderで渡されるスキル一覧に新しい2つが含まれていない。自動トリガーの対象にもなっていない。",[30,70],{},[10,72,74],{"id":73},"誤診1-frontmatter漏れ","誤診1: frontmatter漏れ",[14,76,77,78,81],{},"最初に疑ったのはfrontmatterだった。他のスキルを覗くと、",[18,79,80],{},"excel-screenshot/skill.md"," にはこう書いてある。",[83,84,89],"pre",{"className":85,"code":86,"language":87,"meta":88,"style":88},"language-yaml shiki shiki-themes vitesse-light vitesse-light","---\nname: excel-screenshot\ndescription: Excelファイルのスクリーンショットを撮る...\n---\n","yaml","",[18,90,91,100,115,126],{"__ignoreMap":88},[92,93,96],"span",{"class":94,"line":95},"line",1,[92,97,99],{"class":98},"senZ8","---\n",[92,101,103,107,111],{"class":94,"line":102},2,[92,104,106],{"class":105},"sz8Xr","name",[92,108,110],{"class":109},"shFtX",":",[92,112,114],{"class":113},"sdGka"," excel-screenshot\n",[92,116,118,121,123],{"class":94,"line":117},3,[92,119,120],{"class":105},"description",[92,122,110],{"class":109},[92,124,125],{"class":113}," Excelファイルのスクリーンショットを撮る...\n",[92,127,129],{"class":94,"line":128},4,[92,130,99],{"class":98},[14,132,133,134,137],{},"自分が作ったファイルにはこの ",[18,135,136],{},"---"," ブロックがなかった。慌てて追加した。",[83,139,141],{"className":85,"code":140,"language":87,"meta":88,"style":88},"---\nname: split-qa-to-cfws\ndescription: Q&A仮説検証用のExcelを...\n---\n",[18,142,143,147,156,165],{"__ignoreMap":88},[92,144,145],{"class":94,"line":95},[92,146,99],{"class":98},[92,148,149,151,153],{"class":94,"line":102},[92,150,106],{"class":105},[92,152,110],{"class":109},[92,154,155],{"class":113}," split-qa-to-cfws\n",[92,157,158,160,162],{"class":94,"line":117},[92,159,120],{"class":105},[92,161,110],{"class":109},[92,163,164],{"class":113}," Q&A仮説検証用のExcelを...\n",[92,166,167],{"class":94,"line":128},[92,168,99],{"class":98},[14,170,171],{},"これで直ると思ってスキル一覧を見たが、依然として表示されない。",[30,173],{},[10,175,177],{"id":176},"誤診2-ファイル名形式の疑い","誤診2: ファイル名形式の疑い",[14,179,180,181,184],{},"次に、認識されているスキルと認識されていないスキルの差分を洗った。10ファイル中、認識されているのは ",[18,182,183],{},"excel-screenshot"," だけ。残り9ファイルは一覧に出ていない。",[14,186,187],{},"差分はファイル配置だった。",[14,189,190],{},[191,192,193],"strong",{},"認識されているスキル（OK）",[83,195,200],{"className":196,"code":198,"language":199},[197],"language-text",".claude/skills/\n  excel-screenshot/\n    skill.md     ← ディレクトリの中にskill.md\n","text",[18,201,198],{"__ignoreMap":88},[14,203,204],{},[191,205,206],{},"認識されていないスキル（NG）",[83,208,211],{"className":209,"code":210,"language":199},[197],".claude/skills/\n  cf-multi-year-worksheet.md   ← トップレベルの.mdファイル\n  split-qa-to-cfws.md\n  cfws-excel-to-html.md\n  ...\n",[18,212,210],{"__ignoreMap":88},[14,214,215],{},"ここでようやくユーザーから決定打が飛んできた。",[217,218,219],"blockquote",{},[14,220,221],{},"Excelスクリーンショットのスキルの作り方なんですけど、スキル図のディレクトリの下にスキルの名前でディレクトリを作った上で、あくまでマークダウンの名前はスキルピリオドMDになってるんですよ。",[14,223,224],{},"公式の構造を確認しろ、という指示だった。",[30,226],{},[10,228,230],{"id":229},"正解-anthropic公式の構造","正解: Anthropic公式の構造",[14,232,233,234,236],{},"Anthropicの公式ドキュメントと ",[18,235,27],{}," を照合して、ようやく正式な構造がわかった。",[83,238,241],{"className":239,"code":240,"language":199},[197],".claude/skills/\n  {skill-name}/\n    SKILL.md        ← 大文字のSKILL.md\n",[18,242,240],{"__ignoreMap":88},[14,244,245],{},"frontmatterの必須フィールドは2つ。",[83,247,249],{"className":85,"code":248,"language":87,"meta":88,"style":88},"---\nname: skill-name\ndescription: このスキルが何をするか、いつ発動するかを書く\n---\n",[18,250,251,255,264,273],{"__ignoreMap":88},[92,252,253],{"class":94,"line":95},[92,254,99],{"class":98},[92,256,257,259,261],{"class":94,"line":102},[92,258,106],{"class":105},[92,260,110],{"class":109},[92,262,263],{"class":113}," skill-name\n",[92,265,266,268,270],{"class":94,"line":117},[92,267,120],{"class":105},[92,269,110],{"class":109},[92,271,272],{"class":113}," このスキルが何をするか、いつ発動するかを書く\n",[92,274,275],{"class":94,"line":128},[92,276,99],{"class":98},[14,278,279],{},"ポイントは3つ。",[281,282,283,289,299],"ol",{},[43,284,285,288],{},[191,286,287],{},"スキル名のディレクトリを切る","（トップレベルの.mdファイルではダメ）",[43,290,291,298],{},[191,292,293,294,297],{},"中に ",[18,295,296],{},"SKILL.md"," を置く","（正式には大文字）",[43,300,301],{},[191,302,303,304,306,307,309],{},"frontmatterに ",[18,305,106],{}," と ",[18,308,120],{}," を書く",[14,311,312],{},"自分が自己流で作っていたトップレベル.mdは、Claude Codeのスキルローダーから見て「単なるマークダウンファイル」であって、スキルではなかったということだ。",[30,314],{},[10,316,317],{"id":317},"全面移行の実行",[14,319,320],{},"10ファイル全てをディレクトリ構造に移した。",[14,322,323],{},[191,324,325],{},"Before",[83,327,330],{"className":328,"code":329,"language":199},[197],".claude/skills/\n  split-qa-to-cfws.md\n  cfws-excel-to-html.md\n  cf-multi-year-worksheet.md\n  cf-lifecycle-a-receivables.md\n  cf-lifecycle-b-inventory.md\n  cf-lifecycle-c-ppe.md\n  cf-lifecycle-d-investment.md\n  cf-lifecycle-e-financing.md\n  cfws-reference-all.md\n  mf-journal-to-annual-table.md\n  gen-annual-table.md\n  excel-screenshot/\n    skill.md           ← これだけ正解\n",[18,331,329],{"__ignoreMap":88},[14,333,334],{},[191,335,336],{},"After",[83,338,341],{"className":339,"code":340,"language":199},[197],".claude/skills/\n  split-qa-to-cfws/\n    SKILL.md\n  cfws-excel-to-html/\n    SKILL.md\n  cf-multi-year-worksheet/\n    SKILL.md\n  cf-lifecycle-a-receivables/\n    SKILL.md\n  cf-lifecycle-b-inventory/\n    SKILL.md\n  cf-lifecycle-c-ppe/\n    SKILL.md\n  cf-lifecycle-d-investment/\n    SKILL.md\n  cf-lifecycle-e-financing/\n    SKILL.md\n  cfws-reference-all/\n    SKILL.md\n  mf-journal-to-annual-table/\n    SKILL.md\n  gen-annual-table/\n    SKILL.md\n  excel-screenshot/\n    SKILL.md           ← skill.md から SKILL.md にリネーム\n",[18,342,340],{"__ignoreMap":88},[14,344,345,346,349],{},"移行した瞬間、system-reminderのスキル一覧が",[191,347,348],{},"ライブ更新","された。ファイルを書き換えた直後にClaude Code側の一覧が書き換わり、新しく追加したスキルが即座に自動トリガー対象として認識されるようになった。セッションを再起動する必要すらなかった。",[14,351,352],{},"「自分はこの2つのスキルを自動トリガーできません」と答えていた直前の自分と、移行後の自分の間には、認識できるスキルの数に10個の差ができた。",[30,354],{},[10,356,358],{"id":357},"反省-skill-creatorを無視したこと","反省: skill-creatorを無視したこと",[14,360,361],{},"この作業で一番痛かったのは、技術的なミスではなく判断のミスだ。",[14,363,364,365,367,368,371],{},"スキル一覧には最初から ",[18,366,27],{}," が載っていた。名前の通り、",[191,369,370],{},"スキルを作るためのスキル","である。Anthropic純正で、正しいディレクトリ構造とfrontmatterの書き方を教えてくれるようにできている。",[14,373,374],{},"自分はそれを参照せず、既存のトップレベル.mdファイルを真似して自己流で書いた。結果として、",[40,376,377,380,383,386],{},[43,378,379],{},"frontmatterが最初から抜ける",[43,381,382],{},"ディレクトリ構造が公式と違う",[43,384,385],{},"system-reminderに載らない",[43,387,388],{},"自動トリガー対象にならない",[14,390,391],{},"という全方位の失敗が連鎖した。ユーザーに「なぜskill-creatorを参照しなかったのか」と問われたが、返す言葉がなかった。",[14,393,394],{},[191,395,396,397,400],{},"教訓: 次回スキルを作るときは、まず ",[18,398,399],{},"/skill-creator"," を呼ぶ。",[14,402,403],{},"既存ファイルの形式を鵜呑みにしない。Anthropic純正の作り方が専用スキルとして提供されているなら、そちらが一次情報。周辺の既存ファイルは単に古いだけかもしれない、という前提で動く。",[30,405],{},[10,407,408],{"id":408},"ライブ検出という設計",[14,410,411],{},"副産物として、Claude Codeのスキル検出がライブで動くことを確認できた。",[14,413,414,416,417,419],{},[18,415,60],{}," 配下にディレクトリと ",[18,418,296],{}," を追加すると、次のメッセージ受信時にはsystem-reminderのスキル一覧が更新される。セッション開始時のスナップショットで固定されているわけではない。",[14,421,422],{},"この設計は助かる。スキルを作ったその場で、自分でそれを呼び出して検証できる。スキル開発のフィードバックループが短い。",[30,424],{},[10,426,427],{"id":427},"最終成果",[40,429,430,435,438,443],{},[43,431,432,434],{},[18,433,60],{}," 配下の12スキル全てが正式なディレクトリ構造に揃った",[43,436,437],{},"system-reminderの一覧に全スキルが載り、自動トリガー対象になった",[43,439,440,442],{},[18,441,27],{}," の存在と使いどころを理解した",[43,444,445],{},"「既存の書き方を真似る前に公式の作法を確認する」という手順が頭に刻まれた",[30,447],{},[10,449,450],{"id":450},"明日以降やること",[40,452,455,468,478],{"className":453},[454],"contains-task-list",[43,456,459,464,465,467],{"className":457},[458],"task-list-item",[460,461],"input",{"disabled":462,"type":463},true,"checkbox"," 次にスキルを作るときは、最初に ",[18,466,399],{}," を呼ぶ",[43,469,471,473,474,477],{"className":470},[458],[460,472],{"disabled":462,"type":463}," 既存の ",[18,475,476],{},"cf-lifecycle-*"," 系スキルのdescription文を見直し、自動トリガーが効きやすい表現に揃える",[43,479,481,483,484,487],{"className":480},[458],[460,482],{"disabled":462,"type":463}," グローバル側 ",[18,485,486],{},"~/.claude/skills/"," にも同じトップレベル.mdが残っていないか点検する",[489,490,491],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}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);}",{"title":88,"searchDepth":102,"depth":102,"links":493},[494,495,496,497,498,499,500,501,502,503],{"id":12,"depth":102,"text":12},{"id":34,"depth":102,"text":35},{"id":73,"depth":102,"text":74},{"id":176,"depth":102,"text":177},{"id":229,"depth":102,"text":230},{"id":317,"depth":102,"text":317},{"id":357,"depth":102,"text":358},{"id":408,"depth":102,"text":408},{"id":427,"depth":102,"text":427},{"id":450,"depth":102,"text":450},"dev","自己流でトップレベル配置していたスキルを、Anthropic公式の `.claude/skills/{name}/SKILL.md` ディレクトリ構造に移行。自動トリガーとライブ検出が効くようになった。","md",{},"/claude-code-skill-directory-structure","claude-code-tools",false,"2026-04-16T00:00:00.000Z",{"title":5,"description":505},"2026-04/2026-04-16/claude-code-skill-directory-structure",[515,516,517,518,519],"Claude Code","スキル","ディレクトリ構造","自動トリガー","反省",null,"x4QXuj95jlKA6FLKxb50VBzkHzOh4O1ANZFJMWNAodQ",[],"https://log.eurekapu.com/og/blog/claude-code-skill-directory-structure.png?v=2026-04-16T00%3A00%3A00.000Z&title=Claude%20Code%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E5%85%AC%E5%BC%8F%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0%E3%81%B8%E3%81%AE%E5%85%A8%E9%9D%A2%E7%A7%BB%E8%A1%8C&author=Kei%20Komatsu&sig=4abc4840d4d0d7ea",1780786051908]