gitspace 0.2.0-rc.20 → 0.2.0-rc.21

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 (474) hide show
  1. package/package.json +11 -6
  2. package/.claude/settings.local.json +0 -10
  3. package/.gitspace/bundle.json +0 -50
  4. package/.gitspace/events.json +0 -11
  5. package/.gitspace/processes.json +0 -23
  6. package/.gitspace/scripts/select/01-status.sh +0 -39
  7. package/.gitspace/scripts/setup/01-install-deps.sh +0 -12
  8. package/.gitspace/scripts/setup/02-typecheck.sh +0 -16
  9. package/AGENTS.md +0 -469
  10. package/CLAUDE.md +0 -1
  11. package/bun.lock +0 -794
  12. package/docs/CONNECTION.md +0 -623
  13. package/docs/GATEWAY-WORKER.md +0 -319
  14. package/docs/GETTING-STARTED.md +0 -448
  15. package/docs/GITSPACE-PLATFORM.md +0 -1819
  16. package/docs/INFRASTRUCTURE.md +0 -1347
  17. package/docs/PROTOCOL.md +0 -619
  18. package/docs/QUICKSTART.md +0 -183
  19. package/docs/RELAY.md +0 -327
  20. package/docs/REMOTE-DESIGN.md +0 -554
  21. package/docs/ROADMAP.md +0 -564
  22. package/docs/SITE_DOCS_FIGMA_MAKE.md +0 -1176
  23. package/docs/STACK-DESIGN.md +0 -588
  24. package/docs/UNIFIED_ARCHITECTURE.md +0 -138
  25. package/experiments/pty-benchmark.ts +0 -148
  26. package/experiments/pty-latency.ts +0 -100
  27. package/experiments/router/client.ts +0 -199
  28. package/experiments/router/protocol.ts +0 -74
  29. package/experiments/router/router.ts +0 -217
  30. package/experiments/router/session.ts +0 -180
  31. package/experiments/router/test.ts +0 -133
  32. package/experiments/socket-bandwidth.ts +0 -77
  33. package/homebrew/gitspace.rb +0 -45
  34. package/landing-page/ATTRIBUTIONS.md +0 -3
  35. package/landing-page/README.md +0 -11
  36. package/landing-page/bun.lock +0 -801
  37. package/landing-page/guidelines/Guidelines.md +0 -61
  38. package/landing-page/index.html +0 -37
  39. package/landing-page/package.json +0 -90
  40. package/landing-page/postcss.config.mjs +0 -15
  41. package/landing-page/public/_redirects +0 -1
  42. package/landing-page/public/favicon.png +0 -0
  43. package/landing-page/src/app/App.tsx +0 -53
  44. package/landing-page/src/app/components/figma/ImageWithFallback.tsx +0 -27
  45. package/landing-page/src/app/components/ui/accordion.tsx +0 -66
  46. package/landing-page/src/app/components/ui/alert-dialog.tsx +0 -157
  47. package/landing-page/src/app/components/ui/alert.tsx +0 -66
  48. package/landing-page/src/app/components/ui/aspect-ratio.tsx +0 -11
  49. package/landing-page/src/app/components/ui/avatar.tsx +0 -53
  50. package/landing-page/src/app/components/ui/badge.tsx +0 -46
  51. package/landing-page/src/app/components/ui/breadcrumb.tsx +0 -109
  52. package/landing-page/src/app/components/ui/button.tsx +0 -57
  53. package/landing-page/src/app/components/ui/calendar.tsx +0 -75
  54. package/landing-page/src/app/components/ui/card.tsx +0 -92
  55. package/landing-page/src/app/components/ui/carousel.tsx +0 -241
  56. package/landing-page/src/app/components/ui/chart.tsx +0 -353
  57. package/landing-page/src/app/components/ui/checkbox.tsx +0 -32
  58. package/landing-page/src/app/components/ui/collapsible.tsx +0 -33
  59. package/landing-page/src/app/components/ui/command.tsx +0 -177
  60. package/landing-page/src/app/components/ui/context-menu.tsx +0 -252
  61. package/landing-page/src/app/components/ui/dialog.tsx +0 -135
  62. package/landing-page/src/app/components/ui/drawer.tsx +0 -132
  63. package/landing-page/src/app/components/ui/dropdown-menu.tsx +0 -257
  64. package/landing-page/src/app/components/ui/form.tsx +0 -168
  65. package/landing-page/src/app/components/ui/hover-card.tsx +0 -44
  66. package/landing-page/src/app/components/ui/input-otp.tsx +0 -77
  67. package/landing-page/src/app/components/ui/input.tsx +0 -21
  68. package/landing-page/src/app/components/ui/label.tsx +0 -24
  69. package/landing-page/src/app/components/ui/menubar.tsx +0 -276
  70. package/landing-page/src/app/components/ui/navigation-menu.tsx +0 -168
  71. package/landing-page/src/app/components/ui/pagination.tsx +0 -127
  72. package/landing-page/src/app/components/ui/popover.tsx +0 -48
  73. package/landing-page/src/app/components/ui/progress.tsx +0 -31
  74. package/landing-page/src/app/components/ui/radio-group.tsx +0 -45
  75. package/landing-page/src/app/components/ui/resizable.tsx +0 -56
  76. package/landing-page/src/app/components/ui/scroll-area.tsx +0 -58
  77. package/landing-page/src/app/components/ui/select.tsx +0 -189
  78. package/landing-page/src/app/components/ui/separator.tsx +0 -28
  79. package/landing-page/src/app/components/ui/sheet.tsx +0 -139
  80. package/landing-page/src/app/components/ui/sidebar.tsx +0 -726
  81. package/landing-page/src/app/components/ui/skeleton.tsx +0 -13
  82. package/landing-page/src/app/components/ui/slider.tsx +0 -63
  83. package/landing-page/src/app/components/ui/sonner.tsx +0 -25
  84. package/landing-page/src/app/components/ui/switch.tsx +0 -31
  85. package/landing-page/src/app/components/ui/table.tsx +0 -116
  86. package/landing-page/src/app/components/ui/tabs.tsx +0 -66
  87. package/landing-page/src/app/components/ui/textarea.tsx +0 -18
  88. package/landing-page/src/app/components/ui/toggle-group.tsx +0 -73
  89. package/landing-page/src/app/components/ui/toggle.tsx +0 -47
  90. package/landing-page/src/app/components/ui/tooltip.tsx +0 -61
  91. package/landing-page/src/app/components/ui/use-mobile.ts +0 -21
  92. package/landing-page/src/app/components/ui/utils.ts +0 -6
  93. package/landing-page/src/components/docs/DocsContent.tsx +0 -801
  94. package/landing-page/src/components/docs/DocsSidebar.tsx +0 -90
  95. package/landing-page/src/components/landing/CTA.tsx +0 -59
  96. package/landing-page/src/components/landing/Comparison.tsx +0 -84
  97. package/landing-page/src/components/landing/FaultyTerminal.tsx +0 -424
  98. package/landing-page/src/components/landing/Features.tsx +0 -201
  99. package/landing-page/src/components/landing/Hero.tsx +0 -142
  100. package/landing-page/src/components/landing/Pricing.tsx +0 -140
  101. package/landing-page/src/components/landing/Roadmap.tsx +0 -86
  102. package/landing-page/src/components/landing/Security.tsx +0 -81
  103. package/landing-page/src/components/landing/TerminalWindow.tsx +0 -27
  104. package/landing-page/src/components/landing/UseCases.tsx +0 -55
  105. package/landing-page/src/components/landing/Workflow.tsx +0 -101
  106. package/landing-page/src/components/layout/DashboardNavbar.tsx +0 -37
  107. package/landing-page/src/components/layout/Footer.tsx +0 -55
  108. package/landing-page/src/components/layout/LandingNavbar.tsx +0 -82
  109. package/landing-page/src/components/ui/badge.tsx +0 -39
  110. package/landing-page/src/components/ui/breadcrumb.tsx +0 -115
  111. package/landing-page/src/components/ui/button.tsx +0 -57
  112. package/landing-page/src/components/ui/card.tsx +0 -79
  113. package/landing-page/src/components/ui/mock-terminal.tsx +0 -68
  114. package/landing-page/src/components/ui/separator.tsx +0 -28
  115. package/landing-page/src/lib/utils.ts +0 -6
  116. package/landing-page/src/main.tsx +0 -10
  117. package/landing-page/src/pages/Dashboard.tsx +0 -133
  118. package/landing-page/src/pages/DocsPage.tsx +0 -79
  119. package/landing-page/src/pages/LandingPage.tsx +0 -31
  120. package/landing-page/src/pages/TerminalView.tsx +0 -106
  121. package/landing-page/src/styles/fonts.css +0 -0
  122. package/landing-page/src/styles/index.css +0 -3
  123. package/landing-page/src/styles/tailwind.css +0 -4
  124. package/landing-page/src/styles/theme.css +0 -181
  125. package/landing-page/vite.config.ts +0 -19
  126. package/scripts/GHOSTTY_TAB_BUG.md +0 -106
  127. package/scripts/build.ts +0 -298
  128. package/scripts/migrate-secrets.ts +0 -77
  129. package/scripts/release.ts +0 -140
  130. package/scripts/sample-events.ts +0 -263
  131. package/scripts/test-tabs-minimal.ts +0 -68
  132. package/scripts/test-tabs-workaround.ts +0 -95
  133. package/scripts/test-tabs.ts +0 -171
  134. package/src/__tests__/test-utils.ts +0 -298
  135. package/src/app/input/__tests__/sessionCommands.test.ts +0 -40
  136. package/src/app/input/sessionCommands.ts +0 -94
  137. package/src/app/session/__tests__/useAttachController.test.ts +0 -229
  138. package/src/app/session/createSessionBackend.bun.ts +0 -76
  139. package/src/app/session/createSessionBackend.web.ts +0 -104
  140. package/src/app/session/types.ts +0 -16
  141. package/src/app/session/useAttachController.ts +0 -220
  142. package/src/app/session/useProcessActions.ts +0 -201
  143. package/src/app/session/useSessionClient.ts +0 -35
  144. package/src/app/session/useWorkspaceDeleteFlow.ts +0 -170
  145. package/src/app.tui.tsx +0 -2929
  146. package/src/app.web.tsx +0 -1454
  147. package/src/commands/__tests__/connect-key.test.ts +0 -10
  148. package/src/commands/__tests__/events.test.ts +0 -201
  149. package/src/commands/__tests__/notifications.test.ts +0 -349
  150. package/src/commands/__tests__/process.test.ts +0 -251
  151. package/src/commands/__tests__/serve-messages.test.ts +0 -190
  152. package/src/commands/__tests__/serve-process-hosting.test.ts +0 -63
  153. package/src/commands/access.ts +0 -298
  154. package/src/commands/add.ts +0 -455
  155. package/src/commands/auth.ts +0 -369
  156. package/src/commands/bundle.ts +0 -232
  157. package/src/commands/config.ts +0 -242
  158. package/src/commands/connect-key.ts +0 -1
  159. package/src/commands/connect.ts +0 -576
  160. package/src/commands/directory.ts +0 -16
  161. package/src/commands/events.ts +0 -157
  162. package/src/commands/host.ts +0 -566
  163. package/src/commands/identity.ts +0 -184
  164. package/src/commands/linear.ts +0 -717
  165. package/src/commands/list.ts +0 -181
  166. package/src/commands/migrate.ts +0 -52
  167. package/src/commands/notifications.ts +0 -351
  168. package/src/commands/process.ts +0 -104
  169. package/src/commands/relay.ts +0 -315
  170. package/src/commands/remove.ts +0 -279
  171. package/src/commands/review.ts +0 -787
  172. package/src/commands/serve.ts +0 -1946
  173. package/src/commands/share.ts +0 -451
  174. package/src/commands/status.ts +0 -125
  175. package/src/commands/switch.ts +0 -361
  176. package/src/commands/tmux.ts +0 -317
  177. package/src/components/DPad.web.tsx +0 -343
  178. package/src/components/DiffViewer.web.tsx +0 -1192
  179. package/src/components/Events.tsx +0 -137
  180. package/src/components/Events.tui.tsx +0 -129
  181. package/src/components/Events.web.tsx +0 -386
  182. package/src/components/FloatingControls.web.tsx +0 -112
  183. package/src/components/FloatingJogWheel.web.tsx +0 -240
  184. package/src/components/Flow.tsx +0 -458
  185. package/src/components/Flow.tui.tsx +0 -343
  186. package/src/components/Flow.web.tsx +0 -442
  187. package/src/components/Inbox.tsx +0 -448
  188. package/src/components/Inbox.tui.tsx +0 -262
  189. package/src/components/Inbox.web.tsx +0 -329
  190. package/src/components/MachineList.tsx +0 -187
  191. package/src/components/MachineList.tui.tsx +0 -161
  192. package/src/components/MachineList.web.tsx +0 -210
  193. package/src/components/NumPad.web.tsx +0 -270
  194. package/src/components/ProjectList.tsx +0 -175
  195. package/src/components/ProjectList.tui.tsx +0 -109
  196. package/src/components/ProjectList.web.tsx +0 -143
  197. package/src/components/ProjectOnboardingStep.ts +0 -23
  198. package/src/components/ProjectOnboardingStep.tui.tsx +0 -88
  199. package/src/components/ProjectOnboardingStep.web.tsx +0 -59
  200. package/src/components/RemoteMachineScreen.tui.tsx +0 -690
  201. package/src/components/ScriptTerminal.tui.tsx +0 -160
  202. package/src/components/ScriptTerminal.web.tsx +0 -89
  203. package/src/components/SessionTerminal.tui.tsx +0 -406
  204. package/src/components/SessionTerminal.web.tsx +0 -467
  205. package/src/components/SpacesBrowser.tsx +0 -540
  206. package/src/components/SpacesBrowser.tui.tsx +0 -258
  207. package/src/components/SpacesBrowser.web.tsx +0 -332
  208. package/src/components/TerminalControls.web.tsx +0 -464
  209. package/src/components/ThreadPanel.web.tsx +0 -798
  210. package/src/components/__tests__/SpacesBrowser.test.ts +0 -541
  211. package/src/components/__tests__/SpacesBrowser.tui.test.tsx +0 -249
  212. package/src/components/__tests__/script-terminal-buffer.tui.test.ts +0 -72
  213. package/src/components/index.ts +0 -105
  214. package/src/components/review-decision-colors.ts +0 -11
  215. package/src/components/script-terminal-buffer.tui.ts +0 -37
  216. package/src/components/session-terminal-page-navigation.ts +0 -48
  217. package/src/components/terminal-bracketed-paste.tui.test.ts +0 -43
  218. package/src/components/terminal-bracketed-paste.tui.ts +0 -46
  219. package/src/core/__tests__/access.test.ts +0 -240
  220. package/src/core/__tests__/bundle-refresh.test.ts +0 -567
  221. package/src/core/__tests__/bundle.test.ts +0 -209
  222. package/src/core/__tests__/github-review.test.ts +0 -781
  223. package/src/core/__tests__/project-lifecycle.test.ts +0 -137
  224. package/src/core/__tests__/workspace-lifecycle.test.ts +0 -159
  225. package/src/core/__tests__/workspace.test.ts +0 -149
  226. package/src/core/access.ts +0 -277
  227. package/src/core/bundle-refresh.ts +0 -1064
  228. package/src/core/bundle.ts +0 -326
  229. package/src/core/config.ts +0 -405
  230. package/src/core/git.ts +0 -768
  231. package/src/core/github-review.ts +0 -761
  232. package/src/core/github.ts +0 -151
  233. package/src/core/identity.ts +0 -631
  234. package/src/core/linear.ts +0 -403
  235. package/src/core/preferences-service.ts +0 -17
  236. package/src/core/project-catalog.ts +0 -52
  237. package/src/core/project-lifecycle.ts +0 -163
  238. package/src/core/review-executor.ts +0 -316
  239. package/src/core/review.ts +0 -407
  240. package/src/core/secret-runtime.ts +0 -167
  241. package/src/core/shell.ts +0 -117
  242. package/src/core/trusted-relays.ts +0 -315
  243. package/src/core/workspace-lifecycle.ts +0 -216
  244. package/src/core/workspace.ts +0 -363
  245. package/src/hooks/__tests__/useLocalSession.tui.test.ts +0 -557
  246. package/src/hooks/index.ts +0 -8
  247. package/src/hooks/index.tui.ts +0 -32
  248. package/src/hooks/useDaemonStatus.tui.ts +0 -174
  249. package/src/hooks/useLocalSession.tui.ts +0 -395
  250. package/src/hooks/useRelayConnection.web.ts +0 -54
  251. package/src/hooks/useRemoteMachines.tui.ts +0 -166
  252. package/src/hooks/useRemoteTerminal.tui.ts +0 -22
  253. package/src/hooks/useReview.web.ts +0 -248
  254. package/src/hooks/useTerminal.web.ts +0 -36
  255. package/src/hooks/useUserActivity.ts +0 -61
  256. package/src/hooks/useVisualViewport.web.ts +0 -104
  257. package/src/index.ts +0 -1376
  258. package/src/lib/events/__tests__/collector-filter.test.ts +0 -105
  259. package/src/lib/events/__tests__/store-query.test.ts +0 -103
  260. package/src/lib/events/collector.ts +0 -494
  261. package/src/lib/events/filters.ts +0 -26
  262. package/src/lib/events/index.ts +0 -11
  263. package/src/lib/events/indexer.ts +0 -14
  264. package/src/lib/events/paths.ts +0 -69
  265. package/src/lib/events/reader.ts +0 -212
  266. package/src/lib/events/store.ts +0 -141
  267. package/src/lib/invite.web.ts +0 -58
  268. package/src/lib/preferences-service.web.ts +0 -41
  269. package/src/lib/processes/__tests__/config.test.ts +0 -83
  270. package/src/lib/processes/__tests__/names.test.ts +0 -125
  271. package/src/lib/processes/__tests__/schema.test.ts +0 -208
  272. package/src/lib/processes/__tests__/watchdog.test.ts +0 -210
  273. package/src/lib/processes/autostart.ts +0 -16
  274. package/src/lib/processes/config.ts +0 -187
  275. package/src/lib/processes/control.ts +0 -53
  276. package/src/lib/processes/editor.ts +0 -32
  277. package/src/lib/processes/events-config.ts +0 -37
  278. package/src/lib/processes/index.ts +0 -14
  279. package/src/lib/processes/instances.ts +0 -20
  280. package/src/lib/processes/manager.ts +0 -131
  281. package/src/lib/processes/names.ts +0 -71
  282. package/src/lib/processes/registry.ts +0 -26
  283. package/src/lib/processes/runner.ts +0 -211
  284. package/src/lib/processes/scheduler.ts +0 -17
  285. package/src/lib/processes/schema.ts +0 -74
  286. package/src/lib/processes/session-list.ts +0 -15
  287. package/src/lib/processes/state.ts +0 -82
  288. package/src/lib/processes/watchdog.test.ts +0 -79
  289. package/src/lib/processes/watchdog.ts +0 -106
  290. package/src/lib/remote-session/__tests__/protocol.test.ts +0 -291
  291. package/src/lib/remote-session/index.ts +0 -7
  292. package/src/lib/remote-session/protocol.ts +0 -443
  293. package/src/lib/remote-session/session-handler.ts +0 -1298
  294. package/src/lib/remote-session/workspace-scanner.ts +0 -161
  295. package/src/lib/sonner.web.ts +0 -1
  296. package/src/lib/storage/identity-store.web.ts +0 -94
  297. package/src/lib/tmux-lite/README.md +0 -81
  298. package/src/lib/tmux-lite/cli.ts +0 -855
  299. package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +0 -349
  300. package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +0 -291
  301. package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +0 -142
  302. package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +0 -339
  303. package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +0 -477
  304. package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +0 -499
  305. package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +0 -371
  306. package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +0 -573
  307. package/src/lib/tmux-lite/crypto/access-control.test.ts +0 -512
  308. package/src/lib/tmux-lite/crypto/access-control.ts +0 -320
  309. package/src/lib/tmux-lite/crypto/frames.test.ts +0 -262
  310. package/src/lib/tmux-lite/crypto/frames.ts +0 -141
  311. package/src/lib/tmux-lite/crypto/handshake.ts +0 -894
  312. package/src/lib/tmux-lite/crypto/identity.test.ts +0 -220
  313. package/src/lib/tmux-lite/crypto/identity.ts +0 -286
  314. package/src/lib/tmux-lite/crypto/index.ts +0 -51
  315. package/src/lib/tmux-lite/crypto/invites.test.ts +0 -381
  316. package/src/lib/tmux-lite/crypto/invites.ts +0 -215
  317. package/src/lib/tmux-lite/crypto/keyexchange.ts +0 -435
  318. package/src/lib/tmux-lite/crypto/keys.test.ts +0 -58
  319. package/src/lib/tmux-lite/crypto/keys.ts +0 -47
  320. package/src/lib/tmux-lite/crypto/secretbox.test.ts +0 -169
  321. package/src/lib/tmux-lite/crypto/secretbox.ts +0 -124
  322. package/src/lib/tmux-lite/handshake-handler.ts +0 -451
  323. package/src/lib/tmux-lite/process-run.integration.test.ts +0 -266
  324. package/src/lib/tmux-lite/protocol.test.ts +0 -307
  325. package/src/lib/tmux-lite/protocol.ts +0 -291
  326. package/src/lib/tmux-lite/relay-client.ts +0 -506
  327. package/src/lib/tmux-lite/server-lifecycle.test.ts +0 -212
  328. package/src/lib/tmux-lite/server.ts +0 -1412
  329. package/src/lib/tmux-lite/shell-integration.sh +0 -37
  330. package/src/lib/tmux-lite/terminal-queries.test.ts +0 -54
  331. package/src/lib/tmux-lite/terminal-queries.ts +0 -49
  332. package/src/notifications/__tests__/useNotifications.test.ts +0 -739
  333. package/src/notifications/index.ts +0 -32
  334. package/src/notifications/policy.test.ts +0 -424
  335. package/src/notifications/policy.ts +0 -139
  336. package/src/notifications/types.ts +0 -82
  337. package/src/notifications/useNotifications.ts +0 -350
  338. package/src/pages/ReviewPage.web.tsx +0 -511
  339. package/src/preferences/index.ts +0 -1
  340. package/src/preferences/types.ts +0 -9
  341. package/src/relay/__tests__/e2e-flow.test.ts +0 -1284
  342. package/src/relay/__tests__/helpers/auth.ts +0 -354
  343. package/src/relay/__tests__/helpers/ports.ts +0 -51
  344. package/src/relay/__tests__/protocol-validation.test.ts +0 -265
  345. package/src/relay/authorization.ts +0 -303
  346. package/src/relay/embedded-assets.generated.d.ts +0 -15
  347. package/src/relay/identity.ts +0 -352
  348. package/src/relay/index.ts +0 -57
  349. package/src/relay/pipes.test.ts +0 -427
  350. package/src/relay/pipes.ts +0 -195
  351. package/src/relay/protocol.ts +0 -804
  352. package/src/relay/registries.test.ts +0 -437
  353. package/src/relay/registries.ts +0 -593
  354. package/src/relay/server.test.ts +0 -1323
  355. package/src/relay/server.ts +0 -1128
  356. package/src/relay/signing.ts +0 -238
  357. package/src/relay/types.ts +0 -69
  358. package/src/relay-client/__tests__/machine-directory-client.test.ts +0 -152
  359. package/src/relay-client/__tests__/useMachineDirectory.test.ts +0 -172
  360. package/src/relay-client/adapters/browser.ts +0 -27
  361. package/src/relay-client/adapters/node.ts +0 -29
  362. package/src/relay-client/index.ts +0 -33
  363. package/src/relay-client/machine-directory-client.ts +0 -244
  364. package/src/relay-client/useMachineDirectory.ts +0 -175
  365. package/src/serve/client-session-manager.ts +0 -635
  366. package/src/serve/daemon.ts +0 -497
  367. package/src/serve/pty-session.ts +0 -236
  368. package/src/serve/types.ts +0 -174
  369. package/src/session/__tests__/backend-manager.test.ts +0 -101
  370. package/src/session/__tests__/local-session-backend.test.ts +0 -1129
  371. package/src/session/__tests__/reducer.test.ts +0 -80
  372. package/src/session/__tests__/remote-session-backend.test.ts +0 -995
  373. package/src/session/__tests__/session-name.test.ts +0 -35
  374. package/src/session/__tests__/useBundleRefreshAttachFlow.test.ts +0 -431
  375. package/src/session/__tests__/useRemoteSessionClient.test.ts +0 -424
  376. package/src/session/__tests__/workspace-shell-hooks.integration.test.ts +0 -268
  377. package/src/session/__tests__/workspace-shell-hooks.test.ts +0 -24
  378. package/src/session/adapters/browser-remote.ts +0 -101
  379. package/src/session/adapters/node-remote.ts +0 -135
  380. package/src/session/backend-key.ts +0 -5
  381. package/src/session/backend-manager.ts +0 -80
  382. package/src/session/backend.ts +0 -93
  383. package/src/session/backends/local-session-backend.ts +0 -1119
  384. package/src/session/backends/remote-session-backend.ts +0 -1378
  385. package/src/session/crypto/__tests__/web-terminal.test.ts +0 -1158
  386. package/src/session/crypto/frames.web.ts +0 -205
  387. package/src/session/crypto/handshake.web.ts +0 -396
  388. package/src/session/crypto/identity.web.ts +0 -133
  389. package/src/session/crypto/keyexchange.web.ts +0 -246
  390. package/src/session/crypto/relay-signing.web.ts +0 -53
  391. package/src/session/events.ts +0 -38
  392. package/src/session/index.ts +0 -116
  393. package/src/session/reducer.ts +0 -274
  394. package/src/session/selectors.ts +0 -28
  395. package/src/session/session-name.ts +0 -50
  396. package/src/session/types.ts +0 -101
  397. package/src/session/useBundleRefreshAttachFlow.ts +0 -608
  398. package/src/session/useRemoteSessionClient.ts +0 -424
  399. package/src/session/useSessionEngine.ts +0 -432
  400. package/src/session/workspace-shell-hooks.ts +0 -35
  401. package/src/tui/__tests__/input-text.test.ts +0 -24
  402. package/src/tui/__tests__/local-terminal-sync.test.ts +0 -82
  403. package/src/tui/__tests__/session-terminal-page-navigation.test.ts +0 -94
  404. package/src/tui/app.tsx +0 -2
  405. package/src/tui/index.ts +0 -18
  406. package/src/tui/input-text.ts +0 -38
  407. package/src/tui/local-terminal-sync.ts +0 -41
  408. package/src/types/bundle-refresh.ts +0 -42
  409. package/src/types/bundle.ts +0 -130
  410. package/src/types/config.ts +0 -287
  411. package/src/types/errors.ts +0 -292
  412. package/src/types/events.ts +0 -91
  413. package/src/types/identity.ts +0 -284
  414. package/src/types/processes.ts +0 -45
  415. package/src/types/review.ts +0 -349
  416. package/src/types/script-phase.ts +0 -3
  417. package/src/types/workspace-fuzzy.ts +0 -49
  418. package/src/types/workspace.ts +0 -151
  419. package/src/utils/__tests__/onboarding.test.ts +0 -358
  420. package/src/utils/__tests__/run-scripts.test.ts +0 -535
  421. package/src/utils/__tests__/run-workspace-scripts.test.ts +0 -406
  422. package/src/utils/__tests__/workspace-setup.integration.test.ts +0 -633
  423. package/src/utils/__tests__/workspace-state.test.ts +0 -78
  424. package/src/utils/bun-socket-writer.ts +0 -80
  425. package/src/utils/clipboard.ts +0 -53
  426. package/src/utils/deps.test.ts +0 -31
  427. package/src/utils/deps.ts +0 -145
  428. package/src/utils/device.web.ts +0 -163
  429. package/src/utils/fuzzy-match.ts +0 -125
  430. package/src/utils/hostnames.ts +0 -43
  431. package/src/utils/hunk-header.ts +0 -17
  432. package/src/utils/id.ts +0 -9
  433. package/src/utils/logger.ts +0 -127
  434. package/src/utils/markdown.ts +0 -254
  435. package/src/utils/normalize-env-key.ts +0 -13
  436. package/src/utils/onboarding.ts +0 -279
  437. package/src/utils/prompts.ts +0 -176
  438. package/src/utils/run-commands.ts +0 -112
  439. package/src/utils/run-scripts.ts +0 -337
  440. package/src/utils/run-workspace-scripts.ts +0 -355
  441. package/src/utils/sanitize.test.ts +0 -149
  442. package/src/utils/sanitize.ts +0 -162
  443. package/src/utils/secrets.ts +0 -836
  444. package/src/utils/shell-escape.ts +0 -40
  445. package/src/utils/utf8.ts +0 -79
  446. package/src/utils/workspace-id.ts +0 -55
  447. package/src/utils/workspace-state.ts +0 -427
  448. package/src/version.generated.d.ts +0 -2
  449. package/todo-security.md +0 -92
  450. package/tsconfig.json +0 -29
  451. package/web/README.md +0 -73
  452. package/web/bun.lock +0 -675
  453. package/web/eslint.config.js +0 -23
  454. package/web/index.css +0 -249
  455. package/web/index.html +0 -16
  456. package/web/main.tsx +0 -10
  457. package/web/package.json +0 -39
  458. package/web/public/vite.svg +0 -1
  459. package/web/tsconfig.app.json +0 -35
  460. package/web/tsconfig.json +0 -7
  461. package/web/tsconfig.node.json +0 -26
  462. package/web/vite.config.ts +0 -39
  463. package/worker/bun.lock +0 -237
  464. package/worker/package.json +0 -22
  465. package/worker/schema.sql +0 -96
  466. package/worker/src/handlers/auth.ts +0 -451
  467. package/worker/src/handlers/subdomains.ts +0 -376
  468. package/worker/src/handlers/user.ts +0 -98
  469. package/worker/src/index.ts +0 -70
  470. package/worker/src/middleware/auth.ts +0 -152
  471. package/worker/src/services/cloudflare.ts +0 -609
  472. package/worker/src/types.ts +0 -96
  473. package/worker/tsconfig.json +0 -15
  474. package/worker/wrangler.toml +0 -26
@@ -1,1176 +0,0 @@
1
- You are Figma Make editing the gitspace.sh documentation site:
2
-
3
- You do NOT have access to our codebase. Use ONLY the factual specification below (it is copied from the repo and must be treated as truth). Update the site copy to match it exactly.
4
-
5
- Hard constraints:
6
- - Preserve the existing design system, spacing, typography, and components.
7
- - Preserve existing navigation/anchors as much as possible. If the docs are a single page, keep it single-page but add a TOC at the top with anchor links.
8
- - Replace any incorrect commands/flags/URLs with the exact ones below.
9
- - Do not invent commands, flags, defaults, URLs, or security guarantees.
10
- - Security claims must match "Security notes / current limitations" below (do not overpromise).
11
-
12
- ============================================================
13
- A) PRODUCT FACTS (from the repo)
14
- ============================================================
15
-
16
- Product name: GitSpace CLI
17
- Binary: `gssh`
18
-
19
- What it is:
20
- - A CLI tool for managing GitHub repository workspaces using git worktrees, with an interactive TUI.
21
- - Optional Linear integration for workspace creation.
22
- - Supports repo config bundles for onboarding + convention-based scripts.
23
- - Secure remote terminal access via E2E encrypted relay.
24
-
25
- Key features (safe to claim):
26
- - Interactive TUI for managing projects and workspaces
27
- - Git worktrees for parallel branch development
28
- - Linear integration (optional)
29
- - Custom scripts (pre/setup/select/remove phases)
30
- - Repo config bundles (in-repo or provided)
31
- - Secure secrets for bundles stored via OS keychain (Bun.secrets)
32
- - E2E encrypted remote terminal access
33
- - Identity-based access control (not passwords)
34
- - gitspace.sh instant hosting with custom subdomains
35
-
36
- Remote access:
37
- - GitSpace supports remote terminal access via a "relay" server.
38
- - The relay routes traffic but cannot read terminal content (end-to-end encryption).
39
- - Remote access uses identity-based cryptography with:
40
- - Ed25519 signing keys (identity)
41
- - X25519 key exchange keys
42
- - X3DH-style handshake
43
- - HKDF-SHA256 key derivation
44
- - AES-256-GCM encrypted frames after handshake
45
- - Ed25519-signed relay messages for client routing
46
- - Challenge-response machine registration (Ed25519)
47
-
48
- ============================================================
49
- B) EXACT CLI COMMANDS + FLAGS + DEFAULTS (must match)
50
- ============================================================
51
-
52
- Prereqs (list these on docs site):
53
- - gh (GitHub CLI)
54
- - git
55
- - jq
56
-
57
- Optional prereqs:
58
- - cloudflared (for `gssh host` commands)
59
- - Linear API key (for Linear integration)
60
-
61
- Install (any package manager):
62
- - `npm install -g gitspace`
63
- - `bun install -g gitspace`
64
- - `pnpm install -g gitspace`
65
- - `yarn global add gitspace`
66
- - Verify: `gssh --version`
67
-
68
- ---
69
-
70
- ### Workspace Management Commands
71
-
72
- Local usage (examples you can show):
73
- - `gssh` (launch TUI)
74
- - `gssh add project`
75
- - `gssh add [workspace-name]`
76
- - `gssh switch [workspace-name]` (alias: `gssh sw`)
77
- - `gssh switch project [project-name]`
78
- - `gssh list projects` (alias: `gssh ls projects`)
79
- - `gssh list workspaces` (alias: `gssh ls workspaces`; default `gssh list` lists workspaces)
80
- - `gssh remove workspace [workspace-name]` (alias: `gssh rm workspace`)
81
- - `gssh remove project [project-name]` (alias: `gssh rm project`)
82
- - `gssh directory` (alias: `gssh dir`)
83
-
84
- Options for `gssh add project`:
85
- - `--bundle-url <url>` - Load bundle from remote URL (zip archive)
86
- - `--bundle-path <path>` - Load bundle from local directory
87
- - `--skip-bundle` - Skip bundle detection and onboarding
88
- - `--no-clone` - Create project structure without cloning
89
- - `--org <org>` - Filter repos to specific organization
90
- - `--linear-key <key>` - Provide Linear API key via flag
91
-
92
- Options for `gssh add [workspace-name]`:
93
- - `--branch <name>` - Specify different branch name from workspace name
94
- - `--from <branch>` - Create from specific branch instead of base
95
- - `--no-setup` - Skip setup commands
96
-
97
- Options for `gssh remove workspace`:
98
- - `--force` - Skip confirmation prompts
99
- - `--keep-branch` - Don't delete git branch when removing
100
-
101
- ---
102
-
103
- ### Identity Commands
104
-
105
- - `gssh identity init [--label <name>] [--force]`
106
- - `gssh identity show [--fingerprint] [--json]`
107
-
108
- Identity is encrypted at rest and requires an unlock password when used for remote connections.
109
-
110
- ---
111
-
112
- ### Remote Access / Relay Commands
113
-
114
- Start relay server:
115
- - `gssh relay start [--port 4480] [--bind 0.0.0.0] [--hostname <host>] [--label <label>]`
116
- - Default port: 4480
117
-
118
- Relay management:
119
- - `gssh relay authorize <pubkey>` - Authorize a machine by public key
120
- - `gssh relay revoke <pubkey>` - Revoke a machine's authorization
121
- - `gssh relay machines` - List authorized machines
122
- - `gssh relay trusted` - List trusted relays (client-side)
123
- - `gssh relay untrust <url>` - Remove relay trust (client-side)
124
-
125
- ---
126
-
127
- ### Serve Daemon Commands
128
-
129
- - `gssh serve [--relay <url>] [--relay-pubkey <pubkey>]` - Start daemon (foreground)
130
- - `gssh serve start [--relay <url>] [--relay-pubkey <pubkey>] [--password-stdin] [--foreground]` - Start daemon (background)
131
- - `gssh serve stop` - Stop background daemon
132
- - `gssh status` - Show all daemon statuses
133
-
134
- Default relay URL for serving if not specified: `wss://relay.gitspace.sh`
135
-
136
- When starting `gssh serve`, the user will be prompted:
137
- - "Enter password to unlock identity:"
138
-
139
- ---
140
-
141
- ### Invite / Sharing Commands
142
-
143
- Create share invite token:
144
- - `gssh share create [--expires <duration>] [--session <id>] [--relay <url>]`
145
- - Defaults:
146
- - `--expires` default: `24h`
147
- - `--relay` default: `wss://relay.gitspace.sh`
148
- - Output includes a share URL of the form:
149
- - `https://gitspace.sh/join#<TOKEN>`
150
-
151
- ---
152
-
153
- ### Connect Commands
154
-
155
- Connect via invite:
156
- - `gssh connect <invite-token-or-url>`
157
- - Accepts raw token OR a URL like `https://gitspace.sh/join#<TOKEN>`
158
- - Options:
159
- - `--relay <url>` override relay URL (from token)
160
-
161
- ---
162
-
163
- ### Access Control List (ACL) Commands
164
-
165
- - `gssh access add <pubkey> [--label <name>]`
166
- - `gssh access list [--json]` (alias: `gssh access ls`)
167
- - `gssh access remove <pubkey|label> [--force]` (alias: `gssh access rm`)
168
-
169
- Public key format shown to users:
170
- - `gssh-pub:<BASE64_SIGNING_PUBLIC_KEY>:<BASE64_KEY_EXCHANGE_PUBLIC_KEY>`
171
-
172
- ---
173
-
174
- ### tmux-lite Daemon Commands
175
-
176
- - `gssh tmux start` - Start tmux-lite server daemon
177
- - `gssh tmux stop` - Stop tmux-lite daemon
178
- - `gssh tmux status` - Show tmux-lite daemon status
179
- - `gssh tmux list` - List active terminal sessions
180
- - `gssh tmux attach <id>` - Attach to session
181
- - `gssh tmux new` - Create new session
182
- - `gssh tmux kill <id>` - Kill session
183
-
184
- ---
185
-
186
- ### gitspace.sh Authentication Commands
187
-
188
- - `gssh auth login` - Login via GitHub OAuth device flow
189
- - `gssh auth logout` - Clear local credentials
190
- - `gssh auth status` - Show authentication status
191
-
192
- ---
193
-
194
- ### gitspace.sh Hosting Commands
195
-
196
- - `gssh host reserve <name>` - Reserve subdomain on gitspace.sh
197
- - `gssh host release [name]` - Release a subdomain
198
- - `gssh host list` - List your subdomains
199
- - `gssh host set-primary <name>` - Set primary subdomain
200
- - `gssh host status` - Show hosting status
201
-
202
- ============================================================
203
- C) REMOTE ACCESS: CANONICAL USER FLOWS
204
- ============================================================
205
-
206
- ### Flow 1: gitspace.sh (Managed Service) - RECOMMENDED
207
-
208
- This is the easiest way to get remote access:
209
-
210
- ```bash
211
- # 1. Create identity (first time only)
212
- gssh identity init --label "My MacBook"
213
-
214
- # 2. Authenticate with GitHub
215
- gssh auth login
216
-
217
- # 3. Reserve your subdomain
218
- gssh host reserve yourname
219
- # You get: yourname.gitspace.sh and *.yourname.gitspace.sh
220
-
221
- # 4. Start serving
222
- gssh serve
223
- # Automatically connects to gitspace.sh relay + Cloudflare tunnel
224
-
225
- # 5. Access from browser
226
- # Open: https://yourname.gitspace.sh
227
- ```
228
-
229
- ### Flow 2: Self-Hosted Relay
230
-
231
- For complete control, run your own relay:
232
-
233
- ```bash
234
- # Terminal 1: Start relay server
235
- gssh relay start --port 4480 --bind 0.0.0.0
236
- ```
237
-
238
- Relay listens at: `ws://<bind-or-hostname>:4480/ws`
239
-
240
- ```bash
241
- # Terminal 2: Create identity on the machine
242
- gssh identity init --label "My MacBook"
243
- gssh identity show
244
- ```
245
-
246
- ```bash
247
- # Terminal 3: Authorize machine on relay host
248
- gssh relay authorize gssh-pub:<keys> --label "My MacBook"
249
- ```
250
-
251
- ```bash
252
- # Terminal 4: Start serving
253
- gssh serve --relay ws://localhost:4480/ws
254
- # This will prompt for the identity password
255
- ```
256
-
257
- ```bash
258
- # Terminal 5: Create an invite (while serve is running)
259
- gssh share create
260
- # Output: https://gitspace.sh/join#<TOKEN>
261
- ```
262
-
263
- ```bash
264
- # On client device: Connect
265
- gssh identity init --label "Work Laptop" # First time only
266
- gssh connect https://gitspace.sh/join#<TOKEN>
267
- ```
268
-
269
- ### Flow 3: Direct Connection (Pre-Authorized)
270
-
271
- Once authorized, connect without an invite:
272
-
273
- ```bash
274
- gssh --relay ws://localhost:4480/ws
275
- # Lists available machines, select one to connect
276
- ```
277
-
278
- ============================================================
279
- D) CUSTOM SCRIPTS & BUNDLES
280
- ============================================================
281
-
282
- ### Custom Scripts
283
-
284
- GitSpace uses convention-based scripts stored per workspace in `.gitspace/scripts/`:
285
-
286
- ```
287
- ~/gitspace/<project>/workspaces/<workspace>/.gitspace/
288
- └── scripts/
289
- ├── pre/ # Run before setup (once, in terminal)
290
- ├── setup/ # Run on workspace creation (once)
291
- ├── select/ # Run every time workspace is opened
292
- └── remove/ # Run before workspace deletion
293
- ```
294
-
295
- Script execution rules:
296
- - Scripts must be executable (`chmod +x`)
297
- - Scripts run alphabetically (use `01-`, `02-` prefixes)
298
- - Working directory: The workspace directory
299
- - Arguments: `$1` = workspace name, `$2` = repository name
300
- - Environment: Bundle values available by key name (for example `REGION`, `PULUMI_ACCESS_TOKEN`)
301
-
302
- Example script (`.gitspace/scripts/select/01-status.sh`):
303
- ```bash
304
- #!/bin/bash
305
- WORKSPACE_NAME=$1
306
- REPOSITORY=$2
307
-
308
- echo "Switching to workspace: $WORKSPACE_NAME"
309
- git fetch origin
310
- git status
311
- ```
312
-
313
- ### Repo Config Bundles
314
-
315
- Bundles allow repository owners to share onboarding configurations. Place in `.gitspace/` in your repo:
316
-
317
- ```
318
- .gitspace/
319
- ├── bundle.json # Bundle manifest with onboarding steps
320
- └── scripts/
321
- ├── pre/ # Scripts to run before setup
322
- ├── setup/ # Scripts to run on first workspace creation
323
- ├── select/ # Scripts to run every time workspace is opened
324
- └── remove/ # Scripts to run before workspace deletion
325
- ```
326
-
327
- Bundle manifest example (`bundle.json`):
328
- ```json
329
- {
330
- "version": "1.0",
331
- "name": "my-app-bundle",
332
- "description": "Setup bundle for my-app",
333
- "onboarding": [
334
- {
335
- "id": "welcome",
336
- "type": "info",
337
- "title": "Welcome",
338
- "description": "Let's get you set up!"
339
- },
340
- {
341
- "id": "node",
342
- "type": "confirm",
343
- "title": "Node.js",
344
- "description": "Node.js 18+ is required",
345
- "checkCommand": "node",
346
- "installUrl": "https://nodejs.org"
347
- },
348
- {
349
- "id": "api-key",
350
- "type": "secret",
351
- "title": "API Key",
352
- "description": "Enter your API key",
353
- "configKey": "apiKey"
354
- },
355
- {
356
- "id": "team-name",
357
- "type": "input",
358
- "title": "Team Name",
359
- "description": "Enter your team name",
360
- "configKey": "teamName",
361
- "defaultValue": "engineering"
362
- }
363
- ]
364
- }
365
- ```
366
-
367
- Onboarding step types:
368
-
369
- | Type | Purpose | Storage |
370
- |------|---------|---------|
371
- | `info` | Display information | N/A |
372
- | `confirm` | Verify installation (can check command in PATH) | N/A |
373
- | `secret` | Collect sensitive values (masked input) | OS Keychain |
374
- | `input` | Collect plain text values | Project config |
375
-
376
- Using bundle values in scripts:
377
- ```bash
378
- #!/bin/bash
379
- # Values available as environment variables:
380
- # <KEY> - Value by exact bundle config key name
381
- # <NORMALIZED_KEY> - Uppercase snake-case alias (e.g. teamName -> TEAM_NAME)
382
-
383
- if [ -n "$TEAM_NAME" ]; then
384
- echo "Welcome, $TEAM_NAME team!"
385
- fi
386
-
387
- if [ -n "$API_KEY" ]; then
388
- echo "API Key configured"
389
- fi
390
- ```
391
-
392
- Bundle sources:
393
- - **In-repo** (automatic): `.gitspace/` directory in the cloned repository
394
- - **Local path**: `gssh add project --bundle-path /path/to/bundle/`
395
- - **Remote URL**: `gssh add project --bundle-url https://example.com/bundle.zip`
396
-
397
- ============================================================
398
- E) CONFIGURATION REFERENCE
399
- ============================================================
400
-
401
- ### Global Configuration
402
-
403
- Location: `~/gitspace/.config.json`
404
-
405
- ```json
406
- {
407
- "currentProject": "my-app",
408
- "projectsDir": "/Users/username/spaces",
409
- "defaultBaseBranch": "main",
410
- "staleDays": 30
411
- }
412
- ```
413
-
414
- ### Project Configuration
415
-
416
- Location: `~/gitspace/<project>/.config.json`
417
-
418
- ```json
419
- {
420
- "name": "my-app",
421
- "repository": "myorg/my-app",
422
- "baseBranch": "main",
423
- "linearApiKey": "lin_api_...",
424
- "linearTeamKey": "ENG",
425
- "bundleValues": {
426
- "teamName": "engineering"
427
- },
428
- "bundleSecretKeys": ["apiKey"],
429
- "appliedBundle": {
430
- "name": "my-app-bundle",
431
- "version": "1.0",
432
- "source": "/path/to/bundle",
433
- "appliedAt": "2025-01-01T00:00:00Z"
434
- }
435
- }
436
- ```
437
-
438
- ### Identity Storage
439
-
440
- Location: `~/gitspace/.identity/`
441
-
442
- | File | Purpose |
443
- |------|---------|
444
- | `keypair.json` | Encrypted Ed25519/X25519 keys (password-protected) |
445
- | `access-list.json` | Authorized client public keys |
446
- | `machine.json` | Machine ID and label |
447
- | `relay.json` | Relay configuration cache |
448
-
449
- ### Environment Variables
450
-
451
- | Variable | Description | Default |
452
- |----------|-------------|---------|
453
- | `RELAY_PORT` | Relay server port | `4480` |
454
- | `RELAY_BIND` | Relay bind address | `0.0.0.0` |
455
- | `SPACES_CURRENT_PROJECT` | Override current project | From config |
456
- | `GITSPACE_API_URL` | gitspace.sh API URL | `https://api.gitspace.sh` |
457
-
458
- ### Directory Structure
459
-
460
- ```
461
- ~/gitspace/
462
- ├── .config.json # Global configuration
463
- ├── .identity/ # Identity files (see above)
464
- ├── <project-name>/
465
- │ ├── .config.json # Project configuration
466
- │ ├── base/ # Base repository clone
467
- │ ├── workspaces/ # Git worktrees
468
- │ │ └── <workspace-name>/
469
- │ │ ├── gitspace.lock # Setup completion marker
470
- │ │ ├── .prompt/ # Linear issue details (if applicable)
471
- │ │ │ └── issue.md
472
- │ │ └── .gitspace/
473
- │ │ ├── bundle.json
474
- │ │ └── scripts/ # Custom scripts (per worktree)
475
- │ │ ├── pre/
476
- │ │ ├── setup/
477
- │ │ ├── select/
478
- │ │ └── remove/
479
- ```
480
-
481
- ============================================================
482
- F) SECURITY MODEL
483
- ============================================================
484
-
485
- ### Cryptographic Primitives
486
-
487
- | Purpose | Algorithm | Notes |
488
- |---------|-----------|-------|
489
- | Identity signing | Ed25519 | Fast, secure signatures |
490
- | Key exchange | X25519 | ECDH for shared secrets |
491
- | Key derivation | HKDF-SHA256 | Domain-separated key derivation |
492
- | Symmetric encryption | AES-256-GCM | Authenticated encryption |
493
- | Password KDF | Scrypt (N=2^15, r=8, p=1) | Encrypts identity at rest |
494
-
495
- ### What's Protected
496
-
497
- | Data | Protection Level |
498
- |------|------------------|
499
- | Terminal keystrokes | E2E encrypted (AES-256-GCM) |
500
- | Terminal output | E2E encrypted (AES-256-GCM) |
501
- | Commands | E2E encrypted (AES-256-GCM) |
502
- | Session content | E2E encrypted (AES-256-GCM) |
503
- | Identity keys | Password-encrypted (Scrypt + AES-GCM) |
504
- | Bundle secrets | OS Keychain (macOS Keychain, Linux libsecret) |
505
-
506
- ### What Relay Can See (Metadata Only)
507
-
508
- | Data | Visible to Relay |
509
- |------|------------------|
510
- | Machine ID | Yes (required for routing) |
511
- | Client identity ID | Yes (required for routing) |
512
- | Connection timestamps | Yes (metadata) |
513
- | Data volume (bytes) | Yes (metadata) |
514
- | Online/offline status | Yes |
515
- | Terminal content | NO (encrypted) |
516
- | Keystrokes | NO (encrypted) |
517
- | Commands and output | NO (encrypted) |
518
-
519
- ### Trust Boundaries
520
-
521
- ```
522
- YOU TRUST: YOU DON'T NEED TO TRUST:
523
- ├── Your own machine ├── The relay operator
524
- ├── Clients you've authorized ├── Network infrastructure
525
- └── Devices holding your identity └── Anyone without an invite
526
-
527
- IF THE RELAY IS COMPROMISED:
528
- ✓ Terminal content is still safe (E2E encrypted)
529
- ✓ Identity keys are still safe (never sent to relay)
530
- ✗ Metadata is exposed (who connected when)
531
- ✗ Relay could deny service
532
- ```
533
-
534
- ### Access Types
535
-
536
- | Type | Description | Capabilities |
537
- |------|-------------|--------------|
538
- | `full` | Permanent access grant | Browse all projects/workspaces, create/attach/kill sessions, manage access |
539
- | `session-invite` | One-time session access | View specific session only, no browsing, read-only |
540
-
541
- ### Current Limitations
542
-
543
- > **Important**: Include this callout on the site. These are known limitations.
544
-
545
- 1. **Client proof-of-possession**: The handshake doesn't fully enforce that the client possesses the private key corresponding to their claimed public key. If an attacker learns an authorized public key, ACL identity spoofing is theoretically possible.
546
-
547
- 2. **Permission enforcement**: Permission flags (`read`/`write`/`manage`) are not fully enforced server-side after the handshake completes. "View-only" access should be treated as intended behavior rather than a strict security guarantee.
548
-
549
- These limitations are being addressed in future releases.
550
-
551
- ============================================================
552
- G) TROUBLESHOOTING
553
- ============================================================
554
-
555
- ### Installation Issues
556
-
557
- **"command not found: spaces"**
558
- - Ensure Bun's global bin is in your PATH
559
- - Try: `export PATH="$HOME/.bun/bin:$PATH"`
560
- - Add to your shell profile (`~/.zshrc`, `~/.bashrc`)
561
-
562
- **"GitHub CLI not authenticated"**
563
- ```bash
564
- gh auth login
565
- # Follow prompts to authenticate
566
- ```
567
-
568
- ### Identity Issues
569
-
570
- **"No identity found"**
571
- ```bash
572
- gssh identity init --label "My Device"
573
- ```
574
-
575
- **"Failed to unlock identity"**
576
- - You're entering the wrong password
577
- - If forgotten, recreate: `gssh identity init --force`
578
- - Warning: This invalidates existing invites and access grants
579
-
580
- **"Identity already exists"**
581
- - Use `--force` to overwrite: `gssh identity init --force`
582
-
583
- ### Connection Issues
584
-
585
- **"Machine offline"**
586
- - Ensure `gssh serve` is running on the target machine
587
- - Check the machine can reach the relay URL
588
- - Verify the machine is authorized on the relay
589
-
590
- **"Client not authorized"**
591
- - You need an invite to connect first
592
- - Or have the machine owner add your public key:
593
- ```bash
594
- gssh access add <your-public-key> --label "Name"
595
- ```
596
-
597
- **"Invite not found" or "Invite expired"**
598
- - The invite may have expired (default: 24h)
599
- - Already been used (single-use invites)
600
- - Not been registered (ensure `gssh serve` was running when created)
601
- - Create a new invite: `gssh share create --expires 7d`
602
-
603
- **"Handshake timeout"**
604
- - Check network connectivity
605
- - Verify firewall allows WebSocket connections
606
- - Both parties must have valid identities
607
- - Try connecting again (transient network issue)
608
-
609
- **"Connection refused" to relay**
610
- - Verify relay URL is correct (`ws://` vs `wss://`)
611
- - Check relay server is running
612
- - Verify port is open/reachable
613
-
614
- ### Workspace Issues
615
-
616
- **"Workspace already exists"**
617
- - Choose a different name
618
- - Or remove existing: `gssh remove workspace <name>`
619
-
620
- **"Failed to create worktree"**
621
- - Check branch doesn't already exist
622
- - Ensure you have git write permissions
623
- - Try: `git fetch origin` first
624
-
625
- **"Setup scripts failed"**
626
- - Check script is executable: `chmod +x .gitspace/scripts/setup/*.sh`
627
- - Run manually to see error: `./.gitspace/scripts/setup/01-script.sh`
628
- - Check environment variables are set
629
-
630
- ### Bundle/Secrets Issues
631
-
632
- **"Bundle key variables are empty"**
633
- 1. Ensure you completed onboarding secret steps
634
- 2. Check OS keychain is accessible:
635
- - macOS: Keychain Access should be running
636
- - Linux: `libsecret` must be installed
637
- 3. Re-run onboarding if needed
638
-
639
- ### Hosting Issues (gitspace.sh)
640
-
641
- **"Subdomain not available"**
642
- - Name may be taken or reserved
643
- - Try a different name
644
- - Check your subdomains: `gssh host list`
645
-
646
- **"Tunnel failed to connect"**
647
- - Ensure `cloudflared` is installed
648
- - Check internet connectivity
649
- - Verify subdomain is reserved: `gssh host status`
650
-
651
- **"Authentication failed" (gitspace.sh)**
652
- - Token may be expired
653
- - Re-authenticate: `gssh auth login`
654
-
655
- ============================================================
656
- H) GLOSSARY
657
- ============================================================
658
-
659
- | Term | Definition |
660
- |------|------------|
661
- | **Machine** | A device running `gssh serve` that accepts remote connections |
662
- | **Client** | A device running `gssh connect` or browser accessing terminal |
663
- | **Relay** | WebSocket server that routes encrypted traffic (default: `wss://relay.gitspace.sh`) |
664
- | **Relay Identity** | Ed25519 keypair used by the relay to sign messages and challenges |
665
- | **Authorized Machine** | Machine public key approved to register with a relay |
666
- | **Identity** | Ed25519 signing + X25519 key exchange keypairs, encrypted at rest |
667
- | **Invite** | Signed token that bootstraps trust and enables first connection |
668
- | **ACL (Access Control List)** | Machine-managed list of authorized client identities |
669
- | **X3DH** | Extended Triple Diffie-Hellman handshake for session key establishment |
670
- | **PTY** | Pseudo-terminal, the interface between your shell and the terminal |
671
- | **Worktree** | Git feature allowing multiple working directories for one repository |
672
- | **Bundle** | Repository configuration package for team onboarding |
673
- | **Session** | A terminal session managed by tmux-lite on the server |
674
- | **Stream** | Encrypted channel within a connection (Stream 0 = master) |
675
- | **TUI** | Terminal User Interface, the interactive `gssh` interface |
676
- | **tmux-lite** | Built-in terminal multiplexer for managing sessions |
677
- | **Subdomain** | Your custom URL on gitspace.sh (e.g., `yourname.gitspace.sh`) |
678
-
679
- ============================================================
680
- I) WHAT TO WRITE ON THE SITE
681
- ============================================================
682
-
683
- Update TWO pages: Home and Docs. Keep layout, replace text/code with the following.
684
-
685
- -------------------------
686
- HOME PAGE (replace copy)
687
- -------------------------
688
-
689
- Headline:
690
- GitSpace: Git worktrees + secure remote access for parallel development
691
-
692
- Subheadline:
693
- Manage multiple features in one repo without stashing. Create isolated workspaces (git worktrees), switch instantly, and access your terminal remotely through end-to-end encrypted connections.
694
-
695
- Primary CTA:
696
- Get Started -> link to /docs
697
-
698
- Feature bullets:
699
- - **Interactive TUI**: Manage projects and workspaces visually
700
- - **Git worktrees**: Multiple branches checked out at once
701
- - **Repo onboarding bundles**: Team setup steps + custom scripts
702
- - **Secure remote access**: E2E encrypted terminal from anywhere
703
- - **gitspace.sh hosting**: Instant subdomains like `yourname.gitspace.sh`
704
- - **Identity-based auth**: Cryptographic keys, not passwords
705
-
706
- Short code example:
707
- ```bash
708
- # Install
709
- npm install -g gitspace
710
-
711
- # Launch the TUI
712
- spaces
713
-
714
- # Or via CLI
715
- gssh add project # Add a GitHub repo
716
- gssh add my-feature # Create a workspace
717
- gssh switch my-feature
718
-
719
- # Remote access (optional)
720
- gssh auth login # Login to gitspace.sh
721
- gssh host reserve myname # Get myname.gitspace.sh
722
- gssh serve # Start serving
723
- ```
724
-
725
- -------------------------
726
- DOCS PAGE (with TOC)
727
- -------------------------
728
-
729
- Title: Documentation
730
-
731
- Table of Contents (anchor links):
732
- - Overview
733
- - Quick Start
734
- - Installation
735
- - Local Workflow
736
- - TUI Interface
737
- - CLI Commands
738
- - Custom Scripts
739
- - Repo Config Bundles
740
- - Remote Access
741
- - gitspace.sh (Managed)
742
- - Self-Hosted Relay
743
- - Identity Management
744
- - Access Control
745
- - Configuration
746
- - Troubleshooting
747
- - Security
748
- - Glossary
749
-
750
- ---
751
-
752
- SECTION: Overview
753
-
754
- GitSpace is a CLI tool for managing GitHub repository workspaces using git worktrees, with optional secure remote terminal access.
755
-
756
- **Local Development:**
757
- - Work on multiple branches simultaneously without stashing
758
- - Interactive TUI for visual workspace management
759
- - Convention-based scripts for automation
760
- - Team onboarding via repo config bundles
761
-
762
- **Remote Access:**
763
- - E2E encrypted terminal access from any browser or CLI
764
- - Zero-trust relay: routes traffic but cannot decrypt content
765
- - Identity-based auth using Ed25519/X25519 cryptographic keys
766
- - Instant hosting via gitspace.sh subdomains
767
-
768
- ---
769
-
770
- SECTION: Quick Start
771
-
772
- ### 5-Minute Setup with gitspace.sh
773
-
774
- ```bash
775
- # 1. Install
776
- npm install -g gitspace
777
-
778
- # 2. Create identity
779
- gssh identity init
780
-
781
- # 3. Login to gitspace.sh
782
- gssh auth login
783
-
784
- # 4. Reserve your subdomain
785
- gssh host reserve yourname
786
-
787
- # 5. Start serving
788
- gssh serve
789
-
790
- # 6. Access from browser: https://yourname.gitspace.sh
791
- ```
792
-
793
- ### Local-Only Quick Start
794
-
795
- ```bash
796
- # Install
797
- npm install -g gitspace
798
-
799
- # Authenticate GitHub
800
- gh auth login
801
-
802
- # Launch TUI
803
- spaces
804
-
805
- # Or via CLI:
806
- gssh add project # Add a GitHub repo
807
- gssh add my-feature # Create a workspace
808
- ```
809
-
810
- ---
811
-
812
- SECTION: Installation
813
-
814
- ### Prerequisites
815
-
816
- Required:
817
- - [Bun](https://bun.sh) - JavaScript runtime
818
- - [Git](https://git-scm.com/) - Version control
819
- - [GitHub CLI](https://cli.github.com/) - `gh auth login` before using GitSpace
820
- - [jq](https://stedolan.github.io/jq/) - JSON processing
821
-
822
- Optional:
823
- - [cloudflared](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/) - For `gssh host` commands
824
-
825
- ### Install GitSpace
826
-
827
- ```bash
828
- npm install -g gitspace
829
- gssh --version
830
- ```
831
-
832
- ### Authenticate GitHub CLI
833
-
834
- ```bash
835
- gh auth login
836
- ```
837
-
838
- ---
839
-
840
- SECTION: Local Workflow - TUI Interface
841
-
842
- Launch the TUI with no arguments:
843
-
844
- ```bash
845
- spaces
846
- ```
847
-
848
- The TUI provides a two-panel interface:
849
- - **Left panel**: Your projects
850
- - **Right panel**: Workspaces in the selected project
851
-
852
- **Key Bindings:**
853
- | Key | Action |
854
- |-----|--------|
855
- | `Enter` | Select project / Open workspace |
856
- | `Tab` | Switch between panels |
857
- | `n` | New project / workspace |
858
- | `d` | Delete selected item |
859
- | `?` | Show help |
860
- | `q` | Quit |
861
-
862
- ---
863
-
864
- SECTION: Local Workflow - CLI Commands
865
-
866
- ### Projects
867
-
868
- ```bash
869
- gssh add project # Add from GitHub (interactive)
870
- gssh add project --org myorg # Filter by organization
871
- gssh switch project myapp # Switch to a project
872
- gssh list projects # List all projects
873
- gssh remove project myapp # Remove a project
874
- ```
875
-
876
- ### Workspaces
877
-
878
- ```bash
879
- gssh add my-feature # Create workspace
880
- gssh add --from develop # Create from specific branch
881
- gssh switch my-feature # Switch to workspace
882
- gssh switch # Interactive selection
883
- gssh list # List workspaces
884
- gssh remove workspace my-feature
885
- ```
886
-
887
- ### Other
888
-
889
- ```bash
890
- gssh directory # Print current project path
891
- gssh status # Show daemon statuses
892
- ```
893
-
894
- ---
895
-
896
- SECTION: Local Workflow - Custom Scripts
897
-
898
- GitSpace uses convention-based scripts stored per workspace in `.gitspace/scripts/`:
899
-
900
- ```
901
- ~/gitspace/<project>/workspaces/<workspace>/.gitspace/
902
- └── scripts/
903
- ├── pre/ # Run before setup (once)
904
- ├── setup/ # Run on workspace creation (once)
905
- ├── select/ # Run every time workspace is opened
906
- └── remove/ # Run before workspace deletion
907
- ```
908
-
909
- **Rules:**
910
- - Scripts must be executable (`chmod +x`)
911
- - Run alphabetically (use `01-`, `02-` prefixes)
912
- - Working directory: the workspace
913
- - Arguments: `$1` = workspace name, `$2` = repository
914
-
915
- **Example:**
916
- ```bash
917
- #!/bin/bash
918
- # .gitspace/scripts/select/01-status.sh
919
- echo "Switching to: $1"
920
- git fetch origin
921
- git status
922
- ```
923
-
924
- ---
925
-
926
- SECTION: Local Workflow - Repo Config Bundles
927
-
928
- Bundles allow teams to share onboarding configurations. Place in `.gitspace/`:
929
-
930
- ```
931
- .gitspace/
932
- ├── bundle.json # Manifest
933
- └── scripts/
934
- ├── pre/ # Pre-setup scripts
935
- ├── setup/ # Setup scripts
936
- ├── select/ # Select scripts
937
- └── remove/ # Remove scripts
938
- ```
939
-
940
- **Manifest example:**
941
- ```json
942
- {
943
- "version": "1.0",
944
- "name": "my-app-bundle",
945
- "onboarding": [
946
- { "id": "node", "type": "confirm", "title": "Node.js", "checkCommand": "node" },
947
- { "id": "api-key", "type": "secret", "title": "API Key", "configKey": "apiKey" }
948
- ]
949
- }
950
- ```
951
-
952
- **Step types:**
953
- | Type | Purpose | Storage |
954
- |------|---------|---------|
955
- | `info` | Display information | N/A |
956
- | `confirm` | Verify installation | N/A |
957
- | `secret` | Sensitive values | OS Keychain |
958
- | `input` | Plain text | Config file |
959
-
960
- **Using values in scripts:**
961
- ```bash
962
- echo "Team: $TEAM_NAME"
963
- echo "Has API key: $API_KEY"
964
- ```
965
-
966
- ---
967
-
968
- SECTION: Remote Access - gitspace.sh (Managed)
969
-
970
- The easiest way to get remote access:
971
-
972
- ```bash
973
- # 1. Create identity
974
- gssh identity init
975
-
976
- # 2. Login with GitHub
977
- gssh auth login
978
-
979
- # 3. Reserve subdomain
980
- gssh host reserve yourname
981
-
982
- # 4. Start serving
983
- gssh serve
984
-
985
- # 5. Access: https://yourname.gitspace.sh
986
- ```
987
-
988
- **Manage subdomains:**
989
- ```bash
990
- gssh host list # List your subdomains
991
- gssh host set-primary name # Set primary
992
- gssh host release name # Release subdomain
993
- gssh host status # Show status
994
- ```
995
-
996
- ---
997
-
998
- SECTION: Remote Access - Self-Hosted Relay
999
-
1000
- For complete control:
1001
-
1002
- **1. Start relay:**
1003
- ```bash
1004
- gssh relay start --port 4480
1005
- ```
1006
-
1007
- **2. Authorize machine:**
1008
- ```bash
1009
- gssh identity init --label "My Mac"
1010
- gssh identity show
1011
-
1012
- # On the relay host
1013
- gssh relay authorize gssh-pub:<keys> --label "My Mac"
1014
- ```
1015
-
1016
- **3. Serve:**
1017
- ```bash
1018
- gssh serve --relay ws://localhost:4480/ws
1019
- ```
1020
-
1021
- **4. Create invite:**
1022
- ```bash
1023
- gssh share create
1024
- # Output: https://gitspace.sh/join#<TOKEN>
1025
- ```
1026
-
1027
- **5. Connect from client:**
1028
- ```bash
1029
- gssh identity init --label "Laptop"
1030
- gssh connect https://gitspace.sh/join#<TOKEN>
1031
- ```
1032
-
1033
- ---
1034
-
1035
- SECTION: Remote Access - Identity Management
1036
-
1037
- Every machine and client has a cryptographic identity:
1038
-
1039
- ```bash
1040
- gssh identity init [--label <name>] [--force]
1041
- gssh identity show [--fingerprint] [--json]
1042
- ```
1043
-
1044
- Identity storage: `~/gitspace/.identity/`
1045
-
1046
- ---
1047
-
1048
- SECTION: Remote Access - Access Control
1049
-
1050
- **Grant access:**
1051
- ```bash
1052
- gssh access add gssh-pub:<keys> --label "Brad's Phone"
1053
- ```
1054
-
1055
- **Manage access:**
1056
- ```bash
1057
- gssh access list [--json]
1058
- gssh access remove "Brad's Phone"
1059
- gssh access remove <key-prefix> --force
1060
- ```
1061
-
1062
- **Connect without invite (pre-authorized):**
1063
- ```bash
1064
- gssh --relay ws://relay.example.com/ws
1065
- ```
1066
-
1067
- ---
1068
-
1069
- SECTION: Configuration
1070
-
1071
- ### Global Config
1072
-
1073
- `~/gitspace/.config.json`:
1074
- ```json
1075
- {
1076
- "currentProject": "my-app",
1077
- "projectsDir": "/Users/username/spaces",
1078
- "defaultBaseBranch": "main"
1079
- }
1080
- ```
1081
-
1082
- ### Project Config
1083
-
1084
- `~/gitspace/<project>/.config.json`:
1085
- ```json
1086
- {
1087
- "name": "my-app",
1088
- "repository": "myorg/my-app",
1089
- "baseBranch": "main"
1090
- }
1091
- ```
1092
-
1093
- ### Environment Variables
1094
-
1095
- | Variable | Description | Default |
1096
- |----------|-------------|---------|
1097
- | `RELAY_PORT` | Relay port | `4480` |
1098
- | `SPACES_CURRENT_PROJECT` | Override project | Config |
1099
-
1100
- ---
1101
-
1102
- SECTION: Troubleshooting
1103
-
1104
- **"No identity found"**
1105
- ```bash
1106
- gssh identity init --label "My Device"
1107
- ```
1108
-
1109
- **"Machine offline"**
1110
- - Ensure `gssh serve` is running
1111
- - Check relay connectivity
1112
- - Verify the machine is authorized on the relay
1113
-
1114
- **"Client not authorized"**
1115
- - Use an invite: `gssh share create`
1116
- - Or add public key: `gssh access add <key>`
1117
-
1118
- **"Invite expired"**
1119
- - Create new invite: `gssh share create --expires 7d`
1120
-
1121
- **"GitHub CLI not authenticated"**
1122
- ```bash
1123
- gh auth login
1124
- ```
1125
-
1126
- ---
1127
-
1128
- SECTION: Security
1129
-
1130
- **End-to-end encrypted:** Terminal traffic encrypted with AES-256-GCM. Relay cannot decrypt.
1131
-
1132
- **Cryptographic identity:** Ed25519 signing + X25519 key exchange. No passwords.
1133
-
1134
- **X3DH handshake:** Session keys derived per-connection.
1135
-
1136
- **Current limitations:**
1137
- - Client proof-of-possession for identity signing keys is not fully enforced (ACL spoofing risk if attacker learns authorized public key)
1138
- - Permission flags not fully enforced server-side after handshake; "view-only" is intended behavior, not strict guarantee
1139
-
1140
- ---
1141
-
1142
- SECTION: Glossary
1143
-
1144
- | Term | Definition |
1145
- |------|------------|
1146
- | Machine | Device running `gssh serve` |
1147
- | Client | Device connecting via browser or CLI |
1148
- | Relay | WebSocket router (default: `wss://relay.gitspace.sh`) |
1149
- | Relay Identity | Ed25519 keypair used by the relay to sign messages and challenges |
1150
- | Authorized Machine | Machine public key approved to register with a relay |
1151
- | Identity | Ed25519 + X25519 keypairs |
1152
- | Invite | Signed token for first connection |
1153
- | ACL | Access Control List |
1154
- | X3DH | Key exchange handshake |
1155
- | Worktree | Git feature for multiple working directories |
1156
- | Bundle | Repo onboarding configuration |
1157
-
1158
- ============================================================
1159
- J) FINAL CHECKLIST
1160
- ============================================================
1161
-
1162
- Before finishing, verify:
1163
-
1164
- - [ ] Every command uses exact subcommand names (especially `gssh relay start`, `gssh serve`)
1165
- - [ ] Defaults match:
1166
- - [ ] Relay port: 4480
1167
- - [ ] Serve relay default: `wss://relay.gitspace.sh`
1168
- - [ ] Share URL: `https://gitspace.sh/join#...`
1169
- - [ ] Share expires default: 24h
1170
- - [ ] Security notes are conservative and include "current limitations" callout
1171
- - [ ] No mention of non-existent features (dashboards, OAuth flows on relay, etc.)
1172
- - [ ] Custom scripts and bundles are documented
1173
- - [ ] All troubleshooting items have solutions
1174
- - [ ] Glossary includes all key terms
1175
-
1176
- Now apply these changes to the Docs pages in the Figma site.