ããã³ãå®è£ ã®åã«ããã©ã³ãã¬ã€ããAIã«å åºãããã
Claude CodeãšCodexã1å°ã§åæ¥ããã話ããç¶ããå人éçºãéç£ããããã®èªåååºç€ãã·ãªãŒãºã§ããä»åã¯ãããã³ãå®è£ ã«å ¥ãåã«ãã©ã³ãã¬ã€ããAIã«çæãããŠããä»çµã¿ãäœã£ãè©±ãæžããŸãã
ãªãã¬ã€ãããå åºããããã®ã
å人éçºã§UIãäœããšãããããããã¡ãªãã¿ãŒã³ããããŸããããšããããå®è£ ããŠã¿ãŠãåŸãããã¶ã€ã³ãæŽããããšãããã®ã§ãã
ãã®çµæã©ããªãããClaudeãçæããã³ãŒãã«ã¯å¿ ãããã©ã«ãã®TailwindæãæŒããã·ã£ããŠã»è§äžžã»åäžã«ãŒãã°ãªããã§åãå°œãããããã©ããã§èŠããããªç»é¢ã宿ããŸãããã¯ãªãŒã³ã§ãããã«ããšããæç€ºã§ã¯ãAIãéžã¶ã®ã¯åžžã«æå€§å ¬çŽæ°çãªãã¶ã€ã³ã§ãã
åé¡ã¯æ å ±ã®äžåè¡¡ã«ãããŸããClaudeã¯æç€ºããªããã°ã©ã€ãã©ãªã®ããã©ã«ãèšå®ã§å®è£ ããŸããã³ã³ããŒãã³ãã«æå¿ããªããã°ããã¬ãŒã ã¯ãŒã¯ã®æå¿ã§åããããŸãã
éã«èšãã°ãå®è£ åã«æå³ãæã£ããã©ã³ãã¬ã€ããæž¡ãã°ãAIã®çæç©ã¯äžå€ããŸããã©ã®ãããžã§ã¯ãã«ãããããããªãããšããæ¹åãå ã«æ±ºããŠãè²ã»ã¿ã€ãã»ã¢ãŒã·ã§ã³ã»ã°ã©ããŒã·ã§ã³ã»ã°ã¬ã€ã³ã®æå³ãæç€ºããç¶æ ã§å®è£ ã«å ¥ããšãçæã³ãŒãã®åè³ªãæ¡éãã«å€ãããŸãã
ãã®ãå
åºãããèªååããã®ãã~/dev/brand-kit/generate.sh ã§ãã
brand-kit ã®å šäœå
~/dev/brand-kit/ ã®æ§æã¯ã·ã³ãã«ã§ãã
brand-kit/
âââ generate.sh â ã¡ã€ã³ã¹ã¯ãªãã
âââ lib/
â âââ strip_fence.py â ã³ãŒããã§ã³ã¹é€å»ãŠãŒãã£ãªãã£
âââ output/
â âââ <slug>/ â çæç©çœ®ãå Ž
âââ README.md
generate.sh ã«ã¹ã©ãã°ïŒãããžã§ã¯ãèå¥åïŒãšããªãŒãïŒ1ã3è¡ã®æŠèŠïŒãæž¡ããšãoutput/<slug>/ ã«æå€§4ã€ã®ãã¡ã€ã«ãçæãããŸãã
| ãã¡ã€ã« | å 容 |
|---|---|
brand-guideline.md | äžç芳ã»ã¹ã¿ã€ã«æ¹åã»ãã¬ããæå³ã»ã¿ã€ãæŠç¥ã»ã¢ãŒã·ã§ã³ååã»Do&Don't |
tokens.css | oklch ããŒã¹ã®CSS ã«ã¹ã¿ã ãããã㣠|
preview.html | ããŒã¯ã³ãå®éã«å¹ãããåäžHTMLã®LPæç |
references.md | ïŒ--refs æã®ã¿ïŒWebSearch ã§éããå®åšåèURL |
ãã®ã¬ã€ãäžåŒãå®è£ è ïŒClaude CodeïŒã«ããã®ã¬ã€ãã«åŸã£ãŠå®è£ ããŠããšæž¡ãã®ãåºæ¬ã®äœ¿ãæ¹ã§ããã¬ã€ããå ã«ããã°ãClaudeã¯éžæãè¿·ããã«æžã¿ãŸãã
å®éã®äœ¿ãæ¹
bash generate.sh <slug> "<æŠèŠã»èª°åãã»äœã®ããŒãžã>" [--refs] [--force]
æ¶ç©ºã®å°åå·¥ååºæ¡ä»¶ã§åãããŠã¿ãŸãã
cd ~/dev/brand-kit
bash generate.sh marui-koumuten \
"æ¿æ©åºã®å°åå·¥ååºã®ãªãã¥ãŒã¢ã«HPã50ã60代æœäž»åããè·äººã®æä»äºãšå°åå®çžŸã§åãåãããåã"
å®è¡ãããšãé çªã«3ãã¡ã€ã«ãçæãããŸãã
[brand-kit] guidelineçæ (詊è¡1/3)âŠ
[brand-kit] â brand-guideline.md
[brand-kit] tokensçæ (詊è¡1/3)âŠ
[brand-kit] â tokens.css
[brand-kit] previewçæ (詊è¡1/3)âŠ
[brand-kit] â preview.html
[brand-kit] å®äº: ~/dev/brand-kit/output/marui-koumuten
- brand-guideline.md
- tokens.css
- preview.html
â preview.html ããã©ãŠã¶ã§ç¢ºèªãæ¹åãéãã°æŠèŠãå€ã㊠--force ã§åçæã
æ¹åãæ°ã«å
¥ããªããã°æŠèŠãæžãçŽã㊠--force ãä»ãããšå
šãã¡ã€ã«ãäœãçŽããŸãã--refs ãä»ãããš WebSearch ã§å®åšã®åèURLãéãã references.md ãçæãããŸãïŒãã®åã ãæéãããããŸãïŒã
èšèšã®æ žå¿ïŒãªã3ã³ãŒã«ã«åããã®ã
generate.sh ãèªããšãguidelineã»tokensã»preview ãããããç¬ç«ããã³ãŒã«ã§çæããŠããããšãããããŸããå
éšã® call() ãã«ãã¯ãããªã£ãŠããŸãã
# 1ã³ãŒã«å®è¡ãã«ã: $1=ã©ãã« $2=ããã³ãã $3=allowedTools
call() {
local label="$1" prompt="$2" tools="${3:-}" r=""
local toolflag=(); [ -n "$tools" ] && toolflag=(--allowedTools "$tools")
for attempt in 1 2 3; do
echo "[brand-kit] $label (詊è¡$attempt/3)âŠ" >&2
r=$(timeout "$T" "$CLAUDE" -p "$prompt" "${toolflag[@]}" --model "$MODEL" </dev/null 2>/dev/null)
[ -n "$r" ] && ! printf '%s' "$r" | grep -qiE \
'usage limit|rate limit|session limit|hit your session|request timed out' \
&& { printf '%s' "$r"; return 0; }
sleep 3
done
return 1
}
ãªã1ã³ãŒã«ã§å
šéšåºããªãã®ããçç±ã¯æç¢ºã§ããguideline.md ã ãã§ååãªããªã¥ãŒã ããããããã« tokens.css ãš preview.html ãŸã§å ãããšåºåãæå€§ããŒã¯ã³æ°ãè¶
ããŠéäžã§åããŸããCSSãéãæ¬åŒ§ã®ãªããŸãŸçµãã£ãŠããããHTMLã </body> ãæããªãå£ãããã¡ã€ã«ã«ãªã£ããããŸãã
åå²ããããäžã€ã®ã¡ãªããã¯ãåŸæ®µã®ã³ãŒã«ãåæ®µã®åºåãå ¥åãšããŠåãåããç¹ã§ãã
GUIDE=$(head -c 6000 "$GFILE" 2>/dev/null)
# â guideline ã®å
é 6000æåã tokens çæããã³ããã«åã蟌ã
TOKENS=$(cat "$TFILE" 2>/dev/null)
# â tokens.css å
šæã preview çæããã³ããã«åã蟌ã
ã¬ã€ãã©ã€ã³ã®æå³ãããŒã¯ã³ã«ãããŒã¯ã³ã®å€ããã¬ãã¥ãŒã«ãäžè²«ããŠåŒãç¶ãããŸããçæç©ããã©ãã©ã«ãªããã3ãã¡ã€ã«ãåãäžç芳ãå ±æã§ããŸãã
ãŸãåãã¡ã€ã«ã¯ãã§ã«ååšããã°ã¹ããããããŸãã
if [ "$FORCE" = 1 ] || [ ! -s "$TFILE" ]; then
# tokens ãçæ
else
echo "[brand-kit] = tokens.css (æ¢åã»skip)"
fi
ãããåªçæ§ã®èã§ããéäžã§ã¿ã€ã ã¢ãŠãããã倱æãããããŠããåå®è¡ããã°æ¬ ãããã¡ã€ã«ã ããè£å®ãããŸããbrand-guideline.md ãæåã㊠tokens.css ã§å€±æããå Žåãæ¬¡ã®å®è¡ã§ã¯ brand-guideline.md ãã¹ãããã㊠tokens.css ããåéããŸãã
èžãã èœãšã穎
èœãšã穎â ïŒ</dev/null ãå¿ãããšããªãŒãºãã
æåã« claude -p ãã·ã§ã«ã¹ã¯ãªããããåŒã³åºãããšããã³ãã³ããåž°ã£ãŠããªãçŸè±¡ã«ééããŸããã
åå 㯠stdin ã§ããclaude -p ã¯ãã€ããããå
¥åãèªãããšããŸããã¹ã¯ãªããå
ã§åçŽã«åŒã¶ãšãClaude ãã¿ãŒããã«ã®æšæºå
¥åãåŸ
ã£ããŸãŸæ¢ãŸããŸããtimeout ã§å²ã£ãŠããŠããã¿ã€ã ã¢ãŠããŸã§ã®éãã£ãšãããã¯ãããŸãã
# NG: stdin ãéããŠãããã察話å
¥åãåŸ
ã£ãŠããªãŒãºãã
r=$(timeout 240 "$CLAUDE" -p "$prompt" --model sonnet)
# OK: </dev/null ã§ stdin ãéãã
r=$(timeout 240 "$CLAUDE" -p "$prompt" --model sonnet </dev/null 2>/dev/null)
claude -pãã·ã§ã«ã¹ã¯ãªããã launchd ããåŒã¶ãšãã¯</dev/nullãå¿ é ã§ãã察話çãªã¿ãŒããã«ã§ææã¡ãããšãã¯åé¡ãããŸããããããã¯ã°ã©ãŠã³ãããã»ã¹ãèªååã¹ã¯ãªããã§ã¯å¿ ãä»ããŠãã ãããCodex CLI ã®ãããã¬ã¹å®è¡ã§ãåãçœ ããããŸãïŒååã®èšäºåç §ïŒã
èœãšã穎â¡ïŒã»ãã·ã§ã³äžéãšã©ãŒã§å£ãããã¡ã€ã«ãçæããã
claude -p ã¯ã»ãã·ã§ã³äžéã«éãããšãCSSãHTMLã§ã¯ãªããšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã
You've hit your session limit. Please wait before continuing.
ãã®ãšã©ãŒæååããã®ãŸãŸ tokens.css ã«æžãåºããšãåŸç¶ã® preview.html çæããšã©ãŒããã¹ãããCSSããŒã¯ã³ããšããŠåãåãããŽãHTMLãçæããŸããããã«ãã®ãŸãŸãã¡ã€ã«ã«ä¿åãããŠããŸããæ¬¡åå®è¡æã«ã¯ãæ¢åã»skipãã§ã¹ããããããŠå£ãããŸãŸã«ãªããŸãã
察çãšã㊠call() ãã«ãã®äžã«ã¬ãŒããå
¥ããŠããŸãã
[ -n "$r" ] && ! printf '%s' "$r" | grep -qiE \
'usage limit|rate limit|session limit|hit your session|request timed out' \
&& { printf '%s' "$r"; return 0; }
sleep 3
空ã§ãªãããã€ãšã©ãŒãã¿ãŒã³ãå«ãŸãªãå Žåã®ã¿åºåãè¿ããŸãããšã©ãŒãè¿ã£ãŠããå Žåã¯3ç§åŸ
ã£ãŠãªãã©ã€ããŸãã3å倱æããã° return 1 ã§ã³ãŒã«å€±æãšãããã¡ã€ã«ãžã®æžã蟌ã¿èªäœãè¡ããŸããã
èœãšã穎â¢ïŒã³ãŒããã§ã³ã¹ãå¿çã«æ··å ¥ãã
claude -p ã®å¿çã«ã¯ãæç€ºããªããŠã ```css ã ```html ãªã©ã®ã³ãŒããã§ã³ã¹ãæ··å
¥ããããšããããŸããCSSãã¡ã€ã«ã«ã³ãŒããã§ã³ã¹ãå
¥ããšããã©ãŠã¶ã«ãã®ãŸãŸé©çšã§ããŸããã
åã³ãŒã«ã®åºåã lib/strip_fence.py ã«ãã€ãããŠååŠçããŠããŸãã
# lib/strip_fence.pyïŒæç²ïŒ
t = sys.stdin.read().strip()
# ```lang ... ``` ã§å²ãŸããŠããæå€§ãããã¯ãåªå
m = re.search(r'```[a-zA-Z]*\n(.*?)```', t, flags=re.DOTALL)
if m:
print(m.group(1).strip() + "\n")
sys.exit(0)
# ãã§ã³ã¹ç¡ã: æåã®æ§é çãªè¡ä»¥éãæ¡çšïŒåçœ®ãæ£æãèœãšãïŒ
lines = t.splitlines()
start = 0
for i, ln in enumerate(lines):
s = ln.lstrip()
if s.startswith(("# ", "## ", ":root", "` ã `preview.html` ã®å
é è¡ã«åºåããããæç€ºãå«ãŸããŠããŸããããã `/design-sync` ã¹ãã«ã§ claude.ai ã®ãã¶ã€ã³ã·ã¹ãã Project ã«åæãããšã以åŸã® Claude Design çæããã®ãããžã§ã¯ãã®ããŒã¯ã³ãç¶æ¿ããŠäžè²«ããŸãïŒ`/design-sync` ã®å©çšã«ã¯ claude.ai ãžã®ãã°ã€ã³ãå¿
èŠã§ãïŒã
## ã¢ãã«ãšã¿ã€ã ã¢ãŠãã®èª¿æŽ
`generate.sh` ã®åé ã«ç°å¢å€æ°ã«ããèšå®ããããŸãã
```bash
CLAUDE="${CLAUDE:-~/.local/bin/claude}"
MODEL="${BRAND_KIT_MODEL:-sonnet}"
T="${BRAND_KIT_TIMEOUT:-240}" # 1ã³ãŒã«ãããã®ã¿ã€ã ã¢ãŠãïŒç§ïŒ
é床åªå
ãªã haiku ã«åãæ¿ããããŸããã¬ã€ãã®æèã®æ·±ãã¯èœã¡ãŸãããçæãéããªããŸãã
# haiku ã§é床åªå
BRAND_KIT_MODEL=haiku bash generate.sh marui-koumuten "..."
# ã¿ã€ã ã¢ãŠãã䌞ã°ãïŒäœéãããç°å¢ãªã©ïŒ
BRAND_KIT_TIMEOUT=360 bash generate.sh marui-koumuten "..."
çæã³ã¹ã㯠claude -pïŒClaude MAX æ ïŒã§å®å
šç¡æã§ããAPIããŒã課éèšå®ã¯äžèŠã§ãã
ãŸãšã
- å®è£ åã«ã¬ã€ããå åºãããããšã§ãAIçæã³ãŒãã®è±ãã³ãã¬åãå®çŸã§ããŸã
generate.sh㯠guideline â tokens â preview ã®3ã³ãŒã«ç¬ç«èšèšã1ã³ãŒã«ã§å šéšåºããšåºåãéäžã§åããŸãclaude -pã¯ããã¯ã°ã©ãŠã³ãå®è¡æã«**</dev/nullãå¿ é **ã§ããå¿ãããš stdin åŸ ã¡ã§ããªãŒãºããŸã- ã»ãã·ã§ã³äžéãšã©ãŒã®æååã
grepã§æ€åºããå£ãããã¡ã€ã«ãžã®æžã蟌ã¿ãã¬ãŒãããŸã strip_fence.pyã§ã³ãŒããã§ã³ã¹ãšåçœ®ãæ£æãé€å»ããCSSãšHTMLããã®ãŸãŸäœ¿ãã圢ã§ä¿åããŸã- åãã¡ã€ã«ã¯ååšããã°ã¹ãããââåªçæ§ã«ããåå®è¡ã§æ¬ ããåã ãè£å®ãããŸã
tokens.cssã¯oklch()ã»clamp()ã»feTurbulenceã°ã¬ã€ã³ããã¹ãŠCSS倿°ãšããŠå®çŸ©ããŸããã°ã©ããŒã·ã§ã³ã¯å šãµã€ãã§3ç®æéå®- çæã³ã¹ã㯠Max æ ã§å®å šç¡æã§ã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- äœã£ãã¢ããªã¯ ããŒããã©ãªãª ã«ãŸãšããŠããŸãð±
- æ°çã»éçºã®è£åŽã¯ X @bokuwalily ã§çºä¿¡ããŠããŸãð
- OSS: github.com/bokuwalily ð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ