
ts-morph Refactoring Tools
â 16from SiroSuzume
Refactor TypeScript and JavaScript codebases using ts-morph. Supports renaming symbols and files, moving symbols, and searching for references.
MCP ts-morph Refactoring Tools
ts-morph ãå©çšããŠãTypeScript / JavaScript ã³ãŒãããŒã¹ã«å¯Ÿãã AST ããŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°æäœãæäŸãã MCP ãµãŒããŒã§ããã·ã³ãã«åã®å€æŽããã¡ã€ã«/ãã©ã«ãåã®å€æŽãåç §æ€çŽ¢ãªã©ãããããžã§ã¯ãå šäœã®æŽåæ§ãä¿ã¡ãªããè¡ããŸãã
ç®æ¬¡
- ã¯ã€ãã¯ã¹ã¿ãŒã
- æäŸãããããŒã«
- ãã®ã³ã°èšå®
- éçº
- ãªãªãŒã¹
- ã©ã€ã»ã³ã¹
ã¯ã€ãã¯ã¹ã¿ãŒã
MCP ã¯ã©ã€ã¢ã³ãã®èšå®ãã¡ã€ã«ïŒmcp.json çïŒã«ä»¥äžã远å ããŸããnpx ã䜿ãããšã§ãå
¬éæžã¿ã®ææ°ããŒãžã§ã³ãèªåçã«å©çšãããŸãã
{
"mcpServers": {
"mcp-tsmorph-refactor": {
"command": "npx",
"args": ["-y", "@sirosuzume/mcp-tsmorph-refactor"],
"env": {}
}
}
}ãã®ã³ã°ãã«ã¹ã¿ãã€ãºããå Žå㯠ãã®ã³ã°èšå® ãåç §ããŠãã ãããããŒã«ã«ã®ãœãŒã¹ããèµ·åããå Žå㯠éçº ãåç §ããŠãã ããã
æäŸãããããŒã«
åããŒã«ã¯ ts-morph ã§ AST ãè§£æãããããžã§ã¯ãå
šäœã®åç
§ãä¿ã¡ãªãã倿Žãè¡ããŸãããã¹ãŠã®ããŒã«ã¯ãããžã§ã¯ãã® tsconfig.json ãã¹ãå¿
èŠãšããŸãã
| ããŒã« | æŠèŠ |
|---|---|
rename_symbol_by_tsmorph | ã·ã³ãã«åããããžã§ã¯ãå šäœã§äžæ¬å€æŽ |
rename_filesystem_entry_by_tsmorph | ãã¡ã€ã«/ãã©ã«ãåã倿Žã import ãã¹ãæŽæ° |
find_references_by_tsmorph | ã·ã³ãã«ã®å®çŸ©ã»åç §ç®æãäžèŠ§è¡šç€º |
remove_path_alias_by_tsmorph | ãã¹ãšã€ãªã¢ã¹ãçžå¯Ÿãã¹ã«çœ®æ |
move_symbol_to_file_by_tsmorph | ã·ã³ãã«ãå¥ãã¡ã€ã«ã«ç§»åãåç §ãæŽæ° |
change_signature_by_tsmorph | 颿°ã®åŒæ°ã远å /åé€/äžŠã¹æ¿ããå šåŒã³åºãç®æãæŽæ° |
get_type_at_position_by_tsmorph | æå®äœçœ®ã®æšè«ãããåæ å ±ãååŸ |
find_unused_exports_by_tsmorph | æªäœ¿çš export åè£ãåæ |
rename_symbol_by_tsmorph
æå®ãã¡ã€ã«å ã®ç¹å®äœçœ®ã«ããã·ã³ãã«ïŒé¢æ°ã»å€æ°ã»ã¯ã©ã¹ã»ã€ã³ã¿ãŒãã§ãŒã¹ãªã©ïŒã®ååãããããžã§ã¯ãå šäœã§äžæ¬å€æŽããŸãã
- ãŠãŒã¹ã±ãŒã¹: åç §ç®æãå€ãæäœæ¥ã§ã®å€æŽãå°é£ãªå Žåã
- å¿ èŠãªæ å ±: 察象ãã¡ã€ã«ã®ãã¹ãã·ã³ãã«ã®äœçœ®ïŒè¡ã»åïŒãçŸåšã®ã·ã³ãã«åãæ°ããã·ã³ãã«åã
rename_filesystem_entry_by_tsmorph
è€æ°ã®ãã¡ã€ã«ããã³/ãŸãã¯ãã©ã«ãã®ååã倿Žãããããžã§ã¯ãå
ã®ãã¹ãŠã® import / export æã®ãã¹ãèªåçã«æŽæ°ããŸãã
- ãŠãŒã¹ã±ãŒã¹: ãã¡ã€ã«æ§æã®å€æŽã«äŒŽã import ãã¹ã®ä¿®æ£ãè€æ°ã®ãã¡ã€ã«/ãã©ã«ããäžåºŠã«ãªããŒã /ç§»åãããå Žåã
- å¿
èŠãªæ
å ±: ãªããŒã æäœã®é
å
renames: { oldPath: string, newPath: string }[]ã - æå:
- åç §è§£æ±ºã«ã¯äž»ã«ã·ã³ãã«è§£æãçšããŸãã
- ãã¹ãšã€ãªã¢ã¹ïŒ
@/ãªã©ïŒãå«ãåç §ã¯æŽæ°ãããŸãããçžå¯Ÿãã¹ã«å€æãããŸãã - ãã£ã¬ã¯ããªã®ã€ã³ããã¯ã¹ãåç
§ããã€ã³ããŒãïŒäŸ:
../componentsïŒã¯ãæç€ºçãªãã¡ã€ã«ãã¹ïŒäŸ:../components/index.tsxïŒã«æŽæ°ãããŸãã - æäœåã«ãã¹ã®è¡çªïŒæ¢åãã¹ã»æäœå ã®éè€ïŒããã§ãã¯ããŸãã
- 泚æ: 倿°ã®ãã¡ã€ã«/ãã©ã«ããéåžžã«å€§ããªãããžã§ã¯ãã§ã¯ãè§£æãšæŽæ°ã«æéããããå ŽåããããŸãã
export default Identifier;圢åŒã®ããã©ã«ããšã¯ã¹ããŒãã®åç §ã¯æ£ããæŽæ°ãããªãå ŽåããããŸãïŒæ¢ç¥ã®å¶éïŒã
find_references_by_tsmorph
æå®ãã¡ã€ã«å ã®ç¹å®äœçœ®ã«ããã·ã³ãã«ã®å®çŸ©ç®æãšããããžã§ã¯ãå šäœã§ã®ãã¹ãŠã®åç §ç®æãæ€çŽ¢ããŠäžèŠ§è¡šç€ºããŸãã
- ãŠãŒã¹ã±ãŒã¹: ãã颿°ã倿°ã®äœ¿çšç®æã®ææ¡ããªãã¡ã¯ã¿ãªã³ã°ã®åœ±é¿ç¯å²ã®èª¿æ»ã
- å¿ èŠãªæ å ±: 察象ãã¡ã€ã«ã®ãã¹ãã·ã³ãã«ã®äœçœ®ïŒè¡ã»åïŒã
remove_path_alias_by_tsmorph
æå®ãããã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªå
ã® import / export æã«å«ãŸãããã¹ãšã€ãªã¢ã¹ïŒ@/components ãªã©ïŒããçžå¯Ÿãã¹ïŒ../../components ãªã©ïŒã«çœ®æããŸãã
- ãŠãŒã¹ã±ãŒã¹: ãããžã§ã¯ãã®ç§»æ€æ§ãé«ããããç¹å®ã®ã³ãŒãã£ã³ã°èŠçŽã«åããããå Žåã
- å¿ èŠãªæ å ±: åŠç察象ã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªã®ãã¹ã
move_symbol_to_file_by_tsmorph
æå®ããã·ã³ãã«ïŒé¢æ°ã»å€æ°ã»ã¯ã©ã¹ã»ã€ã³ã¿ãŒãã§ãŒã¹ã»åãšã€ãªã¢ã¹ã»EnumïŒãå¥ãã¡ã€ã«ã«ç§»åãããããžã§ã¯ãå šäœã®åç §ïŒimport/export ãã¹ãå«ãïŒãèªåçã«æŽæ°ããŸãã
- ãŠãŒã¹ã±ãŒã¹: ç¹å®ã®æ©èœãå¥ãã¡ã€ã«ã«åãåºããŠã³ãŒãæ§æã倿Žãããå Žåã
- å¿
èŠãªæ
å ±: ç§»åå
ã»ç§»åå
ã®ãã¡ã€ã«ãã¹ãç§»åããã·ã³ãã«ã®ååãååã·ã³ãã«ãããå Žåã¯çš®é¡ïŒ
declarationKindStringïŒãæå®ããŠææ§æ§ãè§£æ¶ã§ããŸãã - æå: ãã®ã·ã³ãã«å
ã§ã®ã¿äœ¿çšãããå
éšäŸåãäžç·ã«ç§»åããŸããç§»åå
ã®ä»ã·ã³ãã«ãããåç
§ãããäŸåã¯ç§»åå
ã«æ®ããå¿
èŠã«å¿ããŠ
exportã远å ãããŠç§»åå ã§ã€ã³ããŒããããŸãã - 泚æ: ããã©ã«ããšã¯ã¹ããŒãïŒ
export defaultïŒãããã·ã³ãã«ã¯ç§»åã§ããŸããã
change_signature_by_tsmorph
颿°ã»ã¡ãœããã»ã¢ããŒé¢æ°ã®åŒæ°ã远å ã»åé€ã»äžŠã¹æ¿ããããããžã§ã¯ãå ã®ãã¹ãŠã®åŒã³åºãç®æã®åŒæ°ãåãããŠæŽæ°ããŸãã
- ãŠãŒã¹ã±ãŒã¹: åŒã³åºãå ãå€ã颿°ã«å¿ é åŒæ°ã远å ããããimport / åãšã¯ã¹ããŒã / ã¡ãœãããã§ãŒã³çµç±ã§åç §ããã颿°ã®åŒæ°ãåé€ã»äžŠã¹æ¿ãããå ŽåãLLM ã®åçºç·šéã§ã¯åãããŒããèµ·ããããæŽæ°ããåãã§ãã«ãŒçµç±ã§ç¢ºå®ã«åæ ããŸãã
- å¿
èŠãªæ
å ±: 察象ãã¡ã€ã«ã®ãã¹ã颿°åèå¥åã®äœçœ®ïŒè¡ã»åïŒã颿°åãé©çšããæäœã®é
å
operationsã - æäœïŒ
operationsïŒ:add:indexïŒçç¥æã¯æ«å°ŸïŒã«åŒæ°ãæ¿å ¥ãargumentForCallersãæå®ãããšååŒã³åºãç®æã®åãäœçœ®ã«ãã®ããã¹ããæ¿å ¥ãçç¥æã¯åŒã³åºãåŽã倿ŽããªãïŒæ«å°Ÿã® optional / ããã©ã«ãåŒæ°å°çšïŒãremove:indexã®åŒæ°ãåé€ããã®æ°ä»¥äžã®åŒæ°ãæž¡ããŠããåŒã³åºããã察å¿åãåé€ãreorder:newOrderã«åŸã£ãŠåŒæ°ãªã¹ããšååŒã³åºããåæ§ç¯ãåŒæ°ã®æ°ãäžèŽããªãåŒã³åºãããããšå€±æããŸãã- æäœã¯é ã«é©çšãããåŸç¶ã®æäœã¯å è¡æäœé©çšåŸã®åŒæ°ãªã¹ããåç §ããŸãã
- 泚æ: ã¹ãã¬ããåŒæ°ïŒ
fn(...args)ïŒãå«ãåŒã³åºãã¯ãåŒæ°ã倿Žããæäœã§å€±æããŸããåŒã³åºãå ãå€ãå Žåã¯dryRun: trueã§åœ±é¿ãã¡ã€ã«ãå ã«ç¢ºèªããŠãã ãããåŒæ°ã®ãªããŒã ã¯rename_symbol_by_tsmorphã颿°ã®ç§»åã¯move_symbol_to_file_by_tsmorphã䜿ã£ãŠãã ããã
get_type_at_position_by_tsmorph
TypeScript / JavaScript ãã¡ã€ã«ã®æå®äœçœ®ã«ããããTypeChecker ãæšè«ããåã»ã·ã³ãã«ã»å®£èšç®æãè¿ããŸãã
- ãŠãŒã¹ã±ãŒã¹:
tscãèµ·åããã«ããã®å€æ° / åŒ / 颿°ã®å®éã®æšè«åã¯äœãããçŽ æ©ã確èªãããå Žåã宣èšãã¡ã€ã«ãReadããããå®äŸ¡ã«åã·ã°ããã£ãåŸãããšãããªãã¡ã¯ã¿ãªã³ã°åã«å€ã®å®éã®åœ¢ç¶ã確èªããããšãã - å¿ èŠãªæ å ±: 察象ãã¡ã€ã«ã®ãã¹ãæ€æ»ããäœçœ®ïŒè¡ã»åïŒã
- 泚æ: 空çœãã³ã¡ã³ãè¡ãæãå Žåã¯ãã¡ã€ã«ã¬ãã«ã®æšè«åïŒäŸ:
typeof import("...")ïŒãè¿ããéåžžã¯æå³ããçµæã§ã¯ãããŸãããã¬ã¹ãã³ã¹ã®nodeKindã確èªããŠèå¥åã«åã¿ãŒã²ããããŠãã ããã倿°ã®äœçœ®ãäžæ¬ã§è§£æãããå Žåã¯tscãçŽæ¥äœ¿ã£ãŠãã ããã
find_unused_exports_by_tsmorph
ãããžã§ã¯ãå
šäœãèµ°æ»ãã宣èšãã¡ã€ã«ã®å€ããåç
§ãããŠããªã export ãåè£ãšããŠåæããŸãã
- æ€åºå¯Ÿè±¡: ã€ã³ã©ã€ã³
exportïŒexport function/class/const/let/var/enum/interface/typeïŒãexport defaultïŒèå¥åã»é¢æ°ã»ã¯ã©ã¹ïŒãexport = <Identifier>ã - å€å®æ¹æ³:
findReferencesAsNodes()ã®çµæãããåäžãã¡ã€ã«å ã®åç §ã»ExportDeclarationé äžã®åç §ïŒexport { x } from "./y"çã®çŽç²ãªåãšã¯ã¹ããŒãïŒã»node_moduleså ã®åç §ãé€å€ããæ®ã 0 ä»¶ãªãæªäœ¿çšåè£ãšããŸãã - ãŠãŒã¹ã±ãŒã¹: ãããã³ãŒãæé€ãã¢ãžã¥ãŒã«ã®å
¬éé¢ã®æ£åžããåé€åã«ã¯å¿
ã
find_references_by_tsmorphã§ããã«ãã§ãã¯ããŠãã ããã sameFileRefsïŒåé€ vs unexport ã®å€æïŒ: ååè£ã«ãåäžãã¡ã€ã«å ã§ã®åç §æ°ïŒå®£èšèªèº«ãšåãšã¯ã¹ããŒããµã€ãã¯é€å€ïŒãæ·»ããŸããå ±åãããåè£ã¯å®çŸ©äžã宣èšãã¡ã€ã«ã®å€ã§ã¯æªåç §ããªã®ã§ãåé€ã¢ã¯ã·ã§ã³ã¯ãã®å€ã§æ±ºãŸããŸããsameFileRefs=0: åäžãã¡ã€ã«å ã§ãæªäœ¿çš â çã®ãããã宣èšããšåé€ããŠå®å šïŒtextHits=0ã䜵ãããšãã確å®ïŒãsameFileRefs=1+: åäžãã¡ã€ã«å ã§ã¯äœ¿çšäž âexportããŒã¯ãŒãã ãäžèŠã宣èšã¯æ®ãããšïŒæ¶ããšåäžãã¡ã€ã«å åç §ãå£ããïŒãå ±åããã宣èšãäžåŸåé€ãããšãã«ããå£ããŸãã
textOccurrencesïŒtextHitsïŒ: 宣èšãã¡ã€ã«ä»¥å€ã®ãœãŒã¹å ã§\b<name>\bãåºçŸããåæ°ã0ã¯ãä»ãã¡ã€ã«ã«ååãç¡ããã ãã§ãåäžãã¡ã€ã«å 䜿çšã®æç¡ã¯å¥ésameFileRefsãèŠãããšïŒãã®ãã£ãŒã«ãåç¬ã§ã¯ãåé€ããŠå®å šãã倿ã§ããªãïŒã1+ãªãæååãªãã©ã« / JSX / åçåç §ã®å¯èœæ§ãããããfind_references_by_tsmorphã§èŠç¢ºèªã- default export ã®åœéœæ§:
[default]ã¿ã°ã®ä»ãåè£ïŒexport default <Identifier>/export = <Identifier>ïŒã¯ãfindReferencesAsNodesãimport Foo from "./mod"ã® default import ãšçµã³ã€ããåœéœæ§ã«ãªãããããtextHitsã 0 ããåå倧ãã default export ã¯ã»ãŒäœ¿çšäžãäœä¿¡é ŒãšããŠå¿ ãfind_references_by_tsmorphã§ç¢ºèªããŠãã ããã responseFormat:"list"ïŒããã©ã«ãã1 åè£ 1 è¡ïŒ/"summary"ïŒãããžã§ã¯ãå šäœã®éèšïŒç·æ°ã»åé€å®å šæ§ã®å èš³ã»kind å¥ã»ãã£ã¬ã¯ããªå¥ïŒãå€§èŠæš¡ãªãã§ã¯å šä»¶åæãå¿çãµã€ãºäžéãè¶ ããããã®ã§ããŸã"summary"ã§ãããã³ãŒãã®åããææ¡ããentryPoints/excludeFilePatternsã§çµã£ãŠãã"list"ã§æ£ç¢ºãªäœçœ®ãååŸããéçšãå®å šïŒsummaryã¯maxResultsã«é¢ãããå šäœãã¹ãã£ã³ïŒã- ãªãã·ã§ã³:
entryPointsïŒçµ¶å¯Ÿãã¹é åãå ¬é API ãšããŠåžžã«äœ¿çšæ±ãïŒãexcludeFilePatternsïŒéšåäžèŽã§ã¹ãã£ã³å¯Ÿè±¡å€ã«ïŒãmaxResultsïŒlist ã¢ãŒãã®äžéãããã©ã«ã 100ïŒãexpandNamespaceImportsïŒããã©ã«ã ONïŒã - æ¢ç¥ã®éç: åç
require/import()ããã¡ã€ã«ã·ã¹ãã èŠçŽã«äŸåããã«ãŒãã£ã³ã°ïŒNext.js ã®page.tsxçïŒãæååãªãã¬ã¯ã·ã§ã³è¶ãã®åç §ã¯æ€åºã§ããŸãããentryPoints/excludeFilePatternsã§åè£ãçµã蟌ãã§ãã ããã - monorepo ã® built dist ããã±ãŒãžã¯ç³»çµ±çåœéœæ§: workspace ããã±ãŒãžã package.json ã®
exportsïŒãŸãã¯main/module/typesïŒã§ãã«ãææç©ïŒäŸ:./dist/index.jsïŒãå ¬éããŠããå Žåãä»ããã±ãŒãžããã® import ã¯ãã«ãåºåïŒãŸã㯠node_modulesïŒåŽã«è§£æ±ºãããã¹ãã£ã³å¯Ÿè±¡ã® src åŽã·ã³ãã«ã«çŽã¥ããŸããããã®ããå®éã«æ¶è²»ãããŠãã export ããã®ããã±ãŒãžã ãäžæ¬ã§æªäœ¿çšåè£ã«ãªããŸãããã®åœ¢ã¯æ§é çã«æ€åºããçµæã®å é ã« â ããã±ãŒãžåäœã®èŠåïŒããã±ãŒãžåã»ã¹ãã£ã³å€ãæããšã³ããªãã€ã³ãã»åœ±é¿åè£æ°ïŒãä»ããŸããèŠåãä»ããããã±ãŒãžã®åè£ã¯äœä¿¡é ŒãšããŠæ±ããåé€åã«textHitsãšfind_references_by_tsmorphã§å¿ ã確èªããŠãã ãããåé¿ç: è§£ææã¯ãã®ããã±ãŒãžã®exportsããœãŒã¹ïŒ./src/index.tsçïŒã«åããããåè£ãåå¥ã«æ€èšŒããã
ãã®ã³ã°èšå®
ãµãŒããŒã®åäœãã°ã¯ç°å¢å€æ°ã§å¶åŸ¡ããŸããmcp.json ã® env ãããã¯ã§èšå®ããŸãã
| ç°å¢å€æ° | 説æ | ããã©ã«ã |
|---|---|---|
LOG_LEVEL | ãã°ã®è©³çŽ°åºŠãfatal / error / warn / info / debug / trace / silent | info |
LOG_OUTPUT | åºåå
ãconsole ãŸã㯠file | console |
LOG_FILE_PATH | LOG_OUTPUT=file æã®ãã°ãã¡ã€ã«ã®çµ¶å¯Ÿãã¹ | [ãããžã§ã¯ãã«ãŒã]/app.log |
LOG_OUTPUT=console ãã€éçºç°å¢ïŒNODE_ENV !== 'production'ïŒã§ pino-pretty ãã€ã³ã¹ããŒã«ãããŠããå Žåã¯ãèŠããã圢åŒã§åºåãããŸããMCP ã¯ã©ã€ã¢ã³ããžã®æšæºåºåã®åœ±é¿ãé¿ãããå Žå㯠file ãæå®ããŠãã ããã
èšå®äŸ:
{
"mcpServers": {
"mcp-tsmorph-refactor": {
"command": "npx",
"args": ["-y", "@sirosuzume/mcp-tsmorph-refactor"],
"env": {
"LOG_LEVEL": "debug",
"LOG_OUTPUT": "file",
"LOG_FILE_PATH": "/Users/yourname/logs/mcp-tsmorph.log"
}
}
}
}éçº
åææ¡ä»¶
- Node.jsïŒããŒãžã§ã³ã¯
package.jsonã®voltaãã£ãŒã«ããåç §ïŒ - pnpmïŒããŒãžã§ã³ã¯
package.jsonã®packageManagerãã£ãŒã«ããåç §ïŒ
ã»ããã¢ãããšãã«ã
git clone https://github.com/sirosuzume/mcp-tsmorph-refactor.git
cd mcp-tsmorph-refactor
pnpm install
pnpm build # dist/ ã«åºåäž»ãªã³ãã³ã
pnpm test # ãã¹ãå®è¡
pnpm test:watch # ãŠã©ããã¢ãŒãã§ãã¹ã
pnpm check-types # åãã§ãã¯ïŒã³ã³ãã€ã«ãªãïŒ
pnpm lint # Lint ãã§ãã¯
pnpm lint:fix # Lint ä¿®æ£
pnpm format # ãã©ãŒããã
pnpm inspector # MCP Inspector ã§ãããã°ããŒã«ã«ãã«ãã MCP ã¯ã©ã€ã¢ã³ããã䜿ã
ãã«ãåŸãnode ã§ dist/index.js ãçŽæ¥èµ·åã§ããŸãã
{
"mcpServers": {
"mcp-tsmorph-refactor-dev": {
"command": "node",
"args": ["/path/to/your/local/repo/dist/index.js"],
"env": {
"LOG_LEVEL": "debug"
}
}
}
}ãããã°çšã©ã³ãã£ãŒ
ãµãŒããŒã®èµ·åã·ãŒã±ã³ã¹ãæšæºå
¥åºåã詳现ã«ç¢ºèªãããå Žåã¯ãscripts/mcp_launcher.js ã䜿ããŸããæ¬æ¥ã®ãµãŒããŒããã»ã¹ãåããã»ã¹ãšããŠèµ·åããèµ·åæ
å ±ãåºåã .logs/mcp_launcher.log ã«èšé²ããŸãã
mcp.json ã® command ã "node"ãargs ã scripts/mcp_launcher.js ãžã®ãã¹ã«å€æŽããŠã¯ã©ã€ã¢ã³ããåèµ·åãããšã.logs/mcp_launcher.logïŒããã³ãµãŒããŒèªèº«ã®ãã°ïŒã確èªã§ããŸãã
{
"mcpServers": {
"mcp-tsmorph-refactor": {
"command": "node",
"args": ["scripts/mcp_launcher.js"],
"env": {
"LOG_OUTPUT": "file",
"LOG_FILE_PATH": ".logs/mcp-ts-morph.log"
}
}
}
}ãªãªãŒã¹
ãã®ããã±ãŒãžã¯ GitHub Actions ã¯ãŒã¯ãããŒïŒ.github/workflows/release.ymlïŒãä»ã㊠npm ã«èªåå
¬éãããŸãã
Git ã¿ã°ãããŒãžã§ã³ã®åäžã®çå®ã® source ã§ãã package.json ã® version ãš src/version.ts ã® VERSION ã¯ã©ã¡ãã 0.0.0-development ã«åºå®ãããŠããããªãªãŒã¹ã¯ãŒã¯ãããŒã tag ããå€ãåãåºããŠçŒã蟌ã¿ãŸããæåã§ bump ããå¿
èŠã¯ãããŸããã
å ¬éæé
git checkout main && git pull --ff-only
git tag v1.2.0
git push origin v1.2.0ã¿ã° push ã§ã¯ãŒã¯ãããŒãããªã¬ãŒããã以äžãé ã«å®è¡ããŸãã
- tagïŒ
v1.2.0ïŒãã VERSIONïŒ1.2.0ïŒãæœåºïŒstrict SemVer ã®ã¿ããã¬ãªãªãŒã¹æªãµããŒãïŒ - placeholder ããŒãžã§ã³ã®ãŸãŸ
pnpm test node scripts/release-version.mjs --bake 1.2.0ã§src/version.tsãšpackage.jsonã®versionãæžãæãpnpm builddist/version.jsã«exports.VERSION = "1.2.0";ãå«ãŸããããšãgrep -Fã§ç¢ºèª_version_noteã package.json ããé€å»pnpm publish --provenanceã§ npm ãžå ¬éïŒTrusted Publishing / OIDCïŒ
å®äºåŸãnpm view @sirosuzume/mcp-tsmorph-refactor version ã§åæ ã確èªããŠãã ããã
npm Trusted Publishing ãåæã§ãã
NPM_TOKENã¯å»æ¢æžã¿ã§ãGitHub Actions ã® OIDC ãä»ã㊠publish ãããŸãïŒrelease.ymlã®id-token: writeåç §ïŒã
ãªã tag ãçå®ã® source ã«ããŠããã
æ§éçšã§ã¯ãpackage.json ã® version ã bumpããsrc/mcp/config.ts ã® serverInfo.version ã bumpããã¿ã°ãæã€ãã® 3 æé ã®ãããããå¿ãããšäžæŽåããªãªãŒã¹ãããŠããŸããïŒå®éã«ãºã¬ãå±¥æŽããïŒãæ°éçšã§ã¯éçºäžã¯ãã£ãš 0.0.0-development ã®ãŸãŸã§ããªãªãŒã¹æã« CI ã tag ãèŠãŠå
šç®æãæŽæ°ãããããbump å¿ããæ§é çã«çºçããŸããã
CIïŒ.github/workflows/ci.ymlïŒã¯ PR / main push ã®ãã³ã« node scripts/release-version.mjs --check ãå®è¡ããäž¡ãã¡ã€ã«ã placeholder ã®ãŸãŸã§ããããšã確èªããŸããæã§ bump ãã PR ã¯ããã§å€±æããŸãã
倱ææã®åŸ©æ§
- ã¯ãŒã¯ãããŒéäžã§å€±æããå Žå㯠tag ãåé€ãããmain ã«ä¿®æ£ãããŒãžããŠããæ¬¡ã®ãããã¿ã°ïŒ
vX.Y.(Z+1)ïŒãæã£ãŠãã ããïŒfix-forwardïŒã - åãã¿ã°ã§ã®å publish 㯠npm ã® immutability ã«ããäžå¯èœãªãããtag ã®äžæžãã¯ç¡æå³ã§ãã
ã©ã€ã»ã³ã¹
ãã®ãããžã§ã¯ã㯠MIT ã©ã€ã»ã³ã¹ã®äžã§å ¬éãããŠããŸãã詳现㯠LICENSE ãã¡ã€ã«ãã芧ãã ããã
git clone https://github.com/sirosuzume/mcp-tsmorph-refactor.git
cd mcp-tsmorph-refactor
pnpm install
pnpm build # dist/ ã«åºåNo common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MITâ you can use, modify, and redistribute it under that license's terms.