yaver-cli 1.0.0 → 1.95.4

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.
package/bin/yaver ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { runUnified } = require('../src/index');
4
+
5
+ runUnified(process.argv.slice(2));
package/bin/yaver-push CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { run } = require('../src/index');
4
- run(process.argv.slice(2));
3
+ const { runPushCli } = require('../src/index');
4
+ runPushCli(process.argv.slice(2));
Binary file
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "yaver-cli",
3
- "version": "1.0.0",
4
- "description": "Push existing React Native projects to yaver.io for testing on real devices",
3
+ "version": "1.95.4",
4
+ "description": "Unified npm bootstrap for the Yaver agent and push-to-device React Native tooling",
5
5
  "bin": {
6
+ "yaver": "bin/yaver",
6
7
  "yaver-push": "bin/yaver-push"
7
8
  },
8
9
  "main": "src/index.js",
@@ -20,7 +21,7 @@
20
21
  "expo-go-alternative"
21
22
  ],
22
23
  "author": "Yaver <hello@yaver.io>",
23
- "license": "MIT",
24
+ "license": "AGPL-3.0-only",
24
25
  "repository": {
25
26
  "type": "git",
26
27
  "url": "git+https://github.com/kivanccakmak/yaver.io.git"
package/sdk-manifest.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "react": "19.1.0",
5
5
  "hermes": {
6
6
  "version": "0.81.5",
7
- "bytecodeVersion": 99
7
+ "bytecodeVersion": 96
8
8
  },
9
9
  "arch": {
10
10
  "newArch": true,
@@ -13,46 +13,663 @@
13
13
  },
14
14
  "supportedRNRange": "0.81.x",
15
15
  "nativeModules": {
16
- "react-native-screens": "4.16.0",
17
- "react-native-safe-area-context": "5.6.0",
18
- "react-native-gesture-handler": "2.28.0",
19
- "react-native-reanimated": "4.1.1",
20
- "react-native-svg": "15.15.4",
21
- "react-native-webview": "13.15.0",
16
+ "@expo/vector-icons": "15.1.1",
17
+ "@gorhom/bottom-sheet": "5.2.9",
22
18
  "@react-native-async-storage/async-storage": "2.2.0",
19
+ "@react-native-community/datetimepicker": "8.4.4",
23
20
  "@react-native-community/netinfo": "11.4.1",
24
- "react-native-maps": "1.20.1",
25
- "react-native-ble-plx": "3.2.0",
26
- "react-native-mmkv": "4.3.0",
27
- "@shopify/react-native-skia": "2.6.2",
28
- "react-native-udp": "4.1.7",
29
- "react-native-markdown-display": "7.0.2",
30
- "victory-native": "41.20.2",
31
- "whisper.rn": "0.5.5",
21
+ "@react-native-community/slider": "5.0.1",
22
+ "@react-native-masked-view/masked-view": "0.3.2",
23
+ "@react-native-picker/picker": "2.11.1",
24
+ "@react-native-segmented-control/segmented-control": "2.5.7",
25
+ "@shopify/flash-list": "2.0.2",
26
+ "@shopify/react-native-skia": "2.2.12",
27
+ "expo-apple-authentication": "8.0.8",
28
+ "expo-asset": "12.0.12",
29
+ "expo-auth-session": "7.0.10",
30
+ "expo-av": "16.0.8",
31
+ "expo-background-fetch": "14.0.9",
32
+ "expo-battery": "10.0.8",
33
+ "expo-blur": "15.0.8",
34
+ "expo-brightness": "14.0.8",
35
+ "expo-calendar": "15.0.8",
32
36
  "expo-camera": "17.0.10",
33
- "expo-location": "19.0.8",
34
- "expo-sensors": "15.0.8",
35
- "expo-haptics": "15.0.8",
36
- "expo-device": "8.0.10",
37
+ "expo-clipboard": "8.0.8",
37
38
  "expo-constants": "18.0.13",
38
- "expo-notifications": "0.32.16",
39
+ "expo-contacts": "15.0.11",
40
+ "expo-crypto": "15.0.8",
41
+ "expo-device": "8.0.10",
42
+ "expo-document-picker": "14.0.8",
39
43
  "expo-file-system": "19.0.21",
40
- "expo-asset": "12.0.12",
41
44
  "expo-font": "14.0.11",
42
- "expo-clipboard": "8.0.8",
45
+ "expo-haptics": "15.0.8",
46
+ "expo-image": "3.0.11",
47
+ "expo-image-manipulator": "14.0.8",
48
+ "expo-image-picker": "17.0.10",
49
+ "expo-keep-awake": "15.0.8",
50
+ "expo-linear-gradient": "15.0.8",
43
51
  "expo-linking": "8.0.11",
52
+ "expo-local-authentication": "17.0.8",
53
+ "expo-localization": "17.0.8",
54
+ "expo-location": "19.0.8",
55
+ "expo-mail-composer": "15.0.8",
56
+ "expo-media-library": "18.2.1",
57
+ "expo-notifications": "0.32.16",
58
+ "expo-print": "15.0.8",
59
+ "expo-router": "6.0.23",
60
+ "expo-screen-capture": "8.0.9",
61
+ "expo-screen-orientation": "9.0.8",
44
62
  "expo-secure-store": "15.0.8",
45
- "expo-av": "16.0.8",
46
- "expo-image-picker": "17.0.10",
47
- "expo-speech": "14.0.8",
48
- "expo-web-browser": "15.0.10",
49
- "expo-apple-authentication": "8.0.8",
50
- "expo-battery": "10.0.8",
51
- "expo-brightness": "14.0.8",
52
- "expo-localization": "55.0.11",
53
- "expo-share-intent": "3.2.3",
63
+ "expo-sensors": "15.0.8",
64
+ "expo-share-intent": "5.1.1",
54
65
  "expo-sharing": "14.0.8",
66
+ "expo-speech": "14.0.8",
55
67
  "expo-splash-screen": "31.0.13",
56
- "expo-status-bar": "3.0.9"
68
+ "expo-sqlite": "16.0.10",
69
+ "expo-status-bar": "3.0.9",
70
+ "expo-system-ui": "6.0.9",
71
+ "expo-task-manager": "14.0.9",
72
+ "expo-updates": "29.0.16",
73
+ "expo-video": "3.0.16",
74
+ "expo-video-thumbnails": "10.0.8",
75
+ "expo-web-browser": "15.0.10",
76
+ "lottie-react-native": "7.3.6",
77
+ "react-native-ble-plx": "3.5.1",
78
+ "react-native-gesture-handler": "2.28.0",
79
+ "react-native-get-random-values": "1.11.0",
80
+ "react-native-iap": "14.7.20",
81
+ "react-native-maps": "1.20.1",
82
+ "react-native-markdown-display": "7.0.2",
83
+ "react-native-mmkv": "4.3.0",
84
+ "react-native-nitro-modules": "0.35.3",
85
+ "react-native-pager-view": "6.9.1",
86
+ "react-native-reanimated": "4.1.7",
87
+ "react-native-safe-area-context": "5.6.2",
88
+ "react-native-screens": "4.16.0",
89
+ "react-native-svg": "15.12.1",
90
+ "react-native-udp": "4.1.7",
91
+ "react-native-video": "6.19.1",
92
+ "react-native-view-shot": "4.0.3",
93
+ "react-native-web": "0.21.2",
94
+ "react-native-webview": "13.15.0",
95
+ "react-native-worklets": "0.5.1",
96
+ "victory-native": "41.20.2",
97
+ "whisper.rn": "0.5.5"
98
+ },
99
+ "moduleSupport": {
100
+ "@expo/vector-icons": {
101
+ "version": "15.1.1",
102
+ "hostApp": true,
103
+ "cliPush": true,
104
+ "agentOpenInYaver": true,
105
+ "pluginEnabled": false
106
+ },
107
+ "@gorhom/bottom-sheet": {
108
+ "version": "5.2.9",
109
+ "hostApp": true,
110
+ "cliPush": true,
111
+ "agentOpenInYaver": true,
112
+ "pluginEnabled": false
113
+ },
114
+ "@react-native-async-storage/async-storage": {
115
+ "version": "2.2.0",
116
+ "hostApp": true,
117
+ "cliPush": true,
118
+ "agentOpenInYaver": true,
119
+ "pluginEnabled": false
120
+ },
121
+ "@react-native-community/datetimepicker": {
122
+ "version": "8.4.4",
123
+ "hostApp": true,
124
+ "cliPush": true,
125
+ "agentOpenInYaver": true,
126
+ "pluginEnabled": false
127
+ },
128
+ "@react-native-community/netinfo": {
129
+ "version": "11.4.1",
130
+ "hostApp": true,
131
+ "cliPush": true,
132
+ "agentOpenInYaver": true,
133
+ "pluginEnabled": false
134
+ },
135
+ "@react-native-community/slider": {
136
+ "version": "5.0.1",
137
+ "hostApp": true,
138
+ "cliPush": true,
139
+ "agentOpenInYaver": true,
140
+ "pluginEnabled": false
141
+ },
142
+ "@react-native-masked-view/masked-view": {
143
+ "version": "0.3.2",
144
+ "hostApp": true,
145
+ "cliPush": true,
146
+ "agentOpenInYaver": true,
147
+ "pluginEnabled": false
148
+ },
149
+ "@react-native-picker/picker": {
150
+ "version": "2.11.1",
151
+ "hostApp": true,
152
+ "cliPush": true,
153
+ "agentOpenInYaver": true,
154
+ "pluginEnabled": false
155
+ },
156
+ "@react-native-segmented-control/segmented-control": {
157
+ "version": "2.5.7",
158
+ "hostApp": true,
159
+ "cliPush": true,
160
+ "agentOpenInYaver": true,
161
+ "pluginEnabled": false
162
+ },
163
+ "@shopify/flash-list": {
164
+ "version": "2.0.2",
165
+ "hostApp": true,
166
+ "cliPush": true,
167
+ "agentOpenInYaver": true,
168
+ "pluginEnabled": false
169
+ },
170
+ "@shopify/react-native-skia": {
171
+ "version": "2.2.12",
172
+ "hostApp": true,
173
+ "cliPush": true,
174
+ "agentOpenInYaver": true,
175
+ "pluginEnabled": false
176
+ },
177
+ "expo-apple-authentication": {
178
+ "version": "8.0.8",
179
+ "hostApp": true,
180
+ "cliPush": true,
181
+ "agentOpenInYaver": true,
182
+ "pluginEnabled": true
183
+ },
184
+ "expo-asset": {
185
+ "version": "12.0.12",
186
+ "hostApp": true,
187
+ "cliPush": true,
188
+ "agentOpenInYaver": true,
189
+ "pluginEnabled": false
190
+ },
191
+ "expo-auth-session": {
192
+ "version": "7.0.10",
193
+ "hostApp": true,
194
+ "cliPush": true,
195
+ "agentOpenInYaver": true,
196
+ "pluginEnabled": false
197
+ },
198
+ "expo-av": {
199
+ "version": "16.0.8",
200
+ "hostApp": true,
201
+ "cliPush": true,
202
+ "agentOpenInYaver": true,
203
+ "pluginEnabled": false
204
+ },
205
+ "expo-background-fetch": {
206
+ "version": "14.0.9",
207
+ "hostApp": true,
208
+ "cliPush": true,
209
+ "agentOpenInYaver": true,
210
+ "pluginEnabled": false
211
+ },
212
+ "expo-battery": {
213
+ "version": "10.0.8",
214
+ "hostApp": true,
215
+ "cliPush": true,
216
+ "agentOpenInYaver": true,
217
+ "pluginEnabled": false
218
+ },
219
+ "expo-blur": {
220
+ "version": "15.0.8",
221
+ "hostApp": true,
222
+ "cliPush": true,
223
+ "agentOpenInYaver": true,
224
+ "pluginEnabled": false
225
+ },
226
+ "expo-brightness": {
227
+ "version": "14.0.8",
228
+ "hostApp": true,
229
+ "cliPush": true,
230
+ "agentOpenInYaver": true,
231
+ "pluginEnabled": false
232
+ },
233
+ "expo-calendar": {
234
+ "version": "15.0.8",
235
+ "hostApp": true,
236
+ "cliPush": true,
237
+ "agentOpenInYaver": true,
238
+ "pluginEnabled": false
239
+ },
240
+ "expo-camera": {
241
+ "version": "17.0.10",
242
+ "hostApp": true,
243
+ "cliPush": true,
244
+ "agentOpenInYaver": true,
245
+ "pluginEnabled": true
246
+ },
247
+ "expo-clipboard": {
248
+ "version": "8.0.8",
249
+ "hostApp": true,
250
+ "cliPush": true,
251
+ "agentOpenInYaver": true,
252
+ "pluginEnabled": false
253
+ },
254
+ "expo-constants": {
255
+ "version": "18.0.13",
256
+ "hostApp": true,
257
+ "cliPush": true,
258
+ "agentOpenInYaver": true,
259
+ "pluginEnabled": false
260
+ },
261
+ "expo-contacts": {
262
+ "version": "15.0.11",
263
+ "hostApp": true,
264
+ "cliPush": true,
265
+ "agentOpenInYaver": true,
266
+ "pluginEnabled": false
267
+ },
268
+ "expo-crypto": {
269
+ "version": "15.0.8",
270
+ "hostApp": true,
271
+ "cliPush": true,
272
+ "agentOpenInYaver": true,
273
+ "pluginEnabled": false
274
+ },
275
+ "expo-device": {
276
+ "version": "8.0.10",
277
+ "hostApp": true,
278
+ "cliPush": true,
279
+ "agentOpenInYaver": true,
280
+ "pluginEnabled": false
281
+ },
282
+ "expo-document-picker": {
283
+ "version": "14.0.8",
284
+ "hostApp": true,
285
+ "cliPush": true,
286
+ "agentOpenInYaver": true,
287
+ "pluginEnabled": false
288
+ },
289
+ "expo-file-system": {
290
+ "version": "19.0.21",
291
+ "hostApp": true,
292
+ "cliPush": true,
293
+ "agentOpenInYaver": true,
294
+ "pluginEnabled": false
295
+ },
296
+ "expo-font": {
297
+ "version": "14.0.11",
298
+ "hostApp": true,
299
+ "cliPush": true,
300
+ "agentOpenInYaver": true,
301
+ "pluginEnabled": true
302
+ },
303
+ "expo-haptics": {
304
+ "version": "15.0.8",
305
+ "hostApp": true,
306
+ "cliPush": true,
307
+ "agentOpenInYaver": true,
308
+ "pluginEnabled": false
309
+ },
310
+ "expo-image": {
311
+ "version": "3.0.11",
312
+ "hostApp": true,
313
+ "cliPush": true,
314
+ "agentOpenInYaver": true,
315
+ "pluginEnabled": false
316
+ },
317
+ "expo-image-manipulator": {
318
+ "version": "14.0.8",
319
+ "hostApp": true,
320
+ "cliPush": true,
321
+ "agentOpenInYaver": true,
322
+ "pluginEnabled": false
323
+ },
324
+ "expo-image-picker": {
325
+ "version": "17.0.10",
326
+ "hostApp": true,
327
+ "cliPush": true,
328
+ "agentOpenInYaver": true,
329
+ "pluginEnabled": true
330
+ },
331
+ "expo-keep-awake": {
332
+ "version": "15.0.8",
333
+ "hostApp": true,
334
+ "cliPush": true,
335
+ "agentOpenInYaver": true,
336
+ "pluginEnabled": false
337
+ },
338
+ "expo-linear-gradient": {
339
+ "version": "15.0.8",
340
+ "hostApp": true,
341
+ "cliPush": true,
342
+ "agentOpenInYaver": true,
343
+ "pluginEnabled": false
344
+ },
345
+ "expo-linking": {
346
+ "version": "8.0.11",
347
+ "hostApp": true,
348
+ "cliPush": true,
349
+ "agentOpenInYaver": true,
350
+ "pluginEnabled": false
351
+ },
352
+ "expo-local-authentication": {
353
+ "version": "17.0.8",
354
+ "hostApp": true,
355
+ "cliPush": true,
356
+ "agentOpenInYaver": true,
357
+ "pluginEnabled": false
358
+ },
359
+ "expo-localization": {
360
+ "version": "17.0.8",
361
+ "hostApp": true,
362
+ "cliPush": true,
363
+ "agentOpenInYaver": true,
364
+ "pluginEnabled": true
365
+ },
366
+ "expo-location": {
367
+ "version": "19.0.8",
368
+ "hostApp": true,
369
+ "cliPush": true,
370
+ "agentOpenInYaver": true,
371
+ "pluginEnabled": true
372
+ },
373
+ "expo-mail-composer": {
374
+ "version": "15.0.8",
375
+ "hostApp": true,
376
+ "cliPush": true,
377
+ "agentOpenInYaver": true,
378
+ "pluginEnabled": true
379
+ },
380
+ "expo-media-library": {
381
+ "version": "18.2.1",
382
+ "hostApp": true,
383
+ "cliPush": true,
384
+ "agentOpenInYaver": true,
385
+ "pluginEnabled": false
386
+ },
387
+ "expo-notifications": {
388
+ "version": "0.32.16",
389
+ "hostApp": true,
390
+ "cliPush": true,
391
+ "agentOpenInYaver": true,
392
+ "pluginEnabled": true
393
+ },
394
+ "expo-print": {
395
+ "version": "15.0.8",
396
+ "hostApp": true,
397
+ "cliPush": true,
398
+ "agentOpenInYaver": true,
399
+ "pluginEnabled": false
400
+ },
401
+ "expo-router": {
402
+ "version": "6.0.23",
403
+ "hostApp": true,
404
+ "cliPush": true,
405
+ "agentOpenInYaver": true,
406
+ "pluginEnabled": true
407
+ },
408
+ "expo-screen-capture": {
409
+ "version": "8.0.9",
410
+ "hostApp": true,
411
+ "cliPush": true,
412
+ "agentOpenInYaver": true,
413
+ "pluginEnabled": false
414
+ },
415
+ "expo-screen-orientation": {
416
+ "version": "9.0.8",
417
+ "hostApp": true,
418
+ "cliPush": true,
419
+ "agentOpenInYaver": true,
420
+ "pluginEnabled": false
421
+ },
422
+ "expo-secure-store": {
423
+ "version": "15.0.8",
424
+ "hostApp": true,
425
+ "cliPush": true,
426
+ "agentOpenInYaver": true,
427
+ "pluginEnabled": true
428
+ },
429
+ "expo-sensors": {
430
+ "version": "15.0.8",
431
+ "hostApp": true,
432
+ "cliPush": true,
433
+ "agentOpenInYaver": true,
434
+ "pluginEnabled": true
435
+ },
436
+ "expo-share-intent": {
437
+ "version": "5.1.1",
438
+ "hostApp": true,
439
+ "cliPush": true,
440
+ "agentOpenInYaver": true,
441
+ "pluginEnabled": false
442
+ },
443
+ "expo-sharing": {
444
+ "version": "14.0.8",
445
+ "hostApp": true,
446
+ "cliPush": true,
447
+ "agentOpenInYaver": true,
448
+ "pluginEnabled": false
449
+ },
450
+ "expo-speech": {
451
+ "version": "14.0.8",
452
+ "hostApp": true,
453
+ "cliPush": true,
454
+ "agentOpenInYaver": true,
455
+ "pluginEnabled": false
456
+ },
457
+ "expo-splash-screen": {
458
+ "version": "31.0.13",
459
+ "hostApp": true,
460
+ "cliPush": true,
461
+ "agentOpenInYaver": true,
462
+ "pluginEnabled": true
463
+ },
464
+ "expo-sqlite": {
465
+ "version": "16.0.10",
466
+ "hostApp": true,
467
+ "cliPush": true,
468
+ "agentOpenInYaver": true,
469
+ "pluginEnabled": true
470
+ },
471
+ "expo-status-bar": {
472
+ "version": "3.0.9",
473
+ "hostApp": true,
474
+ "cliPush": true,
475
+ "agentOpenInYaver": true,
476
+ "pluginEnabled": false
477
+ },
478
+ "expo-system-ui": {
479
+ "version": "6.0.9",
480
+ "hostApp": true,
481
+ "cliPush": true,
482
+ "agentOpenInYaver": true,
483
+ "pluginEnabled": false
484
+ },
485
+ "expo-task-manager": {
486
+ "version": "14.0.9",
487
+ "hostApp": true,
488
+ "cliPush": true,
489
+ "agentOpenInYaver": true,
490
+ "pluginEnabled": false
491
+ },
492
+ "expo-updates": {
493
+ "version": "29.0.16",
494
+ "hostApp": true,
495
+ "cliPush": true,
496
+ "agentOpenInYaver": true,
497
+ "pluginEnabled": true
498
+ },
499
+ "expo-video": {
500
+ "version": "3.0.16",
501
+ "hostApp": true,
502
+ "cliPush": true,
503
+ "agentOpenInYaver": true,
504
+ "pluginEnabled": true
505
+ },
506
+ "expo-video-thumbnails": {
507
+ "version": "10.0.8",
508
+ "hostApp": true,
509
+ "cliPush": true,
510
+ "agentOpenInYaver": true,
511
+ "pluginEnabled": false
512
+ },
513
+ "expo-web-browser": {
514
+ "version": "15.0.10",
515
+ "hostApp": true,
516
+ "cliPush": true,
517
+ "agentOpenInYaver": true,
518
+ "pluginEnabled": false
519
+ },
520
+ "lottie-react-native": {
521
+ "version": "7.3.6",
522
+ "hostApp": true,
523
+ "cliPush": true,
524
+ "agentOpenInYaver": true,
525
+ "pluginEnabled": false
526
+ },
527
+ "react-native-ble-plx": {
528
+ "version": "3.5.1",
529
+ "hostApp": true,
530
+ "cliPush": true,
531
+ "agentOpenInYaver": true,
532
+ "pluginEnabled": false
533
+ },
534
+ "react-native-gesture-handler": {
535
+ "version": "2.28.0",
536
+ "hostApp": true,
537
+ "cliPush": true,
538
+ "agentOpenInYaver": true,
539
+ "pluginEnabled": false
540
+ },
541
+ "react-native-get-random-values": {
542
+ "version": "1.11.0",
543
+ "hostApp": true,
544
+ "cliPush": true,
545
+ "agentOpenInYaver": true,
546
+ "pluginEnabled": false
547
+ },
548
+ "react-native-iap": {
549
+ "version": "14.7.20",
550
+ "hostApp": true,
551
+ "cliPush": true,
552
+ "agentOpenInYaver": true,
553
+ "pluginEnabled": false
554
+ },
555
+ "react-native-maps": {
556
+ "version": "1.20.1",
557
+ "hostApp": true,
558
+ "cliPush": true,
559
+ "agentOpenInYaver": true,
560
+ "pluginEnabled": false
561
+ },
562
+ "react-native-markdown-display": {
563
+ "version": "7.0.2",
564
+ "hostApp": true,
565
+ "cliPush": true,
566
+ "agentOpenInYaver": true,
567
+ "pluginEnabled": false
568
+ },
569
+ "react-native-mmkv": {
570
+ "version": "4.3.0",
571
+ "hostApp": true,
572
+ "cliPush": true,
573
+ "agentOpenInYaver": true,
574
+ "pluginEnabled": false
575
+ },
576
+ "react-native-nitro-modules": {
577
+ "version": "0.35.3",
578
+ "hostApp": true,
579
+ "cliPush": true,
580
+ "agentOpenInYaver": true,
581
+ "pluginEnabled": false
582
+ },
583
+ "react-native-pager-view": {
584
+ "version": "6.9.1",
585
+ "hostApp": true,
586
+ "cliPush": true,
587
+ "agentOpenInYaver": true,
588
+ "pluginEnabled": false
589
+ },
590
+ "react-native-reanimated": {
591
+ "version": "4.1.7",
592
+ "hostApp": true,
593
+ "cliPush": true,
594
+ "agentOpenInYaver": true,
595
+ "pluginEnabled": false
596
+ },
597
+ "react-native-safe-area-context": {
598
+ "version": "5.6.2",
599
+ "hostApp": true,
600
+ "cliPush": true,
601
+ "agentOpenInYaver": true,
602
+ "pluginEnabled": false
603
+ },
604
+ "react-native-screens": {
605
+ "version": "4.16.0",
606
+ "hostApp": true,
607
+ "cliPush": true,
608
+ "agentOpenInYaver": true,
609
+ "pluginEnabled": false
610
+ },
611
+ "react-native-svg": {
612
+ "version": "15.12.1",
613
+ "hostApp": true,
614
+ "cliPush": true,
615
+ "agentOpenInYaver": true,
616
+ "pluginEnabled": false
617
+ },
618
+ "react-native-udp": {
619
+ "version": "4.1.7",
620
+ "hostApp": true,
621
+ "cliPush": true,
622
+ "agentOpenInYaver": true,
623
+ "pluginEnabled": false
624
+ },
625
+ "react-native-video": {
626
+ "version": "6.19.1",
627
+ "hostApp": true,
628
+ "cliPush": true,
629
+ "agentOpenInYaver": true,
630
+ "pluginEnabled": false
631
+ },
632
+ "react-native-view-shot": {
633
+ "version": "4.0.3",
634
+ "hostApp": true,
635
+ "cliPush": true,
636
+ "agentOpenInYaver": true,
637
+ "pluginEnabled": false
638
+ },
639
+ "react-native-web": {
640
+ "version": "0.21.2",
641
+ "hostApp": true,
642
+ "cliPush": true,
643
+ "agentOpenInYaver": true,
644
+ "pluginEnabled": false
645
+ },
646
+ "react-native-webview": {
647
+ "version": "13.15.0",
648
+ "hostApp": true,
649
+ "cliPush": true,
650
+ "agentOpenInYaver": true,
651
+ "pluginEnabled": false
652
+ },
653
+ "react-native-worklets": {
654
+ "version": "0.5.1",
655
+ "hostApp": true,
656
+ "cliPush": true,
657
+ "agentOpenInYaver": true,
658
+ "pluginEnabled": false
659
+ },
660
+ "victory-native": {
661
+ "version": "41.20.2",
662
+ "hostApp": true,
663
+ "cliPush": true,
664
+ "agentOpenInYaver": true,
665
+ "pluginEnabled": false
666
+ },
667
+ "whisper.rn": {
668
+ "version": "0.5.5",
669
+ "hostApp": true,
670
+ "cliPush": true,
671
+ "agentOpenInYaver": true,
672
+ "pluginEnabled": false
673
+ }
57
674
  }
58
675
  }
@@ -0,0 +1,217 @@
1
+ const fs = require('fs');
2
+ const os = require('os');
3
+ const path = require('path');
4
+ const { spawn } = require('child_process');
5
+ const { pipeline } = require('stream/promises');
6
+ const https = require('https');
7
+
8
+ const PACKAGE = require('../package.json');
9
+
10
+ const DEFAULT_REPO = process.env.YAVER_AGENT_REPO || 'kivanccakmak/yaver.io';
11
+ const AGENT_VERSION = process.env.YAVER_AGENT_VERSION || PACKAGE.version;
12
+ const CACHE_ROOT = process.env.YAVER_AGENT_CACHE_DIR || path.join(os.homedir(), '.yaver', 'bin');
13
+
14
+ async function ensureAgentBinary({ quiet = false } = {}) {
15
+ const asset = resolveAsset();
16
+ const localAgentPath = resolveLocalAgentBinary(asset);
17
+ if (localAgentPath) {
18
+ return localAgentPath;
19
+ }
20
+ const installDir = path.join(CACHE_ROOT, AGENT_VERSION, asset.cacheKey);
21
+ const binaryPath = path.join(installDir, asset.binaryName);
22
+
23
+ if (fs.existsSync(binaryPath)) {
24
+ if (process.platform !== 'win32') {
25
+ fs.chmodSync(binaryPath, 0o755);
26
+ }
27
+ return binaryPath;
28
+ }
29
+
30
+ fs.mkdirSync(installDir, { recursive: true });
31
+ const tmpPath = path.join(installDir, asset.downloadName);
32
+
33
+ if (!quiet) {
34
+ console.error(`Installing Yaver agent ${AGENT_VERSION} for ${asset.cacheKey}...`);
35
+ }
36
+
37
+ await downloadToFile(asset.url, tmpPath);
38
+
39
+ if (asset.archiveType === 'tar.gz') {
40
+ await extractTarball(tmpPath, installDir);
41
+ fs.rmSync(tmpPath, { force: true });
42
+ } else {
43
+ fs.renameSync(tmpPath, binaryPath);
44
+ }
45
+
46
+ if (!fs.existsSync(binaryPath)) {
47
+ throw new Error(`agent binary missing after install: ${binaryPath}`);
48
+ }
49
+ if (process.platform !== 'win32') {
50
+ fs.chmodSync(binaryPath, 0o755);
51
+ }
52
+ return binaryPath;
53
+ }
54
+
55
+ async function runAgentCommand(args, options = {}) {
56
+ const localAgent = resolveLocalAgentCommand(args);
57
+ const spawnSpec = localAgent
58
+ ? localAgent
59
+ : { command: await ensureAgentBinary(options), args };
60
+ const child = spawn(spawnSpec.command, spawnSpec.args, {
61
+ stdio: 'inherit',
62
+ env: process.env,
63
+ cwd: spawnSpec.cwd || process.cwd(),
64
+ });
65
+
66
+ await new Promise((resolve, reject) => {
67
+ child.on('error', reject);
68
+ child.on('exit', (code, signal) => {
69
+ if (signal) {
70
+ reject(new Error(`agent terminated by signal ${signal}`));
71
+ return;
72
+ }
73
+ if (code && code !== 0) {
74
+ const error = new Error(`agent exited with code ${code}`);
75
+ error.exitCode = code;
76
+ reject(error);
77
+ return;
78
+ }
79
+ resolve();
80
+ });
81
+ });
82
+ }
83
+
84
+ function resolveAgentInfo() {
85
+ const asset = resolveAsset();
86
+ return {
87
+ version: AGENT_VERSION,
88
+ repo: DEFAULT_REPO,
89
+ asset: asset.downloadName,
90
+ binaryName: asset.binaryName,
91
+ cacheDir: path.join(CACHE_ROOT, AGENT_VERSION, asset.cacheKey),
92
+ downloadUrl: asset.url,
93
+ };
94
+ }
95
+
96
+ function resolveLocalAgentBinary(asset) {
97
+ if (process.env.YAVER_AGENT_BIN && fs.existsSync(process.env.YAVER_AGENT_BIN)) {
98
+ return process.env.YAVER_AGENT_BIN;
99
+ }
100
+ const repoBinary = path.join(repoRoot(), 'desktop', 'agent', asset.downloadName.replace('.tar.gz', '').replace('.exe', '.exe'));
101
+ if (fs.existsSync(repoBinary)) {
102
+ return repoBinary;
103
+ }
104
+ return null;
105
+ }
106
+
107
+ function resolveLocalAgentCommand(agentArgs) {
108
+ if (process.env.YAVER_AGENT_BIN && fs.existsSync(process.env.YAVER_AGENT_BIN)) {
109
+ return { command: process.env.YAVER_AGENT_BIN, args: agentArgs };
110
+ }
111
+
112
+ const asset = resolveAsset();
113
+ const localBinary = resolveLocalAgentBinary(asset);
114
+ if (localBinary) {
115
+ return { command: localBinary, args: agentArgs };
116
+ }
117
+
118
+ const agentDir = path.join(repoRoot(), 'desktop', 'agent');
119
+ const goMod = path.join(agentDir, 'go.mod');
120
+ if (fs.existsSync(goMod)) {
121
+ return {
122
+ command: 'go',
123
+ args: ['run', '.', ...agentArgs],
124
+ cwd: agentDir,
125
+ };
126
+ }
127
+
128
+ return null;
129
+ }
130
+
131
+ function resolveAsset() {
132
+ const platform = process.platform;
133
+ const arch = process.arch;
134
+ const goArch = arch === 'x64' ? 'amd64' : arch === 'arm64' ? 'arm64' : null;
135
+
136
+ if (!goArch) {
137
+ throw new Error(`unsupported architecture for npm bootstrap: ${arch}`);
138
+ }
139
+
140
+ if (platform === 'win32') {
141
+ return {
142
+ cacheKey: `${platform}-${goArch}`,
143
+ binaryName: 'yaver.exe',
144
+ downloadName: `yaver-windows-${goArch}.exe`,
145
+ archiveType: 'exe',
146
+ url: releaseUrl(`yaver-windows-${goArch}.exe`),
147
+ };
148
+ }
149
+
150
+ if (platform === 'darwin' || platform === 'linux') {
151
+ return {
152
+ cacheKey: `${platform}-${goArch}`,
153
+ binaryName: 'yaver',
154
+ downloadName: `yaver-${platform}-${goArch}.tar.gz`,
155
+ archiveType: 'tar.gz',
156
+ url: releaseUrl(`yaver-${platform}-${goArch}.tar.gz`),
157
+ };
158
+ }
159
+
160
+ throw new Error(`unsupported platform for npm bootstrap: ${platform}`);
161
+ }
162
+
163
+ function releaseUrl(assetName) {
164
+ return `https://github.com/${DEFAULT_REPO}/releases/download/v${AGENT_VERSION}/${assetName}`;
165
+ }
166
+
167
+ async function downloadToFile(url, destPath) {
168
+ const response = await request(url);
169
+ if (response.statusCode && response.statusCode >= 400) {
170
+ throw new Error(`download failed (${response.statusCode}) from ${url}. Publish the matching CLI release assets or set YAVER_AGENT_BIN.`);
171
+ }
172
+ await pipeline(response, fs.createWriteStream(destPath));
173
+ }
174
+
175
+ function request(url) {
176
+ return new Promise((resolve, reject) => {
177
+ https.get(url, (response) => {
178
+ if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
179
+ resolve(request(response.headers.location));
180
+ return;
181
+ }
182
+ resolve(response);
183
+ }).on('error', reject);
184
+ });
185
+ }
186
+
187
+ async function extractTarball(archivePath, destDir) {
188
+ const child = spawn('tar', ['-xzf', archivePath, '-C', destDir], {
189
+ stdio: ['ignore', 'pipe', 'pipe'],
190
+ });
191
+
192
+ let stderr = '';
193
+ child.stderr.on('data', (chunk) => {
194
+ stderr += chunk.toString();
195
+ });
196
+
197
+ await new Promise((resolve, reject) => {
198
+ child.on('error', reject);
199
+ child.on('exit', (code) => {
200
+ if (code !== 0) {
201
+ reject(new Error(stderr.trim() || `tar exited with code ${code}`));
202
+ return;
203
+ }
204
+ resolve();
205
+ });
206
+ });
207
+ }
208
+
209
+ module.exports = {
210
+ ensureAgentBinary,
211
+ resolveAgentInfo,
212
+ runAgentCommand,
213
+ };
214
+
215
+ function repoRoot() {
216
+ return path.resolve(__dirname, '..', '..');
217
+ }
package/src/analyzer.js CHANGED
@@ -73,7 +73,7 @@ function analyzeProject(packageJson, sdkManifest) {
73
73
  if (PURE_JS_PACKAGES.has(name)) continue;
74
74
  if (FALSE_POSITIVE_NATIVE.has(name)) continue;
75
75
  if (packageJson.devDependencies?.[name] && !packageJson.dependencies?.[name]) continue;
76
- if (!looksLikeNativeModule(name)) continue;
76
+ if (!looksLikeNativeModule(name, sdkManifest)) continue;
77
77
 
78
78
  const sdkVersion = sdkManifest.nativeModules[name];
79
79
 
@@ -89,10 +89,10 @@ function analyzeProject(packageJson, sdkManifest) {
89
89
 
90
90
  const localParsed = semver.coerce(cleanLocal);
91
91
  const sdkParsed = semver.coerce(sdkVersion);
92
- if (localParsed && sdkParsed && semver.major(localParsed) !== semver.major(sdkParsed)) {
92
+ if (localParsed && sdkParsed && hasPotentiallyBreakingVersionDrift(localParsed, sdkParsed)) {
93
93
  warnings.push({
94
94
  type: 'version_mismatch', module: name,
95
- message: `"${name}": project ${version}, yaver ${sdkVersion}. Major version differs.`,
95
+ message: `"${name}": project ${version}, yaver ${sdkVersion}. Version differs at a potentially breaking boundary.`,
96
96
  });
97
97
  }
98
98
  }
@@ -101,7 +101,8 @@ function analyzeProject(packageJson, sdkManifest) {
101
101
  return { reactNativeVersion: projectRN, errors, warnings, availableModules, missingModules };
102
102
  }
103
103
 
104
- function looksLikeNativeModule(name) {
104
+ function looksLikeNativeModule(name, sdkManifest) {
105
+ if (sdkManifest?.nativeModules?.[name]) return true;
105
106
  return name.startsWith('react-native-') ||
106
107
  name.startsWith('@react-native-') ||
107
108
  name.startsWith('@react-native/') ||
@@ -114,4 +115,12 @@ function cleanVersion(v) {
114
115
  return (v || '').replace(/[\^~>=<\s]/g, '');
115
116
  }
116
117
 
118
+ function hasPotentiallyBreakingVersionDrift(projectVersion, sdkVersion) {
119
+ if (semver.major(projectVersion) !== semver.major(sdkVersion)) return true;
120
+ if (semver.major(projectVersion) === 0 && semver.minor(projectVersion) !== semver.minor(sdkVersion)) {
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+
117
126
  module.exports = { analyzeProject, PURE_JS_PACKAGES, FALSE_POSITIVE_NATIVE };
package/src/bundler.js CHANGED
@@ -21,7 +21,7 @@ function getHermescPath() {
21
21
  if (rnHermesc) return rnHermesc;
22
22
 
23
23
  throw new Error(
24
- `hermesc not found for ${key}. Install @yaver/cli hermesc binaries or ensure react-native is installed.`
24
+ `hermesc not found for ${key}. Install yaver-cli hermesc binaries or ensure react-native is installed.`
25
25
  );
26
26
  }
27
27
 
@@ -103,13 +103,13 @@ async function compileHermes({ inputPath, outputPath }) {
103
103
 
104
104
  function readBytecodeVersion(hbcPath) {
105
105
  const buf = fs.readFileSync(hbcPath);
106
- if (buf.length < 8) return null;
106
+ if (buf.length < 12) return null;
107
107
 
108
- // Hermes magic: 0x1F1903C1 (little-endian)
109
- const magic = buf.readUInt32LE(0);
108
+ // Hermes HBC format: magic at offset 4, BC version at offset 8
109
+ const magic = buf.readUInt32LE(4);
110
110
  if (magic !== 0x1F1903C1) return null;
111
111
 
112
- return buf.readUInt32LE(4);
112
+ return buf.readUInt32LE(8);
113
113
  }
114
114
 
115
115
  module.exports = { bundle, compileHermes, readBytecodeVersion, getHermescPath };
@@ -16,7 +16,7 @@ async function devices() {
16
16
  for (const d of found) {
17
17
  console.log(` 📱 ${d.name} (${d.platform})`);
18
18
  console.log(` IP: ${d.ip}:${d.port}`);
19
- console.log(` Push: yaver-push push --device ${d.ip}\n`);
19
+ console.log(` Push: yaver push --device ${d.ip}\n`);
20
20
  }
21
21
  }
22
22
 
@@ -1,5 +1,6 @@
1
1
  const fs = require('fs');
2
2
  const { analyzeProject } = require('../analyzer');
3
+ const { loadSDKManifest } = require('../sdk-manifest');
3
4
 
4
5
  async function doctor() {
5
6
  if (!fs.existsSync('package.json')) {
@@ -8,7 +9,7 @@ async function doctor() {
8
9
  }
9
10
 
10
11
  const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
11
- const sdkManifest = require('../../sdk-manifest.json');
12
+ const sdkManifest = loadSDKManifest();
12
13
  const analysis = analyzeProject(pkg, sdkManifest);
13
14
 
14
15
  console.log('\n📋 Yaver Compatibility Report\n');
@@ -1,6 +1,6 @@
1
1
  const fs = require('fs');
2
- const path = require('path');
3
2
  const { analyzeProject } = require('../analyzer');
3
+ const { loadSDKManifest } = require('../sdk-manifest');
4
4
 
5
5
  async function init() {
6
6
  if (!fs.existsSync('package.json')) {
@@ -16,7 +16,7 @@ async function init() {
16
16
 
17
17
  console.log('🔍 Analyzing your project...\n');
18
18
 
19
- const sdkManifest = require('../../sdk-manifest.json');
19
+ const sdkManifest = loadSDKManifest();
20
20
  const analysis = analyzeProject(pkg, sdkManifest);
21
21
 
22
22
  printAnalysis(analysis, sdkManifest);
@@ -37,12 +37,12 @@ async function init() {
37
37
 
38
38
  if (analysis.errors.filter(e => e.type === 'missing_module').length > 0) {
39
39
  console.log('\n⚠️ Your project has compatibility issues (see above).');
40
- console.log(' You can still push with: yaver-push push --ignore-missing');
40
+ console.log(' You can still push with: yaver push --ignore-missing');
41
41
  console.log(' Features using missing modules will crash.\n');
42
42
  } else if (analysis.errors.length > 0) {
43
43
  console.log('\n🚫 Incompatible — see errors above.\n');
44
44
  } else {
45
- console.log('\n🎉 Fully compatible! Run: yaver-push push\n');
45
+ console.log('\n🎉 Fully compatible! Run: yaver push\n');
46
46
  }
47
47
  }
48
48
 
@@ -1,5 +1,6 @@
1
1
  async function modules() {
2
- const sdkManifest = require('../../sdk-manifest.json');
2
+ const { loadSDKManifest } = require('../sdk-manifest');
3
+ const sdkManifest = loadSDKManifest();
3
4
 
4
5
  console.log(`\n📦 Yaver SDK v${sdkManifest.sdkVersion} — Native Modules\n`);
5
6
  console.log(` React Native: ${sdkManifest.reactNative}`);
@@ -3,13 +3,14 @@ const path = require('path');
3
3
  const { analyzeProject } = require('../analyzer');
4
4
  const { bundle, compileHermes, readBytecodeVersion } = require('../bundler');
5
5
  const { discoverDevice, fetchHealth } = require('../discovery');
6
+ const { loadSDKManifest } = require('../sdk-manifest');
6
7
  const { pushBundle, pushAssets } = require('../transport');
7
8
 
8
9
  async function push(options = {}) {
9
10
  const startTime = Date.now();
10
11
  const quiet = options.quiet;
11
12
  const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
12
- const sdkManifest = require('../../sdk-manifest.json');
13
+ const sdkManifest = loadSDKManifest();
13
14
 
14
15
  // Find device
15
16
  if (!quiet) console.log('📡 Finding device...');
@@ -22,7 +23,7 @@ async function push(options = {}) {
22
23
 
23
24
  if (health.hermes?.bytecodeVersion !== sdkManifest.hermes.bytecodeVersion) {
24
25
  console.error(`�� Hermes BC mismatch: device BC${health.hermes?.bytecodeVersion}, CLI BC${sdkManifest.hermes.bytecodeVersion}`);
25
- console.error(' Update @yaver/cli or yaver.io app.');
26
+ console.error(' Update the npm package or the yaver.io app.');
26
27
  process.exit(1);
27
28
  }
28
29
 
@@ -42,7 +43,7 @@ async function push(options = {}) {
42
43
  console.warn(`\n⚠��� ${analysis.missingModules.length} native module(s) NOT in yaver SDK:`);
43
44
  analysis.missingModules.forEach(m => console.warn(` • ${m.name}@${m.version}`));
44
45
  console.warn('\n App will crash if it calls these modules.');
45
- console.warn(' Push anyway: yaver-push push --ignore-missing\n');
46
+ console.warn(' Push anyway: yaver push --ignore-missing\n');
46
47
  if (!options.force) process.exit(1);
47
48
  }
48
49
 
@@ -14,7 +14,7 @@ async function status(options = {}) {
14
14
  console.log(` Missing: ${yj.missingModules?.length || 0} native modules`);
15
15
  console.log(` Analyzed: ${yj.analyzedAt}`);
16
16
  } else {
17
- console.log(' No yaver.json found. Run: yaver-push init');
17
+ console.log(' No yaver.json found. Run: yaver push init');
18
18
  }
19
19
 
20
20
  // Device status
package/src/discovery.js CHANGED
@@ -24,7 +24,7 @@ async function discoverDevice(manualIp) {
24
24
  throw new Error(
25
25
  'No yaver.io device found on network.\n' +
26
26
  ' Make sure the yaver.io app is open on your phone (same WiFi).\n' +
27
- ' Or specify device IP: yaver-push push --device <ip>'
27
+ ' Or specify device IP: yaver push --device <ip>'
28
28
  );
29
29
  }
30
30
 
package/src/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ const PACKAGE = require('../package.json');
2
+ const { resolveAgentInfo, runAgentCommand } = require('./agent-runtime');
1
3
  const { init } = require('./commands/init');
2
4
  const { push } = require('./commands/push');
3
5
  const { doctor } = require('./commands/doctor');
@@ -6,8 +8,8 @@ const { modules } = require('./commands/modules');
6
8
  const { reset } = require('./commands/reset');
7
9
  const { status } = require('./commands/status');
8
10
 
9
- const HELP = `
10
- yaver-push — Push existing React Native projects to yaver.io
11
+ const PUSH_HELP = `
12
+ yaver push — Push existing React Native projects to the Yaver mobile host
11
13
 
12
14
  Commands:
13
15
  init Analyze project, show compatibility, create yaver.json
@@ -27,12 +29,43 @@ Options:
27
29
  --help Show this help
28
30
  `;
29
31
 
30
- async function run(args) {
32
+ const UNIFIED_HELP = `
33
+ yaver — single npm install for the Go agent and the RN push CLI
34
+
35
+ Agent commands:
36
+ yaver serve Start the Yaver agent (downloads platform binary if needed)
37
+ yaver auth Sign in and configure the agent
38
+ yaver version Print agent version
39
+ yaver <agent-command> Forward any other command to the Go agent
40
+
41
+ Push-to-device commands:
42
+ yaver push Bundle + validate + push current RN/Expo project
43
+ yaver push init Analyze current project and create yaver.json
44
+ yaver push doctor Deep compatibility report for current project
45
+ yaver push modules List native modules compiled into the mobile host
46
+ yaver push devices Scan LAN for Yaver mobile hosts
47
+ yaver push reset Clear pushed bundle on the selected device
48
+ yaver push status Show project + device push status
49
+
50
+ Compatibility:
51
+ yaver-push <command> Legacy alias for the push subcommands above
52
+
53
+ Options:
54
+ --help Show this help
55
+ `;
56
+
57
+ const PUSH_SUBCOMMANDS = new Set(['init', 'push', 'doctor', 'devices', 'modules', 'reset', 'status']);
58
+ const DIRECT_PUSH_ALIASES = new Map([
59
+ ['init', 'init'],
60
+ ['modules', 'modules'],
61
+ ]);
62
+
63
+ async function runPushCli(args) {
31
64
  const command = args[0];
32
65
  const options = parseArgs(args.slice(1));
33
66
 
34
- if (!command || command === '--help' || command === '-h') {
35
- console.log(HELP);
67
+ if (!command || command === '--help' || command === '-h' || args.includes('--help') || args.includes('-h')) {
68
+ console.log(PUSH_HELP);
36
69
  process.exit(0);
37
70
  }
38
71
 
@@ -61,7 +94,7 @@ async function run(args) {
61
94
  break;
62
95
  default:
63
96
  console.error(`Unknown command: ${command}`);
64
- console.log(HELP);
97
+ console.log(PUSH_HELP);
65
98
  process.exit(1);
66
99
  }
67
100
  } catch (err) {
@@ -71,6 +104,53 @@ async function run(args) {
71
104
  }
72
105
  }
73
106
 
107
+ async function runUnified(args) {
108
+ const command = args[0];
109
+
110
+ if (!command || command === '--help' || command === '-h' || command === 'help') {
111
+ console.log(UNIFIED_HELP);
112
+ process.exit(0);
113
+ }
114
+
115
+ if (command === 'push') {
116
+ const next = args[1];
117
+ if (!next || next.startsWith('-')) {
118
+ await runPushCli(['push', ...args.slice(1)]);
119
+ return;
120
+ }
121
+ if (PUSH_SUBCOMMANDS.has(next)) {
122
+ const subcommand = next === 'push' ? 'push' : next;
123
+ await runPushCli([subcommand, ...args.slice(2)]);
124
+ return;
125
+ }
126
+ console.error(`Unknown push subcommand: ${next}`);
127
+ console.log(PUSH_HELP);
128
+ process.exit(1);
129
+ }
130
+
131
+ if (DIRECT_PUSH_ALIASES.has(command)) {
132
+ await runPushCli([DIRECT_PUSH_ALIASES.get(command), ...args.slice(1)]);
133
+ return;
134
+ }
135
+
136
+ if (command === 'npm-agent-info') {
137
+ const info = resolveAgentInfo();
138
+ console.log(JSON.stringify(info, null, 2));
139
+ return;
140
+ }
141
+
142
+ try {
143
+ await runAgentCommand(args);
144
+ } catch (err) {
145
+ if (typeof err.exitCode === 'number') {
146
+ process.exit(err.exitCode);
147
+ }
148
+ console.error(`\n❌ ${err.message}`);
149
+ if (process.env.YAVER_DEBUG) console.error(err.stack);
150
+ process.exit(1);
151
+ }
152
+ }
153
+
74
154
  function parseArgs(args) {
75
155
  const opts = {};
76
156
  for (let i = 0; i < args.length; i++) {
@@ -90,4 +170,4 @@ function parseArgs(args) {
90
170
  return opts;
91
171
  }
92
172
 
93
- module.exports = { run };
173
+ module.exports = { runPushCli, runUnified };
@@ -0,0 +1,9 @@
1
+ const path = require('path');
2
+
3
+ function loadSDKManifest() {
4
+ const manifestPath = path.resolve(__dirname, '..', 'sdk-manifest.json');
5
+ delete require.cache[manifestPath];
6
+ return require(manifestPath);
7
+ }
8
+
9
+ module.exports = { loadSDKManifest };