From cee9664fc28de19e8268c4d79d5739144ea0ceb1 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Mon, 30 Dec 2024 23:08:05 +0400 Subject: [PATCH 01/19] build: started deno migration --- .gitignore | 1 + .vscode/settings.json | 16 +----- biome.json | 30 ----------- bun.lockb | Bin 15966 -> 0 bytes deno.jsonc | 25 +++++++++ deno.lock | 115 ++++++++++++++++++++++++++++++++++++++++++ package.json | 27 ---------- scripts/build.ts | 57 +++++++++++++++++++++ scripts/dev.ts | 30 +++++++++++ src/types.ts | 23 --------- tsconfig.json | 29 ----------- 11 files changed, 229 insertions(+), 124 deletions(-) delete mode 100644 biome.json delete mode 100755 bun.lockb create mode 100644 deno.jsonc create mode 100644 deno.lock delete mode 100644 package.json create mode 100644 scripts/build.ts create mode 100644 scripts/dev.ts delete mode 100644 src/types.ts delete mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index dc4d0cb..395e7b3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules/ .env* build/ .DS_Store + diff --git a/.vscode/settings.json b/.vscode/settings.json index 405d493..cbac569 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,3 @@ { - "typescript.tsdk": "node_modules/typescript/lib", - "editor.defaultFormatter": "biomejs.biome", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "quickfix.biome": "explicit" - }, - "[typescript]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "[json]": { - "editor.defaultFormatter": "biomejs.biome" - }, - "files.insertFinalNewline": false, - "files.autoSave": "off", - "cSpell.words": ["Zodios"] + "deno.enable": true } diff --git a/biome.json b/biome.json deleted file mode 100644 index 2eb0751..0000000 --- a/biome.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": false - }, - "files": { - "ignoreUnknown": false, - "ignore": [] - }, - "formatter": { - "enabled": true, - "indentStyle": "tab" - }, - "organizeImports": { - "enabled": true - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - } -} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 3d7bc347fdcd14299ce7d9f1a1dc9f4faded0e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15966 zcmeHOcU)7+7EUlKiw#*+q(~63VL}g}G!;Qb1W~aeOA8nX2_`|JqJ&~^U{~x7tYATf z6;VO#id}G51;v75ckTMlxyisqU9h}A-tYaK-Rs;b-#6!+DR*XaFg7xekxI;i1tN34 zXe>K8Mx+4`M<@=73=;_XoG`H@DoDl|YoVdWU@!{(_N>nBpB}%C6SYsXXvmzSH?B5X z{7Sx5Ppm0U@7R6T87HU&p^GwNsDBnKRB1I*fl9YzFci`7))eCL;!r9tNG=dd;mwK3 zU^It(8;E~{_$tI25Jw53_?*yS#&Jlufb?<@59*1B8qJpoWYSQ6 zG$m;8I2j-1^nwTF>IpI8JsKz{ro+92|d?Xt@DT;@k@`6NA))i;-) z*~Yh8$2l-VuYH4616SKrL@d+JH0fWdt{3<`HF;!fAGwYHB*k9S#5uzsER}cSq#e(6 z&J7*x$bQqTeReC?)la;Z9CwZvx-uiG;Pc&(>wekIg{? zof{X!ZRTY4+;1<8&NyaU=#_gXYL%&?tJ!3JaH{!;*&VW-9DWl!7F7;h_UDO4o%1{` z5?)Mr7=C)1)`Rw+m#;gyWZbHV^MbX@g&AWCI&2>@*EMl_zjEW;Wqciv1rY^#Tl=`^ z54B%)j<>64{+VY1E}Tv35vA=Ow|KsIk)iY1)muwj+aCI7z`2Sy){(c38>qoB`l*1k z216V?4%kl+Lsu~x!SgMF;0vHKj3osOW9;|pnN=SL!9RnFR)9x+U?_e!-V=asD*X4@ zgtR{wK-~Zj(~An<%0cku0D#3sfoa4VD{1Qem*5TI#ZD!^O}(g^3Iy*5FYYQlmXejN zrsmh*2!1oX5c_?-=GSux{t>*`L;F~Z*zoI!+PMVZ0R~QAmHe|4L;?JsoktFymz@z<1`g`&B z0Pm)1pKyH9*jF-0-L7DCdi!9`Zwdq-3U~{e{NDtIN(8?E@VI_rzyC=8od-OQA20*8 z{u18${=@d$2YAn) zz&C(F`y+T9W;kc@!Lfwn4+F-y7J*n)z!=jwFL8|EHy#7Vn1-_u6}}cD4%Y+>7~|N) zJthW>5wC*@2pHq|hcgNlek4Y|b}Br^m^Oq5^)phX+e3^2V=Om@2X!`s2g8rXi2Y^H z|E4`Zw)lu0^xq7?$7CpZ>C~*zlgu10zhWNUWw*cUvnMwjK22LQ-{flQlvDlkn_tSk zeJtEVe|}rNnWn84_WCfR(7tuvsL6MdZ!^tvHp)+kMs<8mcz(Cs(}j?=+?L%(r(Y^w6FAXxRCoRr>-X-a4lK`DR6#;89UVi_3TZUSGU5(7i>` z{!98U29-2koJ%CIe5)+PJ7;HX+jcv1NiWl$UC+GTnDu5y%aBfEj|UpR?6|YHj$60o z*N={fpL8Md;Q02jbGY(Fto($Osh4L-wtet*q4Cnc7pxW!Z#!tFHMsIJ`%uvssS3&uq^De*PeAKm!Vls$*tU-`^=x_i;dyo1ie z7~#B;{_br%JPb)0^G`vU^;8-!&M^{Lp*&~do1D`&N8ZfnxwWCw@@?7*#S$kc&1@$x zevr8Q?1BCz`U!sX&o@6%X0Y8j$+)NEv#jWtvwDlnR~Vg6Up$k>3)_h5z{+}QpA+zR z@W`rR%cBcg78Ji*J9$v>@4KHdcRTbI_EI+t8#wb!Vy9+fsp1CKIM!lWsRlr;h^_7zW#HX3PHnKpdmHfN8}VTm(K7WQf%ar)!D90MEa z)mK`0cR|)O@?Az-ur@mGiJIoS^X`)ozFAIZH~d{N;a!vI3$|}R>uzAuYlADVqOzMy z@SyVYu=f!SO$M7Y+hoV_9$r88Ji^_Rab3TvGmV#g*D2nzC+i>o)iwF3)M~{R!vUK| z>~t&dVw$n9r%(Kx8RhIjk5e0a=iMynWqx|Z?ngy`tQ7fdS-H-0jQ%z8@9n#_$X;Ph z-l^1fUixB<g`Ssd> zM8B0!8<(sQENC+{VgI`PNu3RB(q46Ir++Hx1vH6}?z`!sf=@#49I1eQkw*O#l_Iq%$Exu=P-W&ee1CN0h@KfL_mCas1E zyP8DVHEEIFJYp`-Ys1R8m&N-HR@rkIbM9zq#ri(Hai@QW+c7lWR)iE{*6;HQ{>a{v zex~1yfRU5aURSypJKVX~WqV(%u%_1=y32yz7mn~A9@8|dw8GwE%e-0rTiy!(Ft*R( z+v1SPrw=9lmQLe^JK^fUn*XjyFv%s@Z|_LQSsE{j9mcj}PpGut5}wgUblUR%nFVc6 zH8JUQZ1~m85jPoFaX_Qzbc)0bbxO&fpZoy+ofh8~+c9y?{C&Wi8mv-gEc%|@Apcy-E+x6W6BDh82^6VT03{z#7}Oeo5C}B)2jq0(?=T1u4XxXc&67<;BT;)-GAeUo>OK{qVeJx zk_1-q{KcvIGb3V)9KBN9y0VM(D_BiRdl%2PJb5j4-;qg6lgi54EDAX3(KP2oaM{cmCCZl~*;xCH+%}v1eKS8N#4P!9QxM8J?kjmxsr89znT^LZSBHg z(*|zq9=7US$>oNZ{T6j;(rA{i%sOZDblpg+vMoo7cZZD(nKA6fvoRq>qvBt?9gIv9 ztt{NO@SfctYp!+NT1ew1`+uZoHQCP3Pfy5{oHY#^UfRUs#EzxU1tH7h4HpiyxzT2E zVMcIC>bBO#`(_mO>%XZyd-vvSP5p?CS{~^kd;N`!w=0A+UUEL5cy}BxxO-6$=n_*T zH|wERl;WN1yW^sZ-3{*tXf%qy10J8zMVHX3Mggqd0(b)LIKVAH^PQN!3V zBg~f3c=4P;0;_}1tnPQ$$a-pQ9yn(HT0=jDw%=&$sw3S`xs<&eE8Ak1vBT(&&%yzx zP0aI>mkb}*(BFJo+|GGMugda0TZL7QUr*y@6Hq4{fdaRbwoW+A5Ja+SbA=J=}&Pz$5@fy*2 zFXtFM6uo#mw_mEmn@%}NLGm@a$))U&JjcXlB`FhpmiOK!w7J>A!)e+qcV5@g-7gK@ z=Y8pNGq?S|jPs?eft%LCrk4q)JN#CV^A*yw^0((`-0=HNrzrC5`T==rr!)p%sJN1? zW07WMc&X!zK7r=%BK6gV)t9WbnJF2H!k8ky`>zsG#cItg%?)BM~79}zmX*IYd z^S)NoC#lC4uWl4*_O{o0rvVf%i#m^*5K@R)LLZ@1#OVVb{k9e_k!wsUnmu(~!4$`) zc_WP_jbEQw8M`9MK|V6!+RORYftPPQy`ZMcH|V>iB2b=sVX$scyEv(eR{>n6blyFF zWnAw?qn55doTzb7(pawecJX`i+SkRNY6HX zg2&Bm(fu|CRNOqf3jSBeGeAc=@5)BZsh`qX z-i=7@nCUdk(L0Yqx?viim{t`#b#d!ubG*9!x#NKEA>Zy^UTSB8gDYk%^$S^MysKlc=}RJ; z9tK`=Zo}VUmdi_7N06F`T_Ul#affnOH*zp+4{E=pCBRk4PnR1(4!h`{qvDC81HQ0`y}pYP1JvS3RE zQxdT^!zV`)9n<#rtA5JVx*+RC;vn z3JC~x>4Wu=6Zx?nQC8Fm zbweFdSJVS-!G;Izf;PbR(N<_Pv>n;@!-7}c zSC+Mh1?mU#DTqI&I@6Ntzy(hV^k$?yW{F3qIy1nM3;)?LdO`{4tsuUg>P!d7!Cf`{ zf=^*qsk}o0W6QPXS~D0!p#b@r~7F zWf(OJOXy_6!E`fF_>1P-2C4vtkgRXyVJO2DY}fLN?+ZO}u*5 zn3F7(vVE>8uvv4htf3*|DNQ_lsS-*b;!90@fK{^D!YN4Q4Nbgw)tJ^G8u(2yh+j4F z2UcT(U?^I(2R88>R`wipDTDZE6W?OgM~NZc+QiFPjkzBth$i$4@yjOu#5L^@&u!vy ztSrHiNPN4APcpVcnT%dcq>sriA#j6F=;l65{brJhf{| zh)+E6<*q4FM}tG?ql#;PyQKW6v3v=)w_L`Th=PQJWDYf;gdZZ4;@_fhLW5*M zpqP9dCrl!a;=muR)InUkBD7FD1DZlj>K3lLRe)E&b8u<5L}Z9K3dRaQlmnLJ2Srh9 zFx4M*h*eVwIBOCdT*s|#>ybyb$`fR0Fld3Rd_AzwKj;(KA#T`z<-{F-D?Z$TiyNpuTusXVd8)=u#Z3vYF3G4 z9PHgXj6$yl6!auzkox+Ue0Kp$USSr&d?R{r_!5a&A{7AhSdLI2t4kQ=ClsiZFW=N7 zHN=3cNl=EcMj@P?*f>(H*p6&UFlkU2U&0BF34^E(!_cb%Gd)R-d@G{hzpPD2tz~zRQv+!7O0{iMk1cVV1Q?8JtXGGQ)W!|~R1CurWrLBR{7NdnV|AcwzE40= zli=9GN?%{E(>`+m#;+X*zkqhic^xAP6@&<=DJiW(0D3iGp(i=i=8RhR>L953{-P1! z40|YViOa zE9FpIQ)(r^{-^dQb?9DuBZCIO4Gky{8&67ive5|<3Sc=C#mG5wo=r6hb7KV}YpXAE zLxUtx@I|(gB1jVTRgy3BRWx4~RLjDNijfLy2}EmyD*P7pYt*BfqHti1uVvR5=lh7k zZeP-p%H+qxHmn&>wUtE!em7b5kgcWY U4^dT*!&*w#qEenY{`da<53BNoH2?qr diff --git a/deno.jsonc b/deno.jsonc new file mode 100644 index 0000000..ce15886 --- /dev/null +++ b/deno.jsonc @@ -0,0 +1,25 @@ +{ + "version": "0.1.0", + "tasks": { + "dev": "deno run -A scripts/dev.ts", + "format": "deno fmt", + "lint": "deno lint", + "build": "deno run --allow-read --allow-net --allow-env scripts/build.ts" + }, + "compilerOptions": { + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noPropertyAccessFromIndexSignature": true + }, + "imports": { + "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.0.4", + "@std/assert": "jsr:@std/assert@1", + "@std/cli": "jsr:@std/cli@^1.0.9", + "@std/dotenv": "jsr:@std/dotenv@^0.225.3", + "@std/fs": "jsr:@std/fs@^1.0.8", + "@std/path": "jsr:@std/path@^1.0.8", + "zod": "npm:zod@^3.24.1" + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..84234e9 --- /dev/null +++ b/deno.lock @@ -0,0 +1,115 @@ +{ + "version": "4", + "specifiers": { + "jsr:@std/assert@1": "1.0.10", + "jsr:@std/cli@^1.0.9": "1.0.9", + "jsr:@std/dotenv@~0.225.3": "0.225.3", + "jsr:@std/fs@^1.0.8": "1.0.8", + "jsr:@std/internal@^1.0.5": "1.0.5", + "jsr:@std/path@^1.0.8": "1.0.8", + "npm:@modelcontextprotocol/sdk@^1.0.4": "1.0.4", + "npm:zod@^3.24.1": "3.24.1" + }, + "jsr": { + "@std/assert@1.0.10": { + "integrity": "59b5cbac5bd55459a19045d95cc7c2ff787b4f8527c0dd195078ff6f9481fbb3", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/cli@1.0.9": { + "integrity": "557e5865af000efbf3f737dcfea5b8ab86453594f4a9cd8d08c9fa83d8e3f3bc" + }, + "@std/dotenv@0.225.3": { + "integrity": "a95e5b812c27b0854c52acbae215856d9cce9d4bbf774d938c51d212711e8d4a" + }, + "@std/fs@1.0.8": { + "integrity": "161c721b6f9400b8100a851b6f4061431c538b204bb76c501d02c508995cffe0", + "dependencies": [ + "jsr:@std/path" + ] + }, + "@std/internal@1.0.5": { + "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" + }, + "@std/path@1.0.8": { + "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + } + }, + "npm": { + "@modelcontextprotocol/sdk@1.0.4": { + "integrity": "sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow==", + "dependencies": [ + "content-type", + "raw-body", + "zod" + ] + }, + "bytes@3.1.2": { + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "content-type@1.0.5": { + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "depd@2.0.0": { + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors@2.0.0": { + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": [ + "depd", + "inherits", + "setprototypeof", + "statuses", + "toidentifier" + ] + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": [ + "safer-buffer" + ] + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "raw-body@3.0.0": { + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dependencies": [ + "bytes", + "http-errors", + "iconv-lite", + "unpipe" + ] + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "setprototypeof@1.2.0": { + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "statuses@2.0.1": { + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier@1.0.1": { + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "unpipe@1.0.0": { + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "zod@3.24.1": { + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" + } + }, + "workspace": { + "dependencies": [ + "jsr:@std/assert@1", + "jsr:@std/cli@^1.0.9", + "jsr:@std/dotenv@~0.225.3", + "jsr:@std/fs@^1.0.8", + "jsr:@std/path@^1.0.8", + "npm:@modelcontextprotocol/sdk@^1.0.4", + "npm:zod@^3.24.1" + ] + } +} diff --git a/package.json b/package.json deleted file mode 100644 index 82e4d44..0000000 --- a/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "mcp-server-drupal", - "version": "0.0.1", - "description": "A Model Context Protocol server", - "private": true, - "type": "module", - "bin": { - "mcp-server-drupal": "./build/mcp-server-drupal" - }, - "files": ["build"], - "scripts": { - "build": "bun build --compile --minify --sourcemap --bytecode ./src/index.ts --outfile ./build/mcp-server-drupal", - "dev": "bun run build --watch", - "inspector": "bunx @modelcontextprotocol/inspector build/mcp-server-drupal", - "lint": "biome check --write" - }, - "dependencies": { - "@modelcontextprotocol/sdk": "0.6.0", - "@zodios/core": "^10.9.6" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@types/bun": "^1.1.14", - "@types/node": "^20.11.24", - "typescript": "^5.3.3" - } -} diff --git a/scripts/build.ts b/scripts/build.ts new file mode 100644 index 0000000..cfec575 --- /dev/null +++ b/scripts/build.ts @@ -0,0 +1,57 @@ +import { resolve } from "@std/path"; +import { z } from "zod"; + +const SDK_KEY = "@modelcontextprotocol/sdk"; + +const ConfigSchema = z.object({ + version: z.string(), + imports: z + .object({ + [SDK_KEY]: z.string(), + }) + .transform((value) => { + const full = value[SDK_KEY]; + const sdkVersionMatch = full.match(/\d+\.\d+\.\d+/); + const sdkVersion = sdkVersionMatch ? sdkVersionMatch[0] : "unknown"; + + return sdkVersion; + }), +}); + +if (import.meta.main) { + try { + const path = resolve(import.meta.dirname!, "..", "deno.jsonc"); + const entry = resolve(import.meta.dirname!, "..", "src", "index.ts"); + const config = JSON.parse(Deno.readTextFileSync(path)); + const parsed = ConfigSchema.safeParse(config); + + if (!parsed.success) { + console.error(`ERROR: ${parsed.error.errors}`); + Deno.exit(5); + } + + const command = new Deno.Command(Deno.execPath(), { + args: [ + "compile", + "--allow-read", + "--allow-net", + "--allow-env", + ...Deno.args, + entry, + `--build-sdk-version=${parsed.data.imports}`, + `--build-app-version=${parsed.data.version}`, + ], + stdout: "inherit", + stderr: "inherit", + }); + + await command.output(); + Deno.exit(0); + } catch (error) { + if (error instanceof Deno.errors.NotFound) { + Deno.exit(5); + } + + console.error("ERROR: ", error); + } +} diff --git a/scripts/dev.ts b/scripts/dev.ts new file mode 100644 index 0000000..f6578e0 --- /dev/null +++ b/scripts/dev.ts @@ -0,0 +1,30 @@ +import { resolve } from "@std/path"; + +async function compile() { + const entry = resolve(import.meta.dirname!, "..", "src", "index.ts"); + const command = new Deno.Command(Deno.execPath(), { + args: ["compile", "-A", "--output=build/mcp-server-drupal", entry], + stdout: "inherit", + stderr: "inherit", + }); + + const { code } = await command.output(); + + if (code !== 0) { + console.log("dev[ERROR]: ", code); + } else { + console.log("dev[INFO]: Compiled successfully"); + } +} + +if (import.meta.main) { + const watcher = Deno.watchFs(resolve(import.meta.dirname!, "..", "src/")); + console.log("\ndev[INFO]: Watching for changes..."); + + for await (const event of watcher) { + if (["modify", "create", "remove"].includes(event.kind)) { + console.log("dev[INFO]: Compiling"); + await compile(); + } + } +} diff --git a/src/types.ts b/src/types.ts deleted file mode 100644 index 01010b1..0000000 --- a/src/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { makeApi } from "@zodios/core"; -import { z } from "zod"; - -declare module "bun" { - interface Env { - DRUPAL_BASE_URL: string; - } -} - -export const ApiDefinition = makeApi([ - { - method: "post", - path: "/mcp/post", - parameters: [ - { - name: "arguments", - type: "Body", - schema: z.any(), - }, - ], - response: z.any(), - }, -]); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index d3ef160..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - // Enable latest features - "lib": ["ESNext"], - "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, - - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, - - // Some stricter flags - "noUnusedLocals": true, - "noUnusedParameters": true, - "noPropertyAccessFromIndexSignature": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules"] -} From 0ac41a30ec6e039d0442dfdd21449a2f5668a173 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Wed, 1 Jan 2025 21:04:37 +0400 Subject: [PATCH 02/19] feat: added cli args formatting --- deno.jsonc | 4 +- deno.lock | 5 ++ src/args/handler.ts | 23 ++++++ src/args/templates.ts | 19 +++++ src/index.ts | 187 +----------------------------------------- 5 files changed, 52 insertions(+), 186 deletions(-) create mode 100644 src/args/handler.ts create mode 100644 src/args/templates.ts diff --git a/deno.jsonc b/deno.jsonc index ce15886..f53b1ba 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,7 +1,8 @@ { "version": "0.1.0", "tasks": { - "dev": "deno run -A scripts/dev.ts", + "dev": "deno run -A --watch src/index.ts", + "dev:build": "deno run -A scripts/dev.ts", "format": "deno fmt", "lint": "deno lint", "build": "deno run --allow-read --allow-net --allow-env scripts/build.ts" @@ -18,6 +19,7 @@ "@std/assert": "jsr:@std/assert@1", "@std/cli": "jsr:@std/cli@^1.0.9", "@std/dotenv": "jsr:@std/dotenv@^0.225.3", + "@std/fmt": "jsr:@std/fmt@^1.0.3", "@std/fs": "jsr:@std/fs@^1.0.8", "@std/path": "jsr:@std/path@^1.0.8", "zod": "npm:zod@^3.24.1" diff --git a/deno.lock b/deno.lock index 84234e9..3870a35 100644 --- a/deno.lock +++ b/deno.lock @@ -4,6 +4,7 @@ "jsr:@std/assert@1": "1.0.10", "jsr:@std/cli@^1.0.9": "1.0.9", "jsr:@std/dotenv@~0.225.3": "0.225.3", + "jsr:@std/fmt@^1.0.3": "1.0.3", "jsr:@std/fs@^1.0.8": "1.0.8", "jsr:@std/internal@^1.0.5": "1.0.5", "jsr:@std/path@^1.0.8": "1.0.8", @@ -23,6 +24,9 @@ "@std/dotenv@0.225.3": { "integrity": "a95e5b812c27b0854c52acbae215856d9cce9d4bbf774d938c51d212711e8d4a" }, + "@std/fmt@1.0.3": { + "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" + }, "@std/fs@1.0.8": { "integrity": "161c721b6f9400b8100a851b6f4061431c538b204bb76c501d02c508995cffe0", "dependencies": [ @@ -106,6 +110,7 @@ "jsr:@std/assert@1", "jsr:@std/cli@^1.0.9", "jsr:@std/dotenv@~0.225.3", + "jsr:@std/fmt@^1.0.3", "jsr:@std/fs@^1.0.8", "jsr:@std/path@^1.0.8", "npm:@modelcontextprotocol/sdk@^1.0.4", diff --git a/src/args/handler.ts b/src/args/handler.ts new file mode 100644 index 0000000..88de22e --- /dev/null +++ b/src/args/handler.ts @@ -0,0 +1,23 @@ +import { parseArgs } from "@std/cli"; +import { HELP_MESSAGE, VERSION_FRAME } from "./templates.ts"; + +const flags = parseArgs(Deno.args, { + boolean: ["help", "version"], + string: ["drupal-url", "build-sdk-version", "build-app-version"], + default: { + ["build-sdk-version"]: "dev", + ["build-app-version"]: "dev", + }, +}); + +if (flags.help) { + console.info(HELP_MESSAGE); + Deno.exit(0); +} + +if (flags.version) { + console.log( + VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!) + ); + Deno.exit(0); +} diff --git a/src/args/templates.ts b/src/args/templates.ts new file mode 100644 index 0000000..9f941ad --- /dev/null +++ b/src/args/templates.ts @@ -0,0 +1,19 @@ +import { bold, yellow, cyan } from "@std/fmt/colors"; + +const HELP_MESSAGE = ` +${bold("Usage:")} ${yellow("mcp-server-drupal [OPTIONS]")} + +${bold("Options:")} + ${cyan("--drupal-url")} The URL of the Drupal site + ${cyan("--version")} The version of the server + +${bold(yellow("Drupal Module:"))} https://www.drupal.org/project/mcp +${bold(yellow("Docs:"))} https://mcp-77a54f.pages.drupalcode.org +`; + +const VERSION_FRAME = (core: string, sdk: string) => ` +MCP Server: ${yellow(core)} +MCP SDK: ${yellow(sdk)} +`; + +export { HELP_MESSAGE, VERSION_FRAME }; diff --git a/src/index.ts b/src/index.ts index b75f1a7..cab38da 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,185 +1,2 @@ -#!/usr/bin/env node - -/** - * A simple Drupal MCP server to communicate drupal instance - */ - -import { parseArgs } from "node:util"; -import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { - CallToolRequestSchema, - ListResourceTemplatesRequestSchema, - ListResourcesRequestSchema, - ListToolsRequestSchema, - ReadResourceRequestSchema, - type Resource, - type ResourceTemplate, - type Tool, -} from "@modelcontextprotocol/sdk/types.js"; -import { Zodios, type ZodiosInstance } from "@zodios/core"; -import { ApiDefinition } from "./types.js"; - -const { values } = parseArgs({ - args: Bun.argv, - options: { - drupalBaseUrl: { - type: "string", - short: "d", - }, - }, - strict: true, - allowPositionals: true, -}); - -const DRUPAL_BASE_URL = values.drupalBaseUrl || process.env.DRUPAL_BASE_URL; - -if (!DRUPAL_BASE_URL) { - console.error(` -Error: DRUPAL_BASE_URL is required! - -Please pass the base URL of your Drupal site as a command line argument: -Command line argument: --drupal-base-url=https://your-drupal-site.com (or -d) -`); - process.exit(1); -} - -class DrupalMcpServer { - private readonly server: Server; - private readonly api: ZodiosInstance; - private _tools: Array = []; - private _resourceTemplates: Array = []; - private _resources: Array = []; - - constructor() { - this.server = new Server( - { - name: "mcp-server-drupal", - version: "0.0.1", - }, - { - capabilities: { - tools: {}, - resources: {}, - }, - }, - ); - - this.api = new Zodios(DRUPAL_BASE_URL as string, ApiDefinition); - } - - private setupResourceHandlers(): void { - if (this._resourceTemplates.length > 0) { - console.error(this._resourceTemplates); - - this.server.setRequestHandler( - ListResourceTemplatesRequestSchema, - async () => ({ - resourceTemplates: this._resourceTemplates, - }), - ); - } - if (this._resources.length > 0) { - this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ - resources: this._resources, - })); - } - - this.server.setRequestHandler( - ReadResourceRequestSchema, - async (request) => { - const response = await this.api.post("/mcp/post", { - jsonrpc: "2.0", - id: 2, - method: "resources/read", - params: { - uri: request.params.uri, - }, - }); - - return response.result; - }, - ); - } - - private setupToolHandlers(): void { - this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: this._tools, - })); - - this.server.setRequestHandler(CallToolRequestSchema, async (request) => { - const response = await this.api.post("/mcp/post", { - jsonrpc: "2.0", - id: 2, - method: "tools/call", - params: { - name: request.params.name, - arguments: request.params.arguments, - }, - }); - console.error(response.result); - - return response.result; - }); - } - - private setupErrorHandling(): void { - this.server.onerror = (error) => { - console.error("[MCP Error]", error); - }; - - process.on("SIGINT", async () => { - await this.server.close(); - - process.exit(0); - }); - } - - async init() { - const [tools, resourceTemplates, resources] = await Promise.all([ - this.api.post("/mcp/post", { - jsonrpc: "2.0", - id: 0, - method: "tools/list", - }), - this.api.post("/mcp/post", { - jsonrpc: "2.0", - id: 1, - method: "resources/templates/list", - }), - this.api.post("/mcp/post", { - jsonrpc: "2.0", - id: 2, - method: "resources/list", - }), - ]); - - this._tools = tools.result.tools; - this._resourceTemplates = resourceTemplates.result.resourceTemplates; - this._resources = resources.result.resources; - - if (this._tools.length > 0) { - this.setupToolHandlers(); - } - - if (this._resourceTemplates.length > 0 || this._resources.length > 0) { - this.setupResourceHandlers(); - } - - this.setupErrorHandling(); - - return this; - } - - async run() { - const transport = new StdioServerTransport(); - - await this.server.connect(transport); - - // Although this is just an informative message, we must log to stderr, - // to avoid interfering with MCP communication that happens on stdout. - console.error("Drupal MCP server is running"); - } -} - -new DrupalMcpServer().init().then((server) => server.run()); +import "@std/dotenv/load"; +import "./args/handler.ts"; From 7fad4fc7c9aeb22c3a34ff6a44347d917b9b607b Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 00:57:09 +0400 Subject: [PATCH 03/19] feat: implement drupal proxy client --- src/drupal/client.ts | 81 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/drupal/client.ts diff --git a/src/drupal/client.ts b/src/drupal/client.ts new file mode 100644 index 0000000..7b8aad9 --- /dev/null +++ b/src/drupal/client.ts @@ -0,0 +1,81 @@ +import { bold, red } from "@std/fmt/colors"; +import { + Tool, + Resource, + ResourceTemplate, +} from "@modelcontextprotocol/sdk/types.ts"; + +enum MCPMethods { + TOOLS = "tools/list", + RESOURCES = "resources/list", + TEMPLATES = "resources/templates/list", + CALL = "tools/call", + READ = "resources/read", +} + +type JRPCResponse = { + jsonrpc: string; + id: string; + result: { + [key in K]: T; + }; +}; + +function createDrupalProxy(url: string) { + return { + async tools(): Promise { + const data = await jrpc<"tools", Tool[]>(url, MCPMethods.TOOLS); + return data.result.tools; + }, + async resources(): Promise { + const data = await jrpc<"resources", Resource[]>( + url, + MCPMethods.RESOURCES + ); + + return data.result.resources; + }, + async templates(): Promise { + const data = await jrpc<"resourceTemplates", ResourceTemplate[]>( + url, + MCPMethods.TEMPLATES + ); + return data.result.resourceTemplates; + }, + async call(name: string, args: Record) { + const data = await jrpc<"_", unknown>(url, MCPMethods.CALL, { + name, + args, + }); + return data.result; + }, + async read(params: Record) { + const data = await jrpc<"_", unknown>(url, MCPMethods.READ, params); + return data.result; + }, + }; +} + +function jrpc( + url: string, + method: MCPMethods, + params?: Record +): Promise> { + const request = new Request(url, { + method: "POST", + body: JSON.stringify({ + jsonrpc: "2.0", + id: crypto.randomUUID(), + method, + params: params, + }), + }); + + return fetch(request) + .then((response) => response.json()) + .catch((error) => { + console.error(`${bold(red("ERROR:"))} ${error}`); + }); +} + +export { createDrupalProxy }; From 851ae4f4e55b785bd87edbe90be6a0c4c3169f57 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 15:43:59 +0400 Subject: [PATCH 04/19] feat: added error formatter --- src/args/handler.ts | 23 ---------------------- src/cli/args.ts | 36 ++++++++++++++++++++++++++++++++++ src/cli/format.ts | 9 +++++++++ src/{args => cli}/templates.ts | 8 +++++++- 4 files changed, 52 insertions(+), 24 deletions(-) delete mode 100644 src/args/handler.ts create mode 100644 src/cli/args.ts create mode 100644 src/cli/format.ts rename src/{args => cli}/templates.ts (69%) diff --git a/src/args/handler.ts b/src/args/handler.ts deleted file mode 100644 index 88de22e..0000000 --- a/src/args/handler.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { parseArgs } from "@std/cli"; -import { HELP_MESSAGE, VERSION_FRAME } from "./templates.ts"; - -const flags = parseArgs(Deno.args, { - boolean: ["help", "version"], - string: ["drupal-url", "build-sdk-version", "build-app-version"], - default: { - ["build-sdk-version"]: "dev", - ["build-app-version"]: "dev", - }, -}); - -if (flags.help) { - console.info(HELP_MESSAGE); - Deno.exit(0); -} - -if (flags.version) { - console.log( - VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!) - ); - Deno.exit(0); -} diff --git a/src/cli/args.ts b/src/cli/args.ts new file mode 100644 index 0000000..cd7bbd1 --- /dev/null +++ b/src/cli/args.ts @@ -0,0 +1,36 @@ +import { parseArgs } from "@std/cli"; +import { + DRUPAL_URL_REQUIRED, + HELP_MESSAGE, + VERSION_FRAME, +} from "./templates.ts"; + +const flags = parseArgs(Deno.args, { + boolean: ["help", "version"], + string: ["drupal-url", "build-sdk-version", "build-app-version"], + default: { + ["build-sdk-version"]: "dev", + ["build-app-version"]: "dev", + }, +}); + +function setup() { + if (flags.help) { + console.info(HELP_MESSAGE); + Deno.exit(0); + } + + if (flags.version) { + console.log( + VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!) + ); + Deno.exit(0); + } + + if (!flags["drupal-url"]) { + console.error(DRUPAL_URL_REQUIRED); + Deno.exit(1); + } +} + +export { setup, flags }; diff --git a/src/cli/format.ts b/src/cli/format.ts new file mode 100644 index 0000000..b4ef487 --- /dev/null +++ b/src/cli/format.ts @@ -0,0 +1,9 @@ +import { bold, red } from "@std/fmt/colors"; + +const Formatter = { + error(err: unknown) { + return `\n${bold(red("ERROR:"))} ${err}`; + }, +}; + +export { Formatter }; diff --git a/src/args/templates.ts b/src/cli/templates.ts similarity index 69% rename from src/args/templates.ts rename to src/cli/templates.ts index 9f941ad..9df5ba1 100644 --- a/src/args/templates.ts +++ b/src/cli/templates.ts @@ -1,4 +1,5 @@ import { bold, yellow, cyan } from "@std/fmt/colors"; +import { Formatter } from "./format.ts"; const HELP_MESSAGE = ` ${bold("Usage:")} ${yellow("mcp-server-drupal [OPTIONS]")} @@ -11,9 +12,14 @@ ${bold(yellow("Drupal Module:"))} https://www.drupal.org/project/mcp ${bold(yellow("Docs:"))} https://mcp-77a54f.pages.drupalcode.org `; +const DRUPAL_URL_REQUIRED = Formatter.error(`${cyan( + "--drupal-url" +)} is required, please provide the URL of the Drupal instance +`); + const VERSION_FRAME = (core: string, sdk: string) => ` MCP Server: ${yellow(core)} MCP SDK: ${yellow(sdk)} `; -export { HELP_MESSAGE, VERSION_FRAME }; +export { HELP_MESSAGE, VERSION_FRAME, DRUPAL_URL_REQUIRED }; From b54e698c097c2333d590f65f16678d04e5719e96 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 15:45:25 +0400 Subject: [PATCH 05/19] feat: added preflight call --- src/drupal/client.ts | 17 ++++++++++------ src/drupal/helpers.ts | 11 +++++++++++ src/drupal/preflight.ts | 43 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/drupal/helpers.ts create mode 100644 src/drupal/preflight.ts diff --git a/src/drupal/client.ts b/src/drupal/client.ts index 7b8aad9..1e27451 100644 --- a/src/drupal/client.ts +++ b/src/drupal/client.ts @@ -1,9 +1,10 @@ -import { bold, red } from "@std/fmt/colors"; import { Tool, Resource, ResourceTemplate, } from "@modelcontextprotocol/sdk/types.ts"; +import { Formatter } from "../cli/format.ts"; +import { composeMCPEndpoint } from "./helpers.ts"; enum MCPMethods { TOOLS = "tools/list", @@ -21,7 +22,11 @@ type JRPCResponse = { }; }; -function createDrupalProxy(url: string) { +export type DrupalProxy = ReturnType; + +function createDrupalProxy(base: string) { + const url = composeMCPEndpoint(base); + return { async tools(): Promise { const data = await jrpc<"tools", Tool[]>(url, MCPMethods.TOOLS); @@ -42,10 +47,10 @@ function createDrupalProxy(url: string) { ); return data.result.resourceTemplates; }, - async call(name: string, args: Record) { + async call(name: string, args?: Record) { const data = await jrpc<"_", unknown>(url, MCPMethods.CALL, { name, - args, + arguments: args, }); return data.result; }, @@ -65,7 +70,7 @@ function jrpc( method: "POST", body: JSON.stringify({ jsonrpc: "2.0", - id: crypto.randomUUID(), + id: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), method, params: params, }), @@ -74,7 +79,7 @@ function jrpc( return fetch(request) .then((response) => response.json()) .catch((error) => { - console.error(`${bold(red("ERROR:"))} ${error}`); + console.error(Formatter.error(error)); }); } diff --git a/src/drupal/helpers.ts b/src/drupal/helpers.ts new file mode 100644 index 0000000..c963cff --- /dev/null +++ b/src/drupal/helpers.ts @@ -0,0 +1,11 @@ +const DRUPAL_MCP_SUFFIX = "mcp/post"; + +function composeMCPEndpoint(base: string) { + if (base.endsWith("/")) { + return `${base}${DRUPAL_MCP_SUFFIX}`; + } + + return `${base}/${DRUPAL_MCP_SUFFIX}`; +} + +export { composeMCPEndpoint }; diff --git a/src/drupal/preflight.ts b/src/drupal/preflight.ts new file mode 100644 index 0000000..2a53ff6 --- /dev/null +++ b/src/drupal/preflight.ts @@ -0,0 +1,43 @@ +import { + ListResourceTemplatesRequestSchema, + ListResourcesRequestSchema, + ListToolsRequestSchema, +} from "@modelcontextprotocol/sdk/types.js"; +import { Formatter } from "../cli/format.ts"; +import { DrupalProxy } from "./client.ts"; + +async function preflight(client: DrupalProxy) { + try { + const [tools, resources, templates] = await Promise.all([ + client.tools(), + client.resources(), + client.templates(), + ]); + + const available = [ + { data: tools, key: "tools", schema: ListToolsRequestSchema }, + { data: resources, key: "resources", schema: ListResourcesRequestSchema }, + { + data: templates, + key: "resourceTemplates", + schema: ListResourceTemplatesRequestSchema, + }, + ].filter(({ data }) => data.length); + + if (!available.length) { + console.error( + Formatter.error( + "No available instruments were found during the preflight check" + ) + ); + Deno.exit(1); + } + + return available; + } catch (error) { + console.error(Formatter.error(error)); + Deno.exit(1); + } +} + +export { preflight }; From 5f7f58ec7f204f902e583d9263bb0789d0b972b9 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 15:45:37 +0400 Subject: [PATCH 06/19] build: added inspector script --- deno.jsonc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index f53b1ba..df7fa88 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,11 +1,11 @@ { "version": "0.1.0", "tasks": { - "dev": "deno run -A --watch src/index.ts", - "dev:build": "deno run -A scripts/dev.ts", + "dev": "deno run -A scripts/dev.ts", "format": "deno fmt", "lint": "deno lint", - "build": "deno run --allow-read --allow-net --allow-env scripts/build.ts" + "build": "deno run --allow-read --allow-net --allow-env scripts/build.ts", + "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal" }, "compilerOptions": { "strict": true, From eebc1f2743ebcb3c4fd74c7b715435d396d411fc Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 16:13:07 +0400 Subject: [PATCH 07/19] feat: added server logs --- src/cli/args.ts | 4 ++++ src/cli/format.ts | 5 ++++- src/index.ts | 47 ++++++++++++++++++++++++++++++++++++++++++++++- src/server.ts | 26 ++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/server.ts diff --git a/src/cli/args.ts b/src/cli/args.ts index cd7bbd1..02208f2 100644 --- a/src/cli/args.ts +++ b/src/cli/args.ts @@ -31,6 +31,10 @@ function setup() { console.error(DRUPAL_URL_REQUIRED); Deno.exit(1); } + + Deno.addSignalListener("SIGINT", () => { + Deno.exit(0); + }); } export { setup, flags }; diff --git a/src/cli/format.ts b/src/cli/format.ts index b4ef487..0be1749 100644 --- a/src/cli/format.ts +++ b/src/cli/format.ts @@ -1,9 +1,12 @@ -import { bold, red } from "@std/fmt/colors"; +import { bold, green, red } from "@std/fmt/colors"; const Formatter = { error(err: unknown) { return `\n${bold(red("ERROR:"))} ${err}`; }, + info(msg: string) { + return `\n${bold(green("INFO:"))} ${msg}`; + }, }; export { Formatter }; diff --git a/src/index.ts b/src/index.ts index cab38da..499788c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,47 @@ import "@std/dotenv/load"; -import "./args/handler.ts"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { Server } from "./server.ts"; +import { createDrupalProxy } from "./drupal/client.ts"; +import { flags, setup } from "./cli/args.ts"; +import { preflight } from "./drupal/preflight.ts"; +import { + CallToolRequestSchema, + ReadResourceRequestSchema, +} from "@modelcontextprotocol/sdk/types.js"; +import { Formatter } from "./cli/format.ts"; + +if (import.meta.main) { + setup(); + + const transport = new StdioServerTransport(); + const client = createDrupalProxy(flags["drupal-url"]!); + const instruments = await preflight(client); + + for (const { data, key, schema } of instruments) { + // deno-lint-ignore require-await + Server.setRequestHandler(schema, async () => { + return { + [key]: data, + }; + }); + } + + Server.setRequestHandler(CallToolRequestSchema, async (request) => { + return await client.call(request.params.name, request.params.arguments); + }); + + Server.setRequestHandler(ReadResourceRequestSchema, async (request) => { + return await client.read({ + uri: request.params.uri, + }); + }); + + await Server.connect(transport) + .then(() => { + console.error(Formatter.info("Drupal MCP server is running on STDIO")); + }) + .catch((error) => { + console.error(Formatter.error(error)); + Deno.exit(1); + }); +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..67b5575 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,26 @@ +import { Server as MCPServer } from "@modelcontextprotocol/sdk/server/index.js"; +import { flags } from "./cli/args.ts"; +import { Formatter } from "./cli/format.ts"; + +const Server = new MCPServer( + { + name: "mcp-server-drupal", + version: flags["build-app-version"]!, + }, + { + capabilities: { + tools: {}, + resources: {}, + }, + } +); + +Server.onerror = (error) => { + console.error(Formatter.error(error)); +}; + +Server.oninitialized = () => { + console.error(Formatter.info("Initialization was successful")); +}; + +export { Server }; From c9652e7b69a22b8e0605b9621bf433bf394b8ac6 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 17:13:38 +0400 Subject: [PATCH 08/19] chore: added LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9bf4ae9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Omedia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From 793cc3ca06059bc31dd516482f22b6e8353f22bb Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 18:44:00 +0400 Subject: [PATCH 09/19] chore: adjusted formatting --- src/cli/args.ts | 4 ++-- src/cli/templates.ts | 12 +++++++----- src/drupal/client.ts | 8 ++++---- src/drupal/preflight.ts | 6 +++--- src/server.ts | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/cli/args.ts b/src/cli/args.ts index 02208f2..e2a2a0c 100644 --- a/src/cli/args.ts +++ b/src/cli/args.ts @@ -22,7 +22,7 @@ function setup() { if (flags.version) { console.log( - VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!) + VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!), ); Deno.exit(0); } @@ -37,4 +37,4 @@ function setup() { }); } -export { setup, flags }; +export { flags, setup }; diff --git a/src/cli/templates.ts b/src/cli/templates.ts index 9df5ba1..27af080 100644 --- a/src/cli/templates.ts +++ b/src/cli/templates.ts @@ -1,4 +1,4 @@ -import { bold, yellow, cyan } from "@std/fmt/colors"; +import { bold, cyan, yellow } from "@std/fmt/colors"; import { Formatter } from "./format.ts"; const HELP_MESSAGE = ` @@ -12,9 +12,11 @@ ${bold(yellow("Drupal Module:"))} https://www.drupal.org/project/mcp ${bold(yellow("Docs:"))} https://mcp-77a54f.pages.drupalcode.org `; -const DRUPAL_URL_REQUIRED = Formatter.error(`${cyan( - "--drupal-url" -)} is required, please provide the URL of the Drupal instance +const DRUPAL_URL_REQUIRED = Formatter.error(`${ + cyan( + "--drupal-url", + ) +} is required, please provide the URL of the Drupal instance `); const VERSION_FRAME = (core: string, sdk: string) => ` @@ -22,4 +24,4 @@ MCP Server: ${yellow(core)} MCP SDK: ${yellow(sdk)} `; -export { HELP_MESSAGE, VERSION_FRAME, DRUPAL_URL_REQUIRED }; +export { DRUPAL_URL_REQUIRED, HELP_MESSAGE, VERSION_FRAME }; diff --git a/src/drupal/client.ts b/src/drupal/client.ts index 1e27451..e03de23 100644 --- a/src/drupal/client.ts +++ b/src/drupal/client.ts @@ -1,7 +1,7 @@ import { - Tool, Resource, ResourceTemplate, + Tool, } from "@modelcontextprotocol/sdk/types.ts"; import { Formatter } from "../cli/format.ts"; import { composeMCPEndpoint } from "./helpers.ts"; @@ -35,7 +35,7 @@ function createDrupalProxy(base: string) { async resources(): Promise { const data = await jrpc<"resources", Resource[]>( url, - MCPMethods.RESOURCES + MCPMethods.RESOURCES, ); return data.result.resources; @@ -43,7 +43,7 @@ function createDrupalProxy(base: string) { async templates(): Promise { const data = await jrpc<"resourceTemplates", ResourceTemplate[]>( url, - MCPMethods.TEMPLATES + MCPMethods.TEMPLATES, ); return data.result.resourceTemplates; }, @@ -64,7 +64,7 @@ function createDrupalProxy(base: string) { function jrpc( url: string, method: MCPMethods, - params?: Record + params?: Record, ): Promise> { const request = new Request(url, { method: "POST", diff --git a/src/drupal/preflight.ts b/src/drupal/preflight.ts index 2a53ff6..44a80f2 100644 --- a/src/drupal/preflight.ts +++ b/src/drupal/preflight.ts @@ -1,6 +1,6 @@ import { - ListResourceTemplatesRequestSchema, ListResourcesRequestSchema, + ListResourceTemplatesRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; import { Formatter } from "../cli/format.ts"; @@ -27,8 +27,8 @@ async function preflight(client: DrupalProxy) { if (!available.length) { console.error( Formatter.error( - "No available instruments were found during the preflight check" - ) + "No available instruments were found during the preflight check", + ), ); Deno.exit(1); } diff --git a/src/server.ts b/src/server.ts index 67b5575..1fea04f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -12,7 +12,7 @@ const Server = new MCPServer( tools: {}, resources: {}, }, - } + }, ); Server.onerror = (error) => { From 49f47469da57bb5f2d3f38a7c31b120235f301ff Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 18:44:14 +0400 Subject: [PATCH 10/19] build: added --allow-run for build task --- deno.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.jsonc b/deno.jsonc index df7fa88..2e699fc 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -4,7 +4,7 @@ "dev": "deno run -A scripts/dev.ts", "format": "deno fmt", "lint": "deno lint", - "build": "deno run --allow-read --allow-net --allow-env scripts/build.ts", + "build": "deno run --allow-read --allow-net --allow-env --allow-run scripts/build.ts", "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal" }, "compilerOptions": { From 550389037097e95a8b9d4fd641674531487f230a Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 18:49:50 +0400 Subject: [PATCH 11/19] docs: updated README --- README.md | 106 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index bcfb67a..8610863 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,102 @@ # MCP Server for Drupal -A Model Context Protocol server +![image](https://github.com/user-attachments/assets/3fc18e9b-acd6-4490-8f43-504d812354dc) + +This is a typescript based companion +[Model Context Protocol(MCP)](https://modelcontextprotocol.io/introduction) +server for the [Drupal MCP module](https://www.drupal.org/project/mcp) that +works with the `STDIO` transport. In order to use `SSE` transport this server is +not required. + +## Installation and Usage + +- Download the binary for your system from the + [releases](https://github.com/Omedia/mcp-server-drupal/releases) page + +- To use it with [Claude Desktop](https://claude.ai/download) you need to add + the server config in the `claude_desktop_config.json` file. The file is + located at the following path: + + - On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` + - On Windows: `%APPDATA%/Claude/claude_desktop_config.json` + + ```json + { + "mcpServers": { + "mcp-server-drupal": { + "command": "__BINARY_PATH__", + "args": ["--drupal-url", "__DRUPAL_BASE_URL__"], + "env": {} + } + } + } + ``` + + - Replace `__BINARY_PATH__` with the path to the downloaded binary + - Replace `__DRUPAL_BASE_URL__` with the base URL of your Drupal site -This is a TypeScript-based MCP server for Drupal. + > [!IMPORTANT] > `--drupal-url` is a required argument -## Features +- To check the server and sdk version run the following command: -### Resources +```bash +mcp-server-drupal --version +``` -- All the resources defined by the Drupal API during the initialization phase +- To check the available commands run the following command: -### Tools +```bash +mcp-server-drupal --help +``` -- All the tools defined by the Drupal API during the initialization phase +## MCP -### Prompts +- All instruments are defined by the Drupal API during the initialization phase -- All the prompts defined by the Drupal API during the initialization phase +> [!NOTE] +> The server now exposes the following +> +> - Resources (templates, reads) +> - Tools (calls) +> +> No prompts are exposed by the server for now ## Development -Install dependencies: +This project is built with [Deno](https://deno.land/). -```bash -bun install -``` +> [!NOTE] +> Use deno version `2.0.0` or above -Build the server: +Install dependencies: ```bash -bun run build +deno install ``` For development with auto-rebuild: ```bash -bun run dev +bun task dev ``` -## Installation - -To use with Claude Desktop, add the server config: - -On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json` -On Windows: `%APPDATA%/Claude/claude_desktop_config.json` +Build the server: -```json -{ - "mcpServers": { - "mcp-server-drupal": { - "command": "__BINARY_PATH__", - "args": ["--drupalBaseUrl", "__DRUPAL_BASE_URL__"], - "env": {} - } - } -} +```bash +deno task build --output build/mcp-server-drupal ``` +> [!TIP] +> To build for the specific platform use the `--target` flag and check the +> [docs](https://docs.deno.com/runtime/reference/cli/compile/#supported-targets) + ### Debugging -Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector), which is available as a package script: +Since MCP servers communicate over stdio, debugging can be challenging. We +recommend using the +[MCP Inspector](https://github.com/modelcontextprotocol/inspector), which is +available as a deno task: ```bash -bun run inspector +deno task inspector --drupal-url [DRUPAL_BASE_URL] ``` - -The Inspector will provide a URL to access debugging tools in your browser. From b2c2cc8916774faf753be03882e85c72ce15ad55 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 19:03:37 +0400 Subject: [PATCH 12/19] ci: added lint and build check --- .github/workflows/check.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..b094b12 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,25 @@ +name: check + +on: + push: + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: denoland/setup-deno@v2 + with: + deno-version: "2.x" + - run: deno task lint + - run: deno fmt --check + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: denoland/setup-deno@v2 + with: + deno-version: "2.x" + - run: deno task build --output=build/mcp-server-drupal From 5f416c2092c0be5b6890608976486cb68a872150 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 19:29:11 +0400 Subject: [PATCH 13/19] chore: corrected readme note --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8610863..1fdab9c 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,9 @@ not required. - Replace `__BINARY_PATH__` with the path to the downloaded binary - Replace `__DRUPAL_BASE_URL__` with the base URL of your Drupal site - > [!IMPORTANT] > `--drupal-url` is a required argument + > [!IMPORTANT] + > + > `--drupal-url` is a required argument - To check the server and sdk version run the following command: From 7a43ebd9dfc4912ab73a020e4c9c223de07ec040 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 19:39:59 +0400 Subject: [PATCH 14/19] build: remove bun build pipeline --- .github/workflows/main.yml | 44 -------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index ef19131..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: main - -env: - PACKAGE_NAME: "mcp-server-drupal" - TARGET_LIST: "bun-linux-x64-modern,bun-linux-arm64,bun-windows-x64-modern,bun-darwin-arm64,bun-darwin-x64" - -on: - push: - pull_request: - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - - run: bun install - - run: bun run biome ci --reporter=github - - build-and-release: - runs-on: ubuntu-latest - needs: lint - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - - name: get-npm-version - id: package-version - uses: martinbeentjes/npm-get-version-action@v1.3.1 - - - run: bun install - - run: | - for target in $(echo $TARGET_LIST | tr "," "\n") - do - binary_name=$(echo $target | sed "s/^bun-/$PACKAGE_NAME-${{ steps.package-version.outputs.current-version}}-/" | sed "s/-/_/g") - bun build --compile --target=$target --minify --sourcemap --bytecode ./src/index.ts --outfile ./build/$binary_name - done - - name: Release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - files: | - build/* From adc8edf59ebd09ce33e5a1307d748eaa40165642 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Thu, 2 Jan 2025 19:52:56 +0400 Subject: [PATCH 15/19] docs: added development note --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1fdab9c..667e673 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ server for the [Drupal MCP module](https://www.drupal.org/project/mcp) that works with the `STDIO` transport. In order to use `SSE` transport this server is not required. +> [!IMPORTANT] +> Both the Drupal module and this server are in active development. Use them at +> your own risk. + ## Installation and Usage - Download the binary for your system from the From 3a5be57b3aba1800ed535d57bb916a6233a68576 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Wed, 8 Jan 2025 16:25:41 +0400 Subject: [PATCH 16/19] build: made mode an index file --- scripts/build.ts | 2 +- scripts/dev.ts | 2 +- src/{index.ts => mod.ts} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{index.ts => mod.ts} (100%) diff --git a/scripts/build.ts b/scripts/build.ts index cfec575..cc6510a 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -21,7 +21,7 @@ const ConfigSchema = z.object({ if (import.meta.main) { try { const path = resolve(import.meta.dirname!, "..", "deno.jsonc"); - const entry = resolve(import.meta.dirname!, "..", "src", "index.ts"); + const entry = resolve(import.meta.dirname!, "..", "src", "mod.ts"); const config = JSON.parse(Deno.readTextFileSync(path)); const parsed = ConfigSchema.safeParse(config); diff --git a/scripts/dev.ts b/scripts/dev.ts index f6578e0..a6826b7 100644 --- a/scripts/dev.ts +++ b/scripts/dev.ts @@ -1,7 +1,7 @@ import { resolve } from "@std/path"; async function compile() { - const entry = resolve(import.meta.dirname!, "..", "src", "index.ts"); + const entry = resolve(import.meta.dirname!, "..", "src", "mod.ts"); const command = new Deno.Command(Deno.execPath(), { args: ["compile", "-A", "--output=build/mcp-server-drupal", entry], stdout: "inherit", diff --git a/src/index.ts b/src/mod.ts similarity index 100% rename from src/index.ts rename to src/mod.ts From 9dece46d8061cd47b2b2e6a9ea768c3cd6ab66da Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Wed, 8 Jan 2025 17:10:28 +0400 Subject: [PATCH 17/19] build: added release-it package --- deno.jsonc | 4 +- deno.lock | 1492 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1473 insertions(+), 23 deletions(-) diff --git a/deno.jsonc b/deno.jsonc index 2e699fc..e1ba990 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,7 +5,8 @@ "format": "deno fmt", "lint": "deno lint", "build": "deno run --allow-read --allow-net --allow-env --allow-run scripts/build.ts", - "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal" + "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal", + "release": "deno run npm:release-it" }, "compilerOptions": { "strict": true, @@ -22,6 +23,7 @@ "@std/fmt": "jsr:@std/fmt@^1.0.3", "@std/fs": "jsr:@std/fs@^1.0.8", "@std/path": "jsr:@std/path@^1.0.8", + "release-it": "npm:release-it@^18.0.0", "zod": "npm:zod@^3.24.1" } } diff --git a/deno.lock b/deno.lock index 3870a35..58b9ef9 100644 --- a/deno.lock +++ b/deno.lock @@ -9,6 +9,7 @@ "jsr:@std/internal@^1.0.5": "1.0.5", "jsr:@std/path@^1.0.8": "1.0.8", "npm:@modelcontextprotocol/sdk@^1.0.4": "1.0.4", + "npm:release-it@18": "18.0.0", "npm:zod@^3.24.1": "3.24.1" }, "jsr": { @@ -41,66 +42,1512 @@ } }, "npm": { + "@babel/code-frame@7.26.2": { + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/helper-validator-identifier@7.25.9": { + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@iarna/toml@2.2.5": { + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "@inquirer/checkbox@4.0.4_@types+node@22.10.5": { + "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "@types/node", + "ansi-escapes", + "yoctocolors-cjs" + ] + }, + "@inquirer/confirm@5.1.1_@types+node@22.10.5": { + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node" + ] + }, + "@inquirer/core@10.1.2_@types+node@22.10.5": { + "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "dependencies": [ + "@inquirer/figures", + "@inquirer/type", + "ansi-escapes", + "cli-width", + "mute-stream", + "signal-exit", + "strip-ansi@6.0.1", + "wrap-ansi@6.2.0", + "yoctocolors-cjs" + ] + }, + "@inquirer/editor@4.2.1_@types+node@22.10.5": { + "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node", + "external-editor" + ] + }, + "@inquirer/expand@4.0.4_@types+node@22.10.5": { + "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node", + "yoctocolors-cjs" + ] + }, + "@inquirer/figures@1.0.9": { + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==" + }, + "@inquirer/input@4.1.1_@types+node@22.10.5": { + "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node" + ] + }, + "@inquirer/number@3.0.4_@types+node@22.10.5": { + "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node" + ] + }, + "@inquirer/password@4.0.4_@types+node@22.10.5": { + "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node", + "ansi-escapes" + ] + }, + "@inquirer/prompts@7.2.1_@types+node@22.10.5": { + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", + "dependencies": [ + "@inquirer/checkbox", + "@inquirer/confirm", + "@inquirer/editor", + "@inquirer/expand", + "@inquirer/input", + "@inquirer/number", + "@inquirer/password", + "@inquirer/rawlist", + "@inquirer/search", + "@inquirer/select", + "@types/node" + ] + }, + "@inquirer/rawlist@4.0.4_@types+node@22.10.5": { + "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "@types/node", + "yoctocolors-cjs" + ] + }, + "@inquirer/search@3.0.4_@types+node@22.10.5": { + "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "@types/node", + "yoctocolors-cjs" + ] + }, + "@inquirer/select@4.0.4_@types+node@22.10.5": { + "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "@types/node", + "ansi-escapes", + "yoctocolors-cjs" + ] + }, + "@inquirer/type@3.0.2_@types+node@22.10.5": { + "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "dependencies": [ + "@types/node" + ] + }, "@modelcontextprotocol/sdk@1.0.4": { "integrity": "sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow==", "dependencies": [ - "content-type", - "raw-body", - "zod" + "content-type", + "raw-body", + "zod" + ] + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": [ + "@nodelib/fs.stat", + "run-parallel" + ] + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": [ + "@nodelib/fs.scandir", + "fastq" + ] + }, + "@octokit/auth-token@5.1.1": { + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==" + }, + "@octokit/core@6.1.3": { + "integrity": "sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==", + "dependencies": [ + "@octokit/auth-token", + "@octokit/graphql", + "@octokit/request", + "@octokit/request-error", + "@octokit/types", + "before-after-hook", + "universal-user-agent" + ] + }, + "@octokit/endpoint@10.1.2": { + "integrity": "sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==", + "dependencies": [ + "@octokit/types", + "universal-user-agent" + ] + }, + "@octokit/graphql@8.1.2": { + "integrity": "sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==", + "dependencies": [ + "@octokit/request", + "@octokit/types", + "universal-user-agent" + ] + }, + "@octokit/openapi-types@22.2.0": { + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" + }, + "@octokit/plugin-paginate-rest@11.3.6_@octokit+core@6.1.3": { + "integrity": "sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==", + "dependencies": [ + "@octokit/core", + "@octokit/types" + ] + }, + "@octokit/plugin-request-log@5.3.1_@octokit+core@6.1.3": { + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "dependencies": [ + "@octokit/core" + ] + }, + "@octokit/plugin-rest-endpoint-methods@13.2.6_@octokit+core@6.1.3": { + "integrity": "sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==", + "dependencies": [ + "@octokit/core", + "@octokit/types" + ] + }, + "@octokit/request-error@6.1.6": { + "integrity": "sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==", + "dependencies": [ + "@octokit/types" + ] + }, + "@octokit/request@9.1.4": { + "integrity": "sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==", + "dependencies": [ + "@octokit/endpoint", + "@octokit/request-error", + "@octokit/types", + "fast-content-type-parse", + "universal-user-agent" + ] + }, + "@octokit/rest@21.0.2_@octokit+core@6.1.3": { + "integrity": "sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==", + "dependencies": [ + "@octokit/core", + "@octokit/plugin-paginate-rest", + "@octokit/plugin-request-log", + "@octokit/plugin-rest-endpoint-methods" + ] + }, + "@octokit/types@13.6.2": { + "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", + "dependencies": [ + "@octokit/openapi-types" + ] + }, + "@pnpm/config.env-replace@1.1.0": { + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==" + }, + "@pnpm/network.ca-file@1.0.2": { + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": [ + "graceful-fs@4.2.10" + ] + }, + "@pnpm/npm-conf@2.3.1": { + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dependencies": [ + "@pnpm/config.env-replace", + "@pnpm/network.ca-file", + "config-chain" + ] + }, + "@sec-ant/readable-stream@0.4.1": { + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + }, + "@sindresorhus/merge-streams@2.3.0": { + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==" + }, + "@sindresorhus/merge-streams@4.0.0": { + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" + }, + "@tootallnate/quickjs-emscripten@0.23.0": { + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "@types/node@22.10.5": { + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "dependencies": [ + "undici-types" + ] + }, + "@types/parse-path@7.0.3": { + "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==" + }, + "agent-base@7.1.3": { + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" + }, + "ansi-align@3.0.1": { + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": [ + "string-width@4.2.3" + ] + }, + "ansi-escapes@4.3.2": { + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": [ + "type-fest@0.21.3" + ] + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-regex@6.1.0": { + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, + "ansi-styles@6.2.1": { + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "ast-types@0.13.4": { + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": [ + "tslib" + ] + }, + "async-retry@1.3.3": { + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dependencies": [ + "retry" + ] + }, + "atomically@2.0.3": { + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dependencies": [ + "stubborn-fs", + "when-exit" + ] + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "basic-ftp@5.0.5": { + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==" + }, + "before-after-hook@3.0.2": { + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, + "boxen@8.0.1": { + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dependencies": [ + "ansi-align", + "camelcase", + "chalk", + "cli-boxes", + "string-width@7.2.0", + "type-fest@4.31.0", + "widest-line", + "wrap-ansi@9.0.0" + ] + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": [ + "fill-range" + ] + }, + "bundle-name@4.1.0": { + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dependencies": [ + "run-applescript" + ] + }, + "bytes@3.1.2": { + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase@8.0.0": { + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==" + }, + "chalk@5.4.1": { + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" + }, + "chardet@0.7.0": { + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "ci-info@4.1.0": { + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==" + }, + "cli-boxes@3.0.0": { + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "cli-cursor@5.0.0": { + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dependencies": [ + "restore-cursor" + ] + }, + "cli-spinners@2.9.2": { + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" + }, + "cli-width@4.1.0": { + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "config-chain@1.1.13": { + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": [ + "ini@1.3.8", + "proto-list" + ] + }, + "configstore@7.0.0": { + "integrity": "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==", + "dependencies": [ + "atomically", + "dot-prop", + "graceful-fs@4.2.11", + "xdg-basedir" + ] + }, + "content-type@1.0.5": { + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cosmiconfig@9.0.0": { + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": [ + "env-paths", + "import-fresh", + "js-yaml", + "parse-json" + ] + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": [ + "path-key@3.1.1", + "shebang-command", + "which" + ] + }, + "data-uri-to-buffer@6.0.2": { + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==" + }, + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": [ + "ms" + ] + }, + "deep-extend@0.6.0": { + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "default-browser-id@5.0.0": { + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==" + }, + "default-browser@5.2.1": { + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dependencies": [ + "bundle-name", + "default-browser-id" + ] + }, + "define-lazy-prop@3.0.0": { + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" + }, + "degenerator@5.0.1": { + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": [ + "ast-types", + "escodegen", + "esprima" + ] + }, + "depd@2.0.0": { + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dot-prop@9.0.0": { + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "dependencies": [ + "type-fest@4.31.0" + ] + }, + "emoji-regex@10.4.0": { + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "env-paths@2.2.1": { + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "error-ex@1.3.2": { + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": [ + "is-arrayish" + ] + }, + "escape-goat@4.0.0": { + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==" + }, + "escodegen@2.1.0": { + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": [ + "esprima", + "estraverse", + "esutils", + "source-map" + ] + }, + "esprima@4.0.1": { + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse@5.3.0": { + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "execa@8.0.1": { + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": [ + "cross-spawn", + "get-stream@8.0.1", + "human-signals@5.0.0", + "is-stream@3.0.0", + "merge-stream", + "npm-run-path@5.3.0", + "onetime@6.0.0", + "signal-exit", + "strip-final-newline@3.0.0" + ] + }, + "execa@9.5.2": { + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "dependencies": [ + "@sindresorhus/merge-streams@4.0.0", + "cross-spawn", + "figures", + "get-stream@9.0.1", + "human-signals@8.0.0", + "is-plain-obj", + "is-stream@4.0.1", + "npm-run-path@6.0.0", + "pretty-ms", + "signal-exit", + "strip-final-newline@4.0.0", + "yoctocolors" + ] + }, + "external-editor@3.1.0": { + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": [ + "chardet", + "iconv-lite@0.4.24", + "tmp" + ] + }, + "fast-content-type-parse@2.0.1": { + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==" + }, + "fast-glob@3.3.3": { + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": [ + "@nodelib/fs.stat", + "@nodelib/fs.walk", + "glob-parent", + "merge2", + "micromatch" + ] + }, + "fastq@1.18.0": { + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dependencies": [ + "reusify" + ] + }, + "figures@6.1.0": { + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dependencies": [ + "is-unicode-supported@2.1.0" + ] + }, + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": [ + "to-regex-range" + ] + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-east-asian-width@1.3.0": { + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==" + }, + "get-stream@8.0.1": { + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" + }, + "get-stream@9.0.1": { + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dependencies": [ + "@sec-ant/readable-stream", + "is-stream@4.0.1" + ] + }, + "get-uri@6.0.4": { + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "dependencies": [ + "basic-ftp", + "data-uri-to-buffer", + "debug" + ] + }, + "git-up@8.0.0": { + "integrity": "sha512-uBI8Zdt1OZlrYfGcSVroLJKgyNNXlgusYFzHk614lTasz35yg2PVpL1RMy0LOO2dcvF9msYW3pRfUSmafZNrjg==", + "dependencies": [ + "is-ssh", + "parse-url" + ] + }, + "git-url-parse@16.0.0": { + "integrity": "sha512-Y8iAF0AmCaqXc6a5GYgPQW9ESbncNLOL+CeQAJRhmWUOmnPkKpBYeWYp4mFd3LA5j53CdGDdslzX12yEBVHQQg==", + "dependencies": [ + "git-up" + ] + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": [ + "is-glob" + ] + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch", + "once", + "path-is-absolute" + ] + }, + "global-directory@4.0.1": { + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dependencies": [ + "ini@4.1.1" + ] + }, + "globby@14.0.2": { + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dependencies": [ + "@sindresorhus/merge-streams@2.3.0", + "fast-glob", + "ignore", + "path-type", + "slash", + "unicorn-magic@0.1.0" + ] + }, + "graceful-fs@4.2.10": { + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "http-errors@2.0.0": { + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": [ + "depd", + "inherits", + "setprototypeof", + "statuses", + "toidentifier" + ] + }, + "http-proxy-agent@7.0.2": { + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "https-proxy-agent@7.0.6": { + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": [ + "agent-base", + "debug" + ] + }, + "human-signals@5.0.0": { + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + }, + "human-signals@8.0.0": { + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==" + }, + "iconv-lite@0.4.24": { + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": [ + "safer-buffer" + ] + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": [ + "safer-buffer" + ] + }, + "ignore@5.3.2": { + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + }, + "import-fresh@3.3.0": { + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": [ + "parent-module", + "resolve-from" + ] + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": [ + "once", + "wrappy" + ] + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini@1.3.8": { + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "ini@4.1.1": { + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" + }, + "inquirer@12.3.0_@types+node@22.10.5": { + "integrity": "sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/prompts", + "@inquirer/type", + "@types/node", + "ansi-escapes", + "mute-stream", + "run-async", + "rxjs" + ] + }, + "interpret@1.4.0": { + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ip-address@9.0.5": { + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": [ + "jsbn", + "sprintf-js" + ] + }, + "is-arrayish@0.2.1": { + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-core-module@2.16.1": { + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": [ + "hasown" + ] + }, + "is-docker@3.0.0": { + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": [ + "is-extglob" + ] + }, + "is-in-ci@1.0.0": { + "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==" + }, + "is-inside-container@1.0.0": { + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": [ + "is-docker" ] }, - "bytes@3.1.2": { - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "is-installed-globally@1.0.0": { + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dependencies": [ + "global-directory", + "is-path-inside" + ] }, - "content-type@1.0.5": { - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "is-interactive@2.0.0": { + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" }, - "depd@2.0.0": { - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "is-npm@6.0.0": { + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==" }, - "http-errors@2.0.0": { - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside@4.0.0": { + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==" + }, + "is-plain-obj@4.1.0": { + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, + "is-ssh@1.4.0": { + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dependencies": [ - "depd", - "inherits", - "setprototypeof", - "statuses", - "toidentifier" + "protocols" ] }, - "iconv-lite@0.6.3": { - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "is-stream@3.0.0": { + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "is-stream@4.0.1": { + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==" + }, + "is-unicode-supported@1.3.0": { + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" + }, + "is-unicode-supported@2.1.0": { + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==" + }, + "is-wsl@3.1.0": { + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": [ - "safer-buffer" + "is-inside-container" ] }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "issue-parser@7.0.1": { + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dependencies": [ + "lodash.capitalize", + "lodash.escaperegexp", + "lodash.isplainobject", + "lodash.isstring", + "lodash.uniqby" + ] + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": [ + "argparse" + ] + }, + "jsbn@1.1.0": { + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "json-parse-even-better-errors@2.3.1": { + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "ky@1.7.4": { + "integrity": "sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==" + }, + "latest-version@9.0.0": { + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "dependencies": [ + "package-json" + ] + }, + "lines-and-columns@1.2.4": { + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "lodash.capitalize@4.2.1": { + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" + }, + "lodash.escaperegexp@4.1.2": { + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.isplainobject@4.0.6": { + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring@4.0.1": { + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.uniqby@4.7.0": { + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols@6.0.0": { + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dependencies": [ + "chalk", + "is-unicode-supported@1.3.0" + ] + }, + "lru-cache@7.18.3": { + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + }, + "macos-release@3.3.0": { + "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==" + }, + "merge-stream@2.0.0": { + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": [ + "braces", + "picomatch" + ] + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": [ + "mime-db" + ] + }, + "mimic-fn@4.0.0": { + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "mimic-function@5.0.1": { + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==" + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": [ + "brace-expansion" + ] + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "mute-stream@2.0.0": { + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" + }, + "netmask@2.0.2": { + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, + "new-github-release-url@2.0.0": { + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dependencies": [ + "type-fest@2.19.0" + ] + }, + "npm-run-path@5.3.0": { + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": [ + "path-key@4.0.0" + ] + }, + "npm-run-path@6.0.0": { + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dependencies": [ + "path-key@4.0.0", + "unicorn-magic@0.3.0" + ] + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "onetime@6.0.0": { + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": [ + "mimic-fn" + ] + }, + "onetime@7.0.0": { + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dependencies": [ + "mimic-function" + ] + }, + "open@10.1.0": { + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dependencies": [ + "default-browser", + "define-lazy-prop", + "is-inside-container", + "is-wsl" + ] + }, + "ora@8.1.1": { + "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", + "dependencies": [ + "chalk", + "cli-cursor", + "cli-spinners", + "is-interactive", + "is-unicode-supported@2.1.0", + "log-symbols", + "stdin-discarder", + "string-width@7.2.0", + "strip-ansi@7.1.0" + ] + }, + "os-name@6.0.0": { + "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==", + "dependencies": [ + "macos-release", + "windows-release" + ] + }, + "os-tmpdir@1.0.2": { + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "pac-proxy-agent@7.1.0": { + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", + "dependencies": [ + "@tootallnate/quickjs-emscripten", + "agent-base", + "debug", + "get-uri", + "http-proxy-agent", + "https-proxy-agent", + "pac-resolver", + "socks-proxy-agent" + ] + }, + "pac-resolver@7.0.1": { + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": [ + "degenerator", + "netmask" + ] + }, + "package-json@10.0.1": { + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", + "dependencies": [ + "ky", + "registry-auth-token", + "registry-url", + "semver" + ] + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": [ + "callsites" + ] + }, + "parse-json@5.2.0": { + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": [ + "@babel/code-frame", + "error-ex", + "json-parse-even-better-errors", + "lines-and-columns" + ] + }, + "parse-ms@4.0.0": { + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==" + }, + "parse-path@7.0.0": { + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dependencies": [ + "protocols" + ] + }, + "parse-url@9.2.0": { + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "dependencies": [ + "@types/parse-path", + "parse-path" + ] + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-key@4.0.0": { + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type@5.0.0": { + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pretty-ms@9.2.0": { + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dependencies": [ + "parse-ms" + ] + }, + "proto-list@1.2.4": { + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "protocols@2.0.1": { + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" + }, + "proxy-agent@6.5.0": { + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dependencies": [ + "agent-base", + "debug", + "http-proxy-agent", + "https-proxy-agent", + "lru-cache", + "pac-proxy-agent", + "proxy-from-env", + "socks-proxy-agent" + ] + }, + "proxy-from-env@1.1.0": { + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pupa@3.1.0": { + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dependencies": [ + "escape-goat" + ] + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "raw-body@3.0.0": { "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dependencies": [ "bytes", "http-errors", - "iconv-lite", + "iconv-lite@0.6.3", "unpipe" ] }, + "rc@1.2.8": { + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": [ + "deep-extend", + "ini@1.3.8", + "minimist", + "strip-json-comments" + ] + }, + "rechoir@0.6.2": { + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": [ + "resolve" + ] + }, + "registry-auth-token@5.0.3": { + "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", + "dependencies": [ + "@pnpm/npm-conf" + ] + }, + "registry-url@6.0.1": { + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": [ + "rc" + ] + }, + "release-it@18.0.0": { + "integrity": "sha512-aO7sGBwv+0m8FXVNT+RyL1yky9Nhg0IxkqJIdofTma0Dz4w9z0+u5DddzesOoYQL2fawib3Kwn30DaLxqiz5ng==", + "dependencies": [ + "@iarna/toml", + "@octokit/rest", + "async-retry", + "chalk", + "ci-info", + "cosmiconfig", + "execa@9.5.2", + "git-url-parse", + "globby", + "inquirer", + "issue-parser", + "lodash", + "mime-types", + "new-github-release-url", + "open", + "ora", + "os-name", + "proxy-agent", + "semver", + "shelljs", + "undici", + "update-notifier", + "url-join", + "wildcard-match", + "yargs-parser" + ] + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve@1.22.10": { + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ] + }, + "restore-cursor@5.1.0": { + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dependencies": [ + "onetime@7.0.0", + "signal-exit" + ] + }, + "retry@0.13.1": { + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "reusify@1.0.4": { + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "run-applescript@7.0.0": { + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==" + }, + "run-async@3.0.0": { + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==" + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": [ + "queue-microtask" + ] + }, + "rxjs@7.8.1": { + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": [ + "tslib" + ] + }, "safer-buffer@2.1.2": { "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver@7.6.3": { + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + }, "setprototypeof@1.2.0": { "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex" + ] + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shelljs@0.8.5": { + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": [ + "glob", + "interpret", + "rechoir" + ] + }, + "signal-exit@4.1.0": { + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "slash@5.1.0": { + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" + }, + "smart-buffer@4.2.0": { + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks-proxy-agent@8.0.5": { + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": [ + "agent-base", + "debug", + "socks" + ] + }, + "socks@2.8.3": { + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": [ + "ip-address", + "smart-buffer" + ] + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "sprintf-js@1.1.3": { + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, "statuses@2.0.1": { "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "stdin-discarder@0.2.2": { + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==" + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": [ + "emoji-regex@8.0.0", + "is-fullwidth-code-point", + "strip-ansi@6.0.1" + ] + }, + "string-width@7.2.0": { + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": [ + "emoji-regex@10.4.0", + "get-east-asian-width", + "strip-ansi@7.1.0" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex@5.0.1" + ] + }, + "strip-ansi@7.1.0": { + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": [ + "ansi-regex@6.1.0" + ] + }, + "strip-final-newline@3.0.0": { + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + }, + "strip-final-newline@4.0.0": { + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==" + }, + "strip-json-comments@2.0.1": { + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "stubborn-fs@1.2.5": { + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tmp@0.0.33": { + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": [ + "os-tmpdir" + ] + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": [ + "is-number" + ] + }, "toidentifier@1.0.1": { "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "type-fest@0.21.3": { + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-fest@2.19.0": { + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-fest@4.31.0": { + "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==" + }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "undici@6.21.0": { + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==" + }, + "unicorn-magic@0.1.0": { + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==" + }, + "unicorn-magic@0.3.0": { + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" + }, + "universal-user-agent@7.0.2": { + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" + }, "unpipe@1.0.0": { "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "update-notifier@7.3.1": { + "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", + "dependencies": [ + "boxen", + "chalk", + "configstore", + "is-in-ci", + "is-installed-globally", + "is-npm", + "latest-version", + "pupa", + "semver", + "xdg-basedir" + ] + }, + "url-join@5.0.0": { + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==" + }, + "when-exit@2.1.3": { + "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==" + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe" + ] + }, + "widest-line@5.0.0": { + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dependencies": [ + "string-width@7.2.0" + ] + }, + "wildcard-match@5.1.4": { + "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==" + }, + "windows-release@6.0.1": { + "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==", + "dependencies": [ + "execa@8.0.1" + ] + }, + "wrap-ansi@6.2.0": { + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width@4.2.3", + "strip-ansi@6.0.1" + ] + }, + "wrap-ansi@9.0.0": { + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dependencies": [ + "ansi-styles@6.2.1", + "string-width@7.2.0", + "strip-ansi@7.1.0" + ] + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xdg-basedir@5.1.0": { + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==" + }, + "yargs-parser@21.1.1": { + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yoctocolors-cjs@2.1.2": { + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==" + }, + "yoctocolors@2.1.1": { + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==" + }, "zod@3.24.1": { "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" } @@ -114,6 +1561,7 @@ "jsr:@std/fs@^1.0.8", "jsr:@std/path@^1.0.8", "npm:@modelcontextprotocol/sdk@^1.0.4", + "npm:release-it@18", "npm:zod@^3.24.1" ] } From 8f0c4add2c9a05acd0ce5a50af9326cd6392c268 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Wed, 8 Jan 2025 18:17:34 +0400 Subject: [PATCH 18/19] ci: added release yml --- .github/workflows/release.yml | 57 +++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f8fc65b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,57 @@ +name: Release + +env: + PACKAGE_NAME: "mcp-server-drupal" + TARGET_LIST: "x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,x86_64-pc-windows-msvc,x86_64-apple-darwin,aarch64-apple-darwin" + +on: + push: + tags: + - "v*.*.*" + +permissions: + contents: write + id-token: write + +jobs: + build-and-sign: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: "2.x" + + - name: Extract version from tag + run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV + + - name: Setup cosign + uses: sigstore/cosign-installer@v3.7.0 + + - name: Build the binaries + run: | + for target in $(echo $TARGET_LIST | tr "," "\n") + do + binary_name=$(echo $target | sed "s/^deno-/$PACKAGE_NAME-/" | sed "s/-/_/g") + deno compile --target=$target --output=./build/$binary_name ./src/index.ts + done + + - name: Sign binaries with Sigstore Keyless + run: | + for file in build/* + do + cosign sign-blob + \ --yes + \ build/$file + \ --bundle build/$file.sigstore + done + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: | + build/* + name: "MCP Server Drupal: ${{ env.VERSION }}" From d1eddd63720977160cd74ed3db4ce6ea8415ac08 Mon Sep 17 00:00:00 2001 From: GGKapanadze Date: Wed, 8 Jan 2025 18:20:08 +0400 Subject: [PATCH 19/19] build: corrected release script --- .github/workflows/check.yml | 1 - .github/workflows/release.yml | 47 +++++++++++++++++++++-------------- deno.jsonc | 3 +-- deno.lock | 3 +-- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b094b12..2dd3459 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,7 +1,6 @@ name: check on: - push: pull_request: jobs: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8fc65b..8c479fa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,54 +1,65 @@ name: Release - env: PACKAGE_NAME: "mcp-server-drupal" TARGET_LIST: "x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,x86_64-pc-windows-msvc,x86_64-apple-darwin,aarch64-apple-darwin" - on: push: tags: - "v*.*.*" - permissions: contents: write id-token: write - jobs: build-and-sign: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - - name: Setup Deno uses: denoland/setup-deno@v2 with: deno-version: "2.x" - - name: Extract version from tag run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV - - name: Setup cosign uses: sigstore/cosign-installer@v3.7.0 - - name: Build the binaries run: | for target in $(echo $TARGET_LIST | tr "," "\n") do - binary_name=$(echo $target | sed "s/^deno-/$PACKAGE_NAME-/" | sed "s/-/_/g") - deno compile --target=$target --output=./build/$binary_name ./src/index.ts - done + arch=$(echo $target | cut -d'-' -f1) + os=$(echo $target | cut -d'-' -f2) + + case $arch in + "x86_64") arch_name="x86" ;; + "aarch64") arch_name="arm" ;; + *) arch_name=$arch ;; + esac + + case $os in + "apple") os_name="darwin" ;; + "unknown") os_name="linux" ;; + "pc") os_name="windows" ;; + *) os_name=$os ;; + esac + + binary_name="${PACKAGE_NAME}_${os_name}_${arch_name}" - - name: Sign binaries with Sigstore Keyless + deno task build --target=$target --output=./build/$binary_name + done + - name: Sign binaries run: | - for file in build/* - do - cosign sign-blob - \ --yes - \ build/$file - \ --bundle build/$file.sigstore + mkdir -p build/bundles + + for file in build/*; do + if [[ "$file" == "build/bundles" ]]; then continue; fi + base_name=$(basename "$file" .exe) + cosign sign-blob --bundle "build/bundles/${base_name}.bundle" --yes "$file" done + cd build/bundles + tar -czf ../signatures.tar.gz * + cd ../.. - name: Release uses: softprops/action-gh-release@v2 with: diff --git a/deno.jsonc b/deno.jsonc index e1ba990..78c0581 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -6,7 +6,7 @@ "lint": "deno lint", "build": "deno run --allow-read --allow-net --allow-env --allow-run scripts/build.ts", "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal", - "release": "deno run npm:release-it" + "release": "deno run -A npm:release-it" }, "compilerOptions": { "strict": true, @@ -23,7 +23,6 @@ "@std/fmt": "jsr:@std/fmt@^1.0.3", "@std/fs": "jsr:@std/fs@^1.0.8", "@std/path": "jsr:@std/path@^1.0.8", - "release-it": "npm:release-it@^18.0.0", "zod": "npm:zod@^3.24.1" } } diff --git a/deno.lock b/deno.lock index 58b9ef9..bb74336 100644 --- a/deno.lock +++ b/deno.lock @@ -9,7 +9,7 @@ "jsr:@std/internal@^1.0.5": "1.0.5", "jsr:@std/path@^1.0.8": "1.0.8", "npm:@modelcontextprotocol/sdk@^1.0.4": "1.0.4", - "npm:release-it@18": "18.0.0", + "npm:release-it@*": "18.0.0", "npm:zod@^3.24.1": "3.24.1" }, "jsr": { @@ -1561,7 +1561,6 @@ "jsr:@std/fs@^1.0.8", "jsr:@std/path@^1.0.8", "npm:@modelcontextprotocol/sdk@^1.0.4", - "npm:release-it@18", "npm:zod@^3.24.1" ] }