æ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 ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ