ð¢ --incremental ã§3åé ããªã£ã TypeScript ããã¯ã200KBéŸå€ã§çŽãã話
倧åŠåšåŠäžã«æ10äžããå§ããŠãæãæã¡ã§æ60äžãŸã§ç©ã¿äžããäŒç€Ÿéœåã®è§£éã§äžåºŠãŒãã«ãªã£ããããããå幎ãã㊠Claude Code ã®èªåŸç°å¢ãèªåã§çµã¿äžããä»ã¯æå120äžã§åããŠããŸãããã®éçšã§ãã¡ã°ãå°å³ã«æéãåžãåã£ãã®ãããéãããããšããŠéã«é ããªã£ãããã°ã®ä¿®æ£ã§ããã
ãªããã®ä»çµã¿ãå¹ãã®ã
ãäœæ¥ããŠããããšãç°å¢ãåããŠãããã¯å¥ç©
å人éçºã§æåã䌞ã°ãããã§æåã®å£ã«ãªãã®ããã³ãŒããæžãé床ã§ã¯ãªãæ€èšŒã®ã©ã°ã§ããåãšã©ãŒã¯æžããç¬éã«æ°ã¥ãã°çŽãæéã¯1åã§ããã30ç§åŸã«æ°ã¥ãã°ååŸã®æèãé ããåŒãåºãçŽãå¿ èŠãããã60ç§åŸãªãå¥ã®äœæ¥ã«ç§»è¡ããããŠããã®ã§ãåãæ¿ãã³ã¹ããããã«ä¹ããŸãã
Claude Code ã¯ããŒã«å®è¡åŸã« PostToolUse ããã¯ãåŒã³åºãä»çµã¿ãæã£ãŠããŸããããã« tsc --noEmit ã眮ãã°ããšãŒãžã§ã³ãããã¡ã€ã«ãç·šéãããã³ã«åãã§ãã¯ãèµ°ãããšã©ãŒãããã°å³åº§ã«æ¬¡ã®æç€ºãžãã£ãŒãããã¯ãæ»ããŸããããã¡ã€ã«ãæžãããèªåã§ç¢ºèªããããšããåç·ã人éãä»åšããã«å®çµãããæ§é ã§ãã
åé¡ã¯ããããžã§ã¯ããè²ã€ã«ã€ããŠãã®ãå³åº§ã«ãã厩å£ããŠããããšã§ãã
tsc ã®ã³ãŒã«ãã¹ã¿ãŒãããªãéãã®ã
TypeScript ã®ã³ã³ãã€ã©ã¯èµ·åæã«äŸåã°ã©ãå
šäœãèªã¿èŸŒã¿ãŸãããã¡ã€ã«ã100åãªã軜快ã§ããã€ã³ããŒããé£éããŠå®è³ªçã«åç
§ããã¢ãžã¥ãŒã«ãæ°çŸã«èšããã°ãæ¯åãŒãããè§£æãèµ°ãããã³ã¹ãã¯éŠ¬é¹¿ã«ãªããŸãããcloset-os ãšãããããžã§ã¯ãã§å®æž¬ãããšããã³ãŒã«ãã® tsc --noEmit ã¯30ã60ç§ããã£ãŠããŸãããããã¯ãæ¯ããŒã«åŒã³åºãããšã«60ç§ãããã¯ããç°å¢ã¯ãèªåŸç°å¢ã©ãããäœæ¥ãæ¢ããé害ç©ã§ãã
--incremental ãªãã·ã§ã³ã¯ããã解決ããããã«ååšããŸããååã ãå
šè§£æãè¡ããçµæã .tsbuildinfo ãã¡ã€ã«ãžãã£ãã·ã¥ããã2åç®ä»¥éã¯å·®åã ããåè§£æããããã倿Žãå°ãããã° 1ã3ç§ã§çµãããŸããããã¯åãã«ã¯çæ³çãªéžæè¢ã«èŠããŸããã
é广ã«ãªãã±ãŒã¹
ãšããã closet-os ã®ããã¯ã« --incremental ãå
¥ãããšãããã³ãŒã«ãå®è¡ã 3.6åé
ããªããŸããã
åå 㯠.tsbuildinfo ãã¡ã€ã«ã®è¥å€§åã§ããã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ãã®å·®åæ
å ±ã¯ããããžã§ã¯ãã倧ããã»ã©ååãã£ãã·ã¥çæã«æéãããããŸããããã«ããã£ãã·ã¥ãèç©ãããŠãã¡ã€ã«ãµã€ãºãèšãããšãæ¯åãã®å·šå€§ãªJSONãèªã¿èŸŒããªãŒããŒããããç¡èŠã§ããªããªããŸãããå·®åã ãåŠçããæ©æµãããéããã£ãã·ã¥ãæ¯åããŒãããã³ã¹ãããäžåã£ãç¶æ
ã§ãã
å°ãäžèŠæš¡ãããžã§ã¯ãã§ã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ãå§åçã«æå©ããããå€§èŠæš¡ãããžã§ã¯ãã§ã¯éåžžã® --noEmit ã®æ¹ãéãããšããé転ãèµ·ããŸãããããŠããã¯ã¯ãããããããžã§ã¯ãã§åãã¹ã¯ãªããã䜿ãåããããããããžã§ã¯ãèŠæš¡ã«å¿ããŠèªåã§åãæ¿ããä»çµã¿ããå¿
èŠã«ãªããŸãã
éŸå€ã¬ãŒããšããçºæ³
ãã£ãã·ã¥ãã¡ã€ã«ã®ãµã€ãºã¯ããããžã§ã¯ãèŠæš¡ãšåŒ·ãçžé¢ããŸãã.tsbuildinfo ãå°ãããã°ã€ã³ã¯ãªã¡ã³ã¿ã«ãå¹ãã倧ãããã°éåžžã¢ãŒãã®æ¹ãéãããã®èгå¯ãããããã£ãã·ã¥ãã¡ã€ã«ã200KBãè¶
ãããéåžžã¢ãŒãã«ãã©ãŒã«ããã¯ããããšãã1è¡ã¬ãŒãã«è¡ãçããŸããã
éŸå€ã¯å®æž¬ã§æ±ºããŠããŸããcloset-os ã®ãã£ãã·ã¥ãé
ããªãå§ããæç¹ã§ã®ãµã€ãºã200KBä»è¿ã ã£ãããšãããããå°ãããããžã§ã¯ãã§ã¯äžè²«ããŠã€ã³ã¯ãªã¡ã³ã¿ã«ãæå©ã ã£ãããšã®äž¡æ¹ã確èªããäžã§ã®å€ã§ããããžãã¯ãã³ããŒã§ã¯ãªãã宿ž¬ã«åºã¥ããå¢çç·ã§ãã
å šäœã®æµã
ããã¯ãåãå šäœå
Claude Code ããã¡ã€ã«ãç·šé (PostToolUse)
â
âŒ
post_tsc_check.sh èµ·å
â
ââ tsconfig.json ãç¡ã â exit 0ïŒå³çµäºïŒ
â
ââ timeout ã³ãã³ã解決
â ââ gtimeout (GNU coreutils) ãããã°åªå
â ââ ãªããã° timeout / ãã©ãŒã«ããã¯
â
ââ TSBUILDINFO ã®ãµã€ãºç¢ºèª
â ââ ãã¡ã€ã«ç¡ã or â€200KB â --incremental ã¢ãŒã
â ââ >200KB â éåžžã¢ãŒãïŒãã©ãŒã«ããã¯ïŒ
â
ââ tsc å®è¡ïŒtimeout 60sïŒ
â ââ --incremental: --noEmit --pretty false --incremental --tsBuildInfoFile
â ââ éåžž: --noEmit --pretty false
â
ââ rc=124 (timeout) â èŠåã¡ãã»ãŒãžã»exit 0
ââ ãšã©ãŒãã â åãšã©ãŒè¡šç€ºã»exit 0ïŒãšãŒãžã§ã³ãã¯ãã°ãåãåãïŒ
Claude Code ã®ãšãŒãžã§ã³ãã¯ããã¯ã®åºåããã®ãŸãŸæ¬¡ã®æšè«ã«äœ¿ããŸããåãšã©ãŒãããã°ã=== TypeScriptåãšã©ãŒæ€åº ===ããšããæ¥é èŸã€ãã§åºåãããããããšãŒãžã§ã³ããèªåã§ãšã©ãŒãèªã¿åã£ãŠä¿®æ£ã«ãŒãã«å ¥ããŸãã
å®ã³ãŒãïŒãµã€ãºå€å®ããåå²ãŸã§
~/.claude/hooks/post_tsc_check.sh ã®æ žå¿éšåãé çªã«èªã¿ãŸãã
â ãã£ãã·ã¥ãã¹ã®å®çŸ©
CACHE_DIR="node_modules/.cache"
[ -d "node_modules" ] && mkdir -p "$CACHE_DIR" 2>/dev/null
TSBUILDINFO="$CACHE_DIR/tsc-hook.tsbuildinfo"
.tsbuildinfo 㯠node_modules/.cache/tsc-hook.tsbuildinfo ã«åºå®ããŠããŸãããããžã§ã¯ãã«ãŒãã«çœ®ããªãçç±ã¯ã.gitignore ã®ã¹ã³ãŒãã node_modules/ ã§ãŸãšããŠåžåã§ããããã§ãããã¡ã€ã«åã tsc-hook ãšã¢ããªæ¬äœã®ãã«ããã£ãã·ã¥ãšåå空éãåããŠããŸãã
â¡200KBã¬ãŒã
USE_INCREMENTAL=1
if [ -f "$TSBUILDINFO" ]; then
SIZE=$(stat -f %z "$TSBUILDINFO" 2>/dev/null || echo 0)
if [ "${SIZE:-0}" -gt 204800 ]; then
USE_INCREMENTAL=0
fi
fi
stat -f %z 㯠macOS ã® stat ã§ãã€ãæ°ãååŸããæžãæ¹ã§ãïŒLinux ã® stat -c %s ã«çžåœïŒã2>/dev/null || echo 0 ã§ãšã©ãŒæã®ãŒããã©ãŒã«ããã¯ã確ä¿ãããã¡ã€ã«ãååšããªãååã§ãå®å
šã«åããŸãã204800 㯠200 à 1024 ã§200KBããã€ã衚çŸãããã®ã§ãã
â¢åŒæ°ã®çµã¿ç«ãŠãšå®è¡
if [ "$USE_INCREMENTAL" = 1 ]; then
TSC_ARGS="--noEmit --pretty false --incremental --tsBuildInfoFile $TSBUILDINFO"
else
TSC_ARGS="--noEmit --pretty false"
fi
if [ -n "$TIMEOUT_CMD" ]; then
result=$($TIMEOUT_CMD npx tsc $TSC_ARGS 2>&1 | head -30)
rc=$?
else
result=$(npx tsc $TSC_ARGS 2>&1 | head -30)
rc=$?
fi
--pretty false ã¯ã«ã©ãŒã³ãŒãããªãã«ããããã§ããããã¯ã®åºåã¯ã¿ãŒããã«ã§ã¯ãªããšãŒãžã§ã³ãã®ãã°ã«å
¥ããããANSIãšã¹ã±ãŒãã·ãŒã±ã³ã¹ãæ··å
¥ãããšå¯èªæ§ãèœã¡ãŸããhead -30 ã§ãšã©ãŒã倧éã«åºããšãã®åºåççºãé²ãã§ããŸãã
â£timeout ã® macOS 察å¿
TIMEOUT_CMD=""
if command -v gtimeout >/dev/null 2>&1; then
TIMEOUT_CMD="gtimeout 60"
elif command -v timeout >/dev/null 2>&1; then
TIMEOUT_CMD="timeout 60"
fi
macOS ã® /usr/bin/timeout ã¯ååšããŸããïŒBSD ç±æ¥ã® timeout 㯠Homebrew ã® coreutils ã«å
¥ã£ãŠãã gtimeout ã§ãïŒãcommand -v ã§ååšç¢ºèªããŠãã代å
¥ããã©ã¡ãããªããã° TIMEOUT_CMD="" ã®ãŸãŸã«ã㊠timeout ãªãã§åãããŸãããã®é åºã§æžããŠããã° Linuxã»macOSã»CI ç°å¢ãã¹ãŠã§åãã¹ã¯ãªãããåããŸãã
â€timeout å€å®
if [ "$rc" = 124 ]; then
echo "=== TypeScript check timeout (60s exceeded â tsc å€éå®è¡/巚倧äŸå倿Žã®çã) ==="
exit 0
fi
rc=124 㯠timeout / gtimeout ãããã»ã¹ã kill ãããšãã®çµäºã³ãŒãã§ãããšã©ãŒã§ã¯ãªãèŠåãšããŠæ±ããexit 0 ã§è¿ãããšã§ãšãŒãžã§ã³ãã®åŠçãããŒããããã¯ããŸãããã¡ãã»ãŒãžã«ãå€éå®è¡ã®çãããšæžããŠããã®ã¯ãClaude Code ã䞊è¡ããŠããŒã«ãå®è¡ãããšãè€æ°ã® tsc ãåæã«èµ·åããäºãã®ãã£ãã·ã¥ãå£ãåãã±ãŒã¹ãå®éã«çºçããããã§ãã
ãªã exit 0 ã§è¿ãã®ã
åãšã©ãŒããã£ãŠã exit 0 ã§çµãã£ãŠããŸããexit 1 ã«ãããšããã¯ãã倱æãæ±ãã«ãªããClaude Code ã®ããŒã«å®è¡èªäœãäžæããã±ãŒã¹ããããŸããåãšã©ãŒã¯ãšãŒãžã§ã³ããžã®æ
å ±ã§ãã£ãŠããããŒåæ¢ã®æ¡ä»¶ã§ã¯ãããŸããããšã©ãŒå
å®¹ãæšæºåºåã«æžãåºãã°ããšãŒãžã§ã³ãã¯æ¬¡ã®ã¹ãããã§ãåãšã©ãŒãããããçŽãããšããæšè«ãããŸãããšã©ãŒæ€åºãšãããŒå¶åŸ¡ãåé¢ããèšèšã§ãã
å®è£ ã®è©³çްïŒç¶ãïŒ
tsconfig.json ãã§ãã¯ãæåã®1è¡ã§ããçç±
[ -f "tsconfig.json" ] || exit 0
ã¹ã¯ãªããã®åé ã¯ãã®1è¡ããå§ãŸããŸããPostToolUse ããã¯ã¯ãã¹ãŠã®ãããžã§ã¯ãã§åŒã³åºããããããTypeScript ã§ãªããªããžããªã§ãçºç«ããŸããtsconfig.json ã®ååšç¢ºèªãå
é ã«çœ®ãã°ãPython ãããžã§ã¯ãã Bash ã¹ã¯ãªããã ãã®ãã£ã¬ã¯ããªã§ã¯å³åº§ã« exit 0 ã§æããŸãã
ãã€ã³ãã¯ã倱æãããçµäºãã§ã¯ãªããtsconfig.json ããªããªãçµäºããšããæ¹åã®ãã§ãã¯ã§ããããšã§ãã[ -f "tsconfig.json" ] 㯠true ã®ãšã exit 0 ãå®è¡ããªãïŒ|| ã®å³èŸºã¯å·ŠèŸºãåœã®ãšãã ãè©äŸ¡ãããïŒããã®ã¯ã³ã©ã€ããŒã®èªã¿æ¹ã«æ
£ããŠããªããšåŸã§æ··ä¹±ããã®ã§ãæåã«æŽçããŠãã䟡å€ããããŸãã
åºåãããã¯ã®èšèš
if [ -n "$result" ]; then
echo "=== TypeScriptåãšã©ãŒæ€åº ==="
echo "$result"
echo "================================"
fi
exit 0
ããã¯ããäœãåºåããªããã®ã¯ãšã©ãŒããŒãã®ãšããã€ãŸãæ£åžžæã§ããåãå
šéšéãã°æšæºåºåã¯ç©ºã«ãªãããšãŒãžã§ã³ãã®ãã°ã«ããã€ãºãä¹ããŸããããšã©ãŒããããšãã ã === TypeScriptåãšã©ãŒæ€åº === ãšããæ¥é èŸã€ãã§åºåãããããããšãŒãžã§ã³ãã¯åçŽã«ããã®æååãåºåã«å«ãŸããŠããããã ããèŠãã°åãšã©ãŒã®æç¡ã倿ã§ããŸãã
-n "$result" ã¯æååã空ã§ãªãããšã®ãã§ãã¯ã§ããåãšã©ãŒããªããã° tsc ã®åºåã¯ç©ºæååã«ãªãã®ã§ããã®æ¡ä»¶ã¯ãåãšã©ãŒãã = åºåããããšçäŸ¡ã«æ©èœããŸãã
2>&1 | head -30 ã®çµã¿åãã
result=$($TIMEOUT_CMD npx tsc $TSC_ARGS 2>&1 | head -30)
2>&1 㯠tsc ããšã©ãŒãæšæºãšã©ãŒã«åºãã±ãŒã¹ãžã®å¯Ÿå¿ã§ããTypeScript ã®ãšã©ãŒã¯éåžž stderr ã«åºåãããŸããããã stdout ãšåæµãããªããš $result ã«ã¯äœãå
¥ããŸãããhead -30 ã¯ãšã©ãŒãççºçã«å€ããšãïŒåãšã©ãŒãé£éããŠæ°çŸè¡åºãã±ãŒã¹ã¯çãããªãïŒã«ãããã¡ã溢ããªãããäžäœ30è¡ã«çµã圹å²ãæã¡ãŸãã
30ãšããæ°åã«æ ¹æ ã¯ãªãããšèšãã°ãããŸããcloset-os ã®å®éã®ãšã©ãŒãã°ã確èªãããšããããšã©ãŒå
å®¹ã®æ žå¿ïŒãã¡ã€ã«åã»è¡çªå·ã»ã¡ãã»ãŒãžïŒã¯æåã®æ°è¡ã«éäžããŠããŸãããšãŒãžã§ã³ããä¿®æ£å€æãããã®ã«30è¡ã§ååã§ãããå€ããããš1ãšã©ãŒã§æ°çŸããŒã¯ã³ãæ¶è²»ãããããããã¯ã®ã³ã¹ãå¹çãæªåããŸãã
npx tsc ã䜿ãçç±
çŽæ¥ ./node_modules/.bin/tsc ãå©ãã®ã§ã¯ãªã npx tsc ã«ããŠããŸããçç±ã¯ã·ã³ãã«ã§ãnode_modules ãååšããªãç¶æ
ïŒåå npm install åïŒã§ã npx ãã°ããŒãã«ã® tsc ã«ãã©ãŒã«ããã¯ããããã§ããããã¯ã¯ãããžã§ã¯ãã®ã»ããã¢ããç¶æ
ã«é¢ä¿ãªãåãå¿
èŠããããŸãããã ã node_modules ãããå Žå㯠npx ãããŒã«ã«ãåªå
ãããããããŒãžã§ã³å·®ç°ã¯çããŸããã
ã¹ã¯ãªããå šäœã®è¡æ°
å®ãã¡ã€ã«ã¯61è¡ã§ããã³ã¡ã³ãã»ç©ºè¡ãé€ããšå®è³ª40è¡ä»¥äžãã1000è¡ãã100è¡ã®æå¿«ããã¯ããããå Žæã§äœçŸã§ããŸããæ©èœã®æ žå¿ãçããã°çãã»ã©ãåŸã§å¥ãããžã§ã¯ããžç§»æ€ãããšãã®ã³ãããæ¥œã«ãªããŸãã
ç§ãè©°ãŸã£ã話
以äžã¯ãã¹ãŠå®éã«èžãã 倱æã§ããçç¶ã»åå ã»çŽãæ¹ã®é ã§æžããŸãã
â ãã€ããæãã ã rc ãåžžã«0ã«ãªã£ã
çç¶: tsc ãåãšã©ãŒãåºããŠããã®ã«ãããã¯ãããšã©ãŒã¡ãã»ãŒãžãäžåè¿ã£ãŠããªããecho "$result" ããããã°ã§å
¥ãããšåºåã¯æ£ããåããŠããã®ã« rc ã 0 ã®ãŸãŸã
åå : æåã®å®è£ ã§ã¯ä»¥äžã®ããã«æžããŠããŸããã
result=$(npx tsc $TSC_ARGS 2>&1 | head -30)
rc=$?
$? ãåãã®ã¯çŽåã®ã³ãã³ãã®çµäºã³ãŒãã§ãããã€ãã§ç¹ãã å Žåã$? 㯠head ã®çµäºã³ãŒããè¿ããŸããhead -30 ã¯åžžã«æåïŒçµäºã³ãŒã0ïŒãããããtsc ãã©ãã ããšã©ãŒãåºããŠããŠã rc=0 ã«ãªãç¶ããŠããŸããã
çŽãæ¹: ãã€ãã䜿ãããåºåããã£ããå
šéšåããŠãã head ã«éãæ¹æ³ãæ€èšããŸãããã倧éãšã©ãŒæã®ãããã¡åé¡ããããŸããçŸåšã¯å€æ°ãäºæ®µã«ããŠããŸãïŒresult ã« head æžã¿ã®åºåãå
¥ããrc ã¯ãã€ãçŽåŸã§ã¯ãªã timeout ã³ãã³ãã®çµäºã³ãŒããèŠã圢ïŒãå®éã®ã¹ã¯ãªãããèŠããš rc=$? ã | head -30 ã®åŸã§ã¯ãªãã代å
¥åŒå
šäœã®åŸã«ãããŸããã·ã§ã«ã®åäœãšããŠãã³ãã³ã眮æ $(...) ã®çµäºã³ãŒãã¯ãã€ãã®æåŸã®ã³ãã³ãã§ããtimeout / gtimeout ã¯ã¿ã€ã ã¢ãŠãæã«ã®ã¿ 124 ãè¿ãããã以å€ã¯ tsc ã®çµäºã³ãŒãããã®ãŸãŸééããŸããã€ãŸã timeout ãæãããšã§ããã€ãã®äžã«ããã®ã¯ head ã ãã«ãªããtimeout ã tsc ã®ã³ãŒããæã¡åºãæ§é ã«ãªã£ãŠããŸãã
result=$($TIMEOUT_CMD npx tsc $TSC_ARGS 2>&1 | head -30)
rc=$?
# ãã® rc 㯠timeout ã³ãã³ãå
šäœã®çµäºã³ãŒã
# timeout ã tsc ã wrap ããŠããã®ã§ãtsc ã® rc ãééããã
# (ãã ã timeout èªäœã® rc=124 ãã¿ã€ã ã¢ãŠãã瀺ã)
æå㯠timeout ã䜿ã£ãŠããªãã£ãã®ã§ãã®ãã©ããã«ã¯ãŸããŸãããtimeout ã®è¿œå ããã€ãåé¡ã®å¯æ¬¡çãªè§£æ±ºã«ããªã£ãŠããããšã«ãåŸããæ°ã¥ããŸããã
â¡ macOS ã® stat ã§ãµã€ãºååŸã«å€±æãã
çç¶: 200KBã¬ãŒããå®è£
ããããã©ããªç¶æ
ã§ã USE_INCREMENTAL=1 ããå€ãããªããtsbuildinfo ãæããã«æ°MBã«è²ã£ãŠããã®ã«ãã©ãŒã«ããã¯ããªãã
åå : Linux ã®ã³ãã³ããªãã¡ã¬ã³ã¹ãèŠãŠ stat -c %s ãšæžããŠããŸããã
# ééãïŒLinux çšïŒ
SIZE=$(stat -c %s "$TSBUILDINFO" 2>/dev/null || echo 0)
macOS ã® stat 㯠BSD ç³»ã§ããªãã·ã§ã³ãå
šãç°ãªããŸãã-c %s 㯠macOS ã§ã¯ç¡å¹ãªãªãã·ã§ã³ãšããŠæ±ããããšã©ãŒãè¿ããŸãã2>/dev/null ã§ãšã©ãŒãæšãŠãŠãããã echo 0 ãå®è¡ãããåžžã«ãµã€ãº0ãšå€å®ãããŠããŸããã
çŽãæ¹: macOS çšã®æžãæ¹ã¯ -f %z ã§ãã
SIZE=$(stat -f %z "$TSBUILDINFO" 2>/dev/null || echo 0)
-f ã¯ãã©ãŒãããæååãæå®ãããªãã·ã§ã³ã§ã%z ããã¡ã€ã«ãµã€ãºïŒãã€ãïŒãè¿ããŸããLinux ã® -c %s ãšæå³ã¯åãã§ããããã©ã°ãç°ãªããŸãã
ãããçºèŠããã®ã« man stat ãèªãå¿
èŠããã£ãŠã30åæº¶ãããŸãããæåãã wc -c < "$TSBUILDINFO" ã«ããŠããã°ããã£ããšãæããŸãããwc -c ã¯ãã¡ã€ã«ãå
šèªã¿ããã®ã§å€§ããªãã¡ã€ã«ã§ãããã«é
ãããŸããã¡ã€ã«ãååšããªããšãã®ãšã©ãŒãã³ããªã³ã°ã远å ã§èŠããŸããstat ã®æ¹ããã¡ã€ã«ã·ã¹ãã ã®ã¡ã¿ããŒã¿ã ããèªãã®ã§éãã2>/dev/null || echo 0 ã®ãã¿ãŒã³ã§äžåšæã®å®å
šåŠçã1è¡ã§æžããŸãã
⢠exit 1 ã«ããŠããŠãšãŒãžã§ã³ããæ¢ãŸã£ã
çç¶: åãšã©ãŒãæ€åºããããã¯ãèµ°ããã³ã«ãClaude Code ã®ããŒã«å®è¡ã«ãŒããéäžã§äžæããããšã©ãŒãåºãŠããããšã¯ããããããšãŒãžã§ã³ãããä¿®æ£ãããããšæšè«ãå§ããåã«ã«ãŒããçµãã£ãŠããŸãã
åå : æåã®å®è£
ã§ã¯åãšã©ãŒæã« exit 1 ãè¿ããŠããŸãããClaude Code 㯠PostToolUse ããã¯ãéãŒãã®çµäºã³ãŒããè¿ããšããŒã«å®è¡ãã倱æãæ±ãã«ãã以éã®ã¹ããããç¶ããªãã±ãŒã¹ããããŸãã
çŽãæ¹: ããã¯ã®åœ¹å²ãããããŒå¶åŸ¡ãã§ã¯ãªããæ
å ±éç¥ãã«éå®ããèšèšã«åãæ¿ããŸãããåãšã©ãŒã¯ãšãŒãžã§ã³ããžã®å
¥åæ
å ±ã§ãã£ãŠãåŠçãæ¢ããçç±ã§ã¯ãããŸããããšã©ãŒå
容ã stdout ã«æžãåºã㊠exit 0 ã§è¿ãããšã§ããšãŒãžã§ã³ãã¯æ
å ±ãåãåããªããåŠçãç¶ããããã®åãšã©ãŒãçŽãããšããæ¬¡ã®ã¢ã¯ã·ã§ã³ãžèªåŸçã«é²ã¿ãŸãã
ãããã¯ã¯æ å ±ãã£ã³ãã«ãå¶åŸ¡ãã£ã³ãã«ã§ã¯ãªãããšæèãåãæ¿ããŠãããèšèšããã£ããããŸããã
⣠ANSI ãšã¹ã±ãŒãã³ãŒãããšãŒãžã§ã³ãã®ã³ã³ããã¹ããæ±æãã
çç¶: ãšãŒãžã§ã³ããåãšã©ãŒã®ãã°ãåãåã£ãŠããã¯ããªã®ã«ããšã©ãŒå
å®¹ãæ£ç¢ºã«èªã¿åãããçå€ããªä¿®æ£ãåºããŠããããšã©ãŒã¡ãã»ãŒãžãèªåã§ã¿ãŒããã«ã«è²Œãä»ãããš ^[[1m^[[31merror^[[0m ã®ãããªè¬æååãæ··å
¥ããŠããã
åå : --pretty false ãå
¥ããŠããªãã£ãææããããŸããTypeScript ã®ããã©ã«ãã¯è²ä»ãåºåã§ãã¿ãŒããã«ã§ã¯èµ€ããšã©ãŒæåã§è¡šç€ºãããŸãããå®äœã¯ ANSI ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã§ãããããããã¯ã®åºåã«æ··å
¥ãããšããšãŒãžã§ã³ããåãåãããã¹ãã人éãèªãã ãã®ãšç°ãªããŸããLLM ã¯ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã®è§£éãå®å®ããŠãããããerror ãšããåèªãããã¯ãã®äœçœ®ãã«å¶åŸ¡ã³ãŒããæãŸã£ãŠèªèãé»å®³ããŠããŸããã
çŽãæ¹:
TSC_ARGS="--noEmit --pretty false ..."
--pretty false ãåŒæ°ã«å ããã ãã§ããããã§ tsc ã®åºåããã¬ãŒã³ããã¹ãã«ãªããŸããããã¯ã CI ç°å¢ã§ã¯åžžã« --pretty false ãå
¥ããããšèŠããŠãããšããã§ããã¿ãŒããã«åºåã¯äººéãèªãããã®ãã®ã§ãããã°ã©ã ãåŠçããåºåã«ã¯äžèŠã§ãã
†å€éèµ·åã§ .tsbuildinfo ãå£ãã
çç¶: ããã¯ãæå¹ã«ããŠãã°ãã䜿ã£ãŠããããçªç¶ tsc ã Cannot read file 'node_modules/.cache/tsc-hook.tsbuildinfo' ãšãããšã©ãŒãåºãããã«ãªã£ãããã¡ã€ã«ãåé€ããŠãªãã©ã€ãããšçŽãããæ°æéåŸã«ãŸãå£ããã
åå : Claude Code ã¯è€æ°ã®ããŒã«ã䞊è¡å®è¡ããããšããããŸãããšãŒãžã§ã³ããããã¡ã€ã«Aãæžããããã¡ã€ã«Bãæžãããåæã«çºè¡ãããšãäž¡æ¹ã® PostToolUse ããã¯ãåæã«èµ·åããŸãã2ã€ã® tsc --incremental ããã»ã¹ãåã tsc-hook.tsbuildinfo ãã¡ã€ã«ã«åææžã蟌ã¿ã詊ã¿ããšããã¡ã€ã«ãäžéå端ãªç¶æ
ã§å£ããŸãã
çŽãæ¹: çŸç¶ã®ã¹ã¯ãªããã§ã¯å®å
šãªæä»å¶åŸ¡ïŒflock çïŒã¯å
¥ããŠããŸããã代ããã« 60 ç§ã® timeout ã§ãé·æé tsc ãè€æ°èµ°ã£ãã OS ã« reap ãããããšããæ¹éã«ããŠããŸããã³ã¡ã³ãã«ã # äžŠè¡ hook å®è¡ã«ããå€é tsc ã鲿¢ ãšæžããŠãããŸãã
å®ç§ãªè§£ã¯ flock ã䜿ãããšã§ãã
(
flock -x 200
# tsc å®è¡
) 200>"$TSBUILDINFO.lock"
ãã ããããå
¥ãããš macOS ç°å¢ã§ã®åäœç¢ºèªãå¢ããŸãïŒBSD ã® flock ãš GNU ã® flock ã¯æåãç°ãªãïŒãçŸç¶ã®éçšã§ã¯ .tsbuildinfo ãå£ãããåé€ããã°æ¬¡åããèªååçæããããããtimeout ã«ããç·©ãããªå¯Ÿçã§èš±å®¹ããŠããŸãã粟床ããéçšã®åçŽããåªå
ãã倿ã§ãã
tsbuildinfo ãå£ããŠã Claude Code èªäœã¯æ¢ãŸããŸãããããã¯ãåãšã©ãŒãªãã§è¿ãã°æ¬¡ã®ã¹ããããžé²ã¿ãŸããææªã§ããåãã§ãã¯ããã®1åã ãã¹ããããããããšãã圱é¿ã«ãšã©ãŸããŸããèŽåœçã§ãªããšã©ãŒã«å¯ŸããŠã³ãŒããè€éåãããå¿
èŠã¯ãªãããšããå€æåºæºã®å®äŸã§ãã
ã€ãŸãããã€ã³ãïŒå°å ¥ãéçšã§å®éã«èžãã å°é·ïŒ
äžæ®µã§ã¯ããã€ãã§ rc ãåžžã«0ããmacOS stat ã®æžãæ¹éãããexit 1 ã§ãšãŒãžã§ã³ããæ¢ãŸã£ãããANSI ã³ãŒãæ±æãã䞊è¡èµ·åã«ãã tsbuildinfo ç Žæãã®5ã€ã解説ããŸãããããã§ã¯ãã以å€ã§è©°ãŸããããç®æãäžæ°ã«äžŠã¹ãŸãã
-
chmod +xãå¿ãããšããã¯ããµã€ã¬ã³ãç¡èŠããã
ã¹ã¯ãªãããé 眮ããã ãã§ã¯åããŸãããchmod +x ~/.claude/hooks/post_tsc_check.shã§å®è¡æš©éãä»ãããŸã§ãClaude Code ã¯ããã¯ãéãã«ã¹ãããããŸãããšã©ãŒãèŠåãåºãªããããããã¯ãèšå®ããã®ã«åãã§ãã¯ãè¿ã£ãŠããªãããšããç¶æ ãç¶ããŸãã確èªã¯ls -la ~/.claude/hooks/ã§rwxr-xr-xã«ãªã£ãŠããããèŠãã ãã§ãããããå°å ¥åæ¥ã«æãå€ãè©°ãŸãåå ã§ãã -
ã·ã§ãã³ã
#!/bin/shã«ãããš bash æ§æãéããªãå Žé¢ããã
${SIZE:-0}ã®ãã©ã¡ãŒã¿å±éãcommand -vã¯/bin/shã§ãåããŸãããã¹ã¯ãªãããçºå±ããããšãã« bash éå®ã®æ§æãè¶³ããé端ã«å£ããŸããå®ãã¡ã€ã«ã®1è¡ç®ã#!/bin/bashã«ãªã£ãŠããã®ã¯ãã®ããã§ããæåãã#!/bin/bashã«ããŠããã®ãå®å šã§ãã -
ã«ã¬ã³ããã£ã¬ã¯ããªããããžã§ã¯ãã«ãŒãã§ãªãå Žåãtsconfig.json ãã§ãã¯ã空æ¯ããã
PostToolUse ããã¯ã¯ãšãŒãžã§ã³ããããŒã«ãå®è¡ããæç¹ã® cwd ã§èµ·åããŸãããšãŒãžã§ã³ããpackages/api/src/foo.tsãç·šéããŠã㊠cwd ãpackages/api/ã«ãªã£ãŠããã°åé¡ãããŸããããã«ãŒãã®ãŸãŸã§ããã°ãµãããã±ãŒãžã®tsconfig.jsonãèŠã€ããããã«å³exit 0ã§æããŸããã¢ãã¬ãæ§æã§ã¯æåŸ ãã tsconfig ã®ãã¹ã--projectã§æç€ºããããããã¯ã®å é ã§cd "$(git rev-parse --show-toplevel)"ããŠã«ãŒããžç§»åããŠããå®è¡ããè£åŒ·ãå¿ èŠã§ãã -
ã¢ãã¬ãã§
tscãæ³å®å€ã® tsconfig.json ãæŸã
packages/以äžã«è€æ°ã®tsconfig.jsonã忣ããŠãããšãcwd ã«å¿ããŠã©ããåç §ãããããå€ãããŸããã«ãŒãã® tsconfig ã䜿ãã€ãããããµãããã±ãŒãžã® tsconfig ãæŸã£ãŠåãšã©ãŒã®æ€åºç¯å²ããããã±ãŒã¹ãçºçããŸããTSC_ARGSã«--project $(pwd)/tsconfig.jsonã®ããã«çµ¶å¯Ÿãã¹ã§æå®ããããããã¯ãã¢ãã¬ã察å¿ã§å¥éäœããã®2æã§ãã -
--noEmitãèœãšããš js ãã¡ã€ã«ãæ¯ããã¯å®è¡ã§çæããã
ã€ã³ã¯ãªã¡ã³ã¿ã«ã®åŒæ°ãæå調æŽãããšã--noEmitãæ¶ããŠããŸããšãtscã.jsãæžãåºããŸããããã¯ã®ãã³ã«ãã«ãææç©ãäžæžããããgit statusãæ±æãããŸããããã«ãšãŒãžã§ã³ããããã¡ã€ã«ãå€ãã£ã â ããã¯çºç« â js ãçæ â ãã¡ã€ã«ãå€ãã£ãâŠãã®ç¡éã«ãŒãã«å ¥ãããšããããŸãã--noEmitã¯åŒæ°ãã³ãã¬ãŒãã®å é ã«åºå®ã§æžããŠãã ããã -
TSBUILDINFOã®ãã¹ã«ç©ºçœãå ¥ããšåŒæ°ãåå²ããã
--tsBuildInfoFile $TSBUILDINFOã§ã¯ã©ãŒããæããŠãããšããããžã§ã¯ããã¹ã«ç©ºçœãå«ãŸããç¬éã«tscã«æž¡ãåŒæ°ãåå²ãããŠãšã©ãŒã«ãªããŸããå®ã¹ã¯ãªããã®ãŸãŸã¯ã©ãŒããªãã§æžããŠããå Žåããã¹ã«ç©ºçœãå ¥ã£ãç°å¢ã§ã¯--tsBuildInfoFile "$TSBUILDINFO"ã«ããã«ã¯ã©ãŒãã远å ããå¿ èŠããããŸãã -
npxã®èµ·åã³ã¹ããé«é »åºŠã»ãã·ã§ã³ã§ç©ã¿äžãã
npx tscã¯å®è¡åã«æ¯ånode_modules/.bin/tscã®ååšã解決ããŸãã解決åŠçèªäœã¯ 0.1ã0.3 ç§çšåºŠã§ããããšãŒãžã§ã³ãã1ã»ãã·ã§ã³äžã«æ°åãã¡ã€ã«ãç·šéããå Žåã¯ç©ã¿äžãããŸããnode_modulesã確å®ã«ååšããç°å¢ã§ã¯./node_modules/.bin/tscã«çŽæ¥ãã¹ãéãéžæè¢ããããŸãããã ãnode_modulesããªãååã»ããã¢ãããžã®èæ§ãèœã¡ããããCI ãšå ±çšããã¹ã¯ãªããã«ã¯åããŸããã -
CI ç°å¢ã§
gtimeoutãtimeoutãååšããªã
Alpine Linux ãªã©ã®æå°ã€ã¡ãŒãžã«ã¯timeoutãå ¥ã£ãŠããªãããšããããŸããTIMEOUT_CMD=""ã®ãŸãŸ 60 ç§ã®æã¡åããªãã§tscãèµ°ããŸããCI ã®åãã§ãã¯ã¯å°çšãžã§ãã§ç®¡çããã®ãäžè¬çã§ãããåãã¹ã¯ãªããã CI ã§ã䜿ãå Žåã¯RUN apk add --no-cache coreutilsãªã©ã§timeoutãäºåã«ã€ã³ã¹ããŒã«ããŠãã ããã -
head -30ã§ãšã©ãŒãéäžã§åããŠãšãŒãžã§ã³ããæ ¹æ¬åå ãèŠå€±ã
åãšã©ãŒãé£éãããããžã§ã¯ãã§ã¯æåã®30è¡ã«æ žå¿ãéäžããŸããã埪ç°åç §ã®ãšã©ãŒãªã©ãåŸãã«æ ¹æ¬åå ããããã±ãŒã¹ã§ã¯30è¡ã§ã¯è¶³ããªãããšããããŸãããã®ãšãã¯ããã¯åºåã/tmp/tsc-last.logã«teeã§æ®ãããšãŒãžã§ã³ãã«cat /tmp/tsc-last.logã§å šéãèªãŸããè£å©ããã¯ãçµã¿åãããæ¹æ³ãæå¹ã§ããããã¯æ¬äœã¯ã·ã³ãã«ã«ä¿ã¡ãæ å ±ãè¶³ããªãå±é¢ã¯å¥ãã£ã³ãã«ã§è£ãåé¢ã®çºæ³ã§ãã -
200KB éŸå€ããã¹ãŠã®ãããžã§ã¯ãã«äžåŸé©çšããŠããŸã
200KB ã¯closet-osãšããç¹å®ãããžã§ã¯ãã®å®æž¬ããå°ããå€ã§ãããããžã§ã¯ãèŠæš¡ã»äŸåããªãŒã®æ·±ãã»ãã·ã³ã¹ããã¯ãå€ããã°é転ãã€ã³ããå€ãããŸããæ¬¡ã®ã³ãã³ãã§èªåã®ãããžã§ã¯ãã®å®æ°ãåã£ãŠãã ãããls -lh node_modules/.cache/tsc-hook.tsbuildinfo # ãã£ãã·ã¥ã®çŸãµã€ãº time npx tsc --noEmit # éåžžã¢ãŒãã®å®æž¬ time npx tsc --noEmit --incremental \ --tsBuildInfoFile node_modules/.cache/tsc-hook.tsbuildinfo # ã€ã³ã¯ãªã¡ã³ã¿ã«ã®å®æž¬2åç®ä»¥éã®ã€ã³ã¯ãªã¡ã³ã¿ã«ããéåžžã¢ãŒãããé ããæç¹ã®ãã£ãã·ã¥ãµã€ãºãéŸå€ã«ããã°ãããªãã®ãããžã§ã¯ãåºæã®å¢çå€ãåºãŸãã
ãã¹ããã©ã¯ãã£ã¹
å®è£ ãšå€±æãç¹°ãè¿ããŠåºãŸã£ããæåããããããŠããã°ããã£ããååãåæããŸãã
1. tsconfig.json ãã§ãã¯ã1è¡ç®ã«æžã
[ -f "tsconfig.json" ] || exit 0
é TypeScript ãããžã§ã¯ãã§ã®ããã¯èµ·åã³ã¹ãããŒãã«ããé²è¡ç·ã§ããåŸç¶ã®ãã¹ãŠã®åŠçã®åææ¡ä»¶ã«ãªããããå¿ ãæåã®1è¡ã«çœ®ããŸãã
2. --noEmit --pretty false ã¯äž¡æ¹ã»ããã§å€ããªã
--noEmit ã¯ãã¡ã€ã«çæãé²ãã--pretty false 㯠ANSI ãšã¹ã±ãŒãã³ãŒããæé€ããŸããããã¯åºåã¯ãšãŒãžã§ã³ããžã®å
¥åã«ãªããããæ©æ¢°ãåŠçããããã¹ãã«ã«ã©ãŒã³ãŒãã¯äžèŠã§ãããã®2ãªãã·ã§ã³ãåŒæ°ãã³ãã¬ãŒãããå€ããšãã©ã¡ããéãã«åé¡ãèµ·ãããŸãã
3. åžžã« exit 0 ã§è¿ã
ããã¯ã®ä»äºã¯ãæ
å ±ãæž¡ãããšãã§ãã£ãŠãåŠçãæ¢ããããšãã§ã¯ãããŸãããåãšã©ãŒã exit 1 ã§è¿ããç¬éãããã¯ã¯æ€æ»ããŒã«ããé害ç©ã«å€ãããŸãããšã©ãŒå
å®¹ãæšæºåºåã«æžã㊠exit 0 ã§è¿ãããšã§ããšãŒãžã§ã³ãã¯æ
å ±ãåãåããªããèªåŸçã«ä¿®æ£ã«ãŒããžé²ã¿ãŸãã
4. 2>&1 | head -30 ã¯ã»ããã§äœ¿ã
tsc ã®ãšã©ãŒã¯ stderr ã«åºãŸãã2>&1 ã§ stdout ã«åæµãããªããš $result ã«äœãå
¥ããŸãããhead -30 ã¯ãšã©ãŒãæ°çŸè¡ã«ççºãããšãã®ãããã¡ä¿è·ã§ããã©ã¡ããçæ¹ã ãã§ã¯äžå®å
šã§ãã
5. timeout ã®ååšç¢ºèªã¯ gtimeout â timeout â ãªã ã®é ã§
TIMEOUT_CMD=""
if command -v gtimeout >/dev/null 2>&1; then
TIMEOUT_CMD="gtimeout 60"
elif command -v timeout >/dev/null 2>&1; then
TIMEOUT_CMD="timeout 60"
fi
macOS ã« /usr/bin/timeout ã¯ãããŸããããã®é åºã§ command -v 確èªããŠãã代å
¥ããã°ãåãã¹ã¯ãªããã Linuxã»macOSã»CI ã§åããŸãã
6. rc=124 ã¯åãšã©ãŒãšå¥æ±ãã«ãã
timeout/gtimeout ã kill ãããšãã®çµäºã³ãŒã㯠124 ã§ããããã¯ãtsc ãæ¢ãŸããªãã£ãããšããæ
å ±ã§ãããåãšã©ãŒãšã¯æå³ãç°ãªããŸããå°çšã®ã¡ãã»ãŒãžãåºã㊠exit 0 ã«ããããšã§ã䞊è¡èµ·åã®çãããšãŒãžã§ã³ããžäŒããªãããããŒãç¶ç¶ã§ããŸãã
7. .tsbuildinfo 㯠node_modules/.cache/ ã«åºå®ãã
TSBUILDINFO="node_modules/.cache/tsc-hook.tsbuildinfo"
ãããžã§ã¯ãã«ãŒãã«çœ®ããš .gitignore ã®ã¡ã³ããå¢ããŸããnode_modules/.cache/ ã¯å€ãã®ãããžã§ã¯ãã§æ¢ã«é€å€ãããŠãããã远å èšå®äžèŠã§ãããã¡ã€ã«åã tsc-hook ãšåºæã«ããŠã¢ããªæ¬äœã®ãã«ããã£ãã·ã¥ãšåå空éãåããã®ãéèŠã§ãã
8. 200KB ã¬ãŒãã®éŸå€ã¯èªãããžã§ã¯ãã§å®æž¬ããŠããèšå®ãã
stat -f %z ã§çŸåšã®ãã£ãã·ã¥ãµã€ãºã確èªããtime npx tsc ãš time npx tsc --incremental ãæ¯èŒããŠé転ãã€ã³ããèªåã§åºããŸããããžãã¯ãã³ããŒãæµçšããã宿ž¬ããå¢çå€ã 204800ïŒ200KBïŒã®ä»£ããã«å
¥ããŠãã ããã
9. macOS ã® stat 㯠-f %z ã䜿ã
Linux çšã® -c %s 㯠macOS ã§ã¯ç¡å¹ã§ãã2>/dev/null || echo 0 ãšçµã¿åãããããšã§ããã¡ã€ã«äžåšæã®ãŒããã©ãŒã«ããã¯ã1è¡ã§æžããŸããLinuxã»macOS 䞡察å¿ãå¿
èŠãªã wc -c < ã§ãåããŸããã倧ããªãã¡ã€ã«ã§å
šèªã¿ãèµ°ããã stat ã®æ¹ãè¥å¹²éãã§ãã
10. å°å ¥ãããå¿ ãæåå®è¡ã§åäœç¢ºèªãã
cd /path/to/your/project
bash ~/.claude/hooks/post_tsc_check.sh
Claude Code çµç±ããå
ã«æåã§å©ããŸããæš©éã»ãã¹ã»stat ãªãã·ã§ã³ã»tsconfig.json ã®æ€åºâãã®1ã³ãã³ãã§å
šéšèŠã€ãããŸããClaude Code è¶ãã«ãããã°ããããå§åçã«éãã§ãã確èªåŸã«åé¡ããªããã°æ¬çªããã¯ãšããŠæå¹åããŸãã
11. 倧ããªäŸå倿Žã®ååŸã¯ããã¯ãäžæç¡å¹åãã
package.json ã«æ°ã©ã€ãã©ãªã远å ããçŽåŸã¯ tsc ãå
šè§£æãèµ°ãããããã¯ã 30ã60 ç§ãããã¯ããŸããããããå±é¢ã§ã¯ chmod -x ~/.claude/hooks/post_tsc_check.sh ã§äžæç¡å¹åããnpm install && npx tsc --noEmit ã§èªåã§ç¢ºèªããŠããå床 chmod +x ã«æ»ãå€æãæ£ããã§ããå
šèªåã«åºå·ãããå±é¢ã«å¿ããŠããã¯ãåãæ¿ããæè»ããéçšã®å®å®ã«ã€ãªãããŸãã
12. ã¹ã¯ãªãã㯠61 è¡ä»¥å ã«åãã
å®ãã¡ã€ã«ã¯ã³ã¡ã³ã蟌ã¿ã§ 61 è¡ã§ããæ©èœã远å ãããã³ã«è¡æ°ã¯äŒžã³ãŸããããããã¯ã®ä»äºã¯ãã§ãã¯ããŠå ±åããã ãããšãã責任å¢çãå®ãã°èšãã¿ãŸãããåŠçãè€éã«ãªããªããããã¯ã§ã¯ãªãå¥ã®å°çšã¹ã¯ãªããã«åãåºããµã€ã³ã§ããã1000è¡ãã100è¡ã®æå¿«ããã¯ãã®èŠæš¡ã§äœçŸã§ããŸãã
ãŸãšã
äœã£ãã®ã¯ 61 è¡ã®ã·ã§ã«ã¹ã¯ãªããã§ããããã ãã§ closet-os ã®ããã¯å®è¡æéã¯ãã³ãŒã«ã 3.6 åé
åããããå·®å 1ã3 ç§ãã«å€ãããŸããã
ãã€ã³ãã¯3è¡ã«åãŸããŸãã
--incrementalã¯å€§èŠæš¡ãããžã§ã¯ãã§é广ã«ãªãã.tsbuildinfoã®ãµã€ãºãææšã§ãcloset-osã§ã¯ 200KB ä»è¿ãé転ç¹ã§ãããstat -f %zã§åã£ããµã€ãºã204800ïŒ200KBïŒãè¶ ãããéåžžã¢ãŒããžèªåãã©ãŒã«ããã¯ãã1è¡ã¬ãŒãã§è§£æ±ºããŸãã- ããã¯ã¯ãæ
å ±ãã£ã³ãã«ãã§ãã£ãŠãå¶åŸ¡ãã£ã³ãã«ãã§ã¯ãªããåžžã«
exit 0ã§è¿ããåãšã©ãŒã¯æšæºåºåã§ãšãŒãžã§ã³ããžæž¡ããŸãã
ãã®æ§é ãåããŠãããšãClaude Code ãåãšã©ãŒãåã蟌ããã³ã«ã=== TypeScriptåãšã©ãŒæ€åº ===ããšãããã£ãŒãããã¯ãè¿ãããšãŒãžã§ã³ããèªåŸçã«ä¿®æ£ã«ãŒããåããŸãã人éãåãšã©ãŒã«æ°ã¥ãã©ã°ã¯ãŒãã§ããæå120äžã®èªåŸç°å¢ãæ¯ããå°å³ãªéšåã®ã²ãšã€ã§ãããå°å³ã ããããäœã¶æãå®å®ããŠåãç¶ããŠããŸãã
ããä» closet-os ãšåèŠæš¡ã®ãããžã§ã¯ãã§ --incremental ãéããšæããŠãããªãããŸã ls -lh node_modules/.cache/tsc-hook.tsbuildinfo ãå©ããŠãã ããã200KB ãè¶
ããŠããã°ã仿¥ããçŽããŸãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸã ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ