äŒè©±ãã°ãå€äžã«èªåã¹ãã«åãã â Claude ãèªåã®èšæ¶ããåŠã¶ä»çµã¿
ååã®èšäº ã§ã¯èªåçæãããã¹ãã«ã®ã©ã€ããµã€ã¯ã«ç®¡çïŒstale â archive ã® 2 段éé¿ïŒãæžããŸãããä»åã¯ãã®æå ââ äŒè©±ãã°ãæ¯æ© 3:30 ã«èªãã§ãåå©çšã§ããæé ã ããæœåºã SKILL.md ãšããŠæžãåºã harvest ãããã®å éšæ§é ãå šéšããããŸãã
ã㟠~/.claude/skills/auto/ ã«ã¯ 104 åã®ã¹ãã«ãç©ã¿äžãã£ãŠããŸãããã®ã»ãŒå
šéšã skill-harvest.sh ãç¡äººã§çæãããã®ã§ãã
å°ãããšïŒ3349 æ¬ã®ãã°ãæ¯æ©å šéšèªãŸãããæ ãæ¶ãé£ã¶
~/Documents/my-knowledge-base/raw/conversations/ ã«ã¯ä»æ¥æç¹ã§ 3349 æ¬ã®äŒè©±ãã°ãèç©ãããŠããŸããæ¯æ©ãããå
šéš LLM ã«æž¡ãã°ã確ãã«ã¹ãã«åè£ã¯æŸããŸãããã ãã³ã¹ãã¯ïŒ
3349 æ¬ Ã 1 äžããŒã¯ã³/æ¬ïŒå¹³åèŠç©ãïŒ= 3300 äžããŒã¯ã³ãMax æ ãæ¯æ©ããã§é£ãã€ã¶ãã°ãä»ã®ãžã§ããå šæ» ããŸãã
ããã 2 ã€ã®ä»çµã¿ã§æœ°ããŠããŸãã
- ãŠã©ãŒã¿ãŒããŒã¯æ¹åŒïŒåååŠçæžã¿ã®ãã¡ã€ã«ã¯äºåºŠãšèªãŸãªã
- ããžã§ãããã£ããïŒ1 åãããã® LLM æ¶è²»ã
--max-budget-usd 1.20ã§äžéåºå®
2 ã€ãçµã¿åãããããšã§ãæ¯æ©ã® harvest ããå·®å 3 æ¬ã»45KB åºå®ãã«åããŠããŸãã
å šäœãã€ãã©ã€ã³ïŒ5 ãã§ãŒãº
~/.claude/scripts/skill-harvest.sh ã¯æ¬¡ã®æµãã§åããŸãã
1. ãŠã©ãŒã¿ãŒããŒã¯èªã¿èŸŒã¿ â å·®åãã°ã 3 æ¬ã ãååŸ
2. system-reminder ãã€ãºãé€å» â ãã€ãäžéã§ãã€ãžã§ã¹ãçæ
3. claude -p ãããã¬ã¹ â ã¹ããŒãžã³ã°ã« SKILL.md ãæžããã
4. author:auto ãä¿èšŒ â AUTO ãã£ã¬ã¯ããªãžã·ã§ã«ãã³ããŒ
5. ãŠã©ãŒã¿ãŒããŒã¯æŽæ° â ãã°è¿œèšããŠçµäº
ãã©ã¡ãŒã¿ã¯ 4 ã€ã ãã§ãïŒskill-harvest.sh åé ããïŒã
MAX_LOGS=3 # 1åã§æ±ããã°æ¬æ°
PER_LOG_BYTES=15000 # ãã°1æ¬ãããã®åã蟌ã¿äžéãã€ã
BUDGET_USD=1.20 # æŽèµ°é²æ¢ã³ã¹ããã£ãã
TIMEOUT_SEC=600 # 壿èšã¿ã€ã ã¢ãŠã
ãŠã©ãŒã¿ãŒããŒã¯æ¹åŒã§éè€åŠçãé²ã
~/.claude/skills/auto/.harvest-watermark ãåå harvest å®äºæã®ã¿ã€ã ã¹ã¿ã³ããèšé²ããŠããŸãã
# åå以éã«æŽæ°ããããã°ãåéïŒååã¯ææ° 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
# mtime éé ã§äžäœ MAX_LOGS ä»¶ã«çµã
newlogs=("${(@f)$(ls -t "${newlogs[@]}" 2>/dev/null | head -$MAX_LOGS)}")
find -newer "$WM" ã§ããŠã©ãŒã¿ãŒããŒã¯ããæ°ããããã¡ã€ã«ã ããæœåºããŸãã3349 æ¬ã®ãã¡æšæ©ããä»æã«æŽæ°ãããã®ã¯éåžž 3ã5 æ¬ ââ åŠçå¯Ÿè±¡ã¯æ¡éãã«å°ãªããªããŸãã
çµäºçŽåã§å¿ ã watermark ãæŽæ°ããŸãã
touch "$WM"
exit 0
å®éã®ãã°ã§ç¢ºèªã§ããŸãã
[2026-07-05 03:30:05] harvest start: 3 log(s), digest= 18255B
[2026-07-05 03:35:54] harvest done (exit 0, created=0)
æ¯æ© 3 æ¬ã»18KB ã»ã©ãåŠçããŠããŸãã
$1.20 ããžã§ãããã£ããã§æŽèµ°ã³ã¹ããå¶åŸ¡ãã
claude -p ã® --max-budget-usd ãã©ã°ã«äžéãæž¡ããŸãã
"$CLAUDE" -p "$PROMPT" \
--model sonnet \
--permission-mode acceptEdits \
--allowedTools "Write Edit Read" \
--max-budget-usd "$BUDGET_USD" >> "$LOG" 2>&1 < /dev/null
$BUDGET_USD=1.20 ãè¶
ããæç¹ã§ claude ãèªå abort ããŸããä»å㯠Claude Max å®é¡æ ã§åããã $1.20 ãå®è²»ã«çŽçµããããã§ã¯ãããŸããããæ ã®æ¶è²»éãåºå®ã㊠autopilot çã®ä»ãžã§ããžã®åœ±é¿ãéå®ããæå³ããããŸãã
ããžã§ãããã£ããã ãã§ã¯å£æèšæéãçžããŸãããTIMEOUT_SEC=600 ã®å£æèšã¿ã€ã ã¢ãŠã㯠perl -e 'alarm N; exec @ARGV' ã§å®è£
ããŠããŸãã
( cd "$STAGING" && perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" \
"$CLAUDE" -p "$PROMPT" ... )
ã¿ã€ã ã¢ãŠãæã¯ exit 142ïŒSIGALRM = 128+14ïŒã§èœã¡ãŸããå®éã®ãã°ã«æ®ã£ãŠããŸãã
[2026-07-08 03:30:05] harvest start: 3 log(s), digest= 35159B
[2026-07-08 03:40:05] harvest done (exit 142, created=0)
[2026-07-09 03:30:06] harvest start: 3 log(s), digest= 35159B
[2026-07-09 03:40:15] harvest done (exit 142, created=0)
10 åã§åŒ·å¶çµäºããŠããŸããã¿ã€ã ã¢ãŠãæã created=0 ã§èšé²ãããããç¿æ¥ã® harvest ã¯ç¶ç¶ããŠåããŸãã
macOS æšæºã®
coreutilsã«ã¯ GNU ã®timeoutã³ãã³ãããããŸãããperl -e 'alarm N; exec @ARGV'ã macOS ã§ããŒã¿ãã«ã«äœ¿ããä»£æ¿ææ®µã§ããgtimeoutïŒHomebrew coreutilsïŒã§ãåããŸãããplist ã® PATH ã«äŸåããããããèãã
system-reminder ãã€ãºãäºåãã£ã«ã¿ããŠããã³ããã軜éåãã
äŒè©±ãã°ã«ã¯ Claude Code ã® <system-reminder> ã¿ã°ãã¹ãã«ã»ããŒã«äžèЧè¡ããã®ãŸãŸæžã蟌ãŸããŠããŸãããããããã³ããã«çªã£èŸŒããšãæé çç¥èãšç¡é¢ä¿ãªãã€ãºãããŒã¯ã³ã®å€§åãå ããŸãã
grep -v -e 'system-reminder' -e '^- [a-z0-9].*:' "$f" 2>/dev/null | head -c $PER_LOG_BYTES
é€å€ããŠããã®ã¯ 2 çš®é¡ã§ãã
system-reminderïŒ<system-reminder>ãå«ãè¡ãäžžããšé€å»'^- [a-z0-9].*:'ïŒã¹ãã«ã»ããŒã«äžèЧã®- skill-name: description圢åŒã®è¡ãé€å»
ããã§ 1 æ¬ã®ãã°ããæå€§ $PER_LOG_BYTES=15000 ãã€ãã ããåã蟌ã¿ãŸããMAX_LOGS=3 ãšçµã¿åããããšã1 åã® harvest ã§ LLM ã«æž¡ãã®ã¯æå€§ **45,000 ãã€ãïŒçŽ 45KBïŒ**ã«åºå®ãããŸãããã°ãäœæ¬ã«å¢ããŠãããã³ãããµã€ãºã¯å€ãããŸããã
ã¹ããŒãžã³ã°çµç±ã§ã»ãã¥ã¢ã«ãã¡ã€ã«ãæžã蟌ã
~/.claude/ é
äžã¯ Claude Code èµ·åäžã«æžã蟌ã¿ä¿è·ãããããšããããŸããclaude -p ã«çŽæ¥ ~/.claude/skills/auto/ ãžã®æžã蟌ã¿ãããããš permission denied ã§èœã¡ãŸãã
STAGING=$(mktemp -d -t skill-harvest-stg)
( cd "$STAGING" && perl -e 'alarm shift @ARGV; exec @ARGV' "$TIMEOUT_SEC" \
"$CLAUDE" -p "$PROMPT" \
--permission-mode acceptEdits \
--allowedTools "Write Edit Read" \
--max-budget-usd "$BUDGET_USD" >> "$LOG" 2>&1 < /dev/null )
mktemp -d ã§ /tmp ã«äžæãã£ã¬ã¯ããªãäœããcd "$STAGING" ããç¶æ
ã§ claude -p ãèµ°ãããŸããããã³ããã«ã¯ãã«ã¬ã³ããã£ã¬ã¯ããªçŽäžã« ./kebab-name/SKILL.md ãäœãïŒçµ¶å¯Ÿãã¹çŠæ¢ïŒããšæç€ºããŠããŸãã
- ãã¡ã€ã«: ./<kebab-name>/SKILL.md ïŒã«ã¬ã³ããã£ã¬ã¯ããªçŽäžã«äœãã絶察ãã¹çŠæ¢ïŒ
claude ãæžãçµãã£ãããšãã·ã§ã«åŽã $STAGING ãèµ°æ»ã㊠AUTO ãã£ã¬ã¯ããªãžã³ããŒããŸãã
for sd in "$STAGING"/*(/N); do
[[ -f "$sd/SKILL.md" ]] || continue
name="${sd:t}"
[[ "$name" == .* ]] && continue
# author: auto ãä¿èšŒïŒç¡ããã° frontmatter çŽåŸã«æ¿å
¥ïŒ
grep -q '^author:[[:space:]]*auto' "$sd/SKILL.md" || python3 - "$sd/SKILL.md" <<'PY'
import sys,re
p=sys.argv[1]; s=open(p).read()
if s.startswith('---'):
s=re.sub(r'^---\n', '---\nauthor: auto\n', s, count=1)
else:
s='---\nname: %s\nauthor: auto\nversion: 1.0.0\n---\n'%__import__("os").path.basename(__import__("os").path.dirname(p))+s
open(p,'w').write(s)
PY
[[ -e "$AUTO/$name" ]] || cp -R "$sd" "$AUTO/$name"
done
rm -rf "$STAGING"
author: auto ã frontmatter ã«ãªãå Žå㯠python3 ã¯ã³ã©ã€ããŒã§æ¿å
¥ããŠããç§»éããŸãããã® author: auto ã curate ã®å¯Ÿè±¡å€å®ããŒã«ãªãããå¿
é ã§ãã
launchd ç»é²
plist ã®ã¹ã±ãžã¥ãŒã«éšåã§ãïŒ~/Library/LaunchAgents/com.lily.skill-harvest.plistïŒã
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>3</integer>
<key>Minute</key><integer>30</integer>
</dict>
æ¯æ¥ 3:30 ã«èµ·åããŸããProcessType: Background ã§åãããã°ã¯ ~/.claude/logs/com.lily.skill-harvest.log ã«åãããŸãã
ç»é²ãšå³æãã¹ãïŒ
launchctl load ~/Library/LaunchAgents/com.lily.skill-harvest.plist
launchctl start com.lily.skill-harvest
èžãã èœãšã穎
- launchd ã® PATH ãæ¥µå°ïŒçŽ ã® launchd ç°å¢ã§ã¯
claudeãèŠã€ãããªããplist ã®EnvironmentVariables/PATHã« nvm ã® bin ãš~/.local/binãæç€ºçã«è¿œå ããªããšå³ exit ãã ~/.claudeãžã®çŽæžãã permission deniedïŒClaude Code èµ·åäžã¯ä¿è·ããããstaging + ã·ã§ã«ã³ããŒã§åé¿timeoutã³ãã³ãã macOS æšæºã«ãªãïŒperl -e 'alarm N; exec @ARGV'ã§ä»£æ¿- watermark ã
touchãå¿ãããšå šãã°ãæ¯ååã¹ãã£ã³ïŒçµäºçŽåã®touch "$WM"ã¯å¿ ãexit 0ã®çŽåã«çœ®ã exit 142ãcreated=0ãšåãèŠãç®ã§èšé²ãããïŒã¿ã€ã ã¢ãŠããç°åžžçµäºãšåºå¥ã§ããªãããããã°ã® start-done ã®æå»å·®ïŒæ£åžž: æ°åãã¿ã€ã ã¢ãŠã: 10 åã¡ããã©ïŒã§å€å¥ããçãã€ãã- ååã¹ãã«ãæ¢ã«ãããšäžæžãã§ããªãïŒ
[[ -e "$AUTO/$name" ]]ã§ã³ããŒãã¹ãããããŠãããããæ¢åã¹ãã«ã®æŽæ°ïŒpatchïŒã¯ããã³ããåŽã§ãéè€ãªãæ¢åã Read ã㊠patch ããããšæç€ºããŠå¯Ÿå¿
å®ãã°ã§èŠãã空æ¯ããæ£åžžã
ä»é±ã® harvest ãã°ã§ãã
[2026-07-05 03:30:05] harvest start: 3 log(s), digest= 18255B
ãã®äŒè©±ãã°æç²ã確èªããŸãããINDEX.md ã¯ãã¡ã€ã«äžèЧã®ã¿ã§
æé çç¥èãªããtsuzuke-ios ã® 2 ä»¶ã¯æ¢åã®
xcodegen-project-yml-security-review ã¹ãã«ã§ã«ããŒæžã¿ã
該åœãªã
[2026-07-05 03:35:54] harvest done (exit 0, created=0)
[2026-07-06 03:30:05] harvest start: 3 log(s), digest= 18255B
äžåæ§ã¬ãã¥ãŒïŒæœåºåºæºã«é該åœããã£ãŠãã¡ã€ã«ã¯äœæããŸããã§ããã
[2026-07-06 03:30:45] harvest done (exit 0, created=0)
[2026-07-07 03:30:05] harvest start: 3 log(s), digest= 35008B
[2026-07-07 03:32:28] CREATED: note-bokumolily-factual-review
[2026-07-07 03:32:28] harvest done (exit 0, created=1)
5 æ¥äž 4 æ¥ã created=0 ã§ãã空æ¯ãã¯ç°åžžã§ã¯ãªããæœåºåºæºãæ£ããæ©èœããŠãã蚌æ ã§ããæ¢åã¹ãã«ãšã®éè€ã»äžåºŠããã®åäººäºæ
ã»éè«ã¯ãã¹ãŠåŒŸãããŸãã匟ã倿ã LLM ãèªåŸçã«è¡ã£ãŠãããããä¹±é ã«ãªããŸããã
created=0ã® harvest ã¯ã³ã¹ãïŒMax æ ïŒãã»ãŒæ¶è²»ããŸãããclaude -p ãèµ·åããŠããã³ãããèªãã§ã該åœãªãããè¿ãåã ãã§ããã空æ¯ããå®ããããšãå€éããããæ¯æ©åããçç±ã§ããããŸãã
ãŸãšã
- ãŠã©ãŒã¿ãŒããŒã¯æ¹åŒïŒ
.harvest-watermarkã® mtime ãåºæºã«find -newerã§å·®åãã°ã ããæœåºã3349 æ¬ãã£ãŠãæ¯æ© 3 æ¬ã ãåŠç - ããžã§ãããã£ããäºéïŒ
--max-budget-usd 1.20+perl alarm 600ã§ LLM ã®æ¶è²»éãšå®è¡æéãäž¡æ¹ã«äžéåºå® - ãã€ãºãã£ã«ã¿å
åºãïŒ
grep -v 'system-reminder'ãååŠçã«å ¥ããããšã§ããã³ããã 45KB åºå®ã«å§çž® - ã¹ããŒãžã³ã°çµç±æžã蟌ã¿ïŒ
mktemp -dã§ã·ã§ã«ã仲ä»ãã~/.claudeãžã®çŽæžãç«¶åãåé¿ - 空æ¯ããæ£åžžïŒæœåºåºæºãçµãããšã§
created=0ã®æ¥ãç¶ãã®ãå¥å šãªåäœ
ã¹ãã«ã 100 åãè¶ ã㊠curate åŽã®éèŠæ§ãå¢ããŠãã話㯠åäœ ã«æžããŠããŸããæ¬¡åã¯ããã® 2 ã€ã®ããããç©ã¿äžããã¹ãã«ã»ã¡ã¢ãªã Claude Code ã®èµ·åãéããå§ãã話 ââ ã³ã³ããã¹ãæ³šå ¥éã®ç£æ»ãšåæžãæžãäºå®ã§ãã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ