march-control-cli 0.1.3

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 (53) hide show
  1. package/README.md +220 -0
  2. package/core/apply.js +152 -0
  3. package/core/backup.js +53 -0
  4. package/core/constants.js +55 -0
  5. package/core/desktop-service.js +219 -0
  6. package/core/desktop-state.js +511 -0
  7. package/core/index.js +1293 -0
  8. package/core/paths.js +71 -0
  9. package/core/presets.js +171 -0
  10. package/core/probe.js +70 -0
  11. package/core/store.js +218 -0
  12. package/core/utils.js +178 -0
  13. package/core/writers/codex.js +102 -0
  14. package/core/writers/index.js +16 -0
  15. package/core/writers/openclaw.js +93 -0
  16. package/core/writers/opencode.js +91 -0
  17. package/desktop/assets/march-mark.svg +21 -0
  18. package/desktop/main.js +192 -0
  19. package/desktop/preload.js +49 -0
  20. package/desktop/renderer/app.js +327 -0
  21. package/desktop/renderer/index.html +130 -0
  22. package/desktop/renderer/styles.css +413 -0
  23. package/package.json +106 -0
  24. package/scripts/desktop-dev.mjs +90 -0
  25. package/scripts/postinstall.mjs +28 -0
  26. package/scripts/serve-site.mjs +51 -0
  27. package/site/app.js +10 -0
  28. package/site/assets/march-mark.svg +22 -0
  29. package/site/index.html +286 -0
  30. package/site/styles.css +566 -0
  31. package/src/App.tsx +1186 -0
  32. package/src/components/layout/app-sidebar.tsx +103 -0
  33. package/src/components/layout/top-toolbar.tsx +44 -0
  34. package/src/components/layout/workspace-tabs.tsx +32 -0
  35. package/src/components/providers/inspector-panel.tsx +84 -0
  36. package/src/components/providers/metric-strip.tsx +26 -0
  37. package/src/components/providers/provider-editor.tsx +87 -0
  38. package/src/components/providers/provider-table.tsx +85 -0
  39. package/src/components/ui/logo-mark.tsx +16 -0
  40. package/src/features/mcp/mcp-view.tsx +45 -0
  41. package/src/features/prompts/prompts-view.tsx +40 -0
  42. package/src/features/providers/providers-view.tsx +40 -0
  43. package/src/features/providers/types.ts +8 -0
  44. package/src/features/skills/skills-view.tsx +44 -0
  45. package/src/hooks/use-control-workspace.ts +184 -0
  46. package/src/index.css +22 -0
  47. package/src/lib/client.ts +944 -0
  48. package/src/lib/query-client.ts +3 -0
  49. package/src/lib/workspace-sections.ts +34 -0
  50. package/src/main.tsx +14 -0
  51. package/src/types.ts +76 -0
  52. package/src/vite-env.d.ts +56 -0
  53. package/src-tauri/README.md +11 -0
@@ -0,0 +1,566 @@
1
+ :root {
2
+ --bg: #f4efe6;
3
+ --bg-strong: #efe6d8;
4
+ --panel: rgba(255, 252, 246, 0.84);
5
+ --panel-strong: #fffaf1;
6
+ --line: rgba(18, 33, 44, 0.12);
7
+ --ink: #13212c;
8
+ --muted: #5f6f79;
9
+ --accent: #0e8f88;
10
+ --accent-soft: #d8f2ef;
11
+ --accent-strong: #0a615d;
12
+ --gold: #c98d2f;
13
+ --shadow: 0 22px 60px rgba(19, 33, 44, 0.12);
14
+ }
15
+
16
+ * {
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ html {
21
+ scroll-behavior: smooth;
22
+ }
23
+
24
+ body {
25
+ margin: 0;
26
+ font-family: "Manrope", "Segoe UI Variable", "PingFang SC", sans-serif;
27
+ color: var(--ink);
28
+ background:
29
+ radial-gradient(circle at top left, rgba(201, 141, 47, 0.18), transparent 28%),
30
+ radial-gradient(circle at top right, rgba(14, 143, 136, 0.2), transparent 30%),
31
+ linear-gradient(180deg, #fbf7ef 0%, #f3ecdf 100%);
32
+ }
33
+
34
+ a {
35
+ color: inherit;
36
+ text-decoration: none;
37
+ }
38
+
39
+ button {
40
+ font: inherit;
41
+ }
42
+
43
+ .page-shell {
44
+ width: min(1320px, calc(100% - 32px));
45
+ margin: 0 auto;
46
+ padding-bottom: 56px;
47
+ }
48
+
49
+ .topbar {
50
+ position: sticky;
51
+ top: 16px;
52
+ z-index: 20;
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ gap: 16px;
57
+ margin: 16px 0 32px;
58
+ padding: 16px 18px;
59
+ border: 1px solid rgba(255, 255, 255, 0.55);
60
+ border-radius: 24px;
61
+ background: rgba(255, 250, 241, 0.72);
62
+ backdrop-filter: blur(14px);
63
+ box-shadow: 0 12px 40px rgba(19, 33, 44, 0.08);
64
+ }
65
+
66
+ .brand {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ gap: 12px;
70
+ }
71
+
72
+ .brand img,
73
+ .sidebar-brand img {
74
+ width: 42px;
75
+ height: 42px;
76
+ }
77
+
78
+ .brand-copy,
79
+ .sidebar-brand div {
80
+ display: grid;
81
+ }
82
+
83
+ .brand-copy strong,
84
+ .sidebar-brand strong,
85
+ .hero h1,
86
+ .workspace-header h2,
87
+ .panel h3,
88
+ .detail-card h2,
89
+ .section-title h2 {
90
+ font-family: "Space Grotesk", "Segoe UI Variable", sans-serif;
91
+ }
92
+
93
+ .brand-copy strong,
94
+ .sidebar-brand strong {
95
+ font-size: 1rem;
96
+ letter-spacing: 0.04em;
97
+ }
98
+
99
+ .brand-copy em,
100
+ .sidebar-brand span,
101
+ .sidebar-label,
102
+ .panel-kicker,
103
+ .eyebrow {
104
+ color: var(--muted);
105
+ font-style: normal;
106
+ font-size: 0.8rem;
107
+ letter-spacing: 0.12em;
108
+ text-transform: uppercase;
109
+ }
110
+
111
+ .topnav {
112
+ display: inline-flex;
113
+ gap: 22px;
114
+ color: var(--muted);
115
+ }
116
+
117
+ .topnav a:hover {
118
+ color: var(--ink);
119
+ }
120
+
121
+ .top-cta,
122
+ .button,
123
+ .header-actions button {
124
+ border-radius: 999px;
125
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
126
+ }
127
+
128
+ .top-cta {
129
+ padding: 12px 18px;
130
+ color: #fffaf2;
131
+ background: linear-gradient(135deg, #102532, #0d8d85);
132
+ box-shadow: 0 12px 30px rgba(16, 37, 50, 0.22);
133
+ }
134
+
135
+ .top-cta:hover,
136
+ .button:hover,
137
+ .header-actions button:hover,
138
+ .download-card:hover {
139
+ transform: translateY(-2px);
140
+ }
141
+
142
+ .hero {
143
+ display: grid;
144
+ grid-template-columns: 1.05fr 1.2fr;
145
+ gap: 32px;
146
+ align-items: center;
147
+ padding: 24px 0 40px;
148
+ }
149
+
150
+ .hero-copy {
151
+ padding-right: 12px;
152
+ }
153
+
154
+ .hero h1 {
155
+ margin: 10px 0 18px;
156
+ font-size: clamp(3rem, 6vw, 5.4rem);
157
+ line-height: 0.94;
158
+ letter-spacing: -0.05em;
159
+ }
160
+
161
+ .hero p,
162
+ .detail-card p,
163
+ .faq-list p,
164
+ .feature-strip p,
165
+ .panel-note {
166
+ color: var(--muted);
167
+ font-size: 1.02rem;
168
+ line-height: 1.7;
169
+ }
170
+
171
+ .hero-actions {
172
+ display: flex;
173
+ gap: 14px;
174
+ margin: 28px 0 32px;
175
+ }
176
+
177
+ .button {
178
+ display: inline-flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ min-width: 146px;
182
+ padding: 14px 20px;
183
+ border: 1px solid var(--line);
184
+ }
185
+
186
+ .button.primary {
187
+ color: #fff8ef;
188
+ background: linear-gradient(135deg, var(--accent-strong), var(--ink));
189
+ box-shadow: 0 12px 30px rgba(15, 66, 63, 0.24);
190
+ }
191
+
192
+ .button.secondary {
193
+ background: rgba(255, 255, 255, 0.5);
194
+ }
195
+
196
+ .hero-metrics {
197
+ display: grid;
198
+ grid-template-columns: repeat(3, minmax(0, 1fr));
199
+ gap: 14px;
200
+ padding: 0;
201
+ margin: 0;
202
+ list-style: none;
203
+ }
204
+
205
+ .hero-metrics li,
206
+ .feature-strip article,
207
+ .detail-card,
208
+ .faq-list article {
209
+ border: 1px solid rgba(18, 33, 44, 0.08);
210
+ border-radius: 24px;
211
+ background: rgba(255, 251, 245, 0.72);
212
+ backdrop-filter: blur(12px);
213
+ box-shadow: var(--shadow);
214
+ }
215
+
216
+ .hero-metrics li {
217
+ display: grid;
218
+ gap: 8px;
219
+ padding: 18px;
220
+ }
221
+
222
+ .hero-metrics strong {
223
+ font-size: 1.3rem;
224
+ }
225
+
226
+ .hero-visual {
227
+ position: relative;
228
+ min-height: 680px;
229
+ }
230
+
231
+ .floating-card {
232
+ position: absolute;
233
+ top: 28px;
234
+ right: 18px;
235
+ z-index: 2;
236
+ display: grid;
237
+ gap: 6px;
238
+ width: 230px;
239
+ padding: 18px;
240
+ color: #edf8f7;
241
+ border-radius: 22px;
242
+ background: linear-gradient(160deg, rgba(16, 37, 50, 0.95), rgba(14, 143, 136, 0.84));
243
+ box-shadow: 0 20px 40px rgba(16, 37, 50, 0.28);
244
+ }
245
+
246
+ .floating-card span,
247
+ .floating-card small {
248
+ color: rgba(237, 248, 247, 0.78);
249
+ }
250
+
251
+ .floating-card strong {
252
+ font-size: 1.2rem;
253
+ }
254
+
255
+ .app-frame {
256
+ position: absolute;
257
+ inset: 70px 0 0;
258
+ display: grid;
259
+ grid-template-columns: 248px minmax(0, 1fr);
260
+ border: 1px solid rgba(18, 33, 44, 0.08);
261
+ border-radius: 34px;
262
+ overflow: hidden;
263
+ background: rgba(255, 249, 240, 0.66);
264
+ box-shadow: 0 28px 80px rgba(19, 33, 44, 0.18);
265
+ }
266
+
267
+ .sidebar {
268
+ display: flex;
269
+ flex-direction: column;
270
+ justify-content: space-between;
271
+ padding: 28px 18px;
272
+ background:
273
+ radial-gradient(circle at top, rgba(14, 143, 136, 0.18), transparent 42%),
274
+ linear-gradient(180deg, rgba(10, 17, 24, 0.96), rgba(17, 33, 44, 0.92));
275
+ color: rgba(248, 252, 252, 0.9);
276
+ }
277
+
278
+ .sidebar-brand {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 12px;
282
+ }
283
+
284
+ .sidebar-section {
285
+ display: grid;
286
+ gap: 10px;
287
+ }
288
+
289
+ .nav-item,
290
+ .mini-provider {
291
+ padding: 12px 14px;
292
+ border: 1px solid rgba(255, 255, 255, 0.08);
293
+ border-radius: 18px;
294
+ background: rgba(255, 255, 255, 0.04);
295
+ }
296
+
297
+ .nav-item.active {
298
+ background: linear-gradient(135deg, rgba(14, 143, 136, 0.28), rgba(255, 255, 255, 0.08));
299
+ border-color: rgba(117, 232, 224, 0.18);
300
+ }
301
+
302
+ .mini-provider {
303
+ display: grid;
304
+ gap: 6px;
305
+ }
306
+
307
+ .mini-provider span {
308
+ color: rgba(255, 255, 255, 0.56);
309
+ font-size: 0.85rem;
310
+ }
311
+
312
+ .workspace {
313
+ padding: 26px;
314
+ background:
315
+ radial-gradient(circle at top right, rgba(201, 141, 47, 0.12), transparent 32%),
316
+ linear-gradient(180deg, rgba(255, 253, 248, 0.85), rgba(247, 240, 230, 0.88));
317
+ }
318
+
319
+ .workspace-header,
320
+ .panel-head,
321
+ .row {
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: space-between;
325
+ gap: 12px;
326
+ }
327
+
328
+ .workspace-header h2,
329
+ .section-title h2 {
330
+ margin: 8px 0 0;
331
+ font-size: 2rem;
332
+ letter-spacing: -0.04em;
333
+ }
334
+
335
+ .header-actions {
336
+ display: inline-flex;
337
+ gap: 10px;
338
+ }
339
+
340
+ .header-actions button {
341
+ padding: 12px 16px;
342
+ border: 1px solid var(--line);
343
+ background: rgba(255, 255, 255, 0.65);
344
+ }
345
+
346
+ .header-actions .solid {
347
+ color: #fff8ef;
348
+ border-color: transparent;
349
+ background: linear-gradient(135deg, var(--gold), var(--accent));
350
+ }
351
+
352
+ .workspace-grid {
353
+ display: grid;
354
+ grid-template-columns: 1.2fr 0.8fr;
355
+ gap: 18px;
356
+ margin-top: 24px;
357
+ }
358
+
359
+ .panel {
360
+ padding: 22px;
361
+ border: 1px solid rgba(18, 33, 44, 0.08);
362
+ border-radius: 26px;
363
+ background: rgba(255, 251, 245, 0.82);
364
+ }
365
+
366
+ .panel-highlight {
367
+ background:
368
+ radial-gradient(circle at top right, rgba(14, 143, 136, 0.14), transparent 26%),
369
+ linear-gradient(180deg, rgba(250, 253, 252, 0.94), rgba(255, 247, 239, 0.92));
370
+ }
371
+
372
+ .panel-badge {
373
+ padding: 8px 12px;
374
+ color: var(--accent-strong);
375
+ border-radius: 999px;
376
+ background: var(--accent-soft);
377
+ font-size: 0.82rem;
378
+ font-weight: 700;
379
+ }
380
+
381
+ .provider-list,
382
+ .download-grid {
383
+ display: grid;
384
+ gap: 12px;
385
+ margin-top: 18px;
386
+ }
387
+
388
+ .provider-card,
389
+ .download-card {
390
+ display: grid;
391
+ gap: 5px;
392
+ padding: 16px 18px;
393
+ border: 1px solid rgba(18, 33, 44, 0.09);
394
+ border-radius: 22px;
395
+ background: rgba(255, 255, 255, 0.68);
396
+ transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
397
+ }
398
+
399
+ .provider-card span,
400
+ .provider-card small,
401
+ .download-card span,
402
+ .download-card small {
403
+ color: var(--muted);
404
+ }
405
+
406
+ .provider-card.active,
407
+ .download-card.active {
408
+ border-color: rgba(14, 143, 136, 0.28);
409
+ background: linear-gradient(180deg, rgba(234, 250, 247, 0.95), rgba(255, 255, 255, 0.88));
410
+ box-shadow: 0 16px 36px rgba(14, 143, 136, 0.12);
411
+ }
412
+
413
+ .speed-table {
414
+ display: grid;
415
+ gap: 12px;
416
+ margin-top: 18px;
417
+ }
418
+
419
+ .row {
420
+ padding: 14px 16px;
421
+ border-radius: 18px;
422
+ background: rgba(245, 239, 230, 0.8);
423
+ }
424
+
425
+ .client-stack {
426
+ display: flex;
427
+ flex-wrap: wrap;
428
+ gap: 10px;
429
+ margin: 18px 0 12px;
430
+ }
431
+
432
+ .chip {
433
+ padding: 10px 14px;
434
+ border-radius: 999px;
435
+ background: rgba(16, 37, 50, 0.08);
436
+ font-weight: 700;
437
+ }
438
+
439
+ .panel-download {
440
+ grid-column: 1 / -1;
441
+ }
442
+
443
+ .feature-strip,
444
+ .details,
445
+ .faq-list {
446
+ display: grid;
447
+ gap: 18px;
448
+ }
449
+
450
+ .feature-strip {
451
+ grid-template-columns: repeat(3, minmax(0, 1fr));
452
+ margin: 34px 0;
453
+ }
454
+
455
+ .feature-strip article,
456
+ .detail-card,
457
+ .faq-list article {
458
+ padding: 24px;
459
+ }
460
+
461
+ .feature-strip span {
462
+ display: inline-flex;
463
+ margin-bottom: 14px;
464
+ font-family: "Space Grotesk", sans-serif;
465
+ font-size: 0.94rem;
466
+ color: var(--gold);
467
+ }
468
+
469
+ .details {
470
+ grid-template-columns: repeat(2, minmax(0, 1fr));
471
+ margin-bottom: 34px;
472
+ }
473
+
474
+ .detail-card.accent {
475
+ color: #edf8f7;
476
+ background: linear-gradient(145deg, rgba(16, 37, 50, 0.96), rgba(14, 143, 136, 0.88));
477
+ }
478
+
479
+ .detail-card.accent .eyebrow,
480
+ .detail-card.accent p {
481
+ color: rgba(237, 248, 247, 0.76);
482
+ }
483
+
484
+ .faq {
485
+ padding: 24px 0 8px;
486
+ }
487
+
488
+ .section-title {
489
+ margin-bottom: 18px;
490
+ }
491
+
492
+ .faq-list {
493
+ grid-template-columns: repeat(3, minmax(0, 1fr));
494
+ }
495
+
496
+ @media (max-width: 1100px) {
497
+ .hero,
498
+ .details,
499
+ .feature-strip,
500
+ .faq-list {
501
+ grid-template-columns: 1fr;
502
+ }
503
+
504
+ .hero-visual {
505
+ min-height: auto;
506
+ }
507
+
508
+ .floating-card {
509
+ position: static;
510
+ margin-bottom: 16px;
511
+ }
512
+
513
+ .app-frame {
514
+ position: static;
515
+ grid-template-columns: 1fr;
516
+ }
517
+
518
+ .workspace-grid {
519
+ grid-template-columns: 1fr;
520
+ }
521
+
522
+ .sidebar {
523
+ gap: 24px;
524
+ }
525
+ }
526
+
527
+ @media (max-width: 780px) {
528
+ .page-shell {
529
+ width: min(100% - 20px, 1320px);
530
+ }
531
+
532
+ .topbar {
533
+ position: static;
534
+ flex-wrap: wrap;
535
+ justify-content: center;
536
+ }
537
+
538
+ .topnav {
539
+ flex-wrap: wrap;
540
+ justify-content: center;
541
+ }
542
+
543
+ .hero {
544
+ gap: 24px;
545
+ }
546
+
547
+ .hero-metrics,
548
+ .faq-list {
549
+ grid-template-columns: 1fr;
550
+ }
551
+
552
+ .hero-actions,
553
+ .header-actions {
554
+ flex-direction: column;
555
+ }
556
+
557
+ .workspace {
558
+ padding: 18px;
559
+ }
560
+
561
+ .workspace-header,
562
+ .panel-head {
563
+ flex-direction: column;
564
+ align-items: flex-start;
565
+ }
566
+ }