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/README.md CHANGED
@@ -20,7 +20,6 @@ The following tools must be installed and available in your PATH:
20
20
  - [GitHub CLI (`gh`)](https://cli.github.com/) - for listing repositories
21
21
  - [Git](https://git-scm.com/) - for worktree management
22
22
  - [jq](https://stedolan.github.io/jq/) - for JSON processing
23
- - [Bun](https://bun.sh) - runtime for the CLI
24
23
 
25
24
  **GitHub Authentication**: You must authenticate the GitHub CLI before using GitSpace:
26
25
 
@@ -31,7 +30,17 @@ gh auth login
31
30
  ## Installation
32
31
 
33
32
  ```bash
34
- bun install -g https://github.com/inkibra/gitspace.sh
33
+ # npm
34
+ npm install -g gitspace
35
+
36
+ # bun
37
+ bun install -g gitspace
38
+
39
+ # pnpm
40
+ pnpm install -g gitspace
41
+
42
+ # yarn
43
+ yarn global add gitspace
35
44
 
36
45
  # Verify installation
37
46
  gssh --version
@@ -97,6 +106,22 @@ gssh switch
97
106
  gssh switch my-feature
98
107
  ```
99
108
 
109
+ ### Workspace Session Mode (`space`)
110
+
111
+ When GitSpace opens a workspace-scoped terminal session, it injects a `space` shell function (bash/zsh).
112
+
113
+ - Use `space ...` for workspace operations without repeating `--project` and `--workspace`
114
+ - `gssh` commands are restricted in this mode to avoid cross-workspace mistakes
115
+ - `gssh tmux ...` is blocked inside workspace sessions
116
+
117
+ Examples:
118
+
119
+ ```bash
120
+ space context --json
121
+ space review hunks src/app.ts --format json
122
+ space review add-hunk src/app.ts --index 1 --approve --body "Looks good"
123
+ ```
124
+
100
125
  ## Repo Config Bundles
101
126
 
102
127
  Repo config bundles allow repository owners to share onboarding configurations with their team. When someone clones a project that contains a bundle, they'll be guided through setup steps and have scripts automatically installed.
@@ -108,14 +133,15 @@ A bundle is a directory (typically `.gitspace/`) containing:
108
133
  ```
109
134
  .gitspace/
110
135
  ├── bundle.json # Bundle manifest with onboarding steps
111
- ├── pre/ # Scripts to run before setup
112
- │ └── 01-copy-env.sh
113
- ├── setup/ # Scripts to run on first workspace creation
114
- │ └── 01-install-deps.sh
115
- ├── select/ # Scripts to run every time workspace is opened
116
- │ └── 01-status.sh
117
- └── remove/ # Scripts to run before workspace deletion
118
- └── 01-cleanup.sh
136
+ └── scripts/
137
+ ├── pre/ # Deprecated: migrate scripts into ordered setup/
138
+ │ └── 01-copy-env.sh
139
+ ├── setup/ # Scripts for setup runs (when bundle/value state changes)
140
+ │ └── 01-install-deps.sh
141
+ ├── select/ # Scripts to run on each new terminal attach
142
+ └── 01-status.sh
143
+ └── remove/ # Scripts to run before workspace deletion
144
+ └── 01-cleanup.sh
119
145
  ```
120
146
 
121
147
  ### Bundle Manifest (`bundle.json`)
@@ -170,27 +196,27 @@ A bundle is a directory (typically `.gitspace/`) containing:
170
196
 
171
197
  ### Using Bundle Values in Scripts
172
198
 
173
- Bundle values are passed to scripts as environment variables:
199
+ Bundle values are passed to scripts as environment variables using the configured bundle keys:
174
200
 
175
- - `SPACE_VALUE_<KEY>` - Regular values from input steps
176
- - `SPACE_SECRET_<KEY>` - Secret values from secret steps (fetched from OS keychain)
201
+ - `<KEY>` - Regular or secret value using the exact `configKey` from `bundle.json`
202
+ - `<NORMALIZED_KEY>` - Uppercase snake-case alias (for example, `teamName` -> `TEAM_NAME`)
177
203
 
178
204
  **Example script:**
179
205
 
180
206
  ```bash
181
207
  #!/bin/bash
182
- # .gitspace/select/01-status.sh
208
+ # .gitspace/scripts/select/01-status.sh
183
209
 
184
210
  WORKSPACE_NAME=$1
185
211
  REPOSITORY=$2
186
212
 
187
213
  # Access bundle values
188
- if [ -n "$SPACE_VALUE_TEAMNAME" ]; then
189
- echo "Welcome, $SPACE_VALUE_TEAMNAME team!"
214
+ if [ -n "$TEAM_NAME" ]; then
215
+ echo "Welcome, $TEAM_NAME team!"
190
216
  fi
191
217
 
192
218
  # Access secrets (stored securely in OS keychain)
193
- if [ -n "$SPACE_SECRET_APIKEY" ]; then
219
+ if [ -n "$API_KEY" ]; then
194
220
  echo "API Key configured"
195
221
  fi
196
222
  ```
@@ -199,7 +225,7 @@ fi
199
225
 
200
226
  Bundles can be loaded from:
201
227
 
202
- 1. **In-repo** (automatic): `.gitspace/`, `.gitspace-config/`, `.spaces-config/`, or `.spaces/` in the cloned repository
228
+ 1. **In-repo** (automatic): `.gitspace/` directory in the cloned repository
203
229
  2. **Local path**: `gssh add project --bundle-path /path/to/bundle/`
204
230
  3. **Remote URL**: `gssh add project --bundle-url https://example.com/bundle.zip`
205
231
 
@@ -347,14 +373,16 @@ Located at `~/gitspace/<project-name>/.config.json`:
347
373
 
348
374
  ### Custom Scripts
349
375
 
350
- GitSpace uses **convention over configuration** for custom scripts:
376
+ GitSpace uses **convention over configuration** for custom scripts. Scripts live
377
+ inside each workspace so they can vary by branch:
351
378
 
352
379
  ```
353
- ~/gitspace/<project-name>/scripts/
354
- ├── pre/ # Run before setup (terminal)
355
- ├── setup/ # Run once on workspace creation
356
- ├── select/ # Run every time workspace is opened
357
- └── remove/ # Run before workspace deletion
380
+ ~/gitspace/<project-name>/workspaces/<workspace-name>/.gitspace/
381
+ └── scripts/
382
+ ├── pre/ # Deprecated: run before setup (migrate to setup/)
383
+ ├── setup/ # Run when setup state requires refresh
384
+ ├── select/ # Run on each new terminal attach
385
+ └── remove/ # Run before workspace deletion
358
386
  ```
359
387
 
360
388
  #### Script Execution Rules
@@ -363,15 +391,15 @@ GitSpace uses **convention over configuration** for custom scripts:
363
391
  2. Scripts run **alphabetically** (use `01-`, `02-` prefixes)
364
392
  3. **Working directory**: The workspace directory
365
393
  4. **Arguments**: `$1` = workspace name, `$2` = repository name
366
- 5. **Environment**: Bundle values available as `SPACE_VALUE_*` and `SPACE_SECRET_*`
394
+ 5. **Environment**: Bundle values available by key name (for example `REGION`, `PULUMI_ACCESS_TOKEN`)
367
395
 
368
396
  #### Script Phases
369
397
 
370
398
  | Phase | When | Use Case |
371
399
  |-------|------|----------|
372
- | `pre/` | Once, before setup | Copy .env files, create directories |
373
- | `setup/` | Once, on workspace creation | Install dependencies, initial build |
374
- | `select/` | Every workspace open | Git fetch, status checks |
400
+ | `pre/` | Deprecated | Move scripts into ordered `setup/` files |
401
+ | `setup/` | When setup state changes | Install dependencies, initial build |
402
+ | `select/` | Every new terminal attach | Git fetch, status checks |
375
403
  | `remove/` | Before deletion | Cleanup, notifications |
376
404
 
377
405
  ### Environment Variables
@@ -381,8 +409,8 @@ GitSpace uses **convention over configuration** for custom scripts:
381
409
  export SPACES_CURRENT_PROJECT="my-app"
382
410
 
383
411
  # Available in scripts (from bundle onboarding):
384
- # SPACE_VALUE_<KEY> - Regular values
385
- # SPACE_SECRET_<KEY> - Secret values (from OS keychain)
412
+ # <KEY> - Value by exact bundle config key name
413
+ # <NORMALIZED_KEY> - Uppercase snake-case alias (e.g. teamName -> TEAM_NAME)
386
414
  ```
387
415
 
388
416
  ## Directory Structure
@@ -396,13 +424,15 @@ export SPACES_CURRENT_PROJECT="my-app"
396
424
  │ ├── workspaces/ # Git worktrees
397
425
  │ │ └── <workspace-name>/
398
426
  │ │ ├── gitspace.lock # Setup completion marker
399
- │ │ └── .prompt/ # Linear issue details (if applicable)
400
- │ │ └── issue.md
401
- │ └── scripts/ # Custom scripts
402
- ├── pre/
403
- ├── setup/
404
- ├── select/
405
- └── remove/
427
+ │ │ ├── .prompt/ # Linear issue details (if applicable)
428
+ │ │└── issue.md
429
+ └── .gitspace/
430
+ ├── bundle.json
431
+ │ └── scripts/ # Custom scripts (per worktree)
432
+ ├── pre/
433
+ │ ├── setup/
434
+ │ │ ├── select/
435
+ │ │ └── remove/
406
436
  ```
407
437
 
408
438
  ## Remote Access
@@ -578,7 +608,7 @@ Error: GitHub CLI is not authenticated
578
608
 
579
609
  ### Bundle secrets not available
580
610
 
581
- If `SPACE_SECRET_*` variables are empty, ensure:
611
+ If expected bundle key environment variables are empty, ensure:
582
612
  1. You completed the onboarding secret steps
583
613
  2. Your OS keychain service is running (libsecret on Linux, Keychain on macOS)
584
614
 
package/package.json CHANGED
@@ -1,26 +1,31 @@
1
1
  {
2
2
  "name": "gitspace",
3
- "version": "0.2.0-rc.2",
3
+ "version": "0.2.0-rc.21",
4
4
  "description": "CLI for managing GitHub workspaces with git worktrees and secure remote terminal access",
5
5
  "bin": {
6
6
  "gssh": "./bin/gssh"
7
7
  },
8
+ "files": [
9
+ "bin",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
8
13
  "type": "module",
9
14
  "scripts": {
10
15
  "dev": "bun src/index.ts",
11
16
  "typecheck": "tsc --noEmit",
12
17
  "lint": "eslint src/",
13
- "build:web": "cd src/web && bun install && bun run build",
18
+ "build:web": "cd web && bun install && bun run build",
14
19
  "build": "bun scripts/build.ts",
15
20
  "build:all": "bun scripts/build.ts --all",
16
21
  "build:npm": "bun scripts/build.ts --npm",
17
22
  "relay": "bun src/relay/index.ts"
18
23
  },
19
24
  "optionalDependencies": {
20
- "@gitspace/darwin-arm64": "0.2.0-rc.2",
21
- "@gitspace/darwin-x64": "0.2.0-rc.2",
22
- "@gitspace/linux-x64": "0.2.0-rc.2",
23
- "@gitspace/linux-arm64": "0.2.0-rc.2"
25
+ "@gitspace/darwin-arm64": "0.2.0-rc.21",
26
+ "@gitspace/darwin-x64": "0.2.0-rc.21",
27
+ "@gitspace/linux-x64": "0.2.0-rc.21",
28
+ "@gitspace/linux-arm64": "0.2.0-rc.21"
24
29
  },
25
30
  "keywords": [
26
31
  "cli",
@@ -35,40 +40,46 @@
35
40
  "homepage": "https://gitspace.sh",
36
41
  "repository": {
37
42
  "type": "git",
38
- "url": "https://github.com/inkibra/gitspace.sh.git"
43
+ "url": "https://github.com/inKibra/gitspace.sh.git"
39
44
  },
40
45
  "author": "inKibra, Inc.",
41
46
  "license": "SEE LICENSE IN LICENSE",
42
47
  "dependencies": {
43
- "@inquirer/prompts": "^7.2.0",
48
+ "@inquirer/prompts": "^7.10.1",
44
49
  "@linear/sdk": "^29.0.0",
45
50
  "@noble/curves": "^2.0.1",
46
51
  "@noble/hashes": "^2.0.1",
47
- "@opentui/core": "^0.1.60",
48
- "@opentui/react": "^0.1.60",
52
+ "@opentui-ui/toast": "^0.0.5",
53
+ "@opentui/core": "^0.1.77",
54
+ "@opentui/react": "^0.1.77",
49
55
  "@types/ws": "^8.18.1",
50
56
  "@xterm/addon-serialize": "^0.13.0",
51
57
  "@xterm/headless": "^5.5.0",
52
- "ansi-escapes": "^7.2.0",
53
- "chalk": "^5.3.0",
54
- "commander": "^12.0.0",
58
+ "ansi-escapes": "^7.3.0",
59
+ "chalk": "^5.6.2",
60
+ "clipboardy": "^5.2.1",
61
+ "commander": "^12.1.0",
55
62
  "conf": "^12.0.0",
56
- "ghostty-opentui": "^1.3.11",
63
+ "ghostty-opentui": "^1.3.13",
57
64
  "open": "^11.0.0",
58
- "ora": "^8.0.1",
59
- "react": "^19.2.3",
60
- "simple-git": "^3.23.0",
61
- "ws": "^8.18.3"
65
+ "ora": "^8.2.0",
66
+ "react": "^19.2.4",
67
+ "react-dom": "^19.2.4",
68
+ "simple-git": "^3.30.0",
69
+ "ws": "^8.19.0"
62
70
  },
63
71
  "devDependencies": {
64
- "@types/bun": "^1.3.4",
65
- "@types/node": "^20.11.20",
66
- "@types/react": "^19.2.7",
72
+ "@testing-library/react": "^16.3.2",
73
+ "@types/bun": "^1.3.8",
74
+ "@types/node": "^20.19.32",
75
+ "@types/react": "^19.2.13",
67
76
  "@types/react-dom": "^19.2.3",
68
- "eslint": "^8.57.0",
69
- "typescript": "^5.3.3"
77
+ "eslint": "^8.57.1",
78
+ "happy-dom": "^20.5.0",
79
+ "typescript": "^5.9.3"
70
80
  },
71
81
  "engines": {
72
- "bun": ">=1.3.5"
73
- }
82
+ "bun": ">=1.3.8"
83
+ },
84
+ "packageManager": "pnpm@10.12.1+sha512.f0dda8580f0ee9481c5c79a1d927b9164f2c478e90992ad268bbb2465a736984391d6333d2c327913578b2804af33474ca554ba29c04a8b13060a717675ae3ac"
74
85
  }
@@ -1,21 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(bun test:*)",
5
- "Bash(xargs ls:*)",
6
- "Bash(bun pm:*)",
7
- "Bash(node -e:*)",
8
- "Bash(bun run typecheck:*)",
9
- "Bash(bun -e:*)",
10
- "Bash(bun:*)",
11
- "Bash(xargs:*)",
12
- "Bash(timeout 2 bash -c 'echo \"\"invalid-base64\"\" | bun src/index.ts access add \"\"not-valid-base64-data\"\" 2>&1')",
13
- "Bash(wc:*)",
14
- "WebFetch(domain:ghostty.org)",
15
- "Bash(xxd:*)",
16
- "WebFetch(domain:ast-grep.github.io)",
17
- "WebFetch(domain:developers.cloudflare.com)",
18
- "WebFetch(domain:gitspace.sh)"
19
- ]
20
- }
21
- }
@@ -1,50 +0,0 @@
1
- {
2
- "version": "1.0",
3
- "name": "gitspace-dev",
4
- "description": "Development setup for the GitSpace CLI project",
5
- "onboarding": [
6
- {
7
- "id": "welcome",
8
- "type": "info",
9
- "title": "Welcome to GitSpace CLI Development",
10
- "description": "This onboarding will help you set up your development environment.\n\nYou'll need:\n- Bun runtime installed\n- GitHub CLI (gh) authenticated\n\nLet's verify your setup!"
11
- },
12
- {
13
- "id": "bun",
14
- "type": "confirm",
15
- "title": "Bun Runtime",
16
- "description": "Bun is required to run and build the CLI.",
17
- "checkCommand": "bun",
18
- "installUrl": "https://bun.sh"
19
- },
20
- {
21
- "id": "gh",
22
- "type": "confirm",
23
- "title": "GitHub CLI",
24
- "description": "The GitHub CLI is used for repository operations. Make sure you're logged in with 'gh auth login'.",
25
- "checkCommand": "gh",
26
- "installUrl": "https://cli.github.com"
27
- },
28
- {
29
- "id": "dev-name",
30
- "type": "input",
31
- "title": "Your Name",
32
- "description": "Enter your name for the development environment (used in example scripts).",
33
- "configKey": "developerName",
34
- "defaultValue": "Developer"
35
- },
36
- {
37
- "id": "api-token",
38
- "type": "secret",
39
- "title": "Example API Token",
40
- "description": "Enter a sample API token. This demonstrates how secrets are stored securely in your OS keychain.\n\nYou can enter any value - this is just for demonstration.",
41
- "configKey": "exampleApiToken"
42
- },
43
- {
44
- "id": "ready",
45
- "type": "info",
46
- "title": "You're All Set!",
47
- "description": "Your development environment is configured.\n\nNext steps:\n1. Run 'bun install' to install dependencies\n2. Run 'bun run dev' to start the CLI in dev mode\n3. Run 'bun run typecheck' to check types\n\nHappy coding!"
48
- }
49
- ]
50
- }
@@ -1,40 +0,0 @@
1
- #!/bin/bash
2
- # Show workspace status when switching
3
- #
4
- # This runs every time you switch to an existing workspace.
5
- #
6
- # Bundle values are available as environment variables:
7
- # SPACE_VALUE_<KEY> - Regular values from input steps
8
- # SPACE_SECRET_<KEY> - Secret values from secret steps
9
-
10
- WORKSPACE_NAME=$1
11
- REPOSITORY=$2
12
-
13
- echo ""
14
- echo "=== Workspace: $WORKSPACE_NAME ==="
15
- echo ""
16
-
17
- # Show bundle values (proof of concept)
18
- if [ -n "$SPACE_VALUE_DEVELOPERNAME" ]; then
19
- echo "Welcome back, $SPACE_VALUE_DEVELOPERNAME!"
20
- fi
21
-
22
- # Show that we have access to the secret (masked)
23
- if [ -n "$SPACE_SECRET_EXAMPLEAPITOKEN" ]; then
24
- # Only show first 4 characters to prove we have access
25
- TOKEN_PREVIEW="${SPACE_SECRET_EXAMPLEAPITOKEN:0:4}..."
26
- echo "API Token available: $TOKEN_PREVIEW (stored in OS keychain)"
27
- fi
28
-
29
- echo ""
30
-
31
- # Show git status summary
32
- echo "Git Status:"
33
- git status --short
34
-
35
- # Show branch info
36
- echo ""
37
- echo "Branch:"
38
- git branch --show-current
39
-
40
- echo ""
@@ -1,12 +0,0 @@
1
- #!/bin/bash
2
- # Install dependencies for gitspace development
3
- #
4
- # This runs once when the workspace is first created.
5
-
6
- WORKSPACE_NAME=$1
7
- REPOSITORY=$2
8
-
9
- echo "Installing dependencies for $WORKSPACE_NAME..."
10
- bun install
11
-
12
- echo "Dependencies installed!"
@@ -1,16 +0,0 @@
1
- #!/bin/bash
2
- # Run initial typecheck to verify setup
3
- #
4
- # This runs once when the workspace is first created.
5
-
6
- WORKSPACE_NAME=$1
7
- REPOSITORY=$2
8
-
9
- echo "Running typecheck..."
10
- bun run typecheck
11
-
12
- if [ $? -eq 0 ]; then
13
- echo "Typecheck passed!"
14
- else
15
- echo "Typecheck had issues - you may need to fix some things."
16
- fi