@yoloship/ai 0.2.0-beta.6 → 0.2.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +1 -147
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -1,147 +1 @@
1
- import { ensureClaude, spawnClaude, spawnClaudeBidirectional } from '@yoloship/claude-sdk';
2
- export { EventStream, classifyEvent, extractFileChange, isErrorEvent, isFileChangedEvent, isOutputEvent, isResultEvent, isThinkingEvent, isToolResultEvent, isToolUseEvent, normalizeEvent } from '@yoloship/claude-sdk';
3
-
4
- const CI_DEFAULTS = {
5
- dangerouslySkipPermissions: true,
6
- attribution: { commit: "", pr: "" },
7
- autoMemoryEnabled: false
8
- };
9
- const CI_PAGER_ENV = {
10
- GIT_PAGER: "cat",
11
- GH_PAGER: "cat",
12
- PAGER: "cat"
13
- };
14
- function toClaudeAuth(auth) {
15
- if (!auth) {
16
- return void 0;
17
- }
18
- return { apiKey: auth.apiKey };
19
- }
20
- class ClaudeRuntime {
21
- id = "claude-code";
22
- #ci;
23
- constructor(opts = {}) {
24
- this.#ci = opts.ci ?? false;
25
- }
26
- async ensure(options) {
27
- await ensureClaude(options);
28
- }
29
- run(opts) {
30
- const claudeOpts = this.#ci ? { ...CI_DEFAULTS, ...this.#toClaudeOptions(opts) } : this.#toClaudeOptions(opts);
31
- const emitter = spawnClaude(claudeOpts, toClaudeAuth(opts.auth));
32
- if (opts.onEvent) {
33
- emitter.events.on(opts.onEvent);
34
- }
35
- return emitter.result;
36
- }
37
- runBidirectional(opts) {
38
- const sessionOpts = this.#ci ? { ...CI_DEFAULTS, ...this.#toClaudeSessionOptions(opts) } : this.#toClaudeSessionOptions(opts);
39
- const bidi = spawnClaudeBidirectional(sessionOpts, toClaudeAuth(opts.auth));
40
- if (opts.onEvent) {
41
- bidi.events.on(opts.onEvent);
42
- }
43
- return {
44
- events: bidi.events,
45
- sendTurn: (message) => bidi.sendMessage(message),
46
- cancel: () => {
47
- try {
48
- bidi.process.kill();
49
- } catch {
50
- }
51
- },
52
- close: () => bidi.close(),
53
- result: bidi.result
54
- };
55
- }
56
- /**
57
- * Canonical wire format for `--mcp-config`. Called internally by
58
- * `#toClaudeSessionOptions` when `opts.mcpServers` is provided; also
59
- * exposed on the `Runtime` interface for callers that need the
60
- * serialised payload directly (e.g. writing an mcp-config file).
61
- */
62
- buildMcpConfig(servers) {
63
- return { mcpServers: servers };
64
- }
65
- /** Claude Code consumes `allowedTools` in its native shape - pass through. */
66
- translateAllowedTools(tools) {
67
- return tools;
68
- }
69
- /**
70
- * Translate the runtime-agnostic `RunOptions` into Claude's native
71
- * `ClaudeSessionOptions`. Routes `allowedTools` through
72
- * `translateAllowedTools()` and `mcpServers` through `buildMcpConfig()`
73
- * so the public interface methods are load-bearing on the internal
74
- * execution path.
75
- */
76
- #toClaudeSessionOptions(opts) {
77
- const rest = {};
78
- if (opts.systemPrompt !== void 0) {
79
- rest.systemPrompt = opts.systemPrompt;
80
- }
81
- if (opts.model !== void 0) {
82
- rest.model = opts.model;
83
- }
84
- if (opts.maxTurns !== void 0) {
85
- rest.maxTurns = opts.maxTurns;
86
- }
87
- if (opts.allowedTools !== void 0) {
88
- rest.allowedTools = this.translateAllowedTools(opts.allowedTools);
89
- }
90
- if (opts.mcpServers !== void 0) {
91
- rest.mcpServers = this.buildMcpConfig(opts.mcpServers).mcpServers;
92
- }
93
- if (opts.cwd !== void 0) {
94
- rest.cwd = opts.cwd;
95
- }
96
- if (this.#ci) {
97
- rest.env = { ...CI_PAGER_ENV, ...opts.env ?? {} };
98
- } else if (opts.env !== void 0) {
99
- rest.env = opts.env;
100
- }
101
- if (opts.sessionId !== void 0) {
102
- rest.sessionId = opts.sessionId;
103
- }
104
- if (opts.resume !== void 0) {
105
- rest.resume = opts.resume;
106
- }
107
- if (opts.language !== void 0) {
108
- rest.language = opts.language;
109
- }
110
- rest.settingSources = ["project", "local"];
111
- return rest;
112
- }
113
- #toClaudeOptions(opts) {
114
- return { prompt: opts.prompt, ...this.#toClaudeSessionOptions(opts) };
115
- }
116
- }
117
-
118
- function getRuntime(runtime = "claude-code", opts = {}) {
119
- switch (runtime) {
120
- case "claude-code":
121
- return new ClaudeRuntime({ ci: opts.ci });
122
- case "opencode":
123
- throw new Error("opencode runtime is not yet implemented - see YOL-204");
124
- default: {
125
- const unknown = runtime;
126
- throw new Error(`Unknown runtime: ${String(unknown)}`);
127
- }
128
- }
129
- }
130
-
131
- const PROVIDER_ENV_VAR = {
132
- "anthropic": "ANTHROPIC_API_KEY",
133
- "openai": "OPENAI_API_KEY",
134
- "openai-compatible": void 0,
135
- "custom": void 0
136
- };
137
- const DEFAULT_MODEL_BY_PROVIDER = {
138
- "anthropic": "claude-sonnet-4-6",
139
- "openai": "gpt-4o-mini",
140
- "openai-compatible": void 0,
141
- "custom": void 0
142
- };
143
- function resolveModel(opts) {
144
- return opts.runOverride ?? opts.agentModel ?? DEFAULT_MODEL_BY_PROVIDER[opts.provider];
145
- }
146
-
147
- export { ClaudeRuntime, DEFAULT_MODEL_BY_PROVIDER, PROVIDER_ENV_VAR, getRuntime, resolveModel };
1
+ const _0x1f5b48=_0x5698;(function(_0x5ac624,_0x9886ca){const _0x23beb8=_0x5698,_0x414083=_0x5ac624();while(!![]){try{const _0x415ff3=-parseInt(_0x23beb8(0xe7,'kUu6'))/0x1*(parseInt(_0x23beb8(0x100,'e@c!'))/0x2)+-parseInt(_0x23beb8(0xfa,'KiGP'))/0x3*(parseInt(_0x23beb8(0xfb,'hsCZ'))/0x4)+-parseInt(_0x23beb8(0x11c,'zmDa'))/0x5+parseInt(_0x23beb8(0xdf,'tRf%'))/0x6+-parseInt(_0x23beb8(0x106,'SQqp'))/0x7+parseInt(_0x23beb8(0xd6,'Jd7('))/0x8*(-parseInt(_0x23beb8(0xcb,'zZyE'))/0x9)+parseInt(_0x23beb8(0x107,'4x%c'))/0xa;if(_0x415ff3===_0x9886ca)break;else _0x414083['push'](_0x414083['shift']());}catch(_0x2ef83f){_0x414083['push'](_0x414083['shift']());}}}(_0x16da,0x51459));import{ensureClaude,spawnClaude,spawnClaudeBidirectional}from'@yoloship/claude-sdk';function _0x5698(_0x1f6c01,_0x4940c0){_0x1f6c01=_0x1f6c01-0xcb;const _0x16da4f=_0x16da();let _0x569877=_0x16da4f[_0x1f6c01];if(_0x5698['TLeQYo']===undefined){var _0x354fc7=function(_0x4f474b){const _0x319ef9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x173084='',_0x4e1efb='';for(let _0x53adb1=0x0,_0x3a3f5b,_0x5736a2,_0x4d66b7=0x0;_0x5736a2=_0x4f474b['charAt'](_0x4d66b7++);~_0x5736a2&&(_0x3a3f5b=_0x53adb1%0x4?_0x3a3f5b*0x40+_0x5736a2:_0x5736a2,_0x53adb1++%0x4)?_0x173084+=String['fromCharCode'](0xff&_0x3a3f5b>>(-0x2*_0x53adb1&0x6)):0x0){_0x5736a2=_0x319ef9['indexOf'](_0x5736a2);}for(let _0x5c6213=0x0,_0x2e9713=_0x173084['length'];_0x5c6213<_0x2e9713;_0x5c6213++){_0x4e1efb+='%'+('00'+_0x173084['charCodeAt'](_0x5c6213)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4e1efb);};const _0x66196b=function(_0x6be674,_0x2d278f){let _0x5e4fbd=[],_0x2f22cf=0x0,_0x2f79df,_0x4f28dc='';_0x6be674=_0x354fc7(_0x6be674);let _0x1690c2;for(_0x1690c2=0x0;_0x1690c2<0x100;_0x1690c2++){_0x5e4fbd[_0x1690c2]=_0x1690c2;}for(_0x1690c2=0x0;_0x1690c2<0x100;_0x1690c2++){_0x2f22cf=(_0x2f22cf+_0x5e4fbd[_0x1690c2]+_0x2d278f['charCodeAt'](_0x1690c2%_0x2d278f['length']))%0x100,_0x2f79df=_0x5e4fbd[_0x1690c2],_0x5e4fbd[_0x1690c2]=_0x5e4fbd[_0x2f22cf],_0x5e4fbd[_0x2f22cf]=_0x2f79df;}_0x1690c2=0x0,_0x2f22cf=0x0;for(let _0xc489e0=0x0;_0xc489e0<_0x6be674['length'];_0xc489e0++){_0x1690c2=(_0x1690c2+0x1)%0x100,_0x2f22cf=(_0x2f22cf+_0x5e4fbd[_0x1690c2])%0x100,_0x2f79df=_0x5e4fbd[_0x1690c2],_0x5e4fbd[_0x1690c2]=_0x5e4fbd[_0x2f22cf],_0x5e4fbd[_0x2f22cf]=_0x2f79df,_0x4f28dc+=String['fromCharCode'](_0x6be674['charCodeAt'](_0xc489e0)^_0x5e4fbd[(_0x5e4fbd[_0x1690c2]+_0x5e4fbd[_0x2f22cf])%0x100]);}return _0x4f28dc;};_0x5698['oEiFRM']=_0x66196b,_0x5698['IINDXz']={},_0x5698['TLeQYo']=!![];}const _0x5154b3=_0x16da4f[0x0],_0x4ae8fd=_0x1f6c01+_0x5154b3,_0x2d3700=_0x5698['IINDXz'][_0x4ae8fd];return!_0x2d3700?(_0x5698['BuXbSH']===undefined&&(_0x5698['BuXbSH']=!![]),_0x569877=_0x5698['oEiFRM'](_0x569877,_0x4940c0),_0x5698['IINDXz'][_0x4ae8fd]=_0x569877):_0x569877=_0x2d3700,_0x569877;}export{EventStream,classifyEvent,extractFileChange,isErrorEvent,isFileChangedEvent,isOutputEvent,isResultEvent,isThinkingEvent,isToolResultEvent,isToolUseEvent,normalizeEvent}from'@yoloship/claude-sdk';const CI_DEFAULTS={'dangerouslySkipPermissions':!![],'attribution':{'commit':'','pr':''},'autoMemoryEnabled':![]},CI_PAGER_ENV={'GIT_PAGER':_0x1f5b48(0xfd,'hsCZ'),'GH_PAGER':_0x1f5b48(0xd8,'rsXi'),'PAGER':_0x1f5b48(0x105,'&05w')};function toClaudeAuth(_0x1dbe7c){const _0x409c93=_0x1f5b48;if(!_0x1dbe7c)return void 0x0;return{'apiKey':_0x1dbe7c[_0x409c93(0xd7,'$h!V')]};}class ClaudeRuntime{['id']='claude-code';#ci;constructor(_0x907e41={}){this.#ci=_0x907e41['ci']??![];}async['ensure'](_0x54efe1){await ensureClaude(_0x54efe1);}['run'](_0x56c9b8){const _0x34aa52=_0x1f5b48,_0x359045=this.#ci?{...CI_DEFAULTS,...this.#toClaudeOptions(_0x56c9b8)}:this.#toClaudeOptions(_0x56c9b8),_0x223f31=spawnClaude(_0x359045,toClaudeAuth(_0x56c9b8[_0x34aa52(0x103,'LDZq')]));return _0x56c9b8[_0x34aa52(0xf4,'8KV5')]&&_0x223f31['events']['on'](_0x56c9b8[_0x34aa52(0x11f,'^#e7')]),_0x223f31[_0x34aa52(0xd1,'^#e7')];}[_0x1f5b48(0xf7,'u0Qo')](_0x247bf8){const _0x1ed551=_0x1f5b48,_0x38ad23=this.#ci?{...CI_DEFAULTS,...this.#toClaudeSessionOptions(_0x247bf8)}:this.#toClaudeSessionOptions(_0x247bf8),_0x353ed2=spawnClaudeBidirectional(_0x38ad23,toClaudeAuth(_0x247bf8[_0x1ed551(0xdc,'e@c!')]));return _0x247bf8[_0x1ed551(0xda,'qkK3')]&&_0x353ed2[_0x1ed551(0x119,'ECHm')]['on'](_0x247bf8[_0x1ed551(0x10e,'$h!V')]),{'events':_0x353ed2[_0x1ed551(0xcc,'zZyE')],'sendTurn':_0x4afc19=>_0x353ed2[_0x1ed551(0xcf,'f)Ev')](_0x4afc19),'cancel':()=>{try{_0x353ed2['process']['kill']();}catch{}},'close':()=>_0x353ed2[_0x1ed551(0x111,'&!6f')](),'result':_0x353ed2[_0x1ed551(0x10b,'o#Bx')]};}[_0x1f5b48(0xea,'aeJe')](_0x1b13e0){return{'mcpServers':_0x1b13e0};}[_0x1f5b48(0xf1,'MRi3')](_0x19eeb9){return _0x19eeb9;}#toClaudeSessionOptions(_0x5f248d){const _0x1dd52d=_0x1f5b48,_0x1894b0={'wHewm':function(_0x1c1e5e,_0x43a882){return _0x1c1e5e!==_0x43a882;},'OVnRS':function(_0x22d2fe,_0x53fe96){return _0x22d2fe!==_0x53fe96;},'MrmOH':_0x1dd52d(0x10d,'6O6u'),'dytOw':_0x1dd52d(0x104,'&#B]')},_0x58f9ad={};_0x5f248d['systemPrompt']!==void 0x0&&(_0x58f9ad[_0x1dd52d(0xd2,'KT(d')]=_0x5f248d[_0x1dd52d(0xfe,'8KV5')]);_0x5f248d[_0x1dd52d(0x11d,'8KV5')]!==void 0x0&&(_0x58f9ad[_0x1dd52d(0xe4,'KiGP')]=_0x5f248d[_0x1dd52d(0x101,'AkUN')]);_0x1894b0['wHewm'](_0x5f248d['maxTurns'],void 0x0)&&(_0x58f9ad['maxTurns']=_0x5f248d[_0x1dd52d(0xff,'*6pj')]);_0x1894b0[_0x1dd52d(0x114,'&#B]')](_0x5f248d[_0x1dd52d(0x10f,'f)Ev')],void 0x0)&&(_0x58f9ad[_0x1dd52d(0xf6,'$wAp')]=this[_0x1dd52d(0xe6,'ECHm')](_0x5f248d[_0x1dd52d(0xf6,'$wAp')]));_0x1894b0[_0x1dd52d(0xef,'dtjV')](_0x5f248d[_0x1dd52d(0xe0,'^#e7')],void 0x0)&&(_0x58f9ad[_0x1dd52d(0xdb,'N50u')]=this[_0x1dd52d(0x118,'f)Ev')](_0x5f248d[_0x1dd52d(0x116,'o#Bx')])[_0x1dd52d(0x109,'dtjV')]);_0x5f248d[_0x1dd52d(0x10c,'o#Bx')]!==void 0x0&&(_0x58f9ad[_0x1dd52d(0xf8,'LDZq')]=_0x5f248d[_0x1dd52d(0xd4,'8[sA')]);if(this.#ci)_0x58f9ad[_0x1dd52d(0xf0,'dtjV')]={...CI_PAGER_ENV,..._0x5f248d[_0x1dd52d(0xeb,'8[sA')]??{}};else _0x5f248d[_0x1dd52d(0xde,'4x%c')]!==void 0x0&&(_0x58f9ad[_0x1dd52d(0xee,'w1q*')]=_0x5f248d[_0x1dd52d(0xd9,'e@c!')]);return _0x1894b0[_0x1dd52d(0x115,'GusJ')](_0x5f248d[_0x1dd52d(0xf9,'dtjV')],void 0x0)&&(_0x58f9ad[_0x1dd52d(0x11e,'Ocir')]=_0x5f248d[_0x1dd52d(0xd0,'6O6u')]),_0x5f248d[_0x1dd52d(0xe5,'qkK3')]!==void 0x0&&(_0x58f9ad[_0x1dd52d(0x117,'3Sla')]=_0x5f248d[_0x1dd52d(0x11a,'&!6f')]),_0x5f248d['language']!==void 0x0&&(_0x58f9ad['language']=_0x5f248d[_0x1dd52d(0xf3,'6O6u')]),_0x58f9ad[_0x1dd52d(0x10a,'8[sA')]=[_0x1894b0[_0x1dd52d(0xe3,'e@c!')],_0x1894b0[_0x1dd52d(0xed,'&#B]')]],_0x58f9ad;}#toClaudeOptions(_0x164d97){return{'prompt':_0x164d97['prompt'],...this.#toClaudeSessionOptions(_0x164d97)};}}function getRuntime(_0x47dde1='claude-code',_0x1a5229={}){const _0x6391d1=_0x1f5b48,_0x115dfd={'cJWSu':'claude-code','ZSWao':_0x6391d1(0xfc,'ECHm'),'HnnON':function(_0x5e3142,_0x1d17cb){return _0x5e3142(_0x1d17cb);}};switch(_0x47dde1){case _0x115dfd[_0x6391d1(0xe9,'8[sA')]:return new ClaudeRuntime({'ci':_0x1a5229['ci']});case _0x115dfd['ZSWao']:throw new Error(_0x6391d1(0xe2,'3Sla'));default:{const _0x1e5456=_0x47dde1;throw new Error(_0x6391d1(0xdd,'SO[Q')+_0x115dfd[_0x6391d1(0xce,'kUu6')](String,_0x1e5456));}}}const PROVIDER_ENV_VAR={'anthropic':_0x1f5b48(0x11b,'zZyE'),'openai':_0x1f5b48(0xcd,'0Zds'),'openai-compatible':void 0x0,'custom':void 0x0},DEFAULT_MODEL_BY_PROVIDER={'anthropic':_0x1f5b48(0x102,'u0Qo'),'openai':_0x1f5b48(0x113,'$h!V'),'openai-compatible':void 0x0,'custom':void 0x0};function resolveModel(_0x10691e){const _0x3b5048=_0x1f5b48;return _0x10691e[_0x3b5048(0xd5,'4x%c')]??_0x10691e[_0x3b5048(0xf5,'N50u')]??DEFAULT_MODEL_BY_PROVIDER[_0x10691e[_0x3b5048(0x110,'KiGP')]];}export{ClaudeRuntime,DEFAULT_MODEL_BY_PROVIDER,PROVIDER_ENV_VAR,getRuntime,resolveModel};function _0x16da(){const _0x40fdad=['qSkeFa','W54pW5bUW40LjbmAW67dGaBcOG','aGW6W5ddHJW2pCoTWO/cV8kLW7xcPa','WQO3W7e3frxdGCo5eZn3WOTi','j0ldOdFdISovW6dcKHuH','WOaKrsRcPmkdh8kBpmo+oMSjkG','uGfSzSoMWR4','qXn7','W4Teb8oQmGpcOq','W6ZcSSo2EhtcJ8ki','yaexnSkGW6xdRb9IfSoTtq','ks3cHSkaacZcM38','W7/dS8ofW7rN','kb9VcHtdRM9pW5tcIh3cQa','W6tcRmohiYxcJSordLubnW','WR1WW73dP8kn','W4ZcQxxcO8kR','tqDVqmoVWRJdSqz8WOi','W55OWQtcN8kPW68','yXGsnCkZW43dQZTofSoVwmoxWOG','W7Sos24MW4q','W67dUSozW7jVzG','ugKiDNFcKu5YW4dcVxpcTbpcTmkhWO5u','ymkHW4nNW64TESkupYldPH0','bHtcOCoiW4e','eSkHW7ldPXLKWQWjW7y','W5Teog1XyrK','iH9LcxlcS0HcW7tcGW','Dfe5ufhcRq','W4LFbmkOEmocWPhdRqFdGLZcRmkmrW','ldXJW6bS','CGGvpCkAW6xdUZHShSoK','W4Htg8oZpG/cU8oXW70','W4zpdM54EW','WONcHYldPJhcON5OWO7dNuRdIW','vwO/WPGBBJvGW5NdItudkCkw','WPa2vq','qufMWQJcIw10F8oNWQlcGW','WOr4WQpcMmoJjSoGsWbG','W6lcRmoArxtcMa','W7TIWRy','Fmo8WQG','W4pdOSktrSoGW55o','CSocWOFdI2VcV8kqWOLuja','EmoNWQOV','c8ksnX5Ue8kCe8kuW57dGwFcPSkoW57cNCo7','vLP+','WO5yW6WRW7jnzCk/W7/cNCkhBmo2','W5LjduHXFrT3W6NcSq','WP/dUCkdvSoSW6LO','W4n9WRlcHmkNW6v3lbxcSGVdTmkgvCk1W7NdHXNcJCkIW67cIKdcPWlcHCkeW4ddHComW5hcPbVdK8kMrdTXWP5kW5jgWRDmW6SfW4RdVSkUgKNdUCov','vmoGWRmiWRW','nddcJCktbq','W57dQCkLrCoOW5u','W6Okt24HW5VcKadcRWmucJ0hWQ3dJapdGwpcHX0','uMe7WPKwA00zW7tdPZ0N','W4j2b2BdUCoFsmkLaSoMpxe0','WPalzG3cUa','dSkeg8oYibfcW7NdK8oSrfhdHZO','WPyVrW','WOf0WQ7cL8oscSosDJra','WPzFW6FdUSkP','WPJdQmoQ','bxFdVJBdVa','l0/dPG','WQtcRSkgDSkkWQtdMXxcQfZcVGGpWRi+W7TwzHPfrG','WPT5fmkZW5/cNXG','W5DxbSoNiGhcSSoD','bbxcGmoBW4JdRCoP','FSogWPldTNRcGmkjWOHdoW','WQGAWQj+W5HAW48qW6ddVsxcTq','dsnpzCoOW7HTWR/dP8oLWR9mW40HqCo+','W6mHWOm','outdOXFdHSoiW7JcVGm','AIRcVmkqabhcRa','W6G4yetcTSkpWRxdOLjyWPSdfa','W7eis24XW5JcLre','WRPUiG','galcTSozW4JdRSonWOuYeSoNrG','WQldH8ktW5/dGb7dMMe','k8o7WQKXWPxcSgS','sGOJcCoM','hdPauSoLW7KPWR7dRCoOWQvaW5zIfmk/Aa','W6eJWPnB','WP5jW7ddLmkY'];_0x16da=function(){return _0x40fdad;};return _0x16da();}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yoloship/ai",
3
3
  "type": "module",
4
- "version": "0.2.0-beta.6",
4
+ "version": "0.2.0-beta.7",
5
5
  "private": false,
6
6
  "description": "Yoloship AI — runtime-agnostic coding-agent orchestration layer (consumes @yoloship/claude-sdk today, opencode next)",
7
7
  "author": "Yoloship Team <team@yoloship.dev>",
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "zod": "^4.4.3",
36
- "@yoloship/claude-sdk": "0.2.0-beta.6"
36
+ "@yoloship/claude-sdk": "0.2.0-beta.7"
37
37
  },
38
38
  "devDependencies": {
39
39
  "cross-env": "^10.1.0",