gitspace 0.2.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +21 -0
- package/.gitspace/bundle.json +50 -0
- package/.gitspace/select/01-status.sh +40 -0
- package/.gitspace/setup/01-install-deps.sh +12 -0
- package/.gitspace/setup/02-typecheck.sh +16 -0
- package/AGENTS.md +439 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +25 -0
- package/README.md +607 -0
- package/bin/gssh +62 -0
- package/bun.lock +647 -0
- package/docs/CONNECTION.md +623 -0
- package/docs/GATEWAY-WORKER.md +319 -0
- package/docs/GETTING-STARTED.md +448 -0
- package/docs/GITSPACE-PLATFORM.md +1819 -0
- package/docs/INFRASTRUCTURE.md +1347 -0
- package/docs/PROTOCOL.md +619 -0
- package/docs/QUICKSTART.md +174 -0
- package/docs/RELAY.md +327 -0
- package/docs/REMOTE-DESIGN.md +549 -0
- package/docs/ROADMAP.md +564 -0
- package/docs/SITE_DOCS_FIGMA_MAKE.md +1167 -0
- package/docs/STACK-DESIGN.md +588 -0
- package/docs/UNIFIED_ARCHITECTURE.md +292 -0
- package/experiments/pty-benchmark.ts +148 -0
- package/experiments/pty-latency.ts +100 -0
- package/experiments/router/client.ts +199 -0
- package/experiments/router/protocol.ts +74 -0
- package/experiments/router/router.ts +217 -0
- package/experiments/router/session.ts +180 -0
- package/experiments/router/test.ts +133 -0
- package/experiments/socket-bandwidth.ts +77 -0
- package/homebrew/gitspace.rb +45 -0
- package/landing-page/ATTRIBUTIONS.md +3 -0
- package/landing-page/README.md +11 -0
- package/landing-page/bun.lock +801 -0
- package/landing-page/guidelines/Guidelines.md +61 -0
- package/landing-page/index.html +37 -0
- package/landing-page/package.json +90 -0
- package/landing-page/postcss.config.mjs +15 -0
- package/landing-page/public/_redirects +1 -0
- package/landing-page/public/favicon.png +0 -0
- package/landing-page/src/app/App.tsx +53 -0
- package/landing-page/src/app/components/figma/ImageWithFallback.tsx +27 -0
- package/landing-page/src/app/components/ui/accordion.tsx +66 -0
- package/landing-page/src/app/components/ui/alert-dialog.tsx +157 -0
- package/landing-page/src/app/components/ui/alert.tsx +66 -0
- package/landing-page/src/app/components/ui/aspect-ratio.tsx +11 -0
- package/landing-page/src/app/components/ui/avatar.tsx +53 -0
- package/landing-page/src/app/components/ui/badge.tsx +46 -0
- package/landing-page/src/app/components/ui/breadcrumb.tsx +109 -0
- package/landing-page/src/app/components/ui/button.tsx +57 -0
- package/landing-page/src/app/components/ui/calendar.tsx +75 -0
- package/landing-page/src/app/components/ui/card.tsx +92 -0
- package/landing-page/src/app/components/ui/carousel.tsx +241 -0
- package/landing-page/src/app/components/ui/chart.tsx +353 -0
- package/landing-page/src/app/components/ui/checkbox.tsx +32 -0
- package/landing-page/src/app/components/ui/collapsible.tsx +33 -0
- package/landing-page/src/app/components/ui/command.tsx +177 -0
- package/landing-page/src/app/components/ui/context-menu.tsx +252 -0
- package/landing-page/src/app/components/ui/dialog.tsx +135 -0
- package/landing-page/src/app/components/ui/drawer.tsx +132 -0
- package/landing-page/src/app/components/ui/dropdown-menu.tsx +257 -0
- package/landing-page/src/app/components/ui/form.tsx +168 -0
- package/landing-page/src/app/components/ui/hover-card.tsx +44 -0
- package/landing-page/src/app/components/ui/input-otp.tsx +77 -0
- package/landing-page/src/app/components/ui/input.tsx +21 -0
- package/landing-page/src/app/components/ui/label.tsx +24 -0
- package/landing-page/src/app/components/ui/menubar.tsx +276 -0
- package/landing-page/src/app/components/ui/navigation-menu.tsx +168 -0
- package/landing-page/src/app/components/ui/pagination.tsx +127 -0
- package/landing-page/src/app/components/ui/popover.tsx +48 -0
- package/landing-page/src/app/components/ui/progress.tsx +31 -0
- package/landing-page/src/app/components/ui/radio-group.tsx +45 -0
- package/landing-page/src/app/components/ui/resizable.tsx +56 -0
- package/landing-page/src/app/components/ui/scroll-area.tsx +58 -0
- package/landing-page/src/app/components/ui/select.tsx +189 -0
- package/landing-page/src/app/components/ui/separator.tsx +28 -0
- package/landing-page/src/app/components/ui/sheet.tsx +139 -0
- package/landing-page/src/app/components/ui/sidebar.tsx +726 -0
- package/landing-page/src/app/components/ui/skeleton.tsx +13 -0
- package/landing-page/src/app/components/ui/slider.tsx +63 -0
- package/landing-page/src/app/components/ui/sonner.tsx +25 -0
- package/landing-page/src/app/components/ui/switch.tsx +31 -0
- package/landing-page/src/app/components/ui/table.tsx +116 -0
- package/landing-page/src/app/components/ui/tabs.tsx +66 -0
- package/landing-page/src/app/components/ui/textarea.tsx +18 -0
- package/landing-page/src/app/components/ui/toggle-group.tsx +73 -0
- package/landing-page/src/app/components/ui/toggle.tsx +47 -0
- package/landing-page/src/app/components/ui/tooltip.tsx +61 -0
- package/landing-page/src/app/components/ui/use-mobile.ts +21 -0
- package/landing-page/src/app/components/ui/utils.ts +6 -0
- package/landing-page/src/components/docs/DocsContent.tsx +718 -0
- package/landing-page/src/components/docs/DocsSidebar.tsx +84 -0
- package/landing-page/src/components/landing/CTA.tsx +59 -0
- package/landing-page/src/components/landing/Comparison.tsx +84 -0
- package/landing-page/src/components/landing/FaultyTerminal.tsx +424 -0
- package/landing-page/src/components/landing/Features.tsx +201 -0
- package/landing-page/src/components/landing/Hero.tsx +142 -0
- package/landing-page/src/components/landing/Pricing.tsx +140 -0
- package/landing-page/src/components/landing/Roadmap.tsx +86 -0
- package/landing-page/src/components/landing/Security.tsx +81 -0
- package/landing-page/src/components/landing/TerminalWindow.tsx +27 -0
- package/landing-page/src/components/landing/UseCases.tsx +55 -0
- package/landing-page/src/components/landing/Workflow.tsx +101 -0
- package/landing-page/src/components/layout/DashboardNavbar.tsx +37 -0
- package/landing-page/src/components/layout/Footer.tsx +55 -0
- package/landing-page/src/components/layout/LandingNavbar.tsx +82 -0
- package/landing-page/src/components/ui/badge.tsx +39 -0
- package/landing-page/src/components/ui/breadcrumb.tsx +115 -0
- package/landing-page/src/components/ui/button.tsx +57 -0
- package/landing-page/src/components/ui/card.tsx +79 -0
- package/landing-page/src/components/ui/mock-terminal.tsx +68 -0
- package/landing-page/src/components/ui/separator.tsx +28 -0
- package/landing-page/src/lib/utils.ts +6 -0
- package/landing-page/src/main.tsx +10 -0
- package/landing-page/src/pages/Dashboard.tsx +133 -0
- package/landing-page/src/pages/DocsPage.tsx +79 -0
- package/landing-page/src/pages/LandingPage.tsx +31 -0
- package/landing-page/src/pages/TerminalView.tsx +106 -0
- package/landing-page/src/styles/fonts.css +0 -0
- package/landing-page/src/styles/index.css +3 -0
- package/landing-page/src/styles/tailwind.css +4 -0
- package/landing-page/src/styles/theme.css +181 -0
- package/landing-page/vite.config.ts +19 -0
- package/npm/darwin-arm64/bin/gssh +0 -0
- package/npm/darwin-arm64/package.json +20 -0
- package/package.json +74 -0
- package/scripts/build.ts +284 -0
- package/scripts/release.ts +140 -0
- package/src/__tests__/test-utils.ts +298 -0
- package/src/commands/__tests__/serve-messages.test.ts +190 -0
- package/src/commands/access.ts +298 -0
- package/src/commands/add.ts +452 -0
- package/src/commands/auth.ts +364 -0
- package/src/commands/connect.ts +287 -0
- package/src/commands/directory.ts +16 -0
- package/src/commands/host.ts +396 -0
- package/src/commands/identity.ts +184 -0
- package/src/commands/list.ts +200 -0
- package/src/commands/relay.ts +315 -0
- package/src/commands/remove.ts +241 -0
- package/src/commands/serve.ts +1493 -0
- package/src/commands/share.ts +456 -0
- package/src/commands/status.ts +125 -0
- package/src/commands/switch.ts +353 -0
- package/src/commands/tmux.ts +317 -0
- package/src/core/__tests__/access.test.ts +240 -0
- package/src/core/access.ts +277 -0
- package/src/core/bundle.ts +342 -0
- package/src/core/config.ts +510 -0
- package/src/core/git.ts +317 -0
- package/src/core/github.ts +151 -0
- package/src/core/identity.ts +631 -0
- package/src/core/linear.ts +225 -0
- package/src/core/shell.ts +161 -0
- package/src/core/trusted-relays.ts +315 -0
- package/src/index.ts +821 -0
- package/src/lib/remote-session/index.ts +7 -0
- package/src/lib/remote-session/protocol.ts +267 -0
- package/src/lib/remote-session/session-handler.ts +581 -0
- package/src/lib/remote-session/workspace-scanner.ts +167 -0
- package/src/lib/tmux-lite/README.md +81 -0
- package/src/lib/tmux-lite/cli.ts +796 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +349 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +291 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +142 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +339 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +477 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +499 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +371 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +573 -0
- package/src/lib/tmux-lite/crypto/access-control.test.ts +512 -0
- package/src/lib/tmux-lite/crypto/access-control.ts +320 -0
- package/src/lib/tmux-lite/crypto/frames.test.ts +262 -0
- package/src/lib/tmux-lite/crypto/frames.ts +141 -0
- package/src/lib/tmux-lite/crypto/handshake.ts +894 -0
- package/src/lib/tmux-lite/crypto/identity.test.ts +220 -0
- package/src/lib/tmux-lite/crypto/identity.ts +286 -0
- package/src/lib/tmux-lite/crypto/index.ts +51 -0
- package/src/lib/tmux-lite/crypto/invites.test.ts +381 -0
- package/src/lib/tmux-lite/crypto/invites.ts +215 -0
- package/src/lib/tmux-lite/crypto/keyexchange.ts +435 -0
- package/src/lib/tmux-lite/crypto/keys.test.ts +58 -0
- package/src/lib/tmux-lite/crypto/keys.ts +47 -0
- package/src/lib/tmux-lite/crypto/secretbox.test.ts +169 -0
- package/src/lib/tmux-lite/crypto/secretbox.ts +124 -0
- package/src/lib/tmux-lite/handshake-handler.ts +451 -0
- package/src/lib/tmux-lite/protocol.test.ts +307 -0
- package/src/lib/tmux-lite/protocol.ts +266 -0
- package/src/lib/tmux-lite/relay-client.ts +506 -0
- package/src/lib/tmux-lite/server.ts +1250 -0
- package/src/lib/tmux-lite/shell-integration.sh +37 -0
- package/src/lib/tmux-lite/terminal-queries.test.ts +54 -0
- package/src/lib/tmux-lite/terminal-queries.ts +49 -0
- package/src/relay/__tests__/e2e-flow.test.ts +1284 -0
- package/src/relay/__tests__/helpers/auth.ts +354 -0
- package/src/relay/__tests__/helpers/ports.ts +51 -0
- package/src/relay/__tests__/protocol-validation.test.ts +265 -0
- package/src/relay/authorization.ts +303 -0
- package/src/relay/embedded-assets.generated.d.ts +15 -0
- package/src/relay/identity.ts +352 -0
- package/src/relay/index.ts +57 -0
- package/src/relay/pipes.test.ts +427 -0
- package/src/relay/pipes.ts +195 -0
- package/src/relay/protocol.ts +804 -0
- package/src/relay/registries.test.ts +437 -0
- package/src/relay/registries.ts +593 -0
- package/src/relay/server.test.ts +1323 -0
- package/src/relay/server.ts +1092 -0
- package/src/relay/signing.ts +238 -0
- package/src/relay/types.ts +69 -0
- package/src/serve/client-session-manager.ts +622 -0
- package/src/serve/daemon.ts +497 -0
- package/src/serve/pty-session.ts +236 -0
- package/src/serve/types.ts +169 -0
- package/src/shared/components/Flow.tsx +453 -0
- package/src/shared/components/Flow.tui.tsx +343 -0
- package/src/shared/components/Flow.web.tsx +442 -0
- package/src/shared/components/Inbox.tsx +446 -0
- package/src/shared/components/Inbox.tui.tsx +262 -0
- package/src/shared/components/Inbox.web.tsx +329 -0
- package/src/shared/components/MachineList.tsx +187 -0
- package/src/shared/components/MachineList.tui.tsx +161 -0
- package/src/shared/components/MachineList.web.tsx +210 -0
- package/src/shared/components/ProjectList.tsx +176 -0
- package/src/shared/components/ProjectList.tui.tsx +109 -0
- package/src/shared/components/ProjectList.web.tsx +143 -0
- package/src/shared/components/SpacesBrowser.tsx +332 -0
- package/src/shared/components/SpacesBrowser.tui.tsx +163 -0
- package/src/shared/components/SpacesBrowser.web.tsx +221 -0
- package/src/shared/components/index.ts +103 -0
- package/src/shared/hooks/index.ts +16 -0
- package/src/shared/hooks/useNavigation.ts +226 -0
- package/src/shared/index.ts +122 -0
- package/src/shared/providers/LocalMachineProvider.ts +425 -0
- package/src/shared/providers/MachineProvider.ts +165 -0
- package/src/shared/providers/RemoteMachineProvider.ts +444 -0
- package/src/shared/providers/index.ts +26 -0
- package/src/shared/types.ts +145 -0
- package/src/tui/adapters.ts +120 -0
- package/src/tui/app.tsx +1816 -0
- package/src/tui/components/Terminal.tsx +580 -0
- package/src/tui/hooks/index.ts +35 -0
- package/src/tui/hooks/useAppState.ts +314 -0
- package/src/tui/hooks/useDaemonStatus.ts +174 -0
- package/src/tui/hooks/useInboxTUI.ts +113 -0
- package/src/tui/hooks/useRemoteMachines.ts +209 -0
- package/src/tui/index.ts +24 -0
- package/src/tui/state.ts +299 -0
- package/src/tui/terminal-bracketed-paste.test.ts +45 -0
- package/src/tui/terminal-bracketed-paste.ts +47 -0
- package/src/types/bundle.ts +112 -0
- package/src/types/config.ts +89 -0
- package/src/types/errors.ts +206 -0
- package/src/types/identity.ts +284 -0
- package/src/types/workspace-fuzzy.ts +49 -0
- package/src/types/workspace.ts +151 -0
- package/src/utils/bun-socket-writer.ts +80 -0
- package/src/utils/deps.ts +127 -0
- package/src/utils/fuzzy-match.ts +125 -0
- package/src/utils/logger.ts +127 -0
- package/src/utils/markdown.ts +254 -0
- package/src/utils/onboarding.ts +229 -0
- package/src/utils/prompts.ts +114 -0
- package/src/utils/run-commands.ts +112 -0
- package/src/utils/run-scripts.ts +142 -0
- package/src/utils/sanitize.ts +98 -0
- package/src/utils/secrets.ts +122 -0
- package/src/utils/shell-escape.ts +40 -0
- package/src/utils/utf8.ts +79 -0
- package/src/utils/workspace-state.ts +47 -0
- package/src/web/README.md +73 -0
- package/src/web/bun.lock +575 -0
- package/src/web/eslint.config.js +23 -0
- package/src/web/index.html +16 -0
- package/src/web/package.json +37 -0
- package/src/web/public/vite.svg +1 -0
- package/src/web/src/App.tsx +604 -0
- package/src/web/src/assets/react.svg +1 -0
- package/src/web/src/components/Terminal.tsx +207 -0
- package/src/web/src/hooks/useRelayConnection.ts +224 -0
- package/src/web/src/hooks/useTerminal.ts +699 -0
- package/src/web/src/index.css +55 -0
- package/src/web/src/lib/crypto/__tests__/web-terminal.test.ts +1158 -0
- package/src/web/src/lib/crypto/frames.ts +205 -0
- package/src/web/src/lib/crypto/handshake.ts +396 -0
- package/src/web/src/lib/crypto/identity.ts +128 -0
- package/src/web/src/lib/crypto/keyexchange.ts +246 -0
- package/src/web/src/lib/crypto/relay-signing.ts +53 -0
- package/src/web/src/lib/invite.ts +58 -0
- package/src/web/src/lib/storage/identity-store.ts +94 -0
- package/src/web/src/main.tsx +10 -0
- package/src/web/src/types/identity.ts +45 -0
- package/src/web/tsconfig.app.json +28 -0
- package/src/web/tsconfig.json +7 -0
- package/src/web/tsconfig.node.json +26 -0
- package/src/web/vite.config.ts +31 -0
- package/todo-security.md +92 -0
- package/tsconfig.json +23 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-wal +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-wal +0 -0
- package/worker/bun.lock +237 -0
- package/worker/package.json +22 -0
- package/worker/schema.sql +96 -0
- package/worker/src/handlers/auth.ts +451 -0
- package/worker/src/handlers/subdomains.ts +376 -0
- package/worker/src/handlers/user.ts +98 -0
- package/worker/src/index.ts +70 -0
- package/worker/src/middleware/auth.ts +152 -0
- package/worker/src/services/cloudflare.ts +609 -0
- package/worker/src/types.ts +96 -0
- package/worker/tsconfig.json +15 -0
- package/worker/wrangler.toml +26 -0
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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 ""
|
|
@@ -0,0 +1,12 @@
|
|
|
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!"
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
# Claude Code Development Guide
|
|
2
|
+
|
|
3
|
+
This document provides comprehensive information for AI assistants working on the GitSpace CLI project.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
**GitSpace** is a powerful CLI tool for managing GitHub repository workspaces using git worktrees, with secure remote terminal access via an E2E encrypted relay system. It features both a TUI (Terminal User Interface) and web interface for interactive management.
|
|
8
|
+
|
|
9
|
+
**Key Capabilities:**
|
|
10
|
+
- Git worktrees for parallel branch development
|
|
11
|
+
- Interactive TUI for workspace management
|
|
12
|
+
- **Remote terminal access** via E2E encrypted relay
|
|
13
|
+
- **Identity-based access control** with Ed25519/X25519 keys
|
|
14
|
+
- **X3DH handshake** for forward-secret session encryption
|
|
15
|
+
- Web terminal interface (React + xterm.js)
|
|
16
|
+
- Linear issue integration for workspace creation
|
|
17
|
+
- Convention-based custom scripts (pre, setup, select phases)
|
|
18
|
+
|
|
19
|
+
## Architecture
|
|
20
|
+
|
|
21
|
+
### Core Concepts
|
|
22
|
+
|
|
23
|
+
1. **Projects**: Top-level containers for a GitHub repository
|
|
24
|
+
- Located at `~/gitspace/<project-name>/`
|
|
25
|
+
- Contains: base repo clone, workspaces, scripts, config
|
|
26
|
+
|
|
27
|
+
2. **Workspaces**: Individual git worktrees for features/branches
|
|
28
|
+
- Located at `~/gitspace/<project-name>/workspaces/<workspace-name>/`
|
|
29
|
+
- Each workspace has its own branch
|
|
30
|
+
|
|
31
|
+
3. **Sessions**: PTY terminal sessions managed by tmux-lite
|
|
32
|
+
- Can be attached from multiple clients
|
|
33
|
+
- State maintained by xterm-headless on server
|
|
34
|
+
|
|
35
|
+
4. **Identity**: Cryptographic keypair per machine/client
|
|
36
|
+
- Ed25519 for signing (proving identity)
|
|
37
|
+
- X25519 for key exchange (establishing encryption)
|
|
38
|
+
- Stored in `~/gitspace/.identity/` directory:
|
|
39
|
+
- `keypair.json` - Encrypted identity keypair
|
|
40
|
+
- Access list: `~/gitspace/.access.json` - Authorized client public keys
|
|
41
|
+
- Machine info: `~/gitspace/.machine.json` - Machine registration info
|
|
42
|
+
- Relay config: `~/gitspace/.relay.json` - Relay configuration cache
|
|
43
|
+
|
|
44
|
+
5. **Relay**: WebSocket server for routing encrypted traffic
|
|
45
|
+
- Connects machines to clients through NAT/firewalls
|
|
46
|
+
- Cannot decrypt terminal content (E2E encryption)
|
|
47
|
+
|
|
48
|
+
### Directory Structure
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
src/
|
|
52
|
+
├── index.ts # Entry point (TUI or CLI dispatch)
|
|
53
|
+
├── commands/ # CLI command implementations (16 files)
|
|
54
|
+
│ ├── access.ts # Access control list (add/list/remove)
|
|
55
|
+
│ ├── add.ts # Add projects/workspaces
|
|
56
|
+
│ ├── auth.ts # GitHub OAuth for gitspace.sh
|
|
57
|
+
│ ├── connect.ts # Connect to remote machine
|
|
58
|
+
│ ├── directory.ts # Get project directory path
|
|
59
|
+
│ ├── host.ts # Subdomain hosting (reserve/release/list)
|
|
60
|
+
│ ├── identity.ts # Identity management (init/show)
|
|
61
|
+
│ ├── list.ts # List projects/workspaces
|
|
62
|
+
│ ├── machine.ts # Remote machine management (invite/list)
|
|
63
|
+
│ ├── relay.ts # Relay server (start/token)
|
|
64
|
+
│ ├── remove.ts # Remove projects/workspaces
|
|
65
|
+
│ ├── serve.ts # Machine daemon for remote access
|
|
66
|
+
│ ├── share.ts # Create invite tokens
|
|
67
|
+
│ ├── status.ts # Unified daemon status display
|
|
68
|
+
│ ├── switch.ts # Switch projects/workspaces
|
|
69
|
+
│ └── tmux.ts # tmux-lite CLI commands
|
|
70
|
+
├── core/ # Core business logic (8 files)
|
|
71
|
+
│ ├── access.ts # Access list management
|
|
72
|
+
│ ├── bundle.ts # Project template bundles
|
|
73
|
+
│ ├── config.ts # Configuration management
|
|
74
|
+
│ ├── git.ts # Git operations (worktrees, branches)
|
|
75
|
+
│ ├── github.ts # GitHub API (via gh CLI)
|
|
76
|
+
│ ├── identity.ts # Machine identity management
|
|
77
|
+
│ ├── linear.ts # Linear API integration
|
|
78
|
+
│ └── shell.ts # Subshell spawning
|
|
79
|
+
├── lib/
|
|
80
|
+
│ ├── tmux-lite/ # Terminal multiplexer library
|
|
81
|
+
│ │ ├── cli.ts # CLI interface for tmux-lite
|
|
82
|
+
│ │ ├── server.ts # Session manager with xterm-headless
|
|
83
|
+
│ │ ├── protocol.ts # Frame format (PTY/CONTROL)
|
|
84
|
+
│ │ ├── handshake-handler.ts # X3DH handshake management
|
|
85
|
+
│ │ ├── relay-client.ts # WebSocket client for relay
|
|
86
|
+
│ │ └── crypto/ # Cryptography implementations
|
|
87
|
+
│ │ ├── identity.ts # Ed25519/X25519 key generation
|
|
88
|
+
│ │ ├── keyexchange.ts # X25519 ECDH
|
|
89
|
+
│ │ ├── secretbox.ts # AES-256-GCM encryption
|
|
90
|
+
│ │ ├── frames.ts # Encrypted frame format
|
|
91
|
+
│ │ ├── handshake.ts # X3DH protocol steps
|
|
92
|
+
│ │ ├── invites.ts # Signed invite tokens
|
|
93
|
+
│ │ └── access-control.ts # ACL checking
|
|
94
|
+
│ └── remote-session/ # Remote session handling
|
|
95
|
+
│ ├── session-handler.ts # Handle remote client commands
|
|
96
|
+
│ └── workspace-scanner.ts # Scan workspace info
|
|
97
|
+
├── relay/ # Relay server (8 files)
|
|
98
|
+
│ ├── index.ts # Entry point
|
|
99
|
+
│ ├── server.ts # WebSocket routing server
|
|
100
|
+
│ ├── protocol.ts # Message types and validation
|
|
101
|
+
│ ├── registries.ts # Machine/invite/auth/global access registries
|
|
102
|
+
│ ├── jwt.ts # JWT token creation/verification (HMAC + Ed25519)
|
|
103
|
+
│ ├── pipes.ts # Pipe abstraction for data routing
|
|
104
|
+
│ └── types.ts # WebSocketData, RelayConfig types
|
|
105
|
+
├── serve/ # Machine daemon (4 files)
|
|
106
|
+
│ ├── client-session-manager.ts # Client connection handling
|
|
107
|
+
│ ├── daemon.ts # Daemon lifecycle (PID, status socket)
|
|
108
|
+
│ ├── pty-session.ts # PTY session management
|
|
109
|
+
│ └── types.ts # ServeOptions, permissions
|
|
110
|
+
├── shared/ # Cross-platform components
|
|
111
|
+
│ ├── components/ # Shared UI components (16 files)
|
|
112
|
+
│ │ ├── MachineList.tsx # Logic + hooks
|
|
113
|
+
│ │ ├── MachineList.web.tsx # Web rendering
|
|
114
|
+
│ │ ├── MachineList.tui.tsx # TUI rendering
|
|
115
|
+
│ │ ├── SpacesBrowser.tsx # Workspace browser logic
|
|
116
|
+
│ │ ├── SpacesBrowser.web.tsx
|
|
117
|
+
│ │ ├── SpacesBrowser.tui.tsx
|
|
118
|
+
│ │ ├── Inbox.tsx # Notification system
|
|
119
|
+
│ │ ├── Inbox.web.tsx
|
|
120
|
+
│ │ ├── Inbox.tui.tsx
|
|
121
|
+
│ │ ├── Flow.tsx # Modal dialog system
|
|
122
|
+
│ │ ├── Flow.web.tsx
|
|
123
|
+
│ │ ├── Flow.tui.tsx
|
|
124
|
+
│ │ ├── ProjectList.tsx
|
|
125
|
+
│ │ ├── ProjectList.web.tsx
|
|
126
|
+
│ │ └── ProjectList.tui.tsx
|
|
127
|
+
│ ├── providers/ # Machine access abstraction
|
|
128
|
+
│ │ ├── MachineProvider.ts # Interface definition
|
|
129
|
+
│ │ ├── LocalMachineProvider.ts # Direct tmux-lite access
|
|
130
|
+
│ │ └── RemoteMachineProvider.ts # Via relay
|
|
131
|
+
│ ├── hooks/
|
|
132
|
+
│ │ └── useNavigation.ts # Navigation state management
|
|
133
|
+
│ └── types.ts # Shared type definitions
|
|
134
|
+
├── tui/ # Terminal UI (OpenTUI)
|
|
135
|
+
│ ├── index.ts # TUI entry point
|
|
136
|
+
│ ├── app.tsx # Main TUI application
|
|
137
|
+
│ ├── state.ts # State management
|
|
138
|
+
│ ├── adapters.ts # Local/remote machine adapters
|
|
139
|
+
│ ├── components/
|
|
140
|
+
│ │ └── Terminal.tsx # Embedded terminal
|
|
141
|
+
│ └── hooks/
|
|
142
|
+
│ ├── useAppState.ts
|
|
143
|
+
│ ├── useRemoteMachines.ts
|
|
144
|
+
│ └── useInboxTUI.ts
|
|
145
|
+
├── web/ # Web application (Vite + React)
|
|
146
|
+
│ └── src/
|
|
147
|
+
│ ├── App.tsx # Main web app
|
|
148
|
+
│ ├── components/
|
|
149
|
+
│ │ └── Terminal.tsx
|
|
150
|
+
│ ├── hooks/
|
|
151
|
+
│ │ ├── useRelayConnection.ts
|
|
152
|
+
│ │ └── useTerminal.ts
|
|
153
|
+
│ └── lib/
|
|
154
|
+
│ ├── crypto/ # Client-side crypto (same as server)
|
|
155
|
+
│ └── storage/ # LocalStorage identity
|
|
156
|
+
├── types/ # TypeScript type definitions
|
|
157
|
+
│ ├── bundle.ts # Bundle format
|
|
158
|
+
│ ├── config.ts # Global/project config
|
|
159
|
+
│ ├── errors.ts # Error types
|
|
160
|
+
│ ├── identity.ts # Keypairs, access, invites, X3DH
|
|
161
|
+
│ ├── workspace.ts # Workspace types
|
|
162
|
+
│ └── workspace-fuzzy.ts # Fuzzy search types
|
|
163
|
+
└── utils/ # Utility functions (13 files)
|
|
164
|
+
├── bun-socket-writer.ts # Buffered socket writing
|
|
165
|
+
├── deps.ts # Dependency checking
|
|
166
|
+
├── fuzzy-match.ts # Fuzzy matching
|
|
167
|
+
├── logger.ts # Colored logging
|
|
168
|
+
├── markdown.ts # Markdown rendering
|
|
169
|
+
├── onboarding.ts # Bundle onboarding
|
|
170
|
+
├── prompts.ts # User prompts
|
|
171
|
+
├── run-commands.ts # Command execution
|
|
172
|
+
├── run-scripts.ts # Script discovery/execution
|
|
173
|
+
├── sanitize.ts # String sanitization
|
|
174
|
+
├── secrets.ts # Bun.secrets integration
|
|
175
|
+
├── shell-escape.ts # POSIX escaping
|
|
176
|
+
└── workspace-state.ts # gitspace.lock marker
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## CLI Commands
|
|
180
|
+
|
|
181
|
+
### Workspace Management
|
|
182
|
+
| Command | Description |
|
|
183
|
+
|---------|-------------|
|
|
184
|
+
| `gssh` | Launch TUI (no args) |
|
|
185
|
+
| `gssh add project` | Add a new project from GitHub |
|
|
186
|
+
| `gssh add <name>` | Create workspace in current project |
|
|
187
|
+
| `gssh switch project [name]` | Switch to a project |
|
|
188
|
+
| `gssh switch [name]` | Switch to a workspace |
|
|
189
|
+
| `gssh list projects` | List all projects |
|
|
190
|
+
| `gssh list workspaces` | List workspaces in current project |
|
|
191
|
+
| `gssh remove workspace [name]` | Remove a workspace |
|
|
192
|
+
| `gssh remove project [name]` | Remove a project |
|
|
193
|
+
| `gssh directory` | Print current project directory |
|
|
194
|
+
|
|
195
|
+
### Identity & Access
|
|
196
|
+
| Command | Description |
|
|
197
|
+
|---------|-------------|
|
|
198
|
+
| `gssh identity init` | Create machine identity keypair |
|
|
199
|
+
| `gssh identity show` | Display identity fingerprint |
|
|
200
|
+
| `gssh access add <pubkey>` | Add authorized client |
|
|
201
|
+
| `gssh access list` | List authorized clients |
|
|
202
|
+
| `gssh access remove <key>` | Remove client access |
|
|
203
|
+
| `gssh share create` | Create invite token |
|
|
204
|
+
|
|
205
|
+
### Remote Access
|
|
206
|
+
| Command | Description |
|
|
207
|
+
|---------|-------------|
|
|
208
|
+
| `gssh serve` | Start machine daemon (foreground) |
|
|
209
|
+
| `gssh serve start` | Start machine daemon (background) |
|
|
210
|
+
| `gssh serve stop` | Stop machine daemon |
|
|
211
|
+
| `gssh connect <token>` | Connect to remote machine |
|
|
212
|
+
| `gssh status` | Show status of all daemons |
|
|
213
|
+
|
|
214
|
+
### Relay Server
|
|
215
|
+
| Command | Description |
|
|
216
|
+
|---------|-------------|
|
|
217
|
+
| `gssh relay start` | Start relay server |
|
|
218
|
+
| `gssh relay token` | Create account JWT (HMAC) |
|
|
219
|
+
| `gssh relay authorize <pubkey>` | Authorize a client on relay |
|
|
220
|
+
| `gssh relay revoke <id>` | Revoke client authorization |
|
|
221
|
+
| `gssh relay machines` | List authorized machines |
|
|
222
|
+
|
|
223
|
+
### tmux-lite Daemon
|
|
224
|
+
| Command | Description |
|
|
225
|
+
|---------|-------------|
|
|
226
|
+
| `gssh tmux start` | Start tmux-lite server daemon |
|
|
227
|
+
| `gssh tmux stop` | Stop tmux-lite daemon |
|
|
228
|
+
| `gssh tmux status` | Show tmux-lite daemon status |
|
|
229
|
+
| `gssh tmux list` | List active terminal sessions |
|
|
230
|
+
|
|
231
|
+
### Machine Management
|
|
232
|
+
| Command | Description |
|
|
233
|
+
|---------|-------------|
|
|
234
|
+
| `gssh machine invite` | Create invite for remote machine to join relay |
|
|
235
|
+
| `gssh machine list` | List machines on relay (stub) |
|
|
236
|
+
| `gssh machine remove <id>` | Remove machine from relay (stub) |
|
|
237
|
+
|
|
238
|
+
### Authentication (gitspace.sh)
|
|
239
|
+
| Command | Description |
|
|
240
|
+
|---------|-------------|
|
|
241
|
+
| `gssh auth login` | Login via GitHub OAuth device flow |
|
|
242
|
+
| `gssh auth logout` | Clear local credentials |
|
|
243
|
+
| `gssh auth status` | Show authentication status |
|
|
244
|
+
|
|
245
|
+
### Hosting (gitspace.sh)
|
|
246
|
+
| Command | Description |
|
|
247
|
+
|---------|-------------|
|
|
248
|
+
| `gssh host reserve <name>` | Reserve subdomain on gitspace.sh |
|
|
249
|
+
| `gssh host release [name]` | Release a subdomain |
|
|
250
|
+
| `gssh host list` | List your subdomains |
|
|
251
|
+
| `gssh host set-primary <name>` | Set primary subdomain |
|
|
252
|
+
| `gssh host status` | Show hosting status |
|
|
253
|
+
|
|
254
|
+
## Remote Access Architecture
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
258
|
+
│ Your Machine │ │ Relay Server │ │ Remote Client │
|
|
259
|
+
│ │ │ │ │ │
|
|
260
|
+
│ gssh serve │◀═════▶│ Routing only │◀═════▶│ gssh connect │
|
|
261
|
+
│ (PTY sessions) │ WebSocket │ E2E encrypted │ WebSocket │ or browser │
|
|
262
|
+
│ │ │ (can't decrypt)│ │ │
|
|
263
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Connection Flow
|
|
267
|
+
|
|
268
|
+
1. Machine runs `gssh serve --relay <url> --token <jwt>`
|
|
269
|
+
2. Machine registers with relay (sends public keys)
|
|
270
|
+
3. Machine creates invite: `gssh share create`
|
|
271
|
+
4. Client connects with invite: `gssh connect <token>`
|
|
272
|
+
5. X3DH handshake establishes session keys
|
|
273
|
+
6. All terminal I/O is E2E encrypted
|
|
274
|
+
|
|
275
|
+
### Cryptographic Primitives
|
|
276
|
+
|
|
277
|
+
| Purpose | Algorithm |
|
|
278
|
+
|---------|-----------|
|
|
279
|
+
| Identity signing | Ed25519 |
|
|
280
|
+
| Key exchange | X25519 |
|
|
281
|
+
| Symmetric encryption | AES-256-GCM |
|
|
282
|
+
| Key derivation | HKDF-SHA256 |
|
|
283
|
+
| JWT signing | HMAC-SHA256 |
|
|
284
|
+
|
|
285
|
+
## TUI/Web Shared Component Pattern
|
|
286
|
+
|
|
287
|
+
Components are split into three files:
|
|
288
|
+
- `Component.tsx` - Logic/hooks (React-compatible)
|
|
289
|
+
- `Component.web.tsx` - Web rendering (React DOM)
|
|
290
|
+
- `Component.tui.tsx` - TUI rendering (OpenTUI)
|
|
291
|
+
|
|
292
|
+
This allows shared business logic with platform-specific rendering.
|
|
293
|
+
|
|
294
|
+
### MachineProvider Abstraction
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
interface MachineProvider {
|
|
298
|
+
getMachineInfo(): Promise<MachineInfo>;
|
|
299
|
+
listProjects(): Promise<Project[]>;
|
|
300
|
+
listWorkspaces(project: string): Promise<Workspace[]>;
|
|
301
|
+
createSession(options): Promise<string>;
|
|
302
|
+
attachSession(sessionId): Promise<SessionStream>;
|
|
303
|
+
detachSession(sessionId): Promise<void>;
|
|
304
|
+
getInbox(): Promise<InboxItem[]>;
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
- `LocalMachineProvider`: Direct filesystem + tmux-lite CLI
|
|
309
|
+
- `RemoteMachineProvider`: Via relay WebSocket
|
|
310
|
+
|
|
311
|
+
## Development Workflow
|
|
312
|
+
|
|
313
|
+
### Building and Testing
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
# Type check
|
|
317
|
+
bun run typecheck
|
|
318
|
+
|
|
319
|
+
# Build
|
|
320
|
+
bun run build
|
|
321
|
+
|
|
322
|
+
# Run TUI
|
|
323
|
+
bun src/index.ts
|
|
324
|
+
|
|
325
|
+
# Run relay
|
|
326
|
+
RELAY_SIGNING_SECRET=secret bun src/index.ts relay start
|
|
327
|
+
|
|
328
|
+
# Run serve
|
|
329
|
+
bun src/index.ts serve --relay ws://localhost:8080/ws --token <jwt>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Code Style
|
|
333
|
+
|
|
334
|
+
- **TypeScript**: ESM modules, strict mode
|
|
335
|
+
- **Error Handling**: Use typed errors from `types/errors.ts`
|
|
336
|
+
- **Logging**: Use `logger` from `utils/logger.ts`
|
|
337
|
+
- **User Prompts**: Use `utils/prompts.ts`
|
|
338
|
+
- **Crypto**: Use `lib/tmux-lite/crypto/` modules
|
|
339
|
+
|
|
340
|
+
## Key Files Reference
|
|
341
|
+
|
|
342
|
+
| Purpose | Location |
|
|
343
|
+
|---------|----------|
|
|
344
|
+
| Entry point | `src/index.ts` |
|
|
345
|
+
| Config management | `src/core/config.ts` |
|
|
346
|
+
| Identity/crypto | `src/core/identity.ts`, `src/lib/tmux-lite/crypto/` |
|
|
347
|
+
| Access control | `src/core/access.ts` |
|
|
348
|
+
| Relay server | `src/relay/server.ts` |
|
|
349
|
+
| Relay protocol | `src/relay/protocol.ts` |
|
|
350
|
+
| Relay registries | `src/relay/registries.ts` |
|
|
351
|
+
| JWT tokens | `src/relay/jwt.ts` (HMAC + Ed25519) |
|
|
352
|
+
| Machine daemon | `src/commands/serve.ts`, `src/serve/` |
|
|
353
|
+
| Daemon lifecycle | `src/serve/daemon.ts` |
|
|
354
|
+
| X3DH handshake | `src/lib/tmux-lite/handshake-handler.ts` |
|
|
355
|
+
| Session management | `src/lib/tmux-lite/server.ts` |
|
|
356
|
+
| Frame protocol | `src/lib/tmux-lite/protocol.ts` |
|
|
357
|
+
| Encrypted frames | `src/lib/tmux-lite/crypto/frames.ts` |
|
|
358
|
+
| Secrets/keychain | `src/utils/secrets.ts` |
|
|
359
|
+
| GitHub auth | `src/commands/auth.ts` |
|
|
360
|
+
| Hosting commands | `src/commands/host.ts` |
|
|
361
|
+
|
|
362
|
+
## External Dependencies
|
|
363
|
+
|
|
364
|
+
**Runtime:**
|
|
365
|
+
- `commander` - CLI framework
|
|
366
|
+
- `@inquirer/prompts` - User prompts
|
|
367
|
+
- `@opentui/core` - Terminal UI framework
|
|
368
|
+
- `@linear/sdk` - Linear API client
|
|
369
|
+
- `chalk` - Terminal colors
|
|
370
|
+
- `ws` - WebSocket (relay)
|
|
371
|
+
- `@noble/curves` - Ed25519/X25519 crypto
|
|
372
|
+
- `@noble/ciphers` - AES-GCM encryption
|
|
373
|
+
- `@noble/hashes` - HKDF, SHA256
|
|
374
|
+
- `@xterm/headless` - Terminal state tracking
|
|
375
|
+
- `ghostty-opentui` - TUI terminal embedding
|
|
376
|
+
|
|
377
|
+
**System Commands:**
|
|
378
|
+
- `gh` - GitHub CLI
|
|
379
|
+
- `git` - Git operations
|
|
380
|
+
|
|
381
|
+
## Documentation
|
|
382
|
+
|
|
383
|
+
| File | Description |
|
|
384
|
+
|------|-------------|
|
|
385
|
+
| `README.md` | User-facing documentation |
|
|
386
|
+
| `AGENTS.md` | This file - development guide |
|
|
387
|
+
| `docs/PROTOCOL.md` | Relay message protocol |
|
|
388
|
+
| `docs/RELAY.md` | Relay server architecture |
|
|
389
|
+
| `docs/GETTING-STARTED.md` | Remote access setup guide |
|
|
390
|
+
| `docs/CONNECTION.md` | Connection state management |
|
|
391
|
+
| `docs/REMOTE-DESIGN.md` | E2E encryption design (identity-based) |
|
|
392
|
+
| `docs/UNIFIED_ARCHITECTURE.md` | TUI/Web architecture plan |
|
|
393
|
+
| `docs/GATEWAY-WORKER.md` | Cloudflare Worker gateway spec |
|
|
394
|
+
| `docs/ROADMAP.md` | Feature roadmap and vision |
|
|
395
|
+
| `docs/INFRASTRUCTURE.md` | Future VM infrastructure (not implemented) |
|
|
396
|
+
| `docs/STACK-DESIGN.md` | Future stacked PR feature (not implemented) |
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Configuration
|
|
401
|
+
|
|
402
|
+
### Config Files
|
|
403
|
+
|
|
404
|
+
| File | Location | Purpose |
|
|
405
|
+
|------|----------|---------|
|
|
406
|
+
| Global config | `~/gitspace/.config.json` | Current project, defaults |
|
|
407
|
+
| Project config | `~/gitspace/{project}/.config.json` | Project-specific settings |
|
|
408
|
+
| Identity | `~/gitspace/.identity/` | Keypairs |
|
|
409
|
+
| Access list | `~/gitspace/.access.json` | Authorized client public keys |
|
|
410
|
+
| Machine info | `~/gitspace/.machine.json` | Machine registration |
|
|
411
|
+
| Relay config | `~/gitspace/.relay.json` | Relay configuration cache |
|
|
412
|
+
| Daemon state | `~/gitspace/.serve/` | PID files, status sockets |
|
|
413
|
+
| tmux-lite state | `/tmp/` | Session data (configurable via `TMUX_LITE_SESSION_DIR`) |
|
|
414
|
+
|
|
415
|
+
### Environment Variables
|
|
416
|
+
|
|
417
|
+
| Variable | Description | Default |
|
|
418
|
+
|----------|-------------|---------|
|
|
419
|
+
| `RELAY_PORT` | Relay server port | `4480` |
|
|
420
|
+
| `RELAY_BIND` | Relay bind address | `0.0.0.0` |
|
|
421
|
+
| `RELAY_SIGNING_SECRET` | Secret for HMAC JWT signing | Required |
|
|
422
|
+
| `RELAY_PRIVATE_KEY` | Base64 Ed25519 private key | Uses keychain |
|
|
423
|
+
| `SPACES_CURRENT_PROJECT` | Override current project | From config |
|
|
424
|
+
| `GITSPACE_API_URL` | gitspace.sh API URL | `https://api.gitspace.sh` |
|
|
425
|
+
|
|
426
|
+
### Default Values
|
|
427
|
+
|
|
428
|
+
| Setting | Default | Location |
|
|
429
|
+
|---------|---------|----------|
|
|
430
|
+
| Projects directory | `~/gitspace` | Global config |
|
|
431
|
+
| Base branch | `main` | Global/project config |
|
|
432
|
+
| Stale workspace days | `30` | Global config |
|
|
433
|
+
| Relay port | `4480` | CLI/env |
|
|
434
|
+
| Default relay URL | `wss://relay.gitspace.sh` | CLI |
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
**Last Updated**: 2025-01
|
|
439
|
+
**Runtime**: Bun / Node.js 18+
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
package/LICENSE
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
MIT License with Non-Compete Clause
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 inKibra, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
1. The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
2. The Software may not be used to create or provide a product or service
|
|
16
|
+
that competes with, or is substantially similar to, gitspace.sh or any
|
|
17
|
+
related product or service offered by inKibra, Inc.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
|
+
SOFTWARE.
|