| name | erd-diagram-adjust |
| description | Regenerates the data-model ER diagram from prisma/schema.prisma and visually declutters edge routing (lines must not overlap entity boxes) without ever hand-editing the generated .drawio. Manual layout intent is captured in the layout-overrides side-car so it survives regeneration. Triggered by: "ERD調æŽ", "ERå³èª¿æŽ", "ããŒã¿ã¢ãã«å³", "data-model.drawio", "drawio調æŽ", "å³ã®ç·ãéãªã", "ç·ãããã¯ã¹ãçªãæãã", "erd:generateåŸã®èª¿æŽ", "ERDåçæ", "ã¢ãã«è¿œå åŸã®å³æŽæ°", "adjust ERD diagram", "fix ER diagram routing", "regenerate data model diagram", "erd layout".
|
| invocation | automatic |
| allowed-tools | ["Read","Grep","Glob","Bash","Edit","Write"] |
ERD Diagram Adjust ã¹ãã«
ç®ç
prisma/schema.prismaïŒæ§é ã® SSOTïŒããããŒã¿ã¢ãã« ER å³ docs/architecture/data-model.drawio
ãåçæãããªã¬ãŒã·ã§ã³ç·ããšã³ãã£ãã£ã»ããã¯ã¹ãçªãæããªãç¶æ
ãžèŠèŠèª¿æŽããããã®ã¹ãã«ã
èª¿æŽæå³ã¯ scripts/erd/layout-overrides.jsonïŒã¬ã€ã¢ãŠãã® SSOTïŒã«ä¿åãã
çæåšããããèªã¿èŸŒãã§åé©çšãããããã«ãããåçæã®ãã³ã«æèª¿æŽãæ¶ãããåé¡ãæé€ããã
éå: çæç© .drawio ãçŽæ¥æç·šéããŠã³ãããããªããèŠèŠèª¿æŽã¯å¿
ããµã€ãã«ãŒçµç±ã§è¡ã
ïŒ.claude/rules/03-data-model-diagram-sync.mdïŒã
ä»çµã¿ïŒ2 ãœãŒã¹ â 1 掟çç©ïŒ
prisma/schema.prisma ââââââââ
âââ scripts/erd/generate-erd.ts ââ docs/architecture/data-model.drawio
scripts/erd/layout-overrides.json â â² âïŒçæç©ã»æç·šéçŠæ¢ïŒ
ïŒã¬ã€ã¢ãŠã SSOTïŒ â â draw.io ã§èŠèŠèª¿æŽïŒã¹ã¯ã©ããïŒ
âââ scripts/erd/extract-overrides.ts ââ 調æŽçµæãéæµ
| ãã¡ã€ã« | åœ¹å² | ç·šéããŠããã |
|---|
prisma/schema.prisma | æ§é ã® SSOT | ã¹ããŒã倿޿ã®ã¿ |
scripts/erd/layout-overrides.json | é
眮ã»é
ç·ã® SSOTïŒæèª¿æŽã®ä¿åå
ïŒ | â
ãããç·šéïŒãŸã㯠erd:extract ã§çæïŒ |
scripts/erd/generate-erd.ts | çæåš | æ¢å®ã¬ã€ã¢ãŠã/åé¡ãå€ããæã®ã¿ |
scripts/erd/extract-overrides.ts | æœåºããŒã« | ååäžèŠ |
docs/architecture/data-model.drawio | çæç© | â æç·šéããŠã³ãããããªã |
ãã€èµ·åããã
- ã¹ããŒãïŒã¢ãã«/ãªã¬ãŒã·ã§ã³/enum/
@@unique/onDeleteïŒã远å ã»å€æŽã»åé€ãããšã
ïŒ.claude/rules/03-data-model-diagram-sync.md ã® MUSTïŒ
- æ¢åå³ã§ç·ãããã¯ã¹ãçªãæããŠèŠèªæ§ãèœã¡ãŠããã®ãçŽããšã
å®è¡æé ïŒãã®é çªãå³å®ïŒ
Step 1ïœã¯ãªãŒã³åçæ
bun run erd:generate
- ãµããª
[ERD] models=.. enums=.. edges=.. ã確èªã
- æ°ã¢ãã«ã远å ããå Žåã
[ERD] WARNING: æªåé¡ã¢ãã« ... ãåºãªãããšã確èªããã
åºãã scripts/erd/generate-erd.ts ã® PAGES å®çŸ©ïŒåããŒãžã® models ããã³ cellsïŒã«ã¢ãã«åã远èšããåé¡ããŠããåå®è¡
ïŒ.claude/rules/03-data-model-diagram-sync.mdïŒã
- æ¢åã®ãµã€ãã«ãŒãããã°
[ERD] layout-overrides applied: nodes=.. edges=.. ã衚瀺ãããã
Step 2ïœéãªããç¹å®ãã
docs/architecture/data-model.drawio ã draw.io / diagrams.net ã§éãã
- content-heavy ãªããå
šäœã¹ãããã·ã§ããã¯é¿ããïŒããŒã¯ã³æµªè²»ïŒãåé¡ç®æåšèŸºã ãã確èªãã
ïŒ[
~/.claude/CLAUDE.md ããŒã¯ã³å¹ç] æºæ ïŒã
- å
žåçãªçªãæããã¿ãŒã³:
- åäžåã®é£ã³è¶ãïŒäŸ:
Country â ShippingAddress ã ShippingRate/FreeShipping ã貫ãïŒ
- é·è·é¢ã®æšªæïŒäŸ:
Store â ShippingRate ãè€æ°ãã¡ã€ã³ã暪åãïŒ
Step 3ïœdraw.io ã§èŠèŠèª¿æŽïŒã¹ã¯ã©ããïŒ
- ãšããžããã©ãã°ããŠ**空ããŠãã瞊ã¬ã¿ãŒïŒãã¡ã€ã³åéã®ç©ºçœåž¯ïŒ**ãžæãç¹ãäœããããã¯ã¹ãé¿ããã
- å¿
èŠãªãæ¥ç¶ç¹ïŒexit/entry ããŒãïŒãåºå®ããã
- ããŒããåããå Žåã¯æå°éã«ïŒåãããšèªåã¬ã€ã¢ãŠãã®åæã厩ããããïŒã
- ãã®
.drawio ç·šéã¯äžæçïŒã¹ã¯ã©ããïŒããã®ãŸãŸã³ãããããªãã
ð¡ ã¬ã¿ãŒåº§æšã®ç®å®ïŒæ¢å®ã¬ã€ã¢ãŠãïŒ: ãã¡ã€ã³åã®å³ç«¯ã𿬡åã®å·Šç«¯ã®éïŒå¹
DOMAIN_GAP_X=240ïŒã
äžäžã«ç©ºããŠãããããã瞊ã®éãéã«äœ¿ããšç¢ºå®ã«ããã¯ã¹ãé¿ããããã
Step 4ïœèª¿æŽçµæããµã€ãã«ãŒãžéæµ
bun run erd:extract
bun run erd:extract -- --include-nodes
scripts/erd/layout-overrides.json ãæŽæ°ãããã
- ææžãã§åŸ®èª¿æŽããŠãããïŒã¹ããŒãã¯äžèšããµã€ãã«ãŒä»æ§ãïŒã
Step 5ïœæ±ºå®è«çã«åçŸãããããšãæ€èšŒ
bun run erd:generate
bun run erd:generate
git diff --stat docs/architecture/data-model.drawio
.drawio ãå床éããStep 2 ã§èŠã€ããçªãæããè§£æ¶ããŠããããšãç®èŠã
- 2 åç®ã®åçæã§å·®åãŒã ïŒ ãµã€ãã«ãŒããæ±ºå®è«çã«åãå³ãåçŸããããã確èªã
Step 6ïœåäžã³ãããã§ãŸãšãã
.claude/rules/03-data-model-diagram-sync.md ã«åŸãã
以äžãåäžã³ãããã«å«ãã:
prisma/schema.prismaïŒã¹ããŒããå€ããå ŽåïŒ
scripts/erd/generate-erd.tsïŒPAGES çãå€ããå ŽåïŒ
scripts/erd/layout-overrides.jsonïŒèª¿æŽããå ŽåïŒ
- åçæããã
docs/architecture/data-model.drawio
ã³ãããã¡ãã»ãŒãžäŸ:
docs(erd): reroute Country/Order edges via gutters and regenerate ER diagram
ãµã€ãã«ãŒä»æ§ïŒscripts/erd/layout-overrides.jsonïŒ
çŽç²ãª JSONïŒã³ã¡ã³ãäžå¯ãçæåšã¯å³æ Œ JSON.parseïŒã
{
"pages": {
"<diagramId>": {
"nodes": {
"Order": { "x": 2310, "y": 120 }
},
"edges": {
"Country->ShippingAddress:countryId": {
"exitX": 1, "exitY": 0.5,
"entryX": 1, "entryY": 0.5,
"waypoints": [
{ "x": 3150, "y": 180 },
{ "x": 3150, "y": 1197 }
]
}
}
}
}
}
- ãšããžããŒ:
${parent}->${child}:${label}ãlabel 㯠FK ã«ã©ã åïŒcascade ã® â ã¯é€ãïŒã
CASCADE ç·ã§ã â ã¯ä»ããªãïŒäŸ Order->PaymentDetails:orderIdïŒã
- ããŒã:
exitX/exitYïŒèŠªïŒ, entryX/entryYïŒåïŒãER å³ã¯å·Šå³æ¥ç¶ã®ãã *X ã¯åºæ¬ 0(å·Š) ã 1(å³)ã
- waypoints: 瞊ã¬ã¿ãŒãéãæãç¹ãåãã¬ã¿ãŒãè€æ°ç·ãéãå Žå㯠x ãããããŠäžŠèµ°ãããã
- ã¹ããŒãããæ¶ããã¢ãã«/ãªã¬ãŒã·ã§ã³ã® override ã¯ç¡èŠãããïŒçæã¯å£ããªãïŒã
NEVERïŒçŠæ¢äºé
ïŒ
- â
docs/architecture/data-model.drawio ãçŽæ¥æç·šéããŠã³ãããããïŒèª¿æŽã¯ãµã€ãã«ãŒçµç±ã®ã¿ïŒã
- â ãµã€ãã«ãŒã«ã³ã¡ã³ããæžãïŒå³æ Œ JSON ã®ããããŒã¹å€±æ â override ç¡å¹åïŒã
- â ã¹ããŒããå€ããã®ã«åçæããã³ãããããã
- â æ°ã¢ãã«è¿œå æã«
PAGES æªåé¡ã®ãŸãŸïŒorphan WARNING ãç¡èŠïŒæŸçœ®ããã
ãã©ãã«ã·ã¥ãŒã
| çç¶ | åå / å¯ŸåŠ |
|---|
| override ãå¹ããªã | ãšããžããŒã® labelïŒFK åïŒäžäžèŽãçæ .drawio ã®è©²åœ <mxCell ... edge="1"> ã® value ãç¢ºèª |
[ERD:loadOverrides] Failed to parse | layout-overrides.json ãäžæ£ JSONãæ«å°Ÿã«ã³ã/ã³ã¡ã³ããé€å» |
| ç·ããŸã çªãæãã | å¥ã¬ã¿ãŒãžæãç¹ã远å ãwaypoints ã® x ã空çœåž¯å
ã«çœ®ã |
| 2 åç®åçæã§å·®åãåºã | éæ±ºå®çãªæç·šéãæ®åãStep 1 ããããçŽãã調æŽã¯å¿
ã erd:extract çµç±ã§ |
Related