gitspace 0.2.0-rc.2 → 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 (316) hide show
  1. package/README.md +68 -38
  2. package/package.json +36 -25
  3. package/.claude/settings.local.json +0 -21
  4. package/.gitspace/bundle.json +0 -50
  5. package/.gitspace/select/01-status.sh +0 -40
  6. package/.gitspace/setup/01-install-deps.sh +0 -12
  7. package/.gitspace/setup/02-typecheck.sh +0 -16
  8. package/AGENTS.md +0 -439
  9. package/CLAUDE.md +0 -1
  10. package/bun.lock +0 -647
  11. package/docs/CONNECTION.md +0 -623
  12. package/docs/GATEWAY-WORKER.md +0 -319
  13. package/docs/GETTING-STARTED.md +0 -448
  14. package/docs/GITSPACE-PLATFORM.md +0 -1819
  15. package/docs/INFRASTRUCTURE.md +0 -1347
  16. package/docs/PROTOCOL.md +0 -619
  17. package/docs/QUICKSTART.md +0 -174
  18. package/docs/RELAY.md +0 -327
  19. package/docs/REMOTE-DESIGN.md +0 -549
  20. package/docs/ROADMAP.md +0 -564
  21. package/docs/SITE_DOCS_FIGMA_MAKE.md +0 -1167
  22. package/docs/STACK-DESIGN.md +0 -588
  23. package/docs/UNIFIED_ARCHITECTURE.md +0 -292
  24. package/experiments/pty-benchmark.ts +0 -148
  25. package/experiments/pty-latency.ts +0 -100
  26. package/experiments/router/client.ts +0 -199
  27. package/experiments/router/protocol.ts +0 -74
  28. package/experiments/router/router.ts +0 -217
  29. package/experiments/router/session.ts +0 -180
  30. package/experiments/router/test.ts +0 -133
  31. package/experiments/socket-bandwidth.ts +0 -77
  32. package/homebrew/gitspace.rb +0 -45
  33. package/landing-page/ATTRIBUTIONS.md +0 -3
  34. package/landing-page/README.md +0 -11
  35. package/landing-page/bun.lock +0 -801
  36. package/landing-page/guidelines/Guidelines.md +0 -61
  37. package/landing-page/index.html +0 -37
  38. package/landing-page/package.json +0 -90
  39. package/landing-page/postcss.config.mjs +0 -15
  40. package/landing-page/public/_redirects +0 -1
  41. package/landing-page/public/favicon.png +0 -0
  42. package/landing-page/src/app/App.tsx +0 -53
  43. package/landing-page/src/app/components/figma/ImageWithFallback.tsx +0 -27
  44. package/landing-page/src/app/components/ui/accordion.tsx +0 -66
  45. package/landing-page/src/app/components/ui/alert-dialog.tsx +0 -157
  46. package/landing-page/src/app/components/ui/alert.tsx +0 -66
  47. package/landing-page/src/app/components/ui/aspect-ratio.tsx +0 -11
  48. package/landing-page/src/app/components/ui/avatar.tsx +0 -53
  49. package/landing-page/src/app/components/ui/badge.tsx +0 -46
  50. package/landing-page/src/app/components/ui/breadcrumb.tsx +0 -109
  51. package/landing-page/src/app/components/ui/button.tsx +0 -57
  52. package/landing-page/src/app/components/ui/calendar.tsx +0 -75
  53. package/landing-page/src/app/components/ui/card.tsx +0 -92
  54. package/landing-page/src/app/components/ui/carousel.tsx +0 -241
  55. package/landing-page/src/app/components/ui/chart.tsx +0 -353
  56. package/landing-page/src/app/components/ui/checkbox.tsx +0 -32
  57. package/landing-page/src/app/components/ui/collapsible.tsx +0 -33
  58. package/landing-page/src/app/components/ui/command.tsx +0 -177
  59. package/landing-page/src/app/components/ui/context-menu.tsx +0 -252
  60. package/landing-page/src/app/components/ui/dialog.tsx +0 -135
  61. package/landing-page/src/app/components/ui/drawer.tsx +0 -132
  62. package/landing-page/src/app/components/ui/dropdown-menu.tsx +0 -257
  63. package/landing-page/src/app/components/ui/form.tsx +0 -168
  64. package/landing-page/src/app/components/ui/hover-card.tsx +0 -44
  65. package/landing-page/src/app/components/ui/input-otp.tsx +0 -77
  66. package/landing-page/src/app/components/ui/input.tsx +0 -21
  67. package/landing-page/src/app/components/ui/label.tsx +0 -24
  68. package/landing-page/src/app/components/ui/menubar.tsx +0 -276
  69. package/landing-page/src/app/components/ui/navigation-menu.tsx +0 -168
  70. package/landing-page/src/app/components/ui/pagination.tsx +0 -127
  71. package/landing-page/src/app/components/ui/popover.tsx +0 -48
  72. package/landing-page/src/app/components/ui/progress.tsx +0 -31
  73. package/landing-page/src/app/components/ui/radio-group.tsx +0 -45
  74. package/landing-page/src/app/components/ui/resizable.tsx +0 -56
  75. package/landing-page/src/app/components/ui/scroll-area.tsx +0 -58
  76. package/landing-page/src/app/components/ui/select.tsx +0 -189
  77. package/landing-page/src/app/components/ui/separator.tsx +0 -28
  78. package/landing-page/src/app/components/ui/sheet.tsx +0 -139
  79. package/landing-page/src/app/components/ui/sidebar.tsx +0 -726
  80. package/landing-page/src/app/components/ui/skeleton.tsx +0 -13
  81. package/landing-page/src/app/components/ui/slider.tsx +0 -63
  82. package/landing-page/src/app/components/ui/sonner.tsx +0 -25
  83. package/landing-page/src/app/components/ui/switch.tsx +0 -31
  84. package/landing-page/src/app/components/ui/table.tsx +0 -116
  85. package/landing-page/src/app/components/ui/tabs.tsx +0 -66
  86. package/landing-page/src/app/components/ui/textarea.tsx +0 -18
  87. package/landing-page/src/app/components/ui/toggle-group.tsx +0 -73
  88. package/landing-page/src/app/components/ui/toggle.tsx +0 -47
  89. package/landing-page/src/app/components/ui/tooltip.tsx +0 -61
  90. package/landing-page/src/app/components/ui/use-mobile.ts +0 -21
  91. package/landing-page/src/app/components/ui/utils.ts +0 -6
  92. package/landing-page/src/components/docs/DocsContent.tsx +0 -718
  93. package/landing-page/src/components/docs/DocsSidebar.tsx +0 -84
  94. package/landing-page/src/components/landing/CTA.tsx +0 -59
  95. package/landing-page/src/components/landing/Comparison.tsx +0 -84
  96. package/landing-page/src/components/landing/FaultyTerminal.tsx +0 -424
  97. package/landing-page/src/components/landing/Features.tsx +0 -201
  98. package/landing-page/src/components/landing/Hero.tsx +0 -142
  99. package/landing-page/src/components/landing/Pricing.tsx +0 -140
  100. package/landing-page/src/components/landing/Roadmap.tsx +0 -86
  101. package/landing-page/src/components/landing/Security.tsx +0 -81
  102. package/landing-page/src/components/landing/TerminalWindow.tsx +0 -27
  103. package/landing-page/src/components/landing/UseCases.tsx +0 -55
  104. package/landing-page/src/components/landing/Workflow.tsx +0 -101
  105. package/landing-page/src/components/layout/DashboardNavbar.tsx +0 -37
  106. package/landing-page/src/components/layout/Footer.tsx +0 -55
  107. package/landing-page/src/components/layout/LandingNavbar.tsx +0 -82
  108. package/landing-page/src/components/ui/badge.tsx +0 -39
  109. package/landing-page/src/components/ui/breadcrumb.tsx +0 -115
  110. package/landing-page/src/components/ui/button.tsx +0 -57
  111. package/landing-page/src/components/ui/card.tsx +0 -79
  112. package/landing-page/src/components/ui/mock-terminal.tsx +0 -68
  113. package/landing-page/src/components/ui/separator.tsx +0 -28
  114. package/landing-page/src/lib/utils.ts +0 -6
  115. package/landing-page/src/main.tsx +0 -10
  116. package/landing-page/src/pages/Dashboard.tsx +0 -133
  117. package/landing-page/src/pages/DocsPage.tsx +0 -79
  118. package/landing-page/src/pages/LandingPage.tsx +0 -31
  119. package/landing-page/src/pages/TerminalView.tsx +0 -106
  120. package/landing-page/src/styles/fonts.css +0 -0
  121. package/landing-page/src/styles/index.css +0 -3
  122. package/landing-page/src/styles/tailwind.css +0 -4
  123. package/landing-page/src/styles/theme.css +0 -181
  124. package/landing-page/vite.config.ts +0 -19
  125. package/npm/darwin-arm64/bin/gssh +0 -0
  126. package/npm/darwin-arm64/package.json +0 -20
  127. package/scripts/build.ts +0 -298
  128. package/scripts/release.ts +0 -140
  129. package/src/__tests__/test-utils.ts +0 -298
  130. package/src/commands/__tests__/serve-messages.test.ts +0 -190
  131. package/src/commands/access.ts +0 -298
  132. package/src/commands/add.ts +0 -452
  133. package/src/commands/auth.ts +0 -364
  134. package/src/commands/connect.ts +0 -287
  135. package/src/commands/directory.ts +0 -16
  136. package/src/commands/host.ts +0 -396
  137. package/src/commands/identity.ts +0 -184
  138. package/src/commands/list.ts +0 -200
  139. package/src/commands/relay.ts +0 -315
  140. package/src/commands/remove.ts +0 -241
  141. package/src/commands/serve.ts +0 -1493
  142. package/src/commands/share.ts +0 -456
  143. package/src/commands/status.ts +0 -125
  144. package/src/commands/switch.ts +0 -353
  145. package/src/commands/tmux.ts +0 -317
  146. package/src/core/__tests__/access.test.ts +0 -240
  147. package/src/core/access.ts +0 -277
  148. package/src/core/bundle.ts +0 -342
  149. package/src/core/config.ts +0 -510
  150. package/src/core/git.ts +0 -317
  151. package/src/core/github.ts +0 -151
  152. package/src/core/identity.ts +0 -631
  153. package/src/core/linear.ts +0 -225
  154. package/src/core/shell.ts +0 -161
  155. package/src/core/trusted-relays.ts +0 -315
  156. package/src/index.ts +0 -810
  157. package/src/lib/remote-session/index.ts +0 -7
  158. package/src/lib/remote-session/protocol.ts +0 -267
  159. package/src/lib/remote-session/session-handler.ts +0 -581
  160. package/src/lib/remote-session/workspace-scanner.ts +0 -167
  161. package/src/lib/tmux-lite/README.md +0 -81
  162. package/src/lib/tmux-lite/cli.ts +0 -796
  163. package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +0 -349
  164. package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +0 -291
  165. package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +0 -142
  166. package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +0 -339
  167. package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +0 -477
  168. package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +0 -499
  169. package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +0 -371
  170. package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +0 -573
  171. package/src/lib/tmux-lite/crypto/access-control.test.ts +0 -512
  172. package/src/lib/tmux-lite/crypto/access-control.ts +0 -320
  173. package/src/lib/tmux-lite/crypto/frames.test.ts +0 -262
  174. package/src/lib/tmux-lite/crypto/frames.ts +0 -141
  175. package/src/lib/tmux-lite/crypto/handshake.ts +0 -894
  176. package/src/lib/tmux-lite/crypto/identity.test.ts +0 -220
  177. package/src/lib/tmux-lite/crypto/identity.ts +0 -286
  178. package/src/lib/tmux-lite/crypto/index.ts +0 -51
  179. package/src/lib/tmux-lite/crypto/invites.test.ts +0 -381
  180. package/src/lib/tmux-lite/crypto/invites.ts +0 -215
  181. package/src/lib/tmux-lite/crypto/keyexchange.ts +0 -435
  182. package/src/lib/tmux-lite/crypto/keys.test.ts +0 -58
  183. package/src/lib/tmux-lite/crypto/keys.ts +0 -47
  184. package/src/lib/tmux-lite/crypto/secretbox.test.ts +0 -169
  185. package/src/lib/tmux-lite/crypto/secretbox.ts +0 -124
  186. package/src/lib/tmux-lite/handshake-handler.ts +0 -451
  187. package/src/lib/tmux-lite/protocol.test.ts +0 -307
  188. package/src/lib/tmux-lite/protocol.ts +0 -266
  189. package/src/lib/tmux-lite/relay-client.ts +0 -506
  190. package/src/lib/tmux-lite/server.ts +0 -1250
  191. package/src/lib/tmux-lite/shell-integration.sh +0 -37
  192. package/src/lib/tmux-lite/terminal-queries.test.ts +0 -54
  193. package/src/lib/tmux-lite/terminal-queries.ts +0 -49
  194. package/src/relay/__tests__/e2e-flow.test.ts +0 -1284
  195. package/src/relay/__tests__/helpers/auth.ts +0 -354
  196. package/src/relay/__tests__/helpers/ports.ts +0 -51
  197. package/src/relay/__tests__/protocol-validation.test.ts +0 -265
  198. package/src/relay/authorization.ts +0 -303
  199. package/src/relay/embedded-assets.generated.d.ts +0 -15
  200. package/src/relay/identity.ts +0 -352
  201. package/src/relay/index.ts +0 -57
  202. package/src/relay/pipes.test.ts +0 -427
  203. package/src/relay/pipes.ts +0 -195
  204. package/src/relay/protocol.ts +0 -804
  205. package/src/relay/registries.test.ts +0 -437
  206. package/src/relay/registries.ts +0 -593
  207. package/src/relay/server.test.ts +0 -1323
  208. package/src/relay/server.ts +0 -1092
  209. package/src/relay/signing.ts +0 -238
  210. package/src/relay/types.ts +0 -69
  211. package/src/serve/client-session-manager.ts +0 -622
  212. package/src/serve/daemon.ts +0 -497
  213. package/src/serve/pty-session.ts +0 -236
  214. package/src/serve/types.ts +0 -169
  215. package/src/shared/components/Flow.tsx +0 -453
  216. package/src/shared/components/Flow.tui.tsx +0 -343
  217. package/src/shared/components/Flow.web.tsx +0 -442
  218. package/src/shared/components/Inbox.tsx +0 -446
  219. package/src/shared/components/Inbox.tui.tsx +0 -262
  220. package/src/shared/components/Inbox.web.tsx +0 -329
  221. package/src/shared/components/MachineList.tsx +0 -187
  222. package/src/shared/components/MachineList.tui.tsx +0 -161
  223. package/src/shared/components/MachineList.web.tsx +0 -210
  224. package/src/shared/components/ProjectList.tsx +0 -176
  225. package/src/shared/components/ProjectList.tui.tsx +0 -109
  226. package/src/shared/components/ProjectList.web.tsx +0 -143
  227. package/src/shared/components/SpacesBrowser.tsx +0 -332
  228. package/src/shared/components/SpacesBrowser.tui.tsx +0 -163
  229. package/src/shared/components/SpacesBrowser.web.tsx +0 -221
  230. package/src/shared/components/index.ts +0 -103
  231. package/src/shared/hooks/index.ts +0 -16
  232. package/src/shared/hooks/useNavigation.ts +0 -226
  233. package/src/shared/index.ts +0 -122
  234. package/src/shared/providers/LocalMachineProvider.ts +0 -425
  235. package/src/shared/providers/MachineProvider.ts +0 -165
  236. package/src/shared/providers/RemoteMachineProvider.ts +0 -444
  237. package/src/shared/providers/index.ts +0 -26
  238. package/src/shared/types.ts +0 -145
  239. package/src/tui/adapters.ts +0 -120
  240. package/src/tui/app.tsx +0 -1816
  241. package/src/tui/components/Terminal.tsx +0 -580
  242. package/src/tui/hooks/index.ts +0 -35
  243. package/src/tui/hooks/useAppState.ts +0 -314
  244. package/src/tui/hooks/useDaemonStatus.ts +0 -174
  245. package/src/tui/hooks/useInboxTUI.ts +0 -113
  246. package/src/tui/hooks/useRemoteMachines.ts +0 -209
  247. package/src/tui/index.ts +0 -24
  248. package/src/tui/state.ts +0 -299
  249. package/src/tui/terminal-bracketed-paste.test.ts +0 -45
  250. package/src/tui/terminal-bracketed-paste.ts +0 -47
  251. package/src/types/bundle.ts +0 -112
  252. package/src/types/config.ts +0 -89
  253. package/src/types/errors.ts +0 -206
  254. package/src/types/identity.ts +0 -284
  255. package/src/types/workspace-fuzzy.ts +0 -49
  256. package/src/types/workspace.ts +0 -151
  257. package/src/utils/bun-socket-writer.ts +0 -80
  258. package/src/utils/deps.ts +0 -127
  259. package/src/utils/fuzzy-match.ts +0 -125
  260. package/src/utils/logger.ts +0 -127
  261. package/src/utils/markdown.ts +0 -254
  262. package/src/utils/onboarding.ts +0 -229
  263. package/src/utils/prompts.ts +0 -114
  264. package/src/utils/run-commands.ts +0 -112
  265. package/src/utils/run-scripts.ts +0 -142
  266. package/src/utils/sanitize.ts +0 -98
  267. package/src/utils/secrets.ts +0 -122
  268. package/src/utils/shell-escape.ts +0 -40
  269. package/src/utils/utf8.ts +0 -79
  270. package/src/utils/workspace-state.ts +0 -47
  271. package/src/web/README.md +0 -73
  272. package/src/web/bun.lock +0 -575
  273. package/src/web/eslint.config.js +0 -23
  274. package/src/web/index.html +0 -16
  275. package/src/web/package.json +0 -37
  276. package/src/web/public/vite.svg +0 -1
  277. package/src/web/src/App.tsx +0 -604
  278. package/src/web/src/assets/react.svg +0 -1
  279. package/src/web/src/components/Terminal.tsx +0 -207
  280. package/src/web/src/hooks/useRelayConnection.ts +0 -224
  281. package/src/web/src/hooks/useTerminal.ts +0 -699
  282. package/src/web/src/index.css +0 -55
  283. package/src/web/src/lib/crypto/__tests__/web-terminal.test.ts +0 -1158
  284. package/src/web/src/lib/crypto/frames.ts +0 -205
  285. package/src/web/src/lib/crypto/handshake.ts +0 -396
  286. package/src/web/src/lib/crypto/identity.ts +0 -128
  287. package/src/web/src/lib/crypto/keyexchange.ts +0 -246
  288. package/src/web/src/lib/crypto/relay-signing.ts +0 -53
  289. package/src/web/src/lib/invite.ts +0 -58
  290. package/src/web/src/lib/storage/identity-store.ts +0 -94
  291. package/src/web/src/main.tsx +0 -10
  292. package/src/web/src/types/identity.ts +0 -45
  293. package/src/web/tsconfig.app.json +0 -28
  294. package/src/web/tsconfig.json +0 -7
  295. package/src/web/tsconfig.node.json +0 -26
  296. package/src/web/vite.config.ts +0 -31
  297. package/todo-security.md +0 -92
  298. package/tsconfig.json +0 -23
  299. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite +0 -0
  300. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-shm +0 -0
  301. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-wal +0 -0
  302. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite +0 -0
  303. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-shm +0 -0
  304. package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-wal +0 -0
  305. package/worker/bun.lock +0 -237
  306. package/worker/package.json +0 -22
  307. package/worker/schema.sql +0 -96
  308. package/worker/src/handlers/auth.ts +0 -451
  309. package/worker/src/handlers/subdomains.ts +0 -376
  310. package/worker/src/handlers/user.ts +0 -98
  311. package/worker/src/index.ts +0 -70
  312. package/worker/src/middleware/auth.ts +0 -152
  313. package/worker/src/services/cloudflare.ts +0 -609
  314. package/worker/src/types.ts +0 -96
  315. package/worker/tsconfig.json +0 -15
  316. package/worker/wrangler.toml +0 -26
package/docs/ROADMAP.md DELETED
@@ -1,564 +0,0 @@
1
- # GitSpace Roadmap
2
-
3
- > **Living Document** - Captures the vision and implementation plan for GitSpace
4
-
5
- ---
6
-
7
- ## Vision
8
-
9
- GitSpace is a unified development environment that combines:
10
- - **Git worktrees** for parallel branch development
11
- - **VM isolation** via Lima for secure, reproducible environments
12
- - **Process management** via wide event observability
13
- - **Remote access** via E2E encrypted relay
14
- - **Instant hosting** via Cloudflare tunnels on `*.gitspace.sh`
15
- - **Code intelligence** via ast-grep + AI for structural understanding
16
-
17
- ---
18
-
19
- ## Single Entry Point: `gssh`
20
-
21
- The `gssh` command is the universal entry point:
22
-
23
- ```bash
24
- # Local development (default)
25
- gssh
26
- # → Starts relay daemon in background (if not running)
27
- # → Launches TUI
28
- # → Shows local workspaces
29
-
30
- # Connect to remote machine
31
- gssh --remote <machine-id>
32
- gssh --remote brads-macbook
33
-
34
- # Connect via invite token
35
- gssh --connect <invite-token>
36
- ```
37
-
38
- ### Startup Flow
39
-
40
- ```
41
- ┌─────────────────────────────────────────────────────────────────────────┐
42
- │ gssh (entry point) │
43
- ├─────────────────────────────────────────────────────────────────────────┤
44
- │ │
45
- │ 1. Check: Is relay daemon running? │
46
- │ └── No → Start `gssh serve` in background │
47
- │ │
48
- │ 2. Check: --remote flag? │
49
- │ └── Yes → Connect TUI to remote machine │
50
- │ └── No → Connect TUI to local machine │
51
- │ │
52
- │ 3. Launch TUI │
53
- │ └── Browse workspaces │
54
- │ └── Select workspace → ensure Lima VM running → attach session │
55
- │ │
56
- └─────────────────────────────────────────────────────────────────────────┘
57
- ```
58
-
59
- ---
60
-
61
- ## Feature Roadmap
62
-
63
- ### 1. Cloudflare Tunnel (Status: Partially Implemented)
64
-
65
- Instant hosting on `*.gitspace.sh` subdomains.
66
-
67
- **Implemented Commands:**
68
- ```bash
69
- gssh auth login # GitHub OAuth authentication
70
- gssh auth logout # Clear credentials
71
- gssh auth status # Show auth status
72
- gssh host reserve <name> # Reserve myapp.gitspace.sh
73
- gssh host release [name] # Release subdomain
74
- gssh host list # List your subdomains
75
- gssh host set-primary <n> # Set primary subdomain
76
- gssh host status # Show tunnel status
77
- ```
78
-
79
- **Not Yet Implemented:**
80
- - Service routing (e.g., `app.username.gitspace.sh` → `localhost:3000`)
81
- - Per-service access control
82
- - Gateway worker for auth at edge
83
-
84
- **Architecture:**
85
- ```
86
- Developer Mac Cloudflare Users
87
- ───────────── ────────── ─────
88
-
89
- gssh serve ────────────────────► Tunnel ◄─────────────────── Browser
90
- │ (cloudflared)
91
-
92
-
93
- localhost:4480 ◄─────────────── username.gitspace.sh (relay WebSocket)
94
- ```
95
-
96
- **Implementation Files:**
97
- - `src/commands/auth.ts` - GitHub OAuth device flow
98
- - `src/commands/host.ts` - Subdomain management CLI
99
- - `worker/` - Cloudflare Worker API (D1 database)
100
- - Token stored in keychain via `src/utils/secrets.ts`
101
-
102
- ---
103
-
104
- ### 2. Lima VMs (Status: Not Implemented)
105
-
106
- VM-per-workspace isolation using Lima. Works on all Apple Silicon (M1/M2/M3+).
107
-
108
- **Why Lima:**
109
- - Firecracker requires KVM (Linux-only)
110
- - To run Firecracker on Mac, need nested virtualization
111
- - Nested virt only works on M3+ with macOS 15+
112
- - Lima VMs work on ALL Apple Silicon
113
- - 5-10s boot time is acceptable for workspace-level isolation
114
-
115
- **Architecture:**
116
- ```
117
- ┌─────────────────────────────────────────────────────────────────────────┐
118
- │ MAC HOST │
119
- │ │
120
- │ gssh (TUI) │
121
- │ │ │
122
- │ ▼ │
123
- │ gssh serve (daemon) │
124
- │ │ │
125
- │ ├── LimaManager (VM lifecycle) │
126
- │ │ │ │
127
- │ │ ├── Lima VM: feature-auth │
128
- │ │ │ └── tmux-lite-server │
129
- │ │ │ └── services (api, worker, db) │
130
- │ │ │ │
131
- │ │ └── Lima VM: bugfix-login │
132
- │ │ └── tmux-lite-server │
133
- │ │ └── services │
134
- │ │ │
135
- │ └── Relay connection (ONE machine identity) │
136
- │ │
137
- └─────────────────────────────────────────────────────────────────────────┘
138
- ```
139
-
140
- **Key Design Decisions:**
141
- - **VM per workspace**, not per service
142
- - **Invisible to relay** - Mac appears as one machine with multiple workspaces
143
- - **Session routing** - `gssh serve` routes sessions to correct Lima VM
144
- - **Dockerfile → rootfs** - Define VM environment via familiar Dockerfile
145
-
146
- **Config:**
147
- ```json
148
- {
149
- "vm": {
150
- "enabled": true,
151
- "cpus": 4,
152
- "memory": 4096,
153
- "dockerfile": "./Dockerfile.dev"
154
- }
155
- }
156
- ```
157
-
158
- **Implementation:**
159
- - `src/core/lima/manager.ts` - VM lifecycle (start/stop/status)
160
- - `src/core/lima/config.ts` - Generate Lima YAML from workspace config
161
- - `src/core/lima/connection.ts` - Connect to tmux-lite inside VM
162
- - `src/shared/providers/LimaMachineProvider.ts` - MachineProvider implementation
163
-
164
- **Session Lifecycle:**
165
- 1. User selects workspace in TUI
166
- 2. Check: Lima VM running for this workspace?
167
- - No → Boot Lima VM (~5-10s)
168
- - Yes → Continue
169
- 3. Check: Session exists?
170
- - No → Create session in VM's tmux-lite
171
- - Yes → Attach to existing session
172
- 4. User works in session
173
- 5. VM stays running until idle timeout
174
-
175
- ---
176
-
177
- ### 3. Process Runner + Wide Events (Status: Not Implemented)
178
-
179
- Service management with observability via wide events.
180
-
181
- **Concepts:**
182
- - **Services** - Defined in config, managed by GitSpace
183
- - **Wide Events** - Rich structured events (not metrics/logs/traces separately)
184
- - **Event Correlation** - eventId chains become single wide events
185
-
186
- **Commands:**
187
- ```bash
188
- gssh run # Start all services
189
- gssh run api worker # Start specific services
190
- gssh run --logs # With log tailing
191
-
192
- gssh events # TUI explorer
193
- gssh events tail # Live tail
194
- gssh events "slow requests" # AI-powered query
195
- gssh events --filter "http.status>=500" --group-by path
196
- ```
197
-
198
- **Config:**
199
- ```json
200
- {
201
- "services": [
202
- {
203
- "name": "api",
204
- "command": "bun run dev",
205
- "readyWhen": { "port": 3000 },
206
- "dependsOn": [],
207
- "events": { "source": "stdout", "format": "jsonl" }
208
- },
209
- {
210
- "name": "worker",
211
- "command": "bun run worker",
212
- "dependsOn": ["api"]
213
- }
214
- ],
215
- "events": {
216
- "enabled": true,
217
- "store": "sqlite",
218
- "flushTimeout": 5000
219
- }
220
- }
221
- ```
222
-
223
- **Event Format (apps emit):**
224
- ```json
225
- {"eventId": "req-123", "eventKey": "http.start", "method": "GET", "path": "/users"}
226
- {"eventId": "req-123", "eventKey": "db.query", "table": "users", "duration_ms": 45}
227
- {"eventId": "req-123", "eventKey": "http.end", "status": 200, "finalEvent": true}
228
- ```
229
-
230
- **Wide Event (after correlation):**
231
- ```json
232
- {
233
- "eventId": "req-123",
234
- "http.method": "GET",
235
- "http.path": "/users",
236
- "http.status": 200,
237
- "db.query_count": 1,
238
- "db.total_duration_ms": 45
239
- }
240
- ```
241
-
242
- **Implementation:**
243
- - `src/core/services/supervisor.ts` - Process manager
244
- - `src/core/services/dependency.ts` - Dependency resolution
245
- - `src/core/services/health.ts` - Ready checks
246
- - `src/core/events/collector.ts` - Event ingestion
247
- - `src/core/events/correlator.ts` - eventId → wide event
248
- - `src/core/events/store/` - memory, sqlite, duckdb backends
249
- - `src/core/events/query.ts` - Filter/group/aggregate
250
- - `src/commands/run.ts` - CLI
251
- - `src/commands/events.ts` - CLI
252
-
253
- ---
254
-
255
- ### 4. Code Intelligence (Status: Not Implemented)
256
-
257
- ast-grep + AI for structural code understanding, inspired by Lumen.
258
-
259
- **Concept:**
260
- - Use **ast-grep** for structural code search (not text grep)
261
- - **AI generates patterns** from natural language queries
262
- - **Correlate with runtime** - connect slow events back to code
263
- - **AI synthesizes** findings into actionable insights
264
-
265
- **Commands:**
266
- ```bash
267
- gssh query "how does auth work?"
268
- gssh query "what calls validateUser?"
269
- gssh query "why is checkout slow?" # Uses runtime events + code
270
- gssh query --impact "change User type" # Impact analysis
271
- ```
272
-
273
- **Architecture:**
274
- ```
275
- User: "why is checkout slow?"
276
-
277
-
278
- ┌─────────────────────────────────────────────────────────────────────┐
279
- │ 1. Pattern Generator (AI → ast-grep rules) │
280
- │ "Find all functions with 'checkout' in name" │
281
- │ "Find all db queries in checkout flow" │
282
- └─────────────────────────────────────────────────────────────────────┘
283
-
284
-
285
- ┌─────────────────────────────────────────────────────────────────────┐
286
- │ 2. Structural Scan (ast-grep) │
287
- │ → 5 checkout-related functions │
288
- │ → 12 db queries in call graph │
289
- └─────────────────────────────────────────────────────────────────────┘
290
-
291
-
292
- ┌─────────────────────────────────────────────────────────────────────┐
293
- │ 3. Runtime Correlation (wide events) │
294
- │ → checkout requests have p95 = 850ms │
295
- │ → db.query in OrderRepository taking 500ms │
296
- └─────────────────────────────────────────────────────────────────────┘
297
-
298
-
299
- ┌─────────────────────────────────────────────────────────────────────┐
300
- │ 4. AI Synthesis │
301
- │ "N+1 query in OrderRepository.findByUser() at src/repos/ │
302
- │ order.ts:45. Called in loop by CartService.getItems()." │
303
- └─────────────────────────────────────────────────────────────────────┘
304
- ```
305
-
306
- **Implementation:**
307
- - `src/core/insight/index.ts` - Orchestrator
308
- - `src/core/insight/pattern-gen.ts` - NL → ast-grep patterns
309
- - `src/core/insight/scanner.ts` - Execute patterns
310
- - `src/core/insight/graph.ts` - Dependency/call graphs
311
- - `src/core/insight/ai-synth.ts` - AI synthesis
312
- - `src/lib/ast-grep/runner.ts` - Shell out to sg CLI
313
- - `src/commands/query.ts` - CLI
314
-
315
- ---
316
-
317
- ### 5. Stack Splitting (Status: Not Implemented)
318
-
319
- AI-assisted splitting of WIP commits into clean PRs. See `docs/STACK-DESIGN.md` for full design.
320
-
321
- **Commands:**
322
- ```bash
323
- gssh stack # Analyze and propose split
324
- gssh stack --base develop # Specify base branch
325
- gssh stack --dry-run # Just analyze, don't execute
326
- gssh stack sync # Rebase after PR merges
327
- gssh stack list # List active stacks
328
- ```
329
-
330
- ---
331
-
332
- ## Config Schema (Full)
333
-
334
- ```json
335
- {
336
- "name": "my-app",
337
- "repository": "myorg/my-app",
338
- "baseBranch": "main",
339
- "createdAt": "2024-12-30T00:00:00.000Z",
340
- "lastAccessed": "2024-12-30T00:00:00.000Z",
341
-
342
- "vm": {
343
- "enabled": true,
344
- "cpus": 4,
345
- "memory": 4096,
346
- "disk": 50,
347
- "dockerfile": "./Dockerfile.dev"
348
- },
349
-
350
- "services": [
351
- {
352
- "name": "api",
353
- "command": "bun run dev",
354
- "cwd": "./api",
355
- "env": { "PORT": "3000" },
356
- "dependsOn": ["db"],
357
- "readyWhen": {
358
- "port": 3000,
359
- "timeout": 30000
360
- },
361
- "events": {
362
- "source": "stdout",
363
- "format": "jsonl"
364
- }
365
- },
366
- {
367
- "name": "db",
368
- "command": "postgres",
369
- "readyWhen": { "port": 5432 }
370
- }
371
- ],
372
-
373
- "events": {
374
- "enabled": true,
375
- "store": "sqlite",
376
- "flushTimeout": 5000,
377
- "maxEvents": 100000
378
- },
379
-
380
- "host": {
381
- "subdomain": "myapp",
382
- "routes": [
383
- { "path": "/api", "service": "api" },
384
- { "path": "/", "port": 8080 }
385
- ],
386
- "terminal": true,
387
- "access": {
388
- "mode": "private",
389
- "allowedKeys": []
390
- }
391
- },
392
-
393
- "bundleSecretKeys": ["GITSPACE_TOKEN"]
394
- }
395
- ```
396
-
397
- ---
398
-
399
- ## CLI Reference (Current + Planned)
400
-
401
- ### Implemented
402
-
403
- ```bash
404
- # Entry point
405
- gssh # Start TUI
406
- gssh --relay <url> # TUI with remote machine access
407
-
408
- # Identity
409
- gssh identity init # Create machine keypair
410
- gssh identity show # Show fingerprint
411
-
412
- # Access control
413
- gssh access add <pubkey> # Authorize client
414
- gssh access list # List authorized
415
- gssh access remove <key> # Revoke access
416
-
417
- # Sharing
418
- gssh share create # Create invite token
419
-
420
- # Authentication (gitspace.sh)
421
- gssh auth login # GitHub OAuth
422
- gssh auth logout # Clear credentials
423
- gssh auth status # Show auth status
424
-
425
- # Hosting (gitspace.sh)
426
- gssh host reserve <name> # Reserve subdomain
427
- gssh host release [name] # Release subdomain
428
- gssh host list # List subdomains
429
- gssh host set-primary <n> # Set primary
430
- gssh host status # Show status
431
-
432
- # Remote access
433
- gssh serve # Start daemon (foreground)
434
- gssh serve start # Start daemon (background)
435
- gssh serve stop # Stop daemon
436
- gssh connect <token> # Connect via invite token
437
- gssh status # Show daemon status
438
-
439
- # Machine management
440
- gssh machine invite # Create machine invite
441
- gssh machine list # List machines (stub)
442
- gssh machine remove <id> # Remove machine (stub)
443
-
444
- # Projects/workspaces
445
- gssh add project # Add project from GitHub
446
- gssh add <name> # Create workspace
447
- gssh list projects # List projects
448
- gssh list workspaces # List workspaces
449
- gssh remove workspace # Remove workspace
450
- gssh remove project # Remove project
451
- gssh directory # Print project directory
452
-
453
- # Relay (internal)
454
- gssh relay start # Start relay server
455
- gssh relay authorize <pubkey> # Authorize machine
456
- ```
457
-
458
- ### Planned (Not Implemented)
459
-
460
- ```bash
461
- # Services (requires Lima VMs)
462
- gssh run # Start all services
463
- gssh run <service...> # Start specific services
464
- gssh stop # Stop all services
465
- gssh logs <service> # Tail logs
466
-
467
- # Events
468
- gssh events # TUI explorer
469
- gssh events tail # Live tail
470
- gssh events query "..." # AI-powered query
471
-
472
- # Code intelligence
473
- gssh query "..." # Ask about code + runtime
474
-
475
- # Stack splitting
476
- gssh stack # AI-assisted PR splitting
477
- gssh stack sync # Sync after merges
478
- ```
479
-
480
- ---
481
-
482
- ## File Structure (New)
483
-
484
- ```
485
- src/
486
- ├── commands/
487
- │ ├── host.ts # gssh host *
488
- │ ├── run.ts # gssh run
489
- │ ├── events.ts # gssh events
490
- │ └── query.ts # gssh query
491
- ├── core/
492
- │ ├── lima/
493
- │ │ ├── manager.ts # VM lifecycle
494
- │ │ ├── config.ts # Generate Lima YAML
495
- │ │ └── connection.ts # Connect to VM
496
- │ ├── host/
497
- │ │ ├── tunnel.ts # cloudflared integration
498
- │ │ └── dns.ts # Cloudflare API
499
- │ ├── services/
500
- │ │ ├── supervisor.ts # Process manager
501
- │ │ ├── dependency.ts # Dependency resolution
502
- │ │ └── health.ts # Ready checks
503
- │ ├── events/
504
- │ │ ├── collector.ts # Event ingestion
505
- │ │ ├── correlator.ts # eventId chaining
506
- │ │ ├── store/
507
- │ │ │ ├── memory.ts
508
- │ │ │ ├── sqlite.ts
509
- │ │ │ └── duckdb.ts
510
- │ │ └── query.ts # Query interface
511
- │ └── insight/
512
- │ ├── index.ts # Orchestrator
513
- │ ├── pattern-gen.ts # NL → ast-grep
514
- │ ├── scanner.ts # Pattern execution
515
- │ ├── graph.ts # Dependency graphs
516
- │ └── ai-synth.ts # AI synthesis
517
- ├── shared/
518
- │ └── providers/
519
- │ └── LimaMachineProvider.ts
520
- └── lib/
521
- ├── ast-grep/
522
- │ ├── runner.ts # sg CLI wrapper
523
- │ └── patterns.ts # Common patterns
524
- └── events/
525
- └── emitter.ts # SDK for apps
526
- ```
527
-
528
- ---
529
-
530
- ## Platform Support
531
-
532
- | Platform | VM Isolation | Firecracker | Notes |
533
- |----------|--------------|-------------|-------|
534
- | Mac M1 | Lima VM | ❌ | No nested virt |
535
- | Mac M2 | Lima VM | ❌ | No nested virt |
536
- | Mac M3+ (macOS 15+) | Lima VM | ✅ (optional) | Nested virt works |
537
- | Linux | Firecracker | ✅ | Native KVM |
538
- | Cloud | Firecracker | ✅ | Via Flintlock/Nomad |
539
-
540
- ---
541
-
542
- ## Implementation Progress
543
-
544
- | Feature | Status | Notes |
545
- |---------|--------|-------|
546
- | E2E Encrypted Remote Access | **Complete** | X3DH handshake, relay routing |
547
- | Web Terminal Client | **Complete** | xterm.js, React |
548
- | TUI Remote Access | **Complete** | `--relay` flag for TUI |
549
- | Cloudflare Hosting | **Partial** | Auth, subdomains; missing service routing |
550
- | Lima VMs | Not Started | Isolation layer for workspaces |
551
- | Process Runner | Not Started | Depends on Lima |
552
- | Event Collection | Not Started | Depends on Process Runner |
553
- | Code Intelligence | Not Started | ast-grep + AI |
554
- | Stack Splitting | Not Started | AI-assisted PR splitting |
555
-
556
- ### Next Steps
557
-
558
- 1. **Complete Cloudflare Hosting** - Service routing, gateway worker at edge
559
- 2. **Lima VMs** - Workspace isolation on Mac
560
- 3. **Process Runner** - Service management inside VMs
561
-
562
- ---
563
-
564
- *Last updated: 2025-01*