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.
- package/package.json +11 -6
- package/.claude/settings.local.json +0 -10
- package/.gitspace/bundle.json +0 -50
- package/.gitspace/events.json +0 -11
- package/.gitspace/processes.json +0 -23
- package/.gitspace/scripts/select/01-status.sh +0 -39
- package/.gitspace/scripts/setup/01-install-deps.sh +0 -12
- package/.gitspace/scripts/setup/02-typecheck.sh +0 -16
- package/AGENTS.md +0 -469
- package/CLAUDE.md +0 -1
- package/bun.lock +0 -794
- package/docs/CONNECTION.md +0 -623
- package/docs/GATEWAY-WORKER.md +0 -319
- package/docs/GETTING-STARTED.md +0 -448
- package/docs/GITSPACE-PLATFORM.md +0 -1819
- package/docs/INFRASTRUCTURE.md +0 -1347
- package/docs/PROTOCOL.md +0 -619
- package/docs/QUICKSTART.md +0 -183
- package/docs/RELAY.md +0 -327
- package/docs/REMOTE-DESIGN.md +0 -554
- package/docs/ROADMAP.md +0 -564
- package/docs/SITE_DOCS_FIGMA_MAKE.md +0 -1176
- package/docs/STACK-DESIGN.md +0 -588
- package/docs/UNIFIED_ARCHITECTURE.md +0 -138
- package/experiments/pty-benchmark.ts +0 -148
- package/experiments/pty-latency.ts +0 -100
- package/experiments/router/client.ts +0 -199
- package/experiments/router/protocol.ts +0 -74
- package/experiments/router/router.ts +0 -217
- package/experiments/router/session.ts +0 -180
- package/experiments/router/test.ts +0 -133
- package/experiments/socket-bandwidth.ts +0 -77
- package/homebrew/gitspace.rb +0 -45
- package/landing-page/ATTRIBUTIONS.md +0 -3
- package/landing-page/README.md +0 -11
- package/landing-page/bun.lock +0 -801
- package/landing-page/guidelines/Guidelines.md +0 -61
- package/landing-page/index.html +0 -37
- package/landing-page/package.json +0 -90
- package/landing-page/postcss.config.mjs +0 -15
- package/landing-page/public/_redirects +0 -1
- package/landing-page/public/favicon.png +0 -0
- package/landing-page/src/app/App.tsx +0 -53
- package/landing-page/src/app/components/figma/ImageWithFallback.tsx +0 -27
- package/landing-page/src/app/components/ui/accordion.tsx +0 -66
- package/landing-page/src/app/components/ui/alert-dialog.tsx +0 -157
- package/landing-page/src/app/components/ui/alert.tsx +0 -66
- package/landing-page/src/app/components/ui/aspect-ratio.tsx +0 -11
- package/landing-page/src/app/components/ui/avatar.tsx +0 -53
- package/landing-page/src/app/components/ui/badge.tsx +0 -46
- package/landing-page/src/app/components/ui/breadcrumb.tsx +0 -109
- package/landing-page/src/app/components/ui/button.tsx +0 -57
- package/landing-page/src/app/components/ui/calendar.tsx +0 -75
- package/landing-page/src/app/components/ui/card.tsx +0 -92
- package/landing-page/src/app/components/ui/carousel.tsx +0 -241
- package/landing-page/src/app/components/ui/chart.tsx +0 -353
- package/landing-page/src/app/components/ui/checkbox.tsx +0 -32
- package/landing-page/src/app/components/ui/collapsible.tsx +0 -33
- package/landing-page/src/app/components/ui/command.tsx +0 -177
- package/landing-page/src/app/components/ui/context-menu.tsx +0 -252
- package/landing-page/src/app/components/ui/dialog.tsx +0 -135
- package/landing-page/src/app/components/ui/drawer.tsx +0 -132
- package/landing-page/src/app/components/ui/dropdown-menu.tsx +0 -257
- package/landing-page/src/app/components/ui/form.tsx +0 -168
- package/landing-page/src/app/components/ui/hover-card.tsx +0 -44
- package/landing-page/src/app/components/ui/input-otp.tsx +0 -77
- package/landing-page/src/app/components/ui/input.tsx +0 -21
- package/landing-page/src/app/components/ui/label.tsx +0 -24
- package/landing-page/src/app/components/ui/menubar.tsx +0 -276
- package/landing-page/src/app/components/ui/navigation-menu.tsx +0 -168
- package/landing-page/src/app/components/ui/pagination.tsx +0 -127
- package/landing-page/src/app/components/ui/popover.tsx +0 -48
- package/landing-page/src/app/components/ui/progress.tsx +0 -31
- package/landing-page/src/app/components/ui/radio-group.tsx +0 -45
- package/landing-page/src/app/components/ui/resizable.tsx +0 -56
- package/landing-page/src/app/components/ui/scroll-area.tsx +0 -58
- package/landing-page/src/app/components/ui/select.tsx +0 -189
- package/landing-page/src/app/components/ui/separator.tsx +0 -28
- package/landing-page/src/app/components/ui/sheet.tsx +0 -139
- package/landing-page/src/app/components/ui/sidebar.tsx +0 -726
- package/landing-page/src/app/components/ui/skeleton.tsx +0 -13
- package/landing-page/src/app/components/ui/slider.tsx +0 -63
- package/landing-page/src/app/components/ui/sonner.tsx +0 -25
- package/landing-page/src/app/components/ui/switch.tsx +0 -31
- package/landing-page/src/app/components/ui/table.tsx +0 -116
- package/landing-page/src/app/components/ui/tabs.tsx +0 -66
- package/landing-page/src/app/components/ui/textarea.tsx +0 -18
- package/landing-page/src/app/components/ui/toggle-group.tsx +0 -73
- package/landing-page/src/app/components/ui/toggle.tsx +0 -47
- package/landing-page/src/app/components/ui/tooltip.tsx +0 -61
- package/landing-page/src/app/components/ui/use-mobile.ts +0 -21
- package/landing-page/src/app/components/ui/utils.ts +0 -6
- package/landing-page/src/components/docs/DocsContent.tsx +0 -801
- package/landing-page/src/components/docs/DocsSidebar.tsx +0 -90
- package/landing-page/src/components/landing/CTA.tsx +0 -59
- package/landing-page/src/components/landing/Comparison.tsx +0 -84
- package/landing-page/src/components/landing/FaultyTerminal.tsx +0 -424
- package/landing-page/src/components/landing/Features.tsx +0 -201
- package/landing-page/src/components/landing/Hero.tsx +0 -142
- package/landing-page/src/components/landing/Pricing.tsx +0 -140
- package/landing-page/src/components/landing/Roadmap.tsx +0 -86
- package/landing-page/src/components/landing/Security.tsx +0 -81
- package/landing-page/src/components/landing/TerminalWindow.tsx +0 -27
- package/landing-page/src/components/landing/UseCases.tsx +0 -55
- package/landing-page/src/components/landing/Workflow.tsx +0 -101
- package/landing-page/src/components/layout/DashboardNavbar.tsx +0 -37
- package/landing-page/src/components/layout/Footer.tsx +0 -55
- package/landing-page/src/components/layout/LandingNavbar.tsx +0 -82
- package/landing-page/src/components/ui/badge.tsx +0 -39
- package/landing-page/src/components/ui/breadcrumb.tsx +0 -115
- package/landing-page/src/components/ui/button.tsx +0 -57
- package/landing-page/src/components/ui/card.tsx +0 -79
- package/landing-page/src/components/ui/mock-terminal.tsx +0 -68
- package/landing-page/src/components/ui/separator.tsx +0 -28
- package/landing-page/src/lib/utils.ts +0 -6
- package/landing-page/src/main.tsx +0 -10
- package/landing-page/src/pages/Dashboard.tsx +0 -133
- package/landing-page/src/pages/DocsPage.tsx +0 -79
- package/landing-page/src/pages/LandingPage.tsx +0 -31
- package/landing-page/src/pages/TerminalView.tsx +0 -106
- package/landing-page/src/styles/fonts.css +0 -0
- package/landing-page/src/styles/index.css +0 -3
- package/landing-page/src/styles/tailwind.css +0 -4
- package/landing-page/src/styles/theme.css +0 -181
- package/landing-page/vite.config.ts +0 -19
- package/scripts/GHOSTTY_TAB_BUG.md +0 -106
- package/scripts/build.ts +0 -298
- package/scripts/migrate-secrets.ts +0 -77
- package/scripts/release.ts +0 -140
- package/scripts/sample-events.ts +0 -263
- package/scripts/test-tabs-minimal.ts +0 -68
- package/scripts/test-tabs-workaround.ts +0 -95
- package/scripts/test-tabs.ts +0 -171
- package/src/__tests__/test-utils.ts +0 -298
- package/src/app/input/__tests__/sessionCommands.test.ts +0 -40
- package/src/app/input/sessionCommands.ts +0 -94
- package/src/app/session/__tests__/useAttachController.test.ts +0 -229
- package/src/app/session/createSessionBackend.bun.ts +0 -76
- package/src/app/session/createSessionBackend.web.ts +0 -104
- package/src/app/session/types.ts +0 -16
- package/src/app/session/useAttachController.ts +0 -220
- package/src/app/session/useProcessActions.ts +0 -201
- package/src/app/session/useSessionClient.ts +0 -35
- package/src/app/session/useWorkspaceDeleteFlow.ts +0 -170
- package/src/app.tui.tsx +0 -2929
- package/src/app.web.tsx +0 -1454
- package/src/commands/__tests__/connect-key.test.ts +0 -10
- package/src/commands/__tests__/events.test.ts +0 -201
- package/src/commands/__tests__/notifications.test.ts +0 -349
- package/src/commands/__tests__/process.test.ts +0 -251
- package/src/commands/__tests__/serve-messages.test.ts +0 -190
- package/src/commands/__tests__/serve-process-hosting.test.ts +0 -63
- package/src/commands/access.ts +0 -298
- package/src/commands/add.ts +0 -455
- package/src/commands/auth.ts +0 -369
- package/src/commands/bundle.ts +0 -232
- package/src/commands/config.ts +0 -242
- package/src/commands/connect-key.ts +0 -1
- package/src/commands/connect.ts +0 -576
- package/src/commands/directory.ts +0 -16
- package/src/commands/events.ts +0 -157
- package/src/commands/host.ts +0 -566
- package/src/commands/identity.ts +0 -184
- package/src/commands/linear.ts +0 -717
- package/src/commands/list.ts +0 -181
- package/src/commands/migrate.ts +0 -52
- package/src/commands/notifications.ts +0 -351
- package/src/commands/process.ts +0 -104
- package/src/commands/relay.ts +0 -315
- package/src/commands/remove.ts +0 -279
- package/src/commands/review.ts +0 -787
- package/src/commands/serve.ts +0 -1946
- package/src/commands/share.ts +0 -451
- package/src/commands/status.ts +0 -125
- package/src/commands/switch.ts +0 -361
- package/src/commands/tmux.ts +0 -317
- package/src/components/DPad.web.tsx +0 -343
- package/src/components/DiffViewer.web.tsx +0 -1192
- package/src/components/Events.tsx +0 -137
- package/src/components/Events.tui.tsx +0 -129
- package/src/components/Events.web.tsx +0 -386
- package/src/components/FloatingControls.web.tsx +0 -112
- package/src/components/FloatingJogWheel.web.tsx +0 -240
- package/src/components/Flow.tsx +0 -458
- package/src/components/Flow.tui.tsx +0 -343
- package/src/components/Flow.web.tsx +0 -442
- package/src/components/Inbox.tsx +0 -448
- package/src/components/Inbox.tui.tsx +0 -262
- package/src/components/Inbox.web.tsx +0 -329
- package/src/components/MachineList.tsx +0 -187
- package/src/components/MachineList.tui.tsx +0 -161
- package/src/components/MachineList.web.tsx +0 -210
- package/src/components/NumPad.web.tsx +0 -270
- package/src/components/ProjectList.tsx +0 -175
- package/src/components/ProjectList.tui.tsx +0 -109
- package/src/components/ProjectList.web.tsx +0 -143
- package/src/components/ProjectOnboardingStep.ts +0 -23
- package/src/components/ProjectOnboardingStep.tui.tsx +0 -88
- package/src/components/ProjectOnboardingStep.web.tsx +0 -59
- package/src/components/RemoteMachineScreen.tui.tsx +0 -690
- package/src/components/ScriptTerminal.tui.tsx +0 -160
- package/src/components/ScriptTerminal.web.tsx +0 -89
- package/src/components/SessionTerminal.tui.tsx +0 -406
- package/src/components/SessionTerminal.web.tsx +0 -467
- package/src/components/SpacesBrowser.tsx +0 -540
- package/src/components/SpacesBrowser.tui.tsx +0 -258
- package/src/components/SpacesBrowser.web.tsx +0 -332
- package/src/components/TerminalControls.web.tsx +0 -464
- package/src/components/ThreadPanel.web.tsx +0 -798
- package/src/components/__tests__/SpacesBrowser.test.ts +0 -541
- package/src/components/__tests__/SpacesBrowser.tui.test.tsx +0 -249
- package/src/components/__tests__/script-terminal-buffer.tui.test.ts +0 -72
- package/src/components/index.ts +0 -105
- package/src/components/review-decision-colors.ts +0 -11
- package/src/components/script-terminal-buffer.tui.ts +0 -37
- package/src/components/session-terminal-page-navigation.ts +0 -48
- package/src/components/terminal-bracketed-paste.tui.test.ts +0 -43
- package/src/components/terminal-bracketed-paste.tui.ts +0 -46
- package/src/core/__tests__/access.test.ts +0 -240
- package/src/core/__tests__/bundle-refresh.test.ts +0 -567
- package/src/core/__tests__/bundle.test.ts +0 -209
- package/src/core/__tests__/github-review.test.ts +0 -781
- package/src/core/__tests__/project-lifecycle.test.ts +0 -137
- package/src/core/__tests__/workspace-lifecycle.test.ts +0 -159
- package/src/core/__tests__/workspace.test.ts +0 -149
- package/src/core/access.ts +0 -277
- package/src/core/bundle-refresh.ts +0 -1064
- package/src/core/bundle.ts +0 -326
- package/src/core/config.ts +0 -405
- package/src/core/git.ts +0 -768
- package/src/core/github-review.ts +0 -761
- package/src/core/github.ts +0 -151
- package/src/core/identity.ts +0 -631
- package/src/core/linear.ts +0 -403
- package/src/core/preferences-service.ts +0 -17
- package/src/core/project-catalog.ts +0 -52
- package/src/core/project-lifecycle.ts +0 -163
- package/src/core/review-executor.ts +0 -316
- package/src/core/review.ts +0 -407
- package/src/core/secret-runtime.ts +0 -167
- package/src/core/shell.ts +0 -117
- package/src/core/trusted-relays.ts +0 -315
- package/src/core/workspace-lifecycle.ts +0 -216
- package/src/core/workspace.ts +0 -363
- package/src/hooks/__tests__/useLocalSession.tui.test.ts +0 -557
- package/src/hooks/index.ts +0 -8
- package/src/hooks/index.tui.ts +0 -32
- package/src/hooks/useDaemonStatus.tui.ts +0 -174
- package/src/hooks/useLocalSession.tui.ts +0 -395
- package/src/hooks/useRelayConnection.web.ts +0 -54
- package/src/hooks/useRemoteMachines.tui.ts +0 -166
- package/src/hooks/useRemoteTerminal.tui.ts +0 -22
- package/src/hooks/useReview.web.ts +0 -248
- package/src/hooks/useTerminal.web.ts +0 -36
- package/src/hooks/useUserActivity.ts +0 -61
- package/src/hooks/useVisualViewport.web.ts +0 -104
- package/src/index.ts +0 -1376
- package/src/lib/events/__tests__/collector-filter.test.ts +0 -105
- package/src/lib/events/__tests__/store-query.test.ts +0 -103
- package/src/lib/events/collector.ts +0 -494
- package/src/lib/events/filters.ts +0 -26
- package/src/lib/events/index.ts +0 -11
- package/src/lib/events/indexer.ts +0 -14
- package/src/lib/events/paths.ts +0 -69
- package/src/lib/events/reader.ts +0 -212
- package/src/lib/events/store.ts +0 -141
- package/src/lib/invite.web.ts +0 -58
- package/src/lib/preferences-service.web.ts +0 -41
- package/src/lib/processes/__tests__/config.test.ts +0 -83
- package/src/lib/processes/__tests__/names.test.ts +0 -125
- package/src/lib/processes/__tests__/schema.test.ts +0 -208
- package/src/lib/processes/__tests__/watchdog.test.ts +0 -210
- package/src/lib/processes/autostart.ts +0 -16
- package/src/lib/processes/config.ts +0 -187
- package/src/lib/processes/control.ts +0 -53
- package/src/lib/processes/editor.ts +0 -32
- package/src/lib/processes/events-config.ts +0 -37
- package/src/lib/processes/index.ts +0 -14
- package/src/lib/processes/instances.ts +0 -20
- package/src/lib/processes/manager.ts +0 -131
- package/src/lib/processes/names.ts +0 -71
- package/src/lib/processes/registry.ts +0 -26
- package/src/lib/processes/runner.ts +0 -211
- package/src/lib/processes/scheduler.ts +0 -17
- package/src/lib/processes/schema.ts +0 -74
- package/src/lib/processes/session-list.ts +0 -15
- package/src/lib/processes/state.ts +0 -82
- package/src/lib/processes/watchdog.test.ts +0 -79
- package/src/lib/processes/watchdog.ts +0 -106
- package/src/lib/remote-session/__tests__/protocol.test.ts +0 -291
- package/src/lib/remote-session/index.ts +0 -7
- package/src/lib/remote-session/protocol.ts +0 -443
- package/src/lib/remote-session/session-handler.ts +0 -1298
- package/src/lib/remote-session/workspace-scanner.ts +0 -161
- package/src/lib/sonner.web.ts +0 -1
- package/src/lib/storage/identity-store.web.ts +0 -94
- package/src/lib/tmux-lite/README.md +0 -81
- package/src/lib/tmux-lite/cli.ts +0 -855
- package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +0 -349
- package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +0 -291
- package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +0 -142
- package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +0 -339
- package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +0 -477
- package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +0 -499
- package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +0 -371
- package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +0 -573
- package/src/lib/tmux-lite/crypto/access-control.test.ts +0 -512
- package/src/lib/tmux-lite/crypto/access-control.ts +0 -320
- package/src/lib/tmux-lite/crypto/frames.test.ts +0 -262
- package/src/lib/tmux-lite/crypto/frames.ts +0 -141
- package/src/lib/tmux-lite/crypto/handshake.ts +0 -894
- package/src/lib/tmux-lite/crypto/identity.test.ts +0 -220
- package/src/lib/tmux-lite/crypto/identity.ts +0 -286
- package/src/lib/tmux-lite/crypto/index.ts +0 -51
- package/src/lib/tmux-lite/crypto/invites.test.ts +0 -381
- package/src/lib/tmux-lite/crypto/invites.ts +0 -215
- package/src/lib/tmux-lite/crypto/keyexchange.ts +0 -435
- package/src/lib/tmux-lite/crypto/keys.test.ts +0 -58
- package/src/lib/tmux-lite/crypto/keys.ts +0 -47
- package/src/lib/tmux-lite/crypto/secretbox.test.ts +0 -169
- package/src/lib/tmux-lite/crypto/secretbox.ts +0 -124
- package/src/lib/tmux-lite/handshake-handler.ts +0 -451
- package/src/lib/tmux-lite/process-run.integration.test.ts +0 -266
- package/src/lib/tmux-lite/protocol.test.ts +0 -307
- package/src/lib/tmux-lite/protocol.ts +0 -291
- package/src/lib/tmux-lite/relay-client.ts +0 -506
- package/src/lib/tmux-lite/server-lifecycle.test.ts +0 -212
- package/src/lib/tmux-lite/server.ts +0 -1412
- package/src/lib/tmux-lite/shell-integration.sh +0 -37
- package/src/lib/tmux-lite/terminal-queries.test.ts +0 -54
- package/src/lib/tmux-lite/terminal-queries.ts +0 -49
- package/src/notifications/__tests__/useNotifications.test.ts +0 -739
- package/src/notifications/index.ts +0 -32
- package/src/notifications/policy.test.ts +0 -424
- package/src/notifications/policy.ts +0 -139
- package/src/notifications/types.ts +0 -82
- package/src/notifications/useNotifications.ts +0 -350
- package/src/pages/ReviewPage.web.tsx +0 -511
- package/src/preferences/index.ts +0 -1
- package/src/preferences/types.ts +0 -9
- package/src/relay/__tests__/e2e-flow.test.ts +0 -1284
- package/src/relay/__tests__/helpers/auth.ts +0 -354
- package/src/relay/__tests__/helpers/ports.ts +0 -51
- package/src/relay/__tests__/protocol-validation.test.ts +0 -265
- package/src/relay/authorization.ts +0 -303
- package/src/relay/embedded-assets.generated.d.ts +0 -15
- package/src/relay/identity.ts +0 -352
- package/src/relay/index.ts +0 -57
- package/src/relay/pipes.test.ts +0 -427
- package/src/relay/pipes.ts +0 -195
- package/src/relay/protocol.ts +0 -804
- package/src/relay/registries.test.ts +0 -437
- package/src/relay/registries.ts +0 -593
- package/src/relay/server.test.ts +0 -1323
- package/src/relay/server.ts +0 -1128
- package/src/relay/signing.ts +0 -238
- package/src/relay/types.ts +0 -69
- package/src/relay-client/__tests__/machine-directory-client.test.ts +0 -152
- package/src/relay-client/__tests__/useMachineDirectory.test.ts +0 -172
- package/src/relay-client/adapters/browser.ts +0 -27
- package/src/relay-client/adapters/node.ts +0 -29
- package/src/relay-client/index.ts +0 -33
- package/src/relay-client/machine-directory-client.ts +0 -244
- package/src/relay-client/useMachineDirectory.ts +0 -175
- package/src/serve/client-session-manager.ts +0 -635
- package/src/serve/daemon.ts +0 -497
- package/src/serve/pty-session.ts +0 -236
- package/src/serve/types.ts +0 -174
- package/src/session/__tests__/backend-manager.test.ts +0 -101
- package/src/session/__tests__/local-session-backend.test.ts +0 -1129
- package/src/session/__tests__/reducer.test.ts +0 -80
- package/src/session/__tests__/remote-session-backend.test.ts +0 -995
- package/src/session/__tests__/session-name.test.ts +0 -35
- package/src/session/__tests__/useBundleRefreshAttachFlow.test.ts +0 -431
- package/src/session/__tests__/useRemoteSessionClient.test.ts +0 -424
- package/src/session/__tests__/workspace-shell-hooks.integration.test.ts +0 -268
- package/src/session/__tests__/workspace-shell-hooks.test.ts +0 -24
- package/src/session/adapters/browser-remote.ts +0 -101
- package/src/session/adapters/node-remote.ts +0 -135
- package/src/session/backend-key.ts +0 -5
- package/src/session/backend-manager.ts +0 -80
- package/src/session/backend.ts +0 -93
- package/src/session/backends/local-session-backend.ts +0 -1119
- package/src/session/backends/remote-session-backend.ts +0 -1378
- package/src/session/crypto/__tests__/web-terminal.test.ts +0 -1158
- package/src/session/crypto/frames.web.ts +0 -205
- package/src/session/crypto/handshake.web.ts +0 -396
- package/src/session/crypto/identity.web.ts +0 -133
- package/src/session/crypto/keyexchange.web.ts +0 -246
- package/src/session/crypto/relay-signing.web.ts +0 -53
- package/src/session/events.ts +0 -38
- package/src/session/index.ts +0 -116
- package/src/session/reducer.ts +0 -274
- package/src/session/selectors.ts +0 -28
- package/src/session/session-name.ts +0 -50
- package/src/session/types.ts +0 -101
- package/src/session/useBundleRefreshAttachFlow.ts +0 -608
- package/src/session/useRemoteSessionClient.ts +0 -424
- package/src/session/useSessionEngine.ts +0 -432
- package/src/session/workspace-shell-hooks.ts +0 -35
- package/src/tui/__tests__/input-text.test.ts +0 -24
- package/src/tui/__tests__/local-terminal-sync.test.ts +0 -82
- package/src/tui/__tests__/session-terminal-page-navigation.test.ts +0 -94
- package/src/tui/app.tsx +0 -2
- package/src/tui/index.ts +0 -18
- package/src/tui/input-text.ts +0 -38
- package/src/tui/local-terminal-sync.ts +0 -41
- package/src/types/bundle-refresh.ts +0 -42
- package/src/types/bundle.ts +0 -130
- package/src/types/config.ts +0 -287
- package/src/types/errors.ts +0 -292
- package/src/types/events.ts +0 -91
- package/src/types/identity.ts +0 -284
- package/src/types/processes.ts +0 -45
- package/src/types/review.ts +0 -349
- package/src/types/script-phase.ts +0 -3
- package/src/types/workspace-fuzzy.ts +0 -49
- package/src/types/workspace.ts +0 -151
- package/src/utils/__tests__/onboarding.test.ts +0 -358
- package/src/utils/__tests__/run-scripts.test.ts +0 -535
- package/src/utils/__tests__/run-workspace-scripts.test.ts +0 -406
- package/src/utils/__tests__/workspace-setup.integration.test.ts +0 -633
- package/src/utils/__tests__/workspace-state.test.ts +0 -78
- package/src/utils/bun-socket-writer.ts +0 -80
- package/src/utils/clipboard.ts +0 -53
- package/src/utils/deps.test.ts +0 -31
- package/src/utils/deps.ts +0 -145
- package/src/utils/device.web.ts +0 -163
- package/src/utils/fuzzy-match.ts +0 -125
- package/src/utils/hostnames.ts +0 -43
- package/src/utils/hunk-header.ts +0 -17
- package/src/utils/id.ts +0 -9
- package/src/utils/logger.ts +0 -127
- package/src/utils/markdown.ts +0 -254
- package/src/utils/normalize-env-key.ts +0 -13
- package/src/utils/onboarding.ts +0 -279
- package/src/utils/prompts.ts +0 -176
- package/src/utils/run-commands.ts +0 -112
- package/src/utils/run-scripts.ts +0 -337
- package/src/utils/run-workspace-scripts.ts +0 -355
- package/src/utils/sanitize.test.ts +0 -149
- package/src/utils/sanitize.ts +0 -162
- package/src/utils/secrets.ts +0 -836
- package/src/utils/shell-escape.ts +0 -40
- package/src/utils/utf8.ts +0 -79
- package/src/utils/workspace-id.ts +0 -55
- package/src/utils/workspace-state.ts +0 -427
- package/src/version.generated.d.ts +0 -2
- package/todo-security.md +0 -92
- package/tsconfig.json +0 -29
- package/web/README.md +0 -73
- package/web/bun.lock +0 -675
- package/web/eslint.config.js +0 -23
- package/web/index.css +0 -249
- package/web/index.html +0 -16
- package/web/main.tsx +0 -10
- package/web/package.json +0 -39
- package/web/public/vite.svg +0 -1
- package/web/tsconfig.app.json +0 -35
- package/web/tsconfig.json +0 -7
- package/web/tsconfig.node.json +0 -26
- package/web/vite.config.ts +0 -39
- package/worker/bun.lock +0 -237
- package/worker/package.json +0 -22
- package/worker/schema.sql +0 -96
- package/worker/src/handlers/auth.ts +0 -451
- package/worker/src/handlers/subdomains.ts +0 -376
- package/worker/src/handlers/user.ts +0 -98
- package/worker/src/index.ts +0 -70
- package/worker/src/middleware/auth.ts +0 -152
- package/worker/src/services/cloudflare.ts +0 -609
- package/worker/src/types.ts +0 -96
- package/worker/tsconfig.json +0 -15
- package/worker/wrangler.toml +0 -26
package/src/commands/add.ts
DELETED
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Add command implementation
|
|
3
|
-
* Handles both 'gssh add project' and 'gssh add [workspace-name]'
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
8
|
-
import {
|
|
9
|
-
readProjectConfig,
|
|
10
|
-
createProject,
|
|
11
|
-
setCurrentProject,
|
|
12
|
-
getProjectBaseDir,
|
|
13
|
-
getProjectWorkspacesDir,
|
|
14
|
-
getCurrentProject,
|
|
15
|
-
getAllProjectNames,
|
|
16
|
-
projectExists,
|
|
17
|
-
} from '../core/config.js';
|
|
18
|
-
import { checkGitHubAuth, ensureDependencies } from '../utils/deps.js';
|
|
19
|
-
import { selectItem, promptConfirm, promptInput } from '../utils/prompts.js';
|
|
20
|
-
import { logger } from '../utils/logger.js';
|
|
21
|
-
import { listAllRepos, cloneRepository } from '../core/github.js';
|
|
22
|
-
import {
|
|
23
|
-
getDefaultBranch,
|
|
24
|
-
createWorktree,
|
|
25
|
-
checkRemoteBranch,
|
|
26
|
-
listRemoteBranches,
|
|
27
|
-
} from '../core/git.js';
|
|
28
|
-
import { openWorkspaceShell } from '../core/shell.js';
|
|
29
|
-
import { fetchUnstartedIssues, getLinearConfig } from '../core/linear.js';
|
|
30
|
-
import {
|
|
31
|
-
sanitizeForFileSystem,
|
|
32
|
-
generateWorkspaceName,
|
|
33
|
-
extractRepoName,
|
|
34
|
-
isValidBranchName,
|
|
35
|
-
} from '../utils/sanitize.js';
|
|
36
|
-
import {
|
|
37
|
-
SpacesError,
|
|
38
|
-
NoProjectError,
|
|
39
|
-
ProjectExistsError,
|
|
40
|
-
WorkspaceExistsError,
|
|
41
|
-
} from '../types/errors.js';
|
|
42
|
-
import type { CreateWorkspaceOptions } from '../types/workspace.js';
|
|
43
|
-
import { generateMarkdown } from '../utils/markdown.js';
|
|
44
|
-
import {
|
|
45
|
-
detectBundleInRepo,
|
|
46
|
-
loadBundleFromPath,
|
|
47
|
-
loadBundleFromUrl,
|
|
48
|
-
cleanupBundleDir,
|
|
49
|
-
} from '../core/bundle.js';
|
|
50
|
-
import {
|
|
51
|
-
syncBundleWorkspaceState,
|
|
52
|
-
} from '../core/bundle-refresh.js';
|
|
53
|
-
import { KEEP_EXISTING_SECRET, runOnboarding } from '../utils/onboarding.js';
|
|
54
|
-
import { applyProjectBundleState } from '../core/project-lifecycle.js';
|
|
55
|
-
import type { LoadedBundle, OnboardingResult } from '../types/bundle.js';
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Add a new project
|
|
59
|
-
*/
|
|
60
|
-
export async function addProject(options: {
|
|
61
|
-
noClone?: boolean;
|
|
62
|
-
org?: string;
|
|
63
|
-
linearKey?: string;
|
|
64
|
-
bundleUrl?: string;
|
|
65
|
-
bundlePath?: string;
|
|
66
|
-
skipBundle?: boolean;
|
|
67
|
-
}): Promise<void> {
|
|
68
|
-
// Check dependencies
|
|
69
|
-
await ensureDependencies();
|
|
70
|
-
await checkGitHubAuth();
|
|
71
|
-
|
|
72
|
-
// List all GitHub repositories
|
|
73
|
-
logger.info('Fetching repositories...');
|
|
74
|
-
const repos = await listAllRepos(options.org);
|
|
75
|
-
|
|
76
|
-
if (repos.length === 0) {
|
|
77
|
-
throw new SpacesError(
|
|
78
|
-
'No repositories found',
|
|
79
|
-
'USER_ERROR',
|
|
80
|
-
1
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Select repository
|
|
85
|
-
const selectedRepo = await selectItem(repos, 'Select a repository:');
|
|
86
|
-
|
|
87
|
-
if (!selectedRepo) {
|
|
88
|
-
logger.info('Cancelled');
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
logger.success(`Selected: ${selectedRepo}`);
|
|
93
|
-
|
|
94
|
-
// Extract repo name for project directory
|
|
95
|
-
const projectName = extractRepoName(selectedRepo);
|
|
96
|
-
|
|
97
|
-
// Check if project already exists
|
|
98
|
-
if (projectExists(projectName)) {
|
|
99
|
-
throw new ProjectExistsError(
|
|
100
|
-
projectName,
|
|
101
|
-
getProjectBaseDir(projectName)
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Check for duplicate repositories
|
|
106
|
-
const existingProjects = getAllProjectNames();
|
|
107
|
-
for (const existingProject of existingProjects) {
|
|
108
|
-
const existingConfig = readProjectConfig(existingProject);
|
|
109
|
-
if (existingConfig.repository === selectedRepo) {
|
|
110
|
-
throw new SpacesError(
|
|
111
|
-
`Repository ${selectedRepo} is already tracked by project "${existingProject}"\n\nTo use that project:\n gssh switch project ${existingProject}`,
|
|
112
|
-
'USER_ERROR',
|
|
113
|
-
1
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Clone the repository unless --no-clone
|
|
119
|
-
const baseDir = getProjectBaseDir(projectName);
|
|
120
|
-
|
|
121
|
-
if (!options.noClone) {
|
|
122
|
-
logger.info(`Cloning to ${baseDir}...`);
|
|
123
|
-
await cloneRepository(selectedRepo, baseDir);
|
|
124
|
-
logger.success(`Cloned to ${baseDir}`);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Detect default branch
|
|
128
|
-
const baseBranch = await getDefaultBranch(baseDir);
|
|
129
|
-
logger.debug(`Detected default branch: ${baseBranch}`);
|
|
130
|
-
|
|
131
|
-
// Handle bundle detection and loading
|
|
132
|
-
let loadedBundle: LoadedBundle | null = null;
|
|
133
|
-
let onboardingResult: OnboardingResult | null = null;
|
|
134
|
-
|
|
135
|
-
if (!options.skipBundle) {
|
|
136
|
-
if (options.bundleUrl) {
|
|
137
|
-
// Load from explicit URL
|
|
138
|
-
loadedBundle = await loadBundleFromUrl(options.bundleUrl);
|
|
139
|
-
} else if (options.bundlePath) {
|
|
140
|
-
// Load from explicit local path
|
|
141
|
-
loadedBundle = loadBundleFromPath(options.bundlePath);
|
|
142
|
-
} else if (!options.noClone) {
|
|
143
|
-
// Detect bundle in cloned repo
|
|
144
|
-
const bundleDir = detectBundleInRepo(baseDir);
|
|
145
|
-
if (bundleDir) {
|
|
146
|
-
loadedBundle = loadBundleFromPath(bundleDir);
|
|
147
|
-
logger.info(`Detected spaces bundle: ${loadedBundle.bundle.name}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Run onboarding if bundle has steps
|
|
152
|
-
if (loadedBundle?.bundle.onboarding && loadedBundle.bundle.onboarding.length > 0) {
|
|
153
|
-
const proceed = await promptConfirm(
|
|
154
|
-
`This repository has ${loadedBundle.bundle.onboarding.length} onboarding step(s). Run them now?`,
|
|
155
|
-
true
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
if (proceed) {
|
|
159
|
-
onboardingResult = await runOnboarding(loadedBundle.bundle.onboarding);
|
|
160
|
-
|
|
161
|
-
if (!onboardingResult.completed) {
|
|
162
|
-
const continueAnyway = await promptConfirm(
|
|
163
|
-
'Continue creating project without completing onboarding?',
|
|
164
|
-
false
|
|
165
|
-
);
|
|
166
|
-
if (!continueAnyway) {
|
|
167
|
-
// Clean up bundle temp dir if from URL
|
|
168
|
-
if (loadedBundle) {
|
|
169
|
-
cleanupBundleDir(loadedBundle.bundleDir);
|
|
170
|
-
}
|
|
171
|
-
logger.info('Cancelled');
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Create project configuration
|
|
180
|
-
createProject(
|
|
181
|
-
projectName,
|
|
182
|
-
selectedRepo,
|
|
183
|
-
baseBranch
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
// Store bundle info if bundle was loaded (scripts are read from workspace .gitspace/scripts/)
|
|
187
|
-
if (loadedBundle) {
|
|
188
|
-
if (onboardingResult?.completed) {
|
|
189
|
-
const secretValues = Object.fromEntries(
|
|
190
|
-
Object.entries(onboardingResult.secretValues)
|
|
191
|
-
.filter(([, value]) => value && value !== KEEP_EXISTING_SECRET)
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
await applyProjectBundleState({
|
|
195
|
-
projectName,
|
|
196
|
-
bundle: loadedBundle.bundle,
|
|
197
|
-
inputValues: onboardingResult.inputValues,
|
|
198
|
-
secretValues,
|
|
199
|
-
confirmResults: onboardingResult.confirmResults,
|
|
200
|
-
});
|
|
201
|
-
} else {
|
|
202
|
-
await applyProjectBundleState({
|
|
203
|
-
projectName,
|
|
204
|
-
bundle: loadedBundle.bundle,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Clean up temp directory if bundle was from URL
|
|
209
|
-
cleanupBundleDir(loadedBundle.bundleDir);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
logger.success(`Project '${projectName}' created`);
|
|
213
|
-
|
|
214
|
-
// Set as current project
|
|
215
|
-
setCurrentProject(projectName);
|
|
216
|
-
logger.success('Set as current project');
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Add a new workspace
|
|
221
|
-
*/
|
|
222
|
-
export async function addWorkspace(
|
|
223
|
-
workspaceNameArg?: string,
|
|
224
|
-
options: Partial<CreateWorkspaceOptions> = {}
|
|
225
|
-
): Promise<void> {
|
|
226
|
-
// Get current project
|
|
227
|
-
const currentProject = getCurrentProject();
|
|
228
|
-
if (!currentProject) {
|
|
229
|
-
throw new NoProjectError();
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const projectConfig = readProjectConfig(currentProject);
|
|
233
|
-
const baseDir = getProjectBaseDir(currentProject);
|
|
234
|
-
const workspacesDir = getProjectWorkspacesDir(currentProject);
|
|
235
|
-
|
|
236
|
-
let workspaceName: string;
|
|
237
|
-
let branchName: string;
|
|
238
|
-
|
|
239
|
-
let existsRemotely = false;
|
|
240
|
-
let selectedLinearIssue: Awaited<ReturnType<typeof fetchUnstartedIssues>>[0] | undefined;
|
|
241
|
-
|
|
242
|
-
if (workspaceNameArg) {
|
|
243
|
-
// Workspace name provided as argument - sanitize it (allows branch-like names like fix/bla-bla-blah)
|
|
244
|
-
const sanitizedName = sanitizeForFileSystem(workspaceNameArg);
|
|
245
|
-
if (!sanitizedName) {
|
|
246
|
-
throw new SpacesError(
|
|
247
|
-
`Invalid workspace name: ${workspaceNameArg}\nName must contain at least one letter or number.`,
|
|
248
|
-
'USER_ERROR',
|
|
249
|
-
1
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
workspaceName = sanitizedName;
|
|
254
|
-
// Use original input as branch name if no explicit branch specified (preserves slashes)
|
|
255
|
-
branchName = options.branchName || workspaceNameArg;
|
|
256
|
-
|
|
257
|
-
// Validate the branch name is a valid git ref
|
|
258
|
-
if (!isValidBranchName(branchName)) {
|
|
259
|
-
throw new SpacesError(
|
|
260
|
-
`Invalid branch name: ${branchName}\nBranch names cannot contain spaces, .., or special characters like : ? * [ \\ ~`,
|
|
261
|
-
'USER_ERROR',
|
|
262
|
-
1
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
} else {
|
|
266
|
-
// No workspace name provided, prompt for source
|
|
267
|
-
const sourceOptions = ['Create from GitHub branch', 'Create with manual name'];
|
|
268
|
-
|
|
269
|
-
// Add Linear option if configured
|
|
270
|
-
const linearConfig = await getLinearConfig(currentProject);
|
|
271
|
-
if (linearConfig.apiKey && linearConfig.teamKeys.length > 0) {
|
|
272
|
-
sourceOptions.splice(1, 0, 'Create from Linear issue');
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
const source = await selectItem(sourceOptions, 'How would you like to create the workspace?');
|
|
276
|
-
|
|
277
|
-
if (!source) {
|
|
278
|
-
logger.info('Cancelled');
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (source === 'Create from GitHub branch') {
|
|
283
|
-
// List remote branches
|
|
284
|
-
logger.info('Fetching remote branches...');
|
|
285
|
-
const allBranches = await listRemoteBranches(baseDir);
|
|
286
|
-
|
|
287
|
-
// Filter out the base branch
|
|
288
|
-
const branches = allBranches.filter((branch) => branch !== projectConfig.baseBranch);
|
|
289
|
-
|
|
290
|
-
if (branches.length === 0) {
|
|
291
|
-
throw new SpacesError(
|
|
292
|
-
`No remote branches found (excluding base branch ${projectConfig.baseBranch})`,
|
|
293
|
-
'USER_ERROR',
|
|
294
|
-
1
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const selectedBranch = await selectItem(branches, 'Select a branch:');
|
|
299
|
-
|
|
300
|
-
if (!selectedBranch) {
|
|
301
|
-
logger.info('Cancelled');
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Use branch name as workspace name (sanitize for filesystem safety)
|
|
306
|
-
workspaceName = sanitizeForFileSystem(selectedBranch);
|
|
307
|
-
branchName = selectedBranch;
|
|
308
|
-
existsRemotely = true; // We know it exists remotely
|
|
309
|
-
} else if (source === 'Create from Linear issue') {
|
|
310
|
-
// Fetch unstarted issues from Linear
|
|
311
|
-
logger.info('Fetching Linear issues...');
|
|
312
|
-
|
|
313
|
-
const teamKey = linearConfig.teamKeys[0];
|
|
314
|
-
if (!teamKey) {
|
|
315
|
-
throw new SpacesError('No Linear team configured', 'USER_ERROR', 1);
|
|
316
|
-
}
|
|
317
|
-
const issues = await fetchUnstartedIssues(linearConfig.apiKey!, teamKey);
|
|
318
|
-
|
|
319
|
-
if (issues.length === 0) {
|
|
320
|
-
throw new SpacesError(
|
|
321
|
-
'No unstarted Linear issues found',
|
|
322
|
-
'USER_ERROR',
|
|
323
|
-
1
|
|
324
|
-
);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Format for selection
|
|
328
|
-
const issueOptions = issues.map(
|
|
329
|
-
(issue) => `${issue.identifier} - ${issue.title}`
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
const selectedIssueString = await selectItem(issueOptions, 'Select an issue:');
|
|
333
|
-
|
|
334
|
-
if (!selectedIssueString) {
|
|
335
|
-
logger.info('Cancelled');
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Find the corresponding LinearIssue object
|
|
340
|
-
const [identifier] = selectedIssueString.split(' - ');
|
|
341
|
-
selectedLinearIssue = issues.find(issue => issue.identifier === identifier);
|
|
342
|
-
|
|
343
|
-
if (!selectedLinearIssue) {
|
|
344
|
-
throw new SpacesError(
|
|
345
|
-
`Failed to find Linear issue with identifier ${identifier}`,
|
|
346
|
-
'SYSTEM_ERROR',
|
|
347
|
-
2
|
|
348
|
-
);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Generate workspace name
|
|
352
|
-
workspaceName = generateWorkspaceName(selectedLinearIssue.identifier, selectedLinearIssue.title);
|
|
353
|
-
branchName = options.branchName || workspaceName;
|
|
354
|
-
} else {
|
|
355
|
-
// Manual entry - accepts branch-like names (e.g., fix/bla-bla-blah) and sanitizes them
|
|
356
|
-
const name = await promptInput('Enter workspace name (branch-like names will be sanitized):', {
|
|
357
|
-
validate: (input) => {
|
|
358
|
-
if (!input || input.trim().length === 0) {
|
|
359
|
-
return 'Workspace name is required';
|
|
360
|
-
}
|
|
361
|
-
const sanitized = sanitizeForFileSystem(input);
|
|
362
|
-
if (!sanitized) {
|
|
363
|
-
return 'Name must contain at least one letter or number';
|
|
364
|
-
}
|
|
365
|
-
// Validate it can be used as a branch name
|
|
366
|
-
if (!isValidBranchName(input)) {
|
|
367
|
-
return 'Invalid branch name (no spaces, .., or special chars like : ? * [ \\ ~)';
|
|
368
|
-
}
|
|
369
|
-
return true;
|
|
370
|
-
},
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
if (!name) {
|
|
374
|
-
logger.info('Cancelled');
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const sanitizedName = sanitizeForFileSystem(name);
|
|
379
|
-
workspaceName = sanitizedName;
|
|
380
|
-
// Use original input as branch name (preserves slashes)
|
|
381
|
-
branchName = options.branchName || name;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
const workspacePath = join(workspacesDir, workspaceName);
|
|
386
|
-
|
|
387
|
-
// Check if workspace already exists
|
|
388
|
-
if (existsSync(workspacePath)) {
|
|
389
|
-
throw new WorkspaceExistsError(workspaceName);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
logger.info(`Creating workspace: ${workspaceName}`);
|
|
393
|
-
|
|
394
|
-
// Check if branch exists remotely (if we don't already know)
|
|
395
|
-
if (!existsRemotely) {
|
|
396
|
-
existsRemotely = await checkRemoteBranch(baseDir, branchName);
|
|
397
|
-
|
|
398
|
-
if (existsRemotely) {
|
|
399
|
-
// Prompt user
|
|
400
|
-
const pullRemote = await promptConfirm(`Branch '${branchName}' exists on remote. Pull it down?`, true);
|
|
401
|
-
|
|
402
|
-
if (!pullRemote) {
|
|
403
|
-
logger.info('Cancelled');
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Create worktree
|
|
410
|
-
const baseBranch = options.fromBranch || projectConfig.baseBranch;
|
|
411
|
-
await createWorktree(
|
|
412
|
-
baseDir,
|
|
413
|
-
workspacePath,
|
|
414
|
-
branchName,
|
|
415
|
-
baseBranch,
|
|
416
|
-
existsRemotely
|
|
417
|
-
);
|
|
418
|
-
|
|
419
|
-
logger.success(`Created worktree from ${baseBranch}`);
|
|
420
|
-
|
|
421
|
-
// Register workspace bundle requirements in project-level metadata.
|
|
422
|
-
const bundleSync = syncBundleWorkspaceState(currentProject, workspacePath);
|
|
423
|
-
if (bundleSync.parseError) {
|
|
424
|
-
logger.warning(`Bundle parse error: ${bundleSync.parseError}`);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// If workspace was created from a Linear issue, save issue details as markdown
|
|
428
|
-
if (selectedLinearIssue) {
|
|
429
|
-
const issueLinearConfig = await getLinearConfig(currentProject);
|
|
430
|
-
if (issueLinearConfig.apiKey) {
|
|
431
|
-
const promptDir = join(workspacePath, '.prompt');
|
|
432
|
-
mkdirSync(promptDir, { recursive: true });
|
|
433
|
-
|
|
434
|
-
const markdown = await generateMarkdown(selectedLinearIssue, promptDir, issueLinearConfig.apiKey);
|
|
435
|
-
const issueMarkdownPath = join(promptDir, 'issue.md');
|
|
436
|
-
writeFileSync(issueMarkdownPath, markdown, 'utf-8');
|
|
437
|
-
|
|
438
|
-
logger.debug('Saved Linear issue details to .prompt/issue.md');
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Open workspace shell unless --no-shell
|
|
443
|
-
if (!options.noShell) {
|
|
444
|
-
logger.success(`Opening workspace: ${workspaceName}`);
|
|
445
|
-
await openWorkspaceShell(
|
|
446
|
-
workspacePath,
|
|
447
|
-
currentProject,
|
|
448
|
-
projectConfig.repository,
|
|
449
|
-
options.noSetup || false
|
|
450
|
-
);
|
|
451
|
-
} else {
|
|
452
|
-
logger.success(`Workspace created at: ${workspacePath}`);
|
|
453
|
-
logger.log(`\nTo navigate:\n cd ${workspacePath}`);
|
|
454
|
-
}
|
|
455
|
-
}
|