@vibe80/vibe80 0.1.1

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 (123) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +52 -0
  3. package/bin/vibe80.js +176 -0
  4. package/client/dist/assets/DiffPanel-C_IGzKI5.js +1 -0
  5. package/client/dist/assets/ExplorerPanel-BtlyAT00.js +11 -0
  6. package/client/dist/assets/LogsPanel-BW79JWzR.js +1 -0
  7. package/client/dist/assets/SettingsPanel-b9B7ygP_.js +1 -0
  8. package/client/dist/assets/TerminalPanel-C3fc1HbK.js +1 -0
  9. package/client/dist/assets/browser-e3WgtMs-.js +8 -0
  10. package/client/dist/assets/index-CgqGyssr.css +32 -0
  11. package/client/dist/assets/index-DnwKjoj7.js +706 -0
  12. package/client/dist/assets/vibe80_dark-D7OVPKcU.svg +51 -0
  13. package/client/dist/assets/vibe80_light-BJK37ybI.svg +50 -0
  14. package/client/dist/favicon.ico +0 -0
  15. package/client/dist/favicon.png +0 -0
  16. package/client/dist/favicon.svg +35 -0
  17. package/client/dist/index.html +14 -0
  18. package/client/index.html +16 -0
  19. package/client/package.json +34 -0
  20. package/client/public/favicon.ico +0 -0
  21. package/client/public/favicon.png +0 -0
  22. package/client/public/favicon.svg +35 -0
  23. package/client/public/pwa-192x192.png +0 -0
  24. package/client/public/pwa-512x512.png +0 -0
  25. package/client/src/App.jsx +3131 -0
  26. package/client/src/assets/logo_small.png +0 -0
  27. package/client/src/assets/vibe80_dark.svg +51 -0
  28. package/client/src/assets/vibe80_light.svg +50 -0
  29. package/client/src/components/Chat/ChatComposer.jsx +228 -0
  30. package/client/src/components/Chat/ChatMessages.jsx +811 -0
  31. package/client/src/components/Chat/ChatToolbar.jsx +109 -0
  32. package/client/src/components/Chat/useChatComposer.js +462 -0
  33. package/client/src/components/Diff/DiffPanel.jsx +129 -0
  34. package/client/src/components/Explorer/ExplorerPanel.jsx +449 -0
  35. package/client/src/components/Logs/LogsPanel.jsx +80 -0
  36. package/client/src/components/SessionGate/SessionGate.jsx +874 -0
  37. package/client/src/components/Settings/SettingsPanel.jsx +212 -0
  38. package/client/src/components/Terminal/TerminalPanel.jsx +39 -0
  39. package/client/src/components/Topbar/Topbar.jsx +101 -0
  40. package/client/src/components/WorktreeTabs.css +419 -0
  41. package/client/src/components/WorktreeTabs.jsx +604 -0
  42. package/client/src/hooks/useAttachments.jsx +125 -0
  43. package/client/src/hooks/useBacklog.js +254 -0
  44. package/client/src/hooks/useChatClear.js +90 -0
  45. package/client/src/hooks/useChatCollapse.js +42 -0
  46. package/client/src/hooks/useChatCommands.js +294 -0
  47. package/client/src/hooks/useChatExport.js +144 -0
  48. package/client/src/hooks/useChatMessagesState.js +69 -0
  49. package/client/src/hooks/useChatSend.js +158 -0
  50. package/client/src/hooks/useChatSocket.js +1239 -0
  51. package/client/src/hooks/useDiffNavigation.js +19 -0
  52. package/client/src/hooks/useExplorerActions.js +1184 -0
  53. package/client/src/hooks/useGitIdentity.js +114 -0
  54. package/client/src/hooks/useLayoutMode.js +31 -0
  55. package/client/src/hooks/useLocalPreferences.js +131 -0
  56. package/client/src/hooks/useMessageSync.js +30 -0
  57. package/client/src/hooks/useNotifications.js +132 -0
  58. package/client/src/hooks/usePaneNavigation.js +67 -0
  59. package/client/src/hooks/usePanelState.js +13 -0
  60. package/client/src/hooks/useProviderSelection.js +70 -0
  61. package/client/src/hooks/useRepoBranchesModels.js +218 -0
  62. package/client/src/hooks/useRepoStatus.js +350 -0
  63. package/client/src/hooks/useRpcLogActions.js +19 -0
  64. package/client/src/hooks/useRpcLogView.js +58 -0
  65. package/client/src/hooks/useSessionHandoff.js +97 -0
  66. package/client/src/hooks/useSessionLifecycle.js +287 -0
  67. package/client/src/hooks/useSessionReset.js +63 -0
  68. package/client/src/hooks/useSessionResync.js +77 -0
  69. package/client/src/hooks/useTerminalSession.js +328 -0
  70. package/client/src/hooks/useToolbarExport.js +27 -0
  71. package/client/src/hooks/useTurnInterrupt.js +43 -0
  72. package/client/src/hooks/useVibe80Forms.js +128 -0
  73. package/client/src/hooks/useWorkspaceAuth.js +932 -0
  74. package/client/src/hooks/useWorktreeCloseConfirm.js +46 -0
  75. package/client/src/hooks/useWorktrees.js +396 -0
  76. package/client/src/i18n.jsx +87 -0
  77. package/client/src/index.css +5147 -0
  78. package/client/src/locales/en.json +37 -0
  79. package/client/src/locales/fr.json +321 -0
  80. package/client/src/main.jsx +16 -0
  81. package/client/vite.config.js +62 -0
  82. package/docs/api/asyncapi.json +1511 -0
  83. package/docs/api/openapi.json +3242 -0
  84. package/git_hooks/prepare-commit-msg +35 -0
  85. package/package.json +36 -0
  86. package/server/package.json +29 -0
  87. package/server/scripts/rotate-workspace-secret.js +101 -0
  88. package/server/src/claudeClient.js +454 -0
  89. package/server/src/clientEvents.js +594 -0
  90. package/server/src/clientFactory.js +164 -0
  91. package/server/src/codexClient.js +468 -0
  92. package/server/src/config.js +27 -0
  93. package/server/src/helpers.js +138 -0
  94. package/server/src/index.js +1641 -0
  95. package/server/src/middleware/auth.js +93 -0
  96. package/server/src/middleware/debug.js +89 -0
  97. package/server/src/middleware/errorTypes.js +60 -0
  98. package/server/src/providerLogger.js +60 -0
  99. package/server/src/routes/files.js +114 -0
  100. package/server/src/routes/git.js +183 -0
  101. package/server/src/routes/health.js +13 -0
  102. package/server/src/routes/sessions.js +407 -0
  103. package/server/src/routes/workspaces.js +296 -0
  104. package/server/src/routes/worktrees.js +993 -0
  105. package/server/src/runAs.js +458 -0
  106. package/server/src/runtimeStore.js +32 -0
  107. package/server/src/services/auth.js +157 -0
  108. package/server/src/services/claudeThreadDirectory.js +33 -0
  109. package/server/src/services/session.js +918 -0
  110. package/server/src/services/workspace.js +858 -0
  111. package/server/src/storage/index.js +17 -0
  112. package/server/src/storage/redis.js +412 -0
  113. package/server/src/storage/sqlite.js +649 -0
  114. package/server/src/worktreeManager.js +717 -0
  115. package/server/tests/README.md +13 -0
  116. package/server/tests/factories/workspaceFactory.js +13 -0
  117. package/server/tests/fixtures/workspaceCredentials.json +4 -0
  118. package/server/tests/integration/routes/workspaces-routes.test.js +626 -0
  119. package/server/tests/setup/env.js +9 -0
  120. package/server/tests/unit/helpers.test.js +95 -0
  121. package/server/tests/unit/services/auth.test.js +181 -0
  122. package/server/tests/unit/services/workspace.test.js +115 -0
  123. package/server/vitest.config.js +23 -0
@@ -0,0 +1,419 @@
1
+ .worktree-tabs-container {
2
+ width: 100%;
3
+ min-width: 0;
4
+ }
5
+
6
+ .worktree-tabs {
7
+ display: flex;
8
+ align-items: center;
9
+ gap: 4px;
10
+ padding: 6px 10px;
11
+ background: rgba(20, 19, 17, 0.04);
12
+ border-radius: 999px;
13
+ border: 1px solid rgba(20, 19, 17, 0.1);
14
+ overflow-x: auto;
15
+ scrollbar-width: thin;
16
+ }
17
+
18
+ .worktree-tabs-select {
19
+ display: grid;
20
+ grid-template-columns: minmax(0, 1fr) auto;
21
+ gap: 8px;
22
+ align-items: center;
23
+ width: 100%;
24
+ }
25
+
26
+ .worktree-select {
27
+ width: 100%;
28
+ border: 1px solid rgba(20, 19, 17, 0.12);
29
+ border-radius: 999px;
30
+ padding: 6px 12px;
31
+ background: var(--surface);
32
+ color: var(--ink);
33
+ font-size: 13px;
34
+ font-weight: 600;
35
+ outline: none;
36
+ }
37
+
38
+ .worktree-select:focus {
39
+ border-color: rgba(238, 93, 59, 0.6);
40
+ box-shadow: 0 0 0 3px rgba(238, 93, 59, 0.12);
41
+ }
42
+
43
+ .worktree-tab {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 6px;
47
+ padding: 6px 10px;
48
+ background: rgba(255, 255, 255, 0.7);
49
+ border: 1px solid rgba(20, 19, 17, 0.08);
50
+ border-radius: 8px;
51
+ cursor: pointer;
52
+ font-size: 13px;
53
+ transition: all 0.15s ease;
54
+ white-space: nowrap;
55
+ max-width: 180px;
56
+ }
57
+
58
+ .worktree-tab:hover {
59
+ background: rgba(255, 255, 255, 0.9);
60
+ border-color: rgba(20, 19, 17, 0.15);
61
+ }
62
+
63
+ .worktree-tab.active {
64
+ background: white;
65
+ border-color: var(--tab-accent, #3b82f6);
66
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
67
+ }
68
+
69
+ .worktree-status {
70
+ font-size: 10px;
71
+ line-height: 1;
72
+ }
73
+
74
+ .worktree-status.pulse {
75
+ animation: pulse 1.2s ease-in-out infinite;
76
+ }
77
+
78
+ @keyframes pulse {
79
+ 0%,
80
+ 100% {
81
+ opacity: 1;
82
+ }
83
+ 50% {
84
+ opacity: 0.4;
85
+ }
86
+ }
87
+
88
+ .worktree-tab-name {
89
+ overflow: hidden;
90
+ text-overflow: ellipsis;
91
+ max-width: 100px;
92
+ }
93
+
94
+ .worktree-tab-edit {
95
+ border: 1px solid var(--tab-accent, #3b82f6);
96
+ border-radius: 4px;
97
+ padding: 2px 4px;
98
+ font-size: 12px;
99
+ width: 80px;
100
+ outline: none;
101
+ }
102
+
103
+ .worktree-tab-close {
104
+ background: none;
105
+ border: none;
106
+ color: #9ca3af;
107
+ cursor: pointer;
108
+ font-size: 14px;
109
+ line-height: 1;
110
+ padding: 0 2px;
111
+ margin-left: 2px;
112
+ }
113
+
114
+ .worktree-tab-close:hover {
115
+ color: #ef4444;
116
+ }
117
+
118
+ .worktree-tab-add {
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ width: 28px;
123
+ height: 28px;
124
+ background: rgba(255, 255, 255, 0.5);
125
+ border: 1px dashed rgba(20, 19, 17, 0.2);
126
+ border-radius: 8px;
127
+ cursor: pointer;
128
+ font-size: 18px;
129
+ color: #9ca3af;
130
+ transition: all 0.15s ease;
131
+ }
132
+
133
+ .worktree-tab-add:hover:not(:disabled) {
134
+ background: rgba(255, 255, 255, 0.9);
135
+ border-color: var(--accent, #ee5d3b);
136
+ color: var(--accent, #ee5d3b);
137
+ }
138
+
139
+ .worktree-tab-add:disabled {
140
+ opacity: 0.4;
141
+ cursor: not-allowed;
142
+ }
143
+
144
+ :root[data-theme="dark"] .worktree-tabs {
145
+ background: rgba(255, 255, 255, 0.06);
146
+ border-color: rgba(255, 255, 255, 0.14);
147
+ }
148
+
149
+ :root[data-theme="dark"] .worktree-select {
150
+ background: rgba(22, 24, 23, 0.9);
151
+ border-color: rgba(255, 255, 255, 0.18);
152
+ color: #e6edf3;
153
+ }
154
+
155
+ :root[data-theme="dark"] .worktree-tab {
156
+ background: rgba(255, 255, 255, 0.08);
157
+ border-color: rgba(255, 255, 255, 0.12);
158
+ color: #e6edf3;
159
+ }
160
+
161
+ :root[data-theme="dark"] .worktree-tab:hover {
162
+ background: rgba(255, 255, 255, 0.16);
163
+ border-color: rgba(255, 255, 255, 0.22);
164
+ }
165
+
166
+ :root[data-theme="dark"] .worktree-tab.active {
167
+ background: rgba(255, 255, 255, 0.22);
168
+ border-color: var(--tab-accent, #3b82f6);
169
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.45);
170
+ }
171
+
172
+ :root[data-theme="dark"] .worktree-tab-close {
173
+ color: #c6cbd1;
174
+ }
175
+
176
+ :root[data-theme="dark"] .worktree-tab-add {
177
+ background: rgba(255, 255, 255, 0.06);
178
+ border-color: rgba(255, 255, 255, 0.22);
179
+ color: #b7ada1;
180
+ }
181
+
182
+ :root[data-theme="dark"] .worktree-tab-add:hover:not(:disabled) {
183
+ background: rgba(255, 255, 255, 0.16);
184
+ border-color: var(--accent, #ee5d3b);
185
+ color: var(--accent, #ee5d3b);
186
+ }
187
+
188
+ :root[data-theme="dark"] .worktree-create-dialog {
189
+ background: var(--surface-elevated, #1f2321);
190
+ color: var(--ink, #f2ede3);
191
+ box-shadow: var(--shadow);
192
+ }
193
+
194
+ :root[data-theme="dark"] .worktree-create-dialog h3 {
195
+ color: var(--ink, #f2ede3);
196
+ }
197
+
198
+ :root[data-theme="dark"] .worktree-create-field label {
199
+ color: var(--ink-muted, #b7ada1);
200
+ }
201
+
202
+ :root[data-theme="dark"] .worktree-create-field input,
203
+ :root[data-theme="dark"] .worktree-create-field select {
204
+ background: var(--bg-strong, #171a18);
205
+ border-color: var(--border-soft, rgba(255, 255, 255, 0.12));
206
+ color: var(--ink, #f2ede3);
207
+ }
208
+
209
+ :root[data-theme="dark"] .worktree-create-field input::placeholder {
210
+ color: rgba(242, 237, 227, 0.5);
211
+ }
212
+
213
+ :root[data-theme="dark"] .worktree-btn-refresh {
214
+ background: var(--surface-ghost, rgba(20, 24, 22, 0.8));
215
+ border-color: var(--border-soft, rgba(255, 255, 255, 0.12));
216
+ color: var(--ink-muted, #b7ada1);
217
+ }
218
+
219
+ :root[data-theme="dark"] .worktree-btn-cancel {
220
+ border-color: var(--border-soft, rgba(255, 255, 255, 0.12));
221
+ color: var(--ink-muted, #b7ada1);
222
+ }
223
+
224
+ :root[data-theme="dark"] .worktree-btn-cancel:hover {
225
+ background: rgba(255, 255, 255, 0.06);
226
+ }
227
+
228
+ :root[data-theme="dark"] .worktree-field-hint {
229
+ color: rgba(242, 237, 227, 0.55);
230
+ }
231
+
232
+ :root[data-theme="dark"] .worktree-warning-bubble {
233
+ background: rgba(251, 191, 36, 0.14);
234
+ border-color: rgba(251, 191, 36, 0.38);
235
+ color: #fde68a;
236
+ }
237
+
238
+ .worktree-create-dialog-overlay {
239
+ position: fixed;
240
+ inset: 0;
241
+ background: rgba(0, 0, 0, 0.4);
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ z-index: 1000;
246
+ }
247
+
248
+ .worktree-create-dialog {
249
+ background: white;
250
+ border-radius: 16px;
251
+ padding: 24px;
252
+ width: min(400px, 90vw);
253
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
254
+ }
255
+
256
+ .worktree-create-dialog h3 {
257
+ margin: 0 0 16px;
258
+ font-size: 18px;
259
+ }
260
+
261
+ .worktree-create-grid {
262
+ display: grid;
263
+ grid-template-columns: repeat(2, minmax(0, 1fr));
264
+ gap: 12px;
265
+ }
266
+
267
+ .worktree-create-field {
268
+ margin-bottom: 0;
269
+ }
270
+
271
+ .worktree-create-field label {
272
+ display: block;
273
+ font-size: 13px;
274
+ color: #6b7280;
275
+ margin-bottom: 6px;
276
+ }
277
+
278
+ .worktree-create-field .worktree-toggle {
279
+ display: grid;
280
+ grid-template-columns: 16px 1fr;
281
+ align-items: start;
282
+ column-gap: 8px;
283
+ font-size: 13px;
284
+ color: inherit;
285
+ margin-bottom: 6px;
286
+ width: 100%;
287
+ }
288
+
289
+ .worktree-toggle span {
290
+ line-height: 1.2;
291
+ }
292
+
293
+ .worktree-toggle input {
294
+ accent-color: var(--accent, #ee5d3b);
295
+ width: auto;
296
+ flex: 0 0 auto;
297
+ margin: 0;
298
+ margin-top: 0;
299
+ }
300
+
301
+ .worktree-create-field input,
302
+ .worktree-create-field select {
303
+ width: 100%;
304
+ padding: 10px 12px;
305
+ border: 1px solid rgba(20, 19, 17, 0.14);
306
+ border-radius: 10px;
307
+ font-size: 14px;
308
+ outline: none;
309
+ }
310
+
311
+ .worktree-create-field input:focus,
312
+ .worktree-create-field select:focus {
313
+ border-color: var(--accent, #ee5d3b);
314
+ }
315
+
316
+ .worktree-branch-row {
317
+ display: flex;
318
+ gap: 8px;
319
+ align-items: center;
320
+ }
321
+
322
+ .worktree-branch-row select,
323
+ .worktree-branch-row input {
324
+ flex: 1;
325
+ }
326
+
327
+ .worktree-create-field.is-full {
328
+ grid-column: 1 / -1;
329
+ }
330
+
331
+ .worktree-toggle-field {
332
+ align-self: start;
333
+ grid-column: 1 / -1;
334
+ display: flex;
335
+ justify-content: flex-start;
336
+ }
337
+
338
+ .worktree-btn-refresh {
339
+ border: 1px solid rgba(20, 19, 17, 0.14);
340
+ border-radius: 10px;
341
+ padding: 10px 12px;
342
+ background: white;
343
+ font-size: 13px;
344
+ color: #6b7280;
345
+ cursor: pointer;
346
+ }
347
+
348
+ .worktree-btn-refresh:disabled {
349
+ opacity: 0.6;
350
+ cursor: not-allowed;
351
+ }
352
+
353
+ .worktree-field-hint {
354
+ margin-top: 6px;
355
+ font-size: 12px;
356
+ color: #9ca3af;
357
+ }
358
+
359
+ .worktree-field-error {
360
+ margin-top: 6px;
361
+ font-size: 12px;
362
+ color: #ef4444;
363
+ }
364
+
365
+ .worktree-warning-bubble {
366
+ border: 1px solid rgba(245, 158, 11, 0.35);
367
+ background: rgba(245, 158, 11, 0.08);
368
+ color: #9a3412;
369
+ border-radius: 10px;
370
+ padding: 10px 12px;
371
+ font-size: 12px;
372
+ line-height: 1.4;
373
+ }
374
+
375
+ .worktree-create-actions {
376
+ display: grid;
377
+ grid-template-columns: repeat(2, minmax(0, 1fr));
378
+ gap: 12px;
379
+ margin-top: 20px;
380
+ }
381
+
382
+ .worktree-btn-cancel,
383
+ .worktree-btn-create {
384
+ padding: 10px 20px;
385
+ border-radius: 10px;
386
+ font-size: 14px;
387
+ cursor: pointer;
388
+ transition: all 0.15s ease;
389
+ }
390
+
391
+ .worktree-btn-cancel {
392
+ background: transparent;
393
+ border: 1px solid rgba(20, 19, 17, 0.14);
394
+ color: #6b7280;
395
+ }
396
+
397
+ .worktree-btn-cancel:hover {
398
+ background: rgba(0, 0, 0, 0.04);
399
+ }
400
+
401
+ .worktree-btn-create {
402
+ background: var(--accent, #ee5d3b);
403
+ border: none;
404
+ color: white;
405
+ }
406
+
407
+ .worktree-btn-create:hover {
408
+ background: var(--accent-dark, #b43c24);
409
+ }
410
+
411
+ @media (max-width: 720px) {
412
+ .worktree-create-grid {
413
+ grid-template-columns: 1fr;
414
+ }
415
+
416
+ .worktree-create-field.is-full {
417
+ grid-column: auto;
418
+ }
419
+ }