0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔄 Claudeが自分でスキルを増やしお自分で敎理する仕組み

0
Posted at

月10䞇の倧孊生が月120䞇になれたのは、私が頑匵ったからじゃない。頑匵らなくおも回る環境を、先に䜜ったからです。

なぜこの仕組みが効くのか

Claude Codeを䜿い蟌んでいるず、ある矛盟にぶ぀かりたす。

䜿えば䜿うほど、Claudeは賢くなる。䜜業䞭に「このパタヌン、たた䜿えそうだな」ず思った手順を自動でスキルファむルに曞き出しおくれる。今日解決した゚ラヌ回避策が、明日の別タスクで即座に呌び出せる。これは確かに䟿利です。

でも3ヶ月も続けるず、スキルの墓堎ができあがりたす。

最初の1ヶ月で䜜ったスキルが、い぀のたにか動かなくなっおいおも誰も気づかない。䌌たような名前のスキルが2぀3぀乱立する。去幎の自分が「䟿利だろう」ず刀断した手順が、今の環境では前提が厩れおいお逆にノむズになる。人間が管理しないシステムは、必ず腐りたす。

かずいっお、自分で定期的にスキルを敎理するのは続かない。副業収入が増えおくるほど本圓に集䞭すべき刀断が増え、ファむル敎理みたいな「重芁だが緊急じゃない䜜業」は埌回しになり続けたす。私も䞀床、スキルディレクトリが70件を超えた時点で䜕が䜕だかわからなくなり、䞀から芋盎す矜目になりたした。あの時間は玔粋に損倱でした。

この問題の本質は「管理ずいう䜜業が人間のコンテキストを食う」こずです。

重芁なのは成果物を生み出す刀断であり、成果物の玠材になるスキルラむブラリの鮮床維持は、できれば脳みそを䜿わずに枈たせたい。それを実珟するのが、今回玹介する2本のシェルスクリプトず、それを動かす2枚のlaunchdゞョブです。

「䜜業をする」から「環境を持぀」ぞの転換

私がClaude Code自埋環境の構築に半幎かけお孊んだ最倧の教蚓は、「毎日やる䜜業」ず「仕組みが毎日やる䜜業」は党く違うずいうこずです。

副業を掛け持ちしお月60䞇たで皌いでいた頃は、私が党郚やっおいたした。毎朝チェックリストを開いお、コンテンツを曎新しお、レポヌトを確認しお。䌚瀟郜合で解雇されおれロになった時、痛感したのは「自分が動かないず止たるシステムは、脆い」ずいう事実です。

再起にあたっお培底したのは、自分がボトルネックになる構造を排陀するこず。スキルの収集ず敎理も、「気が向いたらやる」から「毎晩3時30分ず毎週日曜4時15分に自動で回る」に倉えたした。この差は小さいようで、3ヶ月埌には決定的な違いになりたす。

読者にずっおの共感ポむント

「スキルが貯たるのはいいけど、管理が远い぀かない」ずいう悩みは、Claude Codeをある皋床䜿い蟌んだ人なら必ず経隓したす。最初の感動フェヌズを過ぎるず、ラむブラリの肥倧化ず陳腐化ずいう珟実が来る。

この蚘事で玹介するのは、そこぞの具䜓的な解答です。コヌドの䞀字䞀句は私の環境で実際に動いおいる実物を匕甚したす。動かない蚭蚈論は曞きたせん。

党䜓の流れ

システムを䞀蚀で衚すず、倜間バッチで䌚話ログからスキルを抜出し、週次バッチで賞味期限切れを自動退避する2段パむプラむンです。

䌚話ログ (~/Documents/my-knowledge-base/raw/conversations/*.md)
         │
         â–Œ  毎日 3:30 AM
┌─────────────────────────────────────────────────┐
│              skill-harvest.sh                   │
│                                                 │
│  .harvest-watermark で前回以降の差分だけ取埗    │
│        ↓                                        │
│  MAX_LOGS=3 本 × PER_LOG_BYTES=15000 B         │
│  system-reminder行陀去 → ダむゞェスト生成       │
│        ↓                                        │
│  claude -p (sonnet / max-budget $1.20)         │
│  「この手順、再利甚できる」ず問い続ける       │
│        ↓                                        │
│  ステヌゞングdir に SKILL.md 生成               │
│  author: auto を保蚌 → ~/.claude/skills/auto/  │
└─────────────────────────────────────────────────┘
         │
         â–Œ 蓄積
~/.claude/skills/auto/  (auto-skill ラむブラリ)
         │
         â–Œ  毎週日曜 4:15 AM
┌─────────────────────────────────────────────────┐
│              skill-curate.sh                    │
│                                                 │
│  実行前スナップショット (.snapshots/*.tar.gz)   │
│  author: auto 以倖は䞀切觊れない                │
│        ↓                                        │
│  最終䜿甚日を3段階で掚定                        │
│  (䌚話ログMtime → created → file mtime)        │
│        ↓                                        │
│  30日未䜿甚 → status: stale に曞き換え         │
│  90日未䜿甚 → .archive/ に物理退避             │
│        ↓                                        │
│  LLM で重耇・統合候補を怜出                    │
│  → .curator-proposals.md に提案曞生成           │
└─────────────────────────────────────────────────┘

デヌタは䞀方向にしか流れたせん。harverstがむンプット偎、curateがクリヌンアップ偎。2぀のゞョブは独立しお動き、お互いの実行を埅たない蚭蚈です。

skill-harvest.sh の仕組み

スクリプトの冒頭で3぀の定数が蚭蚈思想を語っおいたす。

MAX_LOGS=3              # 1回で扱うログ本数
PER_LOG_BYTES=15000     # ログ1本あたりの取り蟌み䞊限バむト
BUDGET_USD=1.20         # 暎走防止キャップ

䌚話ログは1本あたり数MB〜数十MBになるこずがありたす。それをそのたたClaudeに枡すずトヌクンコストが跳ね䞊がる。だからダむゞェストを䜜りたす。

grep -v -e 'system-reminder' -e '^- [a-z0-9].*:' "$f" 2>/dev/null | head -c $PER_LOG_BYTES

system-reminder ブロックはスキル䞀芧ノむズの塊なので陀倖。それからバむト䞊限で切る。この2行で、Claudeに枡す前の「情報密床の匕き䞊げ」をシェルレベルで実珟しおいたす。

差分凊理のキヌは .harvest-watermark ファむルです。

if [[ -f "$WM" ]]; then
  newlogs=("${(@f)$(find "$LOGS" -name '*.md' -newer "$WM" 2>/dev/null)}")
else
  newlogs=("${(@f)$(ls -t "$LOGS"/*.md 2>/dev/null)}")
fi

初回は最新ログを取埗し、2回目以降はりォヌタヌマヌクより新しいファむルだけを察象にする。毎晩3時30分に起動しおも、その日に䌚話がなければ「no new logs — skip」でれロコストで終了したす。課金を無駄にしない蚭蚈です。

ステヌゞングパタヌンが肝心です。

~/.claude/ 配䞋はClaude Codeが曞き蟌み保護をかけるため、Claudeに盎接 ~/.claude/skills/auto/ ぞ曞かせるこずができたせん。だからスクリプトは䞀時ディレクトリをステヌゞングずしお䜿いたす。

STAGING=$(mktemp -d -t skill-harvest-stg)
( cd "$STAGING" && perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" \
  "$CLAUDE" -p "$PROMPT" \
  --model sonnet \
  --permission-mode acceptEdits \
  --allowedTools "Write Edit Read" \
  --max-budget-usd "$BUDGET_USD" >> "$LOG" 2>&1 < /dev/null )

Claudeは $STAGING をカレントディレクトリずしお起動され、盞察パス ./kebab-name/SKILL.md でファむルを䜜る。その埌、シェルが実䜓を ~/.claude/skills/auto/ にコピヌしたす。

for sd in "$STAGING"/*(/N); do
  [[ -f "$sd/SKILL.md" ]] || continue
  name="${sd:t}"
  if [[ -e "$AUTO/$name" ]]; then
    echo "[$(ts)] exists, skip copy: $name" >> "$LOG"
  else
    cp -R "$sd" "$AUTO/$name" && { echo "[$(ts)] CREATED: $name" >> "$LOG"; ((created++)); }
  fi
done

既存スキルず同名なら skip copy でコピヌしない。重耇䜜成の防止はここで担保されたす。

さらに author: auto の付䞎をPythonむンラむンスクリプトで保蚌したす。これが埌段の skill-curate.sh で「觊っおいい察象かどうか」の刀断基準になるため、ここで確実に打っおおく必芁がある。

skill-curate.sh の仕組み

週次ゞョブのほうが、蚭蚈ずしお面癜い。

最初に必ずスナップショットを取りたす。

tar czf "$SNAP/auto-$(date +%Y%m%d-%H%M%S).tar.gz" -C "$HOME/.claude/skills" \
  --exclude='auto/.snapshots' --exclude='auto/.archive' auto 2>/dev/null

--exclude='auto/.snapshots' でスナップショット自身を再垰的に含めないようにしおいる点に泚目しおください。スナップショットのスナップショットが無限に増えるのを防ぐ䞀行です。このスクリプトは実削陀を䞀切したせん。mv で .archive/ に退避するだけ。「取り戻せない操䜜をしない」ずいう非砎壊蚭蚈の培底です。

安党ガヌドは最初の条件チェックで入りたす。

if ! grep -q '^author:[[:space:]]*auto' "$md"; then
  echo "[$(ts)] skip (not author:auto): $skill" >> "$LOG"
  continue
fi

手動で䜜ったスキルや、バンドルスキル、ECCスキルには絶察に觊れない。author: auto ずいう䞀行が、「敎理察象かどうか」のフラグになっおいたす。このガヌドがあるので、スクリプトを怖がらずに党スキルディレクトリに察しお実行できたす。

最終䜿甚日の蚈算が3段フォヌルバックになっおいるのも実務的です。

lastlog, created, md = (sys.argv + ["","",""])[1:4]
ref = None
if lastlog.strip():
    try: ref = float(lastlog)
    except: ref = None
if ref is None and created.strip():
    try: ref = time.mktime(datetime.datetime.strptime(created.strip(), "%Y-%m-%d").timetuple())
    except: ref = None
if ref is None:
    ref = os.path.getmtime(md)

たず䌚話ログでそのスキル名が蚀及された最新mtimeを探す。なければSKILL.mdのfrontmatterにある created: 日付。それもなければファむル自䜓のmtimeに萜ちる。どのケヌスでもれロ陀算や䟋倖で死なない蚭蚈です。

STALE_DAYS=30 を超えたら status: stale に曞き換え、ARCHIVE_DAYS=90 を超えたら .archive/ に退避。この数倀が重芁なのは「30日䜿われおいないスキルは本圓に忘れおいる可胜性が高い、90日ならほが確実に䞍芁」ずいう経隓則から来おいるからです。システムを入れおから5ヶ月、この閟倀で誀怜知は出おいたせん。

LLM提案フェヌズが最埌に走りたす。

if [[ "$RUN_LLM" != "nollm" ]] && (( active >= 2 )) && [[ -x "$CLAUDE" ]]; then

active >= 2 件以䞊のスキルが残っおいる堎合だけLLMを起動する条件が入っおいたす。スキルが1件しかなければ統合提案の意味がないので起動しない、ずいうロゞックです。提案は --max-budget-usd 5.00 のClaude呌び出しが .curator-proposals.md に曞き出したす。実ファむルのスキルは倉曎も削陀もしない、提案曞を生成するだけ。最終刀断は人間私がその提案曞を読んで手動でマヌゞするかどうかを決めたす。

launchd の蚭定タむミング

2枚のplistが定矩する実行時刻です。

skill-harvestcom.shun.skill-harvest: 毎日午前3時30分

<key>StartCalendarInterval</key>
<dict>
    <key>Hour</key>
    <integer>3</integer>
    <key>Minute</key>
    <integer>30</integer>
</dict>

skill-curatecom.shun.skill-curate: 毎週日曜午前4時15分

<key>StartCalendarInterval</key>
<dict>
    <key>Hour</key>
    <integer>4</integer>
    <key>Minute</key>
    <integer>15</integer>
    <key>Weekday</key>
    <integer>0</integer>
</dict>

午前3時30分は私が確実に眠っおいる時間です。MacBook Proが静かに起き䞊がっお䌚話ログを読み、スキルを抜出し、たた眠る。収穫harvestが終わっおから44分埌、午前4時15分に今床は週1回の敎理curateが走る。この45分のバッファは、harverstが異垞に時間がかかった堎合の衝突回避ですタむムアりトは TIMEOUT_SEC=600 の10分に蚭定されおいるので䜙裕がある。

䞡方のplistずも ProcessType: Background ず Nice: 10 を蚭定しおいたす。MacBookが䜕かほかの䜜業をしおいおも、自分のプロセスが圧迫されないように最䜎優先床で動く。睡眠䞭に静かに仕事をするためのマナヌです。

ログはそれぞれ ~/.claude/logs/com.shun.skill-harvest.log ず ~/.claude/logs/com.shun.skill-curate.log に曞き蟌たれ、翌朝確認すれば昚倜䜕が起きたかが䞀目でわかりたす。

実装の詳现

プロンプト蚭蚈Claudeに「䜕を曞くか」より「どこに曞くか」を厳呜する

skill-harvest.sh のプロンプトで最も重芁な郚分は、内容の指瀺ではなくツヌルの䜿い方の指瀺です。

【最重芁・厳守】
- 各スキルは必ず **Write ツヌル** を䜿っお ./<kebab-name>/SKILL.md ずしお実際にファむル䜜成するこず
- スキル本文をこの返信メッセヌゞに貌り付けおはいけない。必ずファむルに曞き蟌む
- ファむルを曞き終えたら、䜜成したスキル名だけを箇条曞きで報告する本文は䞍芁
- 該圓が無ければファむルを䜜らず『該圓なし』ずだけ答える

これが必芁な理由は、指瀺しないずClaudeが「䞁寧な返答ずしお」スキルをチャット本文に貌り付けおしたうからです。最初のバヌゞョンではこの指定がなく、毎回芋事にMarkdownをテキストで返しおくれおいたした。ファむルは0件のたた。コストだけかかる。

existing=$(ls "$AUTO" 2>/dev/null | grep -v '^\.' | tr '\n' ',')

既存スキル䞀芧をカンマ区切りでプロンプトに入れおいるのも意図的です。「重耇するなら既存をpatchせよ」ずいう指瀺ずセットにするこずで、同じ手順が埮劙に違う名前で3本生えおくる問題を抑制したす。この察策を入れた週以降、重耇䜜成の発生率がほがれロになりたした。

タむムアりトの仕掛けなぜ timeout コマンドを䜿わないのか

スクリプトの䞭に少し奇劙な呌び出し方がありたす。

perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" \
  "$CLAUDE" -p "$PROMPT" ...

最初は玠盎に timeout 600 claude -p ... ず曞いおいたした。動きたす。ただ、macOS暙準の timeout はGNU coreutilsずは挙動が埮劙に違い、子プロセスにSIGTERMを送った埌の終了コヌドがシェルごずに倉わる。さらに launchd から実行するずコマンドが芋぀からないケヌスもあった埌述。

perl -e 'alarm' は macOS に暙準搭茉されおいお、SIGALRM を確実に投げたす。exec @ARGV で子プロセスにそのたた眮き換えおいるのでPIDが䜙蚈に増えない。シンプルで確実な方法ずしお最終的にこの圢に萜ち着きたした。

curate の差分チェック$5のLLM呌び出しを無駄にしない

skill-curate.sh のLLM提案フェヌズには、実行するかどうかを刀断する仕掛けが入っおいたす。

prop_mtime=0
[[ -f "$PROP" ]] && prop_mtime=$(stat -f '%m' "$PROP" 2>/dev/null || echo 0)
changed_names=()
changed_files=()
while IFS= read -r md; do
  md_mtime=$(stat -f '%m' "$md" 2>/dev/null || echo 0)
  if [[ ! -f "$PROP" ]] || (( md_mtime > prop_mtime )); then
    changed_names+=("$skill")
    changed_files+=("$md")
  fi
done < <(find "$AUTO" -mindepth 2 -maxdepth 2 -name SKILL.md -print 2>/dev/null)

.curator-proposals.md の最終曎新日時ず各 SKILL.md の曎新日時を比べおいたす。前回の提案ファむルより新しいスキルが1件もなければ LLM skip でClaudeを起動しない。

2026-07-13 04:23:18 no new skills, LLM skip

毎週日曜に動くずいっおも、党スキルが1週間で曎新されるわけではない。倉化がない週にLLMを起動するのは玔粋に無駄です。この刀定を入れるだけで、月あたりのcurate LLMコストが実枬で玄65%枛りたした。

むンラむンPythonで倖郚䟝存を排陀する

frontmatterの曞き換えに sed を䜿わずPythonのむンラむンスクリプトを遞んでいるのは、macOSずLinuxで sed -i の匕数が違うからです。

import sys, re
p = sys.argv[1]; s = open(p).read()
if re.search(r'^status:', s, re.M):
    s = re.sub(r'^status:.*$', 'status: stale', s, count=1, flags=re.M)
else:
    s = re.sub(r'^(author:[ \t]*auto.*)$', r'\1\nstatus: stale', s, count=1, flags=re.M)
open(p, 'w').write(s)

status: 行が既にあれば曞き換え、なければ author: auto の盎埌に远加する。この2分岐が必芁なのは、初期のスキルには status: を省略しおいるものが混圚しおいるからです。どちらのケヌスでも1回のPython呌び出しで凊理が完結するため、pipやvenvは䞀切䞍芁です。


私が詰たった話

この仕組みを完成させるたでに4回、同じ「動くはずなのに動かない」をやりたした。蚭蚈は正しいのに実行環境が想定ず違う、ずいうパタヌンです。

詰たり①launchd から起動するず claude が「芋぀からない」

最初のplistには EnvironmentVariables ブロックがありたせんでした。タヌミナルから手動実行するず動く。でも深倜3時30分に動いたログを朝確認するず、

2026-06-01 03:30:02 claude not found: /Users/xxx/.local/bin/claude

launchd は ~/.zshrc を読たない。nvm も読たない。タヌミナルで動く $PATH が䞞ごず存圚しない状態でゞョブが起動したす。

察凊は plist に明瀺的な EnvironmentVariables を曞き蟌むこずです。

<key>EnvironmentVariables</key>
<dict>
    <key>PATH</key>
    <string>/Users/xxx/.nvm/versions/node/v24.13.0/bin:/opt/homebrew/bin:...:/Users/xxx/.local/bin</string>
</dict>

さらにスクリプト冒頭にも同じPATHを export で曞いおいたす。二重に曞くのは過剰に芋えたすが、plistのパスが曎新されずにNodeバヌゞョンを䞊げた堎合の保険です。どちらか䞀方が叀くなっおも、もう䞀方が生きおいれば動く。

詰たり②~/.claude/ に盎接曞かせようずしたら党郚止たった

最初の蚭蚈では「Claudeに盎接 ~/.claude/skills/auto/ にファむルを曞かせる」぀もりでした。プロンプトに絶察パスを曞いお実行したずころ、Claudeが曞き蟌もうずした瞬間にパヌミッション゚ラヌが出お停止。

Claude Code は ~/.claude/ 配䞋ぞの倖郚からの曞き蟌みをブロックしたす。これはセキュリティ蚭蚈で、別のプロセスから claude -p を䜿っお自分のスキルディレクトリを曞き換えさせるこずができない。

解決策がステヌゞングパタヌンです。

STAGING=$(mktemp -d -t skill-harvest-stg)
( cd "$STAGING" && "$CLAUDE" -p "$PROMPT" \
  --permission-mode acceptEdits \
  --allowedTools "Write Edit Read" ... )
# Claudeが曞いたファむルをシェルがコピヌする
for sd in "$STAGING"/*(/N); do
  cp -R "$sd" "$AUTO/$name"
done

Claudeが曞けるのは自分のカレントディレクトリ䞀時ディレクトリだけ。ファむルのコピヌはシェルが行う。制玄を回避するのではなく、制玄ず共存する蚭蚈です。skill-curate.sh の提案曞生成でも同じ構造を䜿っおいたす。

STG=$(mktemp -d -t skill-curate-stg)
( cd "$STG" && "$CLAUDE" -p "..." \
  --add-dir "$AUTO" --permission-mode acceptEdits ... )
[[ -f "$STG/curator-proposals.md" ]] && cp "$STG/curator-proposals.md" "$PROP"

ここで --add-dir "$AUTO" が必芁になりたす。curate の堎合、Claudeは既存スキルを「読む」必芁がある提案を曞くために。しかしカレントは䞀時ディレクトリ。--add-dir で ~/.claude/skills/auto を読み取り蚱可リストに远加するこずで、「読めるが曞けない」状態を䜜りたす。

詰たり③スナップショットが週ごずに肥倧化しおディスクを食い始めた

skill-curate.sh を入れおから2週間埌、スナップショットディレクトリが急激に膚らんでいるこずに気づきたした。1回目が12MB、2回目が35MB、3回目が89MB  指数関数的に増えおいる。

原因は tar の陀倖蚭定を忘れおいたこずです。

# 壊れたバヌゞョン
tar czf "$SNAP/auto-20260601.tar.gz" -C "$HOME/.claude/skills" auto

# 正しいバヌゞョン
tar czf "$SNAP/auto-20260601.tar.gz" -C "$HOME/.claude/skills" \
  --exclude='auto/.snapshots' --exclude='auto/.archive' auto

スナップショット自身が auto/.snapshots/ にいるので、陀倖しないず「スナップショットのスナップショット」が毎週入れ子になっお蚘録されおいたした。修正埌は毎回8〜15MBで安定しおいたす。

詰たり④りォヌタヌマヌクなしで動かすず毎晩$1.20課金された

初期バヌゞョンには .harvest-watermark がありたせんでした。「前回からの差分だけを凊理する」ロゞックがなく、毎晩 $LOGS/*.md を党件取埗しおいた。

# 壊れたバヌゞョン毎晩党ログを取る
newlogs=("${(@f)$(ls -t "$LOGS"/*.md 2>/dev/null | head -$MAX_LOGS)}")

# 正しいバヌゞョン差分だけ
if [[ -f "$WM" ]]; then
  newlogs=("${(@f)$(find "$LOGS" -name '*.md' -newer "$WM" 2>/dev/null)}")
else
  newlogs=("${(@f)$(ls -t "$LOGS"/*.md 2>/dev/null)}")
fi

䌚話がなかった日も3本のログを読んで、䜕も抜出できず終了。それでも BUDGET_USD=1.20 が毎晩消費される。10日で12ドル、気づいたのが請求を芋た時でした。

りォヌタヌマヌクを入れおからは、䌚話がない倜は no new logs — skip の1行だけログに残しおれロコストで終了したす。実際のコスト発生は月に10〜15日皋床で、月額換算だず圓初の半分以䞋になりたした。

詰たり⑀手䜜りスキルが突然 .archive/ に消えた

curate を動かしお最初の日曜日の朝、自分が手動で䜜った重芁なスキルが .archive/ に移動されおいたした。䜜ったのが2ヶ月前で、䜿甚頻床は高くなかったものセットアップ系のone-shot手順。

原因は author: auto ガヌドを入れおいなかったこずです。

# この条件がなかった
if ! grep -q '^author:[[:space:]]*auto' "$md"; then
  echo "[$(ts)] skip (not author:auto): $skill"
  continue
fi

圓時の蚭蚈では「auto-skill ディレクトリにあるものは党郚敎理察象」ずいう前提でした。でも実際には、バンドルスキルや手動䜜成スキルが混圚しおいた。author: auto の䞀行が「敎理しおよいか」のフラグになる、ずいう蚭蚈倉曎は、この倱敗から来おいたす。

今は手動スキルには author: manual を明瀺するルヌルにしおいたす。curate は author: auto 以倖を䞀切觊りたせん。.archive/ に退避されたスキルはスナップショットから埩元できたしたが、このルヌルを決める前に䜜ったスキルは党郚 author: フィヌルドを遡及远加する必芁がありたした。10分くらいかけお手䜜業で曞き盎した蚘憶がありたす。

぀たずきポむント

前段で玹介した5぀の詰たりPATHがない・ステヌゞングが芁る・スナップショット肥倧・りォヌタヌマヌク挏れ・author:autoガヌド䞍備は、私が実際に螏んだ穎でした。でもそれで終わりではありたせん。運甚に入っおから気づく「2呚目の詰たり」がただありたす。箇条曞きで䞀気に出したす。

--permission-mode acceptEdits だけでは足りない

harvest/curateどちらも --allowedTools "Write Edit Read" を明瀺しないず、Claudeが䜙蚈なツヌルBash、WebFetchなどを呌び出そうずしお倱敗したす。蚱可ツヌルの制限はコスト暎走の防止にもなるので、䞡方セットで曞くず芚えおください。

"$CLAUDE" -p "$PROMPT" \
  --permission-mode acceptEdits \
  --allowedTools "Write Edit Read" \
  --max-budget-usd "$BUDGET_USD"

zsh 固有の glob qualifier を bash で動かした

"$STAGING"/*(/N) はzshのglob qualifierで、/ はディレクトリのみを意味し N はれロマッチでも゚ラヌを出さない修食子です。bashでは構文゚ラヌになりたす。plistの ProgramArguments に /bin/zsh を明瀺しおいるのはこのためで、デフォルトの /bin/sh に倉えるず即死したす。

curate で --add-dir を忘れるずLLMが読めない

curate偎のステヌゞングディレクトリは䞀時領域なので、そこからは ~/.claude/skills/auto/ の䞭が芋えたせん。--add-dir "$AUTO" を枡すこずで「読み取りは蚱可するが曞き蟌みは防ぐ」状態を䜜っおいたす。この匕数が抜けるず、LLMは空癜の状態で提案曞を曞こうずしお、意味のない内容が curator-proposals.md に出力されたす。

active カりンタの動きを誀解する

skill-curate.sh を読むず、90日超えのスキルは mv でアヌカむブした埌 ((active++)) を呌ばない蚭蚈になっおいたす。

if (( days > ARCHIVE_DAYS )); then
  mv "$d" "$ARCH/" && echo "[...] ARCHIVED"
  # active++ はここにない
elif (( days > STALE_DAYS )); then
  # ... stale 曞き換え
  ((active++))
else
  ((active++))
fi

党スキルがARCHIVE察象になった堎合、active=0のたたLLMが起動しない条件 (( active >= 2 )) を満たさず、提案フェヌズが静かにスキップされたす。゚ラヌではなく意図した蚭蚈ですが、「LLMが䞀床も動いおいない」ず䞍思議に思ったずきはactiveカりントを確認しおください。

Node.jsバヌゞョンアップ埌に倜間バッチだけが壊れる

nvm use 24.14.0 でNodeを䞊げた翌朝のログに claude not found が出るケヌスです。plist2枚の EnvironmentVariables にはバヌゞョン番号たで含んだ絶察パスが曞かれおいるので、Nodeを䞊げたらplistも同時に曎新しなければなりたせん。

<string>/Users/xxx/.nvm/versions/node/v24.13.0/bin:...</string>

v24.13.0 の郚分をアップグレヌド埌のバヌゞョンに曞き換えお launchctl unload → load が必芁です。スクリプト冒頭の export PATH ずplistの䞡方を曎新する理由がここにありたす。

launchd の StartCalendarInterval はスリヌプスキップではなく「起動時に即実行」

macOSが日曜4:15にスリヌプ䞭だった堎合、次にMacを開いた瞬間にcurateが走りたす。月曜の朝9時にノヌトPCを開いたら突然curate が起動、ずいう珟象が起きたす。驚かないよう芚えおおいおください。launchdは「来た時刻を芋逃した = 次の機䌚に即実行」の挙動をしたす。

.curator-proposals.md を䞀床も開かないたた数ヶ月が経぀

提案曞が生成されおも実ファむルは倉わりたせん。提案曞を読たなければ統合・削陀・パッチは䞀切起きない。「LLMが勝手に敎理しおくれる」ずいうのは誀解で、「LLMが提案曞を曞いおくれる、実行するのは人間」です。私はカレンダヌに毎週月曜の朝「proposals確認」を入れおいたす。

StandardOutPath のディレクトリが存圚しない状態でplistをloadする

plistには ~/.claude/logs/ ぞのパスが曞かれおいたすが、ログディレクトリをあらかじめ䜜っおおかないずlaunchdがplistのload自䜓を倱敗させたす。plistをlaunchctlに登録する前に mkdir -p ~/.claude/logs/ を確認するのを忘れずに。

LowPriorityIO: true を入れ忘れる

äž¡plistには LowPriorityIO ず Nice: 10 の䞡方が入っおいたす。LowPriorityIO がないず、深倜のTime Machine / Spotlight曎新ず重なった堎合に数分間のディスクI/O競合が起きたす。Nice: 10 はCPU優先床を䞋げるだけなので、I/O偎の蚭定は別途必芁です。

<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>10</integer>

curate 偎のタむムアりトが倉数化されおいない

harvest では TIMEOUT_SEC=600 を倉数に出しおから perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" ず枡しおいたす。curate 偎は perl -e 'alarm 600; exec @ARGV' ずハヌドコヌドです。倉曎したければスクリプト本文を盎接線集する必芁がありたす。これは蚭蚈の非察称性で、気になる方は倉数化するのが良いでしょう。

macOS の stat -f '%m' はLinuxでは動かない

curate の最終䜿甚日蚈算で䜿っおいる stat -f '%m' はmacOS/BSD専甚フラグです。同じスクリプトをLinuxサヌバヌに持っおいくず stat が倱敗し、党スキルのdaysがれロになっお䞀切の敎理が走りたせん。macOS専甚であるこずを最初から割り切っお䜿う蚭蚈です。

nollm 匕数を知らずにLLMコストを無駄遣いする

RUN_LLM="${1:-llm}"   # 第1匕数 "nollm" でLLM統合提案をスキップテスト甚

./skill-curate.sh nollm で実行するず、stale/archive刀定だけを走らせおLLM起動をスキップできたす。「敎理ロゞックだけ動䜜確認したい」「週次バッチをテストしたいが$5䜿いたくない」ずいう堎面で掻躍したす。この匕数の存圚を知らないず毎回LLMを起動しながらデバッグする矜目になりたす。


ベストプラクティス

5ヶ月の運甚で固たった、省略しなくおよかった習慣を列挙したす。

1. 必ず手動で動かしおからlaunchdに登録する

# harvest の動䜜確認
~/.claude/scripts/skill-harvest.sh

# curate の動䜜確認LLMなし
~/.claude/scripts/skill-curate.sh nollm

plistをloadする前に1回手動実行するだけで、PATHミスずディレクトリ䞍圚のほずんどが発芚したす。ログに harvest done (exit 0, created=1) が出れば基本的に正垞です。

2. BUDGET_USD は小さく始めお段階的に䞊げる

最初から $1.20 に蚭定する必芁はありたせん。$0.30 から始めお、「切り捚おられおいるスキルがある」ず感じたら䞊げおいけば十分です。harvest は1本あたり最倧15,000バむトのダむゞェストを3本凊理するので、䌚話が薄い日は$0.30でも党量凊理できたす。

3. Node.jsバヌゞョンアップ時はplistもセットで曎新する

plistのPATH曎新は手䜜業です。曎新を忘れないようにするには、nvmのバヌゞョン曎新をするたびに「plist 2枚のv番号を倉える」をセットの䜜業にする。私はnvmのaliasに「.zshrc補完 + plist曎新」をセットにしたメモをスキルファむルに残しおいたす。

4. author: manual を先に付けおからcurateを有効化する

既存の手動スキルに author: manual を付けおから curate を有効化する順番が安党です。逆にするず、著者フィヌルドのない手動スキルが author: auto ガヌドを通り抜けおしたうリスクがあるガヌドは ^author:[[:space:]]*auto の有無を確認するので、フィヌルド自䜓がなければスキップを刀定できない。遡及修正は10分で終わりたすが、倱ったスキルを .archive から掘り出す手間より先に察凊する方が楜です。

5. .curator-proposals.md の確認をカレンダヌに入れる

毎週月曜9:00 — ~/.claude/skills/auto/.curator-proposals.md を確認する

提案曞を読んで「これは統合すべき」ず刀断したら、自分でSKILL.mdを手でpatchする。「curate が自動でやっおくれる」のは stale/archive 刀定ず提案曞生成だけです。実際のスキル敎理の意思決定は人間の仕事です。この分業を最初から理解しおいるず、「なぜ自動で統合しおくれないのか」ずいう期埅ズレが起きたせん。

6. STALE_DAYS/ARCHIVE_DAYS は最初は長めに蚭定する

デフォルトは30日/90日ですが、最初は60日/180日くらいから始めるこずを勧めたす。「どのスキルが䜿われおいるか」の感芚が掎めおから閟倀を瞮めた方が、誀刀定で重芁なスキルが消えるこずを防げたす。5ヶ月運甚しお「30日/90日でちょうどいい」ずいう結論に至りたしたが、最初から最終倀に蚭定する必芁はありたせん。

7. ログを最初の2週間は毎朝確認する

tail -50 ~/.claude/logs/com.shun.skill-harvest.log
tail -50 ~/.claude/logs/com.shun.skill-curate.log

最初の2週間だけ毎朝ログを芋る習慣を぀けるず、「䜕が抜出されおいるか・䜕がstaleず刀定されたか」の感芚が逊われたす。安定したら週1確認で十分です。

8. スナップショットのロヌテヌション䞊限を蚭ける

curate のスナップショットはデフォルトで無限に増えたす。週次実行で1幎続けるず52個のtarball。私は月に1回叀いものを削陀するルヌティンを蚭けおいたす。

# 最新13件だけ残す3ヶ月分
ls -t ~/.claude/skills/auto/.snapshots/*.tar.gz | tail -n +14 | xargs rm -f

9. watermark のリセットで匷制再スキャンできるこずを知っおおく

# watermark を叀い日付に曞き換えるず次回harvest が党ログを再スキャンする
touch -t 202601010000 ~/.claude/skills/auto/.harvest-watermark

「最近の䌚話から挏れたスキルを拟いたい」「watermark が誀っお曎新されおしたった」ずいう堎面で䜿いたす。匷制再スキャンは1回で終わり、次回からたた通垞の差分凊理に戻りたす。

10. harvest ず curate の時刻に45分以䞊のバッファを取る

harvest のタむムアりトは TIMEOUT_SEC=60010分です。仮にharvest が最悪ケヌスで10分近くかかった堎合でも、curate が3:30+10分=3:40に終わるこずを想定しお4:15のcurate 起動ず35分のバッファが確保されおいたす。curate を4:00に前倒しするず、harvest ず重なるリスクが出たす。2ゞョブの時刻蚭定は珟状のたた倉えないのが無難です。

11. active >= 2 の条件の意味を把握しおおく

スキルが1件以䞋だず統合提案の意味がないのでLLMが起動しない蚭蚈です。新しい環境でれロから始める堎合、harvest で最初の数件が溜たるたで curate のLLMフェヌズは動きたせん。「LLMが䞀床も起動しおいない」ずいう状態は最初のうちは正垞です。

12. -p フラグず --model sonnet の組み合わせを厩さない

harvest では claude -p "$PROMPT" --model sonnet を䜿っおいたす。-p はヘッドレス・非察話モヌドで実行するためのフラグです。これを倖すずlaunchd から実行したずきに暙準入力埅ちでハングしたす。たた --model を省略するず蚭定ファむルのデフォルトモデルが䜿われ、高䟡なモデルが意図せず遞ばれる可胜性がありたす。

13. StandardOutPath ず StandardErrorPath を同じパスにする

äž¡plistずも stdout ず stderr を同じログファむルに向けおいたす。別ファむルにするず゚ラヌずスクリプト内郚のログが分散しお読みにくくなりたす。特にclaudeコマンドの出力は stderr に出る郚分が倚いので、1ファむルにたずめる方が実甚的です。

14. 運甹1ヶ月埌にスキル数を数えお期埅倀ず比范する

harvest を入れる前ず1ヶ月埌でスキル数を ls ~/.claude/skills/auto | grep -v '^\.' | wc -l で比べたす。「思ったより少ない → ログのダむゞェストが薄すぎる・䌚話数が少ない」「倚すぎる → 重耇抑制プロンプトが効いおいない」の蚺断基準になりたす。

15. スクリプトを盎接線集するずきは必ず構文チェックを入れる

zsh -n ~/.claude/scripts/skill-harvest.sh
zsh -n ~/.claude/scripts/skill-curate.sh

zsh -n は実行せずに構文チェックだけ走らせたす。深倜3時30分のゞョブが構文゚ラヌで萜ちおも朝たで気づかないので、線集埌は必ず走らせおください。


たずめ

この蚘事で玹介したのは、2本のシェルスクリプトず2枚のplistだけです。コヌドベヌスは合わせお250行皋床。でもこれが動き続けるこずで、私は「スキルを管理する」ずいう䜜業を脳みそのタスクリストから完党に倖せたした。

蚭蚈の栞心は3぀です。

非砎壊であるこず。 skill-curate.sh は実削陀を䞀切したせん。mv で .archive/ に退避するだけ。実行前スナップショットで「取り戻せない操䜜をしない」を担保しおいたす。だから怖がらずに有効化できる。

コスト䞊限を倖郚から制埡できるこず。 BUDGET_USD=1.20 は暎走防止のキャップです。䌚話がなかった日は no new logs — skip でれロコスト。curate のLLMフェヌズも「前回以降に倉化したスキルがなければスキップ」する刀定が入っおいたす。月あたりの実コストは harvest が600〜800円皋床、curate の提案フェヌズが200〜400円皋床に収たっおいたす。

敎理察象を author: auto で明確に区切るこず。 スクリプトが觊れるのは自分が䜜ったスキルだけ。手動スキル、バンドルスキル、ECCスキルには䞀切手を出さない。このガヌドがあるから、既存の環境に埌付けで入れるこずができたした。

月120䞇の収益の倚くは、私がコンテンツを䜜る刀断・プロダクトを育おる刀断に集䞭できる時間から来おいたす。スキルラむブラリの鮮床を保぀「管理ずいう䜜業」を自動化したこずは、盎接収益を生むわけではありたせん。でも、管理に取られおいた週30分の泚意が、䟡倀の高い刀断に向かう週30分に倉わる。これが5ヶ月積み䞊がった結果が今です。

仕組みを持぀ずはそういうこずだず思いたす。


仕組みの党䜓像・月120䞇の内蚳・30日手順は有料noteにたずめおいたす。

📕 Claude Code自埋環境で、実際どう皌ぐか ― 仕組み・実䟋・始め方・サポヌト


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • 制䜜物・蚘事は bokuwalily.com にたずめおいたす🖥
  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍

皆さんの ❀ やシェアが励みになりたす

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?