ã¯ããã« bunã®ã€ã³ã¹ããŒã« äœæ¥ç°å¢ã®äœæ Prettierã®ã€ã³ã¹ããŒã« Remarkã®ã€ã³ã¹ããŒã« ããŒã¶ã®ã»ããã¢ãã RemarkãšPrettierã®æŽåæ§ãåã Remarkã®äžéšãšããŠPrettierãåãã Linterã®ã»ããã¢ãã ããã¥ã¡ã³ãã®ãªã³ã¯åããæ€èšŒãã Linterçšã®èšå®ãã¡ã€ã«ãå€éšåãã ãŸãšã ã¯ããã« ã¿ãªããããã«ã¡ã¯ãXIæ¬éšãšã³ãžãã¢ãªã³ã°ãªãã£ã¹ã®äœè€å€ªäžã§ãã Amazon ã®Kiroã話é¡ã«ãªã£ãããããããAIã« Markdown ã§ä»æ§æžãæžããŠãããããšã§ææç©ã®å質ãäœæ¥å質ãé«ããåãçµã¿ã泚ç®ãããŠããŸããã Amazon ã®Kiroã ãã§ãªãã GitHub ã® Spec Kit ã Claude Code Spec Workflow ã Claude Code Spec ãªã©æ§ã
ãªæŽ»åãå
¬éãããŠããŸãã ãã®ãšã³ããªã§ã¯ããããã£ã掻åã®äžã§å°ãèŠéããããã¡ãª Markdown ãã¡ã€ã«ãã®ãã®ã®å質ãåºäžãããããã®åãçµã¿ã玹ä»ããŸãã å
·äœçã«ã¯ãRemarkãšPrettierãçµã¿åãã㊠Markdown ãã¡ã€ã«ãæå®ã®ã«ãŒã«ã«æ²¿ã£ãèšè¿°ããããŠãããèªåçã«ä¿èšŒããæ¹æ³ã説æããŸãã bunã®ã€ã³ã¹ããŒã« ä»åå©çšããããŒã«ã¯ JavaScript ãTypeScriptã§èšè¿°ãããŠããŸãã ãããã®ããŒã«ã¯ãç¶ç¶çã«ç¹°ãè¿ãå®è¡ãããããå°ãã§ãé«éã«åäœããããšãæãŸããã®ã§ãä»åã¯bunã䜿ã£ãŠå®è¡ããŸãã Windows ç°å¢ã§ããã°ä»¥äžã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ã§ããŸãã powershell -c "irm bun.sh/install.ps1 | iex" Linux ã Mac ç°å¢ãªã以äžã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ã§ããŸãã curl -fsSL https://bun.sh/install | bash bunã¯é«éã«åäœããããã«ç¹å¥ãªèšå®ãããã«TypeScriptãçŽæ¥å®è¡ã§ããã®ã§ãç§ã¯æ¥åžžç㪠ã¹ã¯ãªãã ãTypeScriptã§æžããŠããŸãã äœæ¥ç°å¢ã®äœæ ä»åã¯çè
ã®äœæ¥ç°å¢ã Windows ãªã®ã§ããããåæã«ç°å¢æ§ç¯ãè¡ããŸãã ãã©ãããã©ãŒã äŸåæ§ã®ãã話ã¯å
šäœãšããŠã»ãŒååšããŸããã®ã§ã Linux ã Mac ã䜿ã£ãŠããæ¹ã¯é©å®èªã¿æ¿ããŠãã ããã äœæ¥çšã® ãã£ã¬ã¯ã ãªãšããŠã C:/dev/md-tutorial ã«æ°ãã ãã£ã¬ã¯ã ãªãäœæããŸããã ä»åŸã¯ããã® ãã£ã¬ã¯ã ãªå
ã§äœæ¥ããŠãããã®ãšèããŠãã ããã ãã® ãã£ã¬ã¯ã ãªã«ã bunfig.toml ãšãããã¡ã€ã«ã以äžã®å
容ã§äœæããŸãã [install] exact = true ããã«ãã£ãŠãbunã§ã€ã³ã¹ããŒã«ããããŒã«ã®ããŒãžã§ã³ãåžžã«åºå®ããããã®ã«ãªããŸãã Prettierã®ã€ã³ã¹ããŒã« Prettierã¯ãhtmlã JavaScript ãTypeScriptãªã©æè¿ã®ããã³ããšã³ãéçºã§äœ¿ãããŠããããã¹ããã¡ã€ã«ã®ãã©ãŒããããèªåçã«è¡ã æèŠã®åŒ·ã ãã©ãŒããã¿ã§ãã ç§èªèº«ã¯ãå
šãŠã® ãœãŒã¹ã³ãŒã ã¯ãã©ãŒãããããã¹ãã§ãããšèããŠããŸãã ãã ããäžè²«æ§ããããã°ãã©ãŒãããã®ã«ãŒã«ã«ã€ããŠã¯ããŸããã ããããªãã®ã§ãPrettierãåžžçšããŠããŸãã 以äžã®ã³ãã³ããå®è¡ããŠãPrettierãbunã§ã€ã³ã¹ããŒã«ããŸãããã bun add prettier 以äžã®ããã« package.json ãäœæãããŸãã { " dependencies ": { " prettier ": " 3.6.2 " } } ããã«bunããPrettierãå®è¡ããããã®ã³ãã³ãã远å ããŸãã { " dependencies ": { " prettier ": " 3.6.2 " } , " scripts ": { " lint:prettier ": " prettier --check docs/ ", " format:prettier ": " prettier --write docs/ " } } ä»åã¯Prettierã§æ€æ»å¯Ÿè±¡ã«ãããã¡ã€ã«ã¯ docs/ ãã£ã¬ã¯ã ãªã«æ ŒçŽããããã®ãšããŠã¿ã¹ã¯ãå®çŸ©ããŸããã ã§ã¯ã docs/ ãã£ã¬ã¯ã ãªã« README.md ã以äžã®å
容ã§äœæããŸãããã # Title Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Body Text Prettierã®åäœç¢ºèªããããã®ã§ãå°ãå¥åŠãªãã¡ã€ã«ã§ãã ã¿ã€ãã«ã®åŸãã«ç¡æå³ãªåè§ã¹ããŒã¹ããã£ããã空è¡ã®ã¿ã®è¡ãã¹ããŒã¹ã§ã€ã³ãã³ããããŠãããããŸãã ãã®ç¶æ
ã§Prettierãå®è¡ããŠã¿ãŸãããã以äžã®ã³ãã³ããå®è¡ããŸãã bun lint:prettier 以äžã®ããã«åºåãããŸããã ãã¡ã€ã«ã«åé¡ãããããã§ãããããããä»åã®åé¡ã¯èªåçã«å¯ŸåŠã§ãããã®ã§ãã ã§ã¯ã以äžã®ã³ãã³ããå®è¡ããŸãããã bun format:prettier å®è¡çµæã¯ä»¥äžã®ããã«åºåãããŸãã èªåçãªæãè¿ãã¯ãããªãããã§ãããããããäœåãªåè§ã¹ããŒã¹ã¯å
šãŠé€å»ãããŠããŸãã Prettierã¯åºæ¬çã«èšå®ã®èª¿æŽãäžèŠãªã®ã§ãããããã€ãç§ã®è¶£å³ã«åããªãéšåãããã®ã§ãããã ãã¯å€ããŸããããå
·äœçã«ã¯ãã¿ããšäžè¡ã®æå€§å¹
ãšæ¹è¡ã³ãŒãã§ãã ã¿ãã¯åè§ã¹ããŒã¹2ã€ã«å€æããŸããäžè¡ã®å¹
ã¯ããã©ã«ãã®80æåãã120æåã«å¢ãããŸããããæ¹è¡ã³ãŒãã¯LFã®ã¿ã«åºå®ããŸãã { " dependencies ": { " prettier ": " 3.6.2 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " lint:prettier ": " prettier --check docs/ ", " format:prettier ": " prettier --write docs/ " } } ããããŠã .gitattributes ãã¡ã€ã«ã以äžã®å
容ã§äœæããŸãã text=auto eol=lf Remarkã®ã€ã³ã¹ããŒã« Remark㯠JavaScript ã§å®è£
ããã Markdown ã®åŠçããŒã«ã§ããããããã® ãã©ã°ã€ã³ ããããåŠçããŒã«ãšããŠã®æ©èœã調ç¯ã§ããããã«ãªã£ãŠããŸãã ãŸããããŒãºããŠASTã«ãªã£ã Markdown ããã¡ã€ã«ã«æžãåºãããããªåœ¢åŒã«æ°žç¶åããæ©èœããããŸãã ããŒã¶ã®ã»ããã¢ãã ãŸãã¯ãRemarkã®ããŒã¶éšåãã»ããã¢ããããŠã¿ãŸãããã以äžã®ã³ãã³ãã§3ã€ã®ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã bun add remark-cli remark-frontmatter remark-gfm ããããŠãbunããåŒã³åºããããã«ã³ãã³ãã远å ããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } ãã£ãšãRemarkã远å ããã¢ãžã¥ãŒã«ãåäœããããã«æ§æããŠããŸããã§ããã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } remarkConfigã«pluginsãšããããããã£ãããã®ã§ãããã«è¿œå ããã ãã©ã°ã€ã³ ã®ã¢ãžã¥ãŒã«åãåæããŠããŸããä»å㯠remark-frontmatter ãš remark-gfm ã§ããã åäœã確èªããŠãããŸãããããšã¯ãããæ¢ã«çšæãã docs/README.md ã§ã¯äœãèµ·ããªãã®ã§æ°ãããã¡ã€ã«ã远å ããŸãã docs/list.md ãšãããã¡ã€ã«ã以äžã®å
容ã§ä¿åããŸãã --- author: taichi category: - example - sample --- # Title _foo bar baz_ ## Sub Title - [ ] one - [ ] two - [ ] three foo bar baz 1. first 1. second 1. third ---- frontmatterãšãã YAML ã§ ã¡ã¿ããŒã¿ ãä»ãã Markdown ã§ãããListã®éšåã§ã¯ã GitHub åºæã® ãã§ãã¯ããã¯ã¹ èšæ³ã䜿ã£ãŠããŸãã Remarkã®åäœã確èªããŠã¿ãŸãããã以äžã®ã³ãã³ããå®è¡ããŸãã bun lint:md ç¹ã«ãšã©ãŒãªãåŠçãçµäºããã§ãããã æ¬¡ã¯ããã©ãŒãããã¿ã¹ã¯ãå®è¡ããŸãããã以äžã®ã³ãã³ãã§ãã bun format:md docs/list.md ãéããªãããŠã¿ãŠãã ãããè峿·±ãå€åãèµ·ããŠããã¯ãã§ãã --- author: taichi category: - example - sample --- # Title *foo bar baz* ## Sub Title * [ ] one * [ ] two * [ ] three foo bar baz 1. first 2. second 3. third *** frontmatteréšåã«å€åã¯ãããŸããã æ¬¡ã®Titleããäžã®ã€ã¿ãªãã¯äœã«ãªã£ãŠããèšå·ãå€åããŠããŸãããã©ãŒãããå㯠_foo bar baz_ ãšã¢ã³ããŒã¹ã³ã¢èšå·ã䜿ã£ãŠããŸãããããã©ãŒãããåŸã¯ *foo bar baz* ãš ã¢ã¹ã¿ãªã¹ã¯ ã䜿ãããŠããŸãã ãªã¹ãèšæ³ã® - ã * ã«å€åããŠããŸãã åæ§ã«åºåãç·ãšããŠããã€ãã³ã䜿ã£ãŠããã®ã§ ---- ã§ãããããã©ãŒãããåŸã¯ **** ã«ãªã£ãŠããŸãã æåŸã®é åºä»ããªã¹ãã¯ãæ°åãæé ã«èª¿æŽãããŠããŸãã ãããRemarkã«å
èµãããŠãã remark-stringify ã®æ£åžžãªåäœã§ãã Markdown ãããŒãºããŠASTã«ããåŸãã¡ã¢ãªäžã®è¡šçŸãäžå®ã®ã«ãŒã«ã§æååã«æ°žç¶åããããã§ãã ãã®ãŸãŸã§ã¯ãå°ãéœåãæªãã®ã§èª¿æŽããŸããããremarkConfigã« settings ããããã£ã远å ããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } ããã§ã¯ã ãªã¹ãã«äœ¿ãèšå·ãšã㊠- æäœãããŒã«ããªã©ã匷調ããéã«äœ¿ãèšå·ãšã㊠_ åºåãç·ãšããŠäœ¿ãèšå·ãšã㊠- ãèšå®ããŠããŸãã ã§ã¯ãããäžåºŠãã©ãŒããã¿ãåãããŠã¿ãŸãããã bun format:md åŠçã¯æåã以äžã®ããã«èšå®ã«åºã¥ãã衚çŸã«ãªã£ãŠããã¯ãã§ããé åºä»ããªã¹ãã ããæé ã®ãŸãŸã§ããã --- author : taichi category : - example - sample --- # Title _foo bar baz_ ## Sub Title - [ ] one - [ ] two - [ ] three foo bar baz 1. first 2. second 3. third --- ããã§åãã£ãããã«ãRemarkã Markdown ã®ãã©ãŒããã¿ãšããŠäœ¿ãå Žåã«ã¯ãremarkConfigãªããžã§ã¯ãã®settingsããããã£ã調æŽããŸãããã®èšå®é
ç®ã¯ã remark-stringify#options ã«èšèŒãããŠããŸãã RemarkãšPrettierã®æŽåæ§ãåã Prettierã¯ããã¹ããã¡ã€ã«ã®ãã©ãŒããããæŽããããŒã«ã§ãããå®ã¯Remarkã®Lintã«ãŒã«ã®äžã«ã¯ãPrettierã®åäœãšççŸãããã®ãéè€ãããã®ãå«ãŸããŠããŸãã PrettierãšããŸãçµã¿åããããªããã®ã¯ããããããç¡å¹ã«ããŠããŸããŸãããããã®ããã®ã¢ãžã¥ãŒã«ã以äžã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ããŸãã bun add remark-preset-prettier ã¢ãžã¥ãŒã«ã远å ãããããã®ã¢ãžã¥ãŒã«åã ãã©ã°ã€ã³ ãšããŠè¿œå ããŸãã以äžã®ããã«ãªãã§ãããã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-prettier ": " 2.0.2 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-prettier " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } 次ã¯ãã©ãŒããããããã®ããã³ã³ãã³ããçšæããŸããããdocs/table.md ãšããŠä»¥äžã®ãããªãã¡ã€ã«ãäœæããŸãã # Table | Column1 | Label | Description | | ----- | ----- | ----- | | val | aaaaaaa | Lorem ipsum dolor sit amet, consectetur adipiscing elit | | valval | aa | sed do eiusmod tempor incididunt ut labore | | foo | d | Duis aute irure dolor in reprehenderit in voluptate | | xxxxxxx | | deserunt mollit anim id est laborum | Prettierã§ãã©ãŒãããããã³ãã³ãã¯ä»¥äžã®ãšããã§ãã bun format:prettier ã³ãã³ããæ£åžžã«çµäºããããã©ã®ããã«ãã©ãŒããããããã確èªããŠã¿ãŸãããã # Table | Column1 | Label | Description | | ------- | ------- | ------------------------------------------------------- | | val | aaaaaaa | Lorem ipsum dolor sit amet, consectetur adipiscing elit | | valval | aa | sed do eiusmod tempor incididunt ut labore | | foo | d | Duis aute irure dolor in reprehenderit in voluptate | | xxxxxxx | | deserunt mollit anim id est laborum | ãã©ãŒãããããåã®ããŒãã«ã¯æ£çŽèšã£ãŠHTMLãªããšãã£ã¿ã® ãã¬ãã¥ãŒæ©èœ ãªãã䜿ããªããã°å
å®¹ãææ¡ã§ããªããã®ã§ããããPrettierã®ãã©ãŒãããã«ããããã¹ã衚çŸã ãã§ãèªããããã«ãªããŸãããã Remarkã®äžéšãšããŠPrettierãåãã Remarkã«ãããã©ãŒããããšPrettierã«ãããã©ãŒããããæ¯ååããã®ã¯ããé¢åã§ãããäœãã®æåã«æããŠããŸãããã§ãã ãšããããã§ãRemarkã®åŠçã®æåŸã«Prettierãåããããã® ãã©ã°ã€ã³ ãå°å
¥ããŸãããã bun add unified-prettier ãããŸã§éããpluginsã«è¿œå ã§ãããåºåçšã® ãã©ã°ã€ã³ ãªã®ã§ remark-preset-prettier ãããåŸãã«é
眮ããŸãã { "dependencies": { "prettier": "3.6.2", "remark-cli": "12.0.1", "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.1", "remark-preset-prettier": "2.0.2", "unified-prettier": "2.0.1" }, "prettier": { "tabWidth": 2, "printWidth": 120, "endOfLine": "lf" }, "remarkConfig": { "settings": { "bullet": "-", "emphasis": "_", "rule": "-" }, "plugins": [ "remark-frontmatter", "remark-gfm", "remark-preset-prettier", "unified-prettier" ] }, "scripts": { "lint:md": "remark --frail docs/", "lint:prettier": "prettier --check docs/", "format": "remark docs/ --frail --output" } } PrettierãšRemarkã«ãããã©ãŒãããã¯çµ±åãããã®ã§ãã³ãã³ãåã¯ã·ã³ãã«ãª format ã«å€æŽããŠããŸãã Linterã®ã»ããã¢ãã ããã§ã¯ãããããLinteræ©èœãRemarkã«è¿œå ããŸãããã Remarkãå
¬åŒã§æäŸããŠããLinterã¯ã remark-lint/packages ã«äžŠãã§ããã®ã§ããããã®çްããã«ãŒã«ãäžã€ãã€éžå®ããŠããã®ã¯é¢åã§ããè€æ°ã®ã«ãŒã«ãæã«ããããªã»ãããå
¬åŒããæäŸãããŠããŸãã®ã§ãããã䜿ããŸãããã remark-preset-lint-recommended Markdown ã䜿ãããã§åºæ¬çãªã«ãŒã«ã®éåã§ããä»åã¯ãããæ¡çšããŸãã remark-preset-lint-consistent ããã¥ã¡ã³ãå
ã§èšæ³ãäžè²«ããããã«åŒ·å¶ããã«ãŒã«ã®éåã§ãã ããããã®èšæ³ã«ãããŠããã¡ã€ã«å
ã§æåã«ç»å Žããèšæ³ãäžè²«ããŠäœ¿ãããŠãããã©ãããæ€èšŒã§ããŸãã ä»åã¯æ°èŠã®ãããžã§ã¯ããåæã«ããŸãã®ã§äžæ¡çšã§ãã remark-preset-lint-markdown-style-guide Markdown Style Guide ãšããæ¥µããŠåŒ·ãæèŠã® Markdown ã«é¢ããã¹ã¿ã€ã«ã¬ã€ããæ¡çšããã«ãŒã«ã§ãã ä»åã¯ããã»ã©å€ãã®ããã¥ã¡ã³ããããããã§ã¯ãªãã®ã§äžæ¡çšã§ãã ãŸãã¯ãã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã bun add remark-preset-lint-recommended ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããã ãã©ã°ã€ã³ ãšããŠè¿œå ããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-lint-recommended ", " remark-preset-prettier ", " unified-prettier " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output " } } Remarkã® ãã©ã°ã€ã³ ã·ã¹ãã ã¯ãé
åã®åŸãåŽã«ãªãã»ã©ã«ãŒã«ãšããŠåªå
ãããŸãã®ã§ãä»å远å ããããªã»ããã¯ã¡ããã©äžã»ã©ã«å
¥ãããã«è¿œå ããŸãã lintã®ã«ãŒã«ã远å ããã®ã§ãããããšã©ãŒãçºçãããã㪠Markdown ãäœããŸããããdocs/link.md ã以äžã®å
容ã§äœæããŸãã # Links https : //example.com ãªã³ã¯èšæ³ã䜿ãããã«ãªã³ã¯ã®ãããªãã®ãããã¹ããšããŠèšè¿°ãããŠããŸãã®ã§ãããã¯èŠåãããã¯ãã§ãã Linterãå®è¡ããã³ãã³ãã¯ä»¥äžã®ãšããã§ãã bun lint : md å®è¡ãããšç¢ºãã«èŠåãåºåãããããã»ã¹ããšã©ãŒã§çµäºããŸãã ãªã³ã¯èšæ³ã䜿ãã¹ãã§ãããšããèŠåãåºåãããŠããŸããããããèªåçã«æ¹åããããã©ãã確èªããŠã¿ãŸãããã bun format Linterãå®è¡ãããšããšåããšã©ãŒãåºåãããŠããŸããã ã§ã¯ã Markdown ãã¡ã€ã«ã¯ã©ããªã£ãŠããã®ã§ããããã # Links < https://example.com > ãªã³ã¯ã <> ã§ãããããŠããŸãããèªåä¿®æ£ã¯æ©èœããŠããããã§ãããã ãAIã䜿ã£ãéçºã«ãããŠã¯ããã®åºåã ãšAIãæšæºåºåãããã¡ãã»ãŒãžãæ ¹æ ã«è§£æ±ºã詊ã¿ãŸãã ã€ãŸããåœè©²ãã¡ã€ã«ãéããã®ã®å®éã«ã¯ä¿®æ£æžã¿ãšããç¶æ
ã«ãªã£ãŠããŸããŸãã®ã§ãäžå®ã®æ··ä¹±ãçºçããŸãã éä¿¡ãã ããŒã¯ ã³éã§èª²éãããããå¶éãããä»ã®AIçžæã«ã¯ããããç¡é§ãèµ·ããªãããã«ããªããã°ãªããŸããã ãã®åé¡ã«å¯Ÿå¿ããããã«èšå®ã調æŽããŠã¿ãŸããããpluginsããããã£ã«ã¢ãžã¥ãŒã«ãåæãããšåžžã«äœ¿ãããŠããŸãã®ã§ãLinterãåãããšããšãã©ãŒããã¿ãåãããšãã§äœ¿ãã¢ãžã¥ãŒã«ãåãæ¿ããå¿
èŠããããŸãã remarkã³ãã³ãã® -u ãªãã·ã§ã³ã䜿ããšåå¥ã«ã¢ãžã¥ãŒã«ãæå®ã§ããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ -u remark-preset-lint-recommended -u remark-preset-prettier ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output -u remark-preset-prettier -u unified-prettier " } } ãã®èšå®ã§ã¯ãLinterãšãã©ãŒããã¿ã§å
±éããŠäœ¿ãéšåã¯remarkConfig以äžã«å®çŸ©ããéãéšåã¯åã³ãã³ãã®åŒæ°ãšããŠå®çŸ©ããŠããŸãã ããã§ã¯ã確èªã®ãããè£æ£æžã¿ã®docs/link.md ãè£æ£åã«æ»ããããã§ãLinterãåãããŠã¿ãŸãããã ãšã©ãŒãåºåãããŠããŸããã ã§ã¯ããã©ãŒããã¿ãåãããŠã¿ãŸãããã ãšã©ãŒãèŠåãåºåãããªãã®ã§ãããã»ã¹ã¯æ£åžžã«çµäºããŸãã ãããŠã Markdown ã¯èªåè£æ£ãããŠæ£ãããã©ãŒããããããŠããŸããã # Links < https://example.com > ããã¥ã¡ã³ãã®ãªã³ã¯åããæ€èšŒãã èšèšããã¥ã¡ã³ããšã㊠Markdown ã䜿ããšããããšã¯ã圹å²ã責任ç¯å²æ¯ã«ãã¡ã€ã«ãåå²ããŠããããããã ãã€ããŒãªã³ã¯ ã§æ¥ç¶ãããšããäœ¿ãæ¹ãæ³å®ãããŸãã ãããããšãåé¡ã«ãªãã®ããããã¥ã¡ã³ãéã®ãªã³ã¯åãåé¡ã§ãããã¡ã€ã«åããã¡ã€ã«ãã¹ã倿Žããããšã«ãã£ãŠããªã³ã¯åãã¯é »ç¹ã«çºçããŸããããããã¡ããšã¡ã³ããã³ã¹ããŠããã®ã¯ãéåžžã«é¢åãªã¿ã¹ã¯ã§ãããã ããã§ãLinterã®äžéšãšããŠãªã³ã¯åãããã§ãã¯ããšã©ãŒãæšæºåºåããããšã§ããªã³ã¯ã®ã¡ã³ããã³ã¹ãçæAIã«ä»»ããŸãããã Remarkã«ã¯ãªã³ã¯åããæ€èšŒãã ãã©ã°ã€ã³ ãããã€ãããã®ã§ããããããŸãšããŠã€ã³ã¹ããŒã«ããŸãããã bun add remark-validate-links remark-lint-no-dead-urls remark-validate-links ãåã ãã£ã¬ã¯ã ãªããªãŒå
ã«ãããã¡ã€ã«ãžã®ãªã³ã¯ãæ€èšŒãã ãã©ã°ã€ã³ ã§ããããã«å¯ŸããŠã remark-lint-no-dead-urls ã¯ãªã³ã¯ãšããŠèšèŒãããŠããURLã«HTTPãªã¯ ãšã¹ ããéä¿¡ããŠæ©èœããŠãããæ€èšŒãã ãã©ã°ã€ã³ ã§ãã ãããLinterçšã®ã³ãã³ãã«çµã¿èŸŒããšãããªããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-lint-no-dead-urls ": " 2.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " remark-validate-links ": " 13.1.0 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ -u remark-preset-lint-recommended -u remark-preset-prettier -u remark-validate-links=repository:false -u remark-lint-no-dead-urls=deadOrAliveOptions:{timeout:10000} ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output -u remark-preset-prettier -u unified-prettier " } } Linterçšã®ã³ãã³ããé·ããªãå§ããŠããŸãããå¿
èŠãªæã ãæç²ããŠèª¬æããŸãã å
éšãªã³ã¯ãæ€èšŒãã ãã©ã°ã€ã³ ã®èšå®éšåãããã§ãã -u remark-validate-links=repository:false remarkã³ãã³ãã®ãªãã·ã§ã³ãšããŠãã¢ãžã¥ãŒã«æ¯ã®èšå®ãèšè¿°ããã«ã¯ãã¢ãžã¥ãŒã«åã®æåŸã« = ãä»ããããã§ãæå€åšã® {} ããªãJSON5ãèšè¿°ããŸãã remark-validate-linksã¯ãæ€èšŒå¯Ÿè±¡ãgit ãªããžã㪠ã§ãã€originãèšå®ãããŠããããšãåæã«åäœããã®ã§ããã®æ©èœãç¡å¹åããããã« repository:false ãèšå®ããŠããŸãã æ®æ®µãªããã®èšå®ã¯äžèŠã§ãããã å€éšãªã³ã¯ãæ€èšŒãã ãã©ã°ã€ã³ ã®èšå®éšåãããã§ãã -u remark-lint-no-dead-urls=deadOrAliveOptions:{timeout:10000} remark-lint-no-dead-urls 㯠dead-or-alive ãšããã©ã€ãã©ãªãå
éšçã«äœ¿ã£ãŠããŸãããã® ã¿ã€ã ã¢ãŠã ãªãã·ã§ã³ãããã§ã¯èšå®ããŠããŸãã ãããã® ãã©ã°ã€ã³ ãæ©èœããã確èªããããã«ãå
ã»ã©ã® docs/links.md ã«æãå ããŠå
éšãªã³ã¯ãšå€éšãªã³ã¯ã远å ããŠã¿ãŸãããã # Links < https://example.com > ## Internal Links * [ Exists ]( #Links ) * [ NotExists ]( #likns ) ## External Links * [ External Example ]( https://example.com ) * [ NotExists External ]( https://example.com/fail ) ã§ã¯ããªã³ã¯åããæ€èšŒããŠã¿ãŸãããã以äžã®ã³ãã³ããå®è¡ããŸãã bun lint:md å®è¡çµæã¯ãšã©ãŒçµäºã«ãªããŸãã ã¿ã€ãããŠããããŒãžå
ã®ãªã³ã¯ãšãååšããªãå€éšããŒãžã«å¯Ÿãããªã³ã¯ãèŠåããšã©ãŒãšããŠæ€åºãããŠããŸããã Linterçšã®èšå®ãã¡ã€ã«ãå€éšåãã CLI ãªãã·ã§ã³ãšããŠJSON5ãèšè¿°ãããšããã®ã¯ãåããèŸãã®ã§èšå®ãã¡ã€ã«ãå€éšåããŸãããã ããã§ã¯ãã©ãŒããã¿ã®èšå®ããåé¢ããŸããèšå®ãã¡ã€ã«ã config/remark-format.json ã«äœæããŠãã ããã { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-prettier ", " unified-prettier " ] } ãã©ãŒããã¿ã®èšå®ã¯ããŒã¶ãšã· ãªã¢ã© ã€ã¶ã ããªã®ã§ã·ã³ãã«ã§ããã æ¬¡ã«Linterã®èšå®ãã¡ã€ã«ãåé¢ããŸãã config/remark-lint.json ã«äœæããŸãã { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-lint-recommended ", " remark-preset-prettier ", [ " remark-validate-links ", { " repository ": false } ] , [ " remark-lint-no-dead-urls ", { " deadOrAliveOptions ": { " timeout ": 10000 } } ] ] } ãã®ãšã³ããªã§ã¯ãããŸããããLinteråŽã®èšå®ã¯ãŸã ããªã調æŽã®äœå°ãããã§ãããã æåŸã«package. json ããäžèŠã«ãªã£ãèšå®ãåé€ããŠãã³ãã³ãã調æŽããŸãã { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-lint-no-dead-urls ": " 2.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " remark-validate-links ": " 13.1.0 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " format ": " remark docs/ --frail --output -r config/remark-format.json ", " lint ": " remark --frail docs/ -r config/remark-lint.json " } } PrettierãçŽæ¥å©çšããã±ãŒã¹ã¯åºæ¬çã«ãããŸããã®ã§ãããããŠã³ãã³ããã·ã³ãã«ã«ããŠãããŸããã ãŸãšã ä»åã®ãšã³ããªã§ã¯ãé ã远ã£ãŠPrettierã®å°å
¥ããRemarkã«ãããã©ãŒãããããã®åŸLinterãå°å
¥ããæåŸã¯èšå®ãã¡ã€ã«ãåãåºããŠèª¿æŽããããç¶æ
ã«ããŸããã ããã§ç޹ä»ããææ³ã䜿ãã°ãçæAIãåºåãã倧éã®ããã¹ããã¡ã€ã«ã®ãã¡ã€ã«ãã©ãŒããããæ§æãäžå®ã®æ°Žæºã«ä¿ãŠãããã«ãªããŸãã çæAIã¯åºåããæç« ã®äžèº«ã«ã€ããŠçè§£ããŠããããããã£ãœããã®ãåºåããã®ã¿ã§ããããããã£ãŠèªåçã«å¯ŸåŠã§ããéšåã«ã€ããŠã¯ãAIã«å¯ŸåŠããŠãããããšã§ç§ãã¡ã¯ããæå³ã®ããã¬ãã¥ãŒãè¡ããããã«ãªãã¯ãã§ãã ãã®ãšã³ããªãèªãã çããããããé«å質ãªããã¥ã¡ã³ããå
ã«ãœãããŠã§ã¢éçºã宿œã§ããããã«ãªãããšãé¡ã£ãŠããŸãã ç§ãã¡ã¯äžç·ã«åããŠããã仲éãåéããŠããŸãïŒ é»éç·ç ãã£ãªã¢æ¡çšãµã€ã é»éç·ç æ°åæ¡çšãµã€ã å·çïŒ @sato.taichi ã¬ãã¥ãŒïŒ @yamashita.tsuyoshi ïŒ Shodo ã§å·çãããŸãã ïŒ