GitHub Copilot
516f1b1946
Reorganize project into standard root layout
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 22:40:29 +00:00
GitHub Copilot
4e90b65c6b
ci: tighten release workflow cleanup policy
...
Rationalize the release workflow by adding top-level concurrency to avoid overlapping publish runs for the same ref and by restricting cleanup jobs to tag refs only.
Keep ci.yml as the PR/main validation gate while docker.yml remains focused on release publishing and post-release maintenance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 18:21:25 +00:00
GitHub Copilot
3d4dab2359
Finalize Go-only migration, runtime hardening, and CI/container optimization
...
This commit consolidates the full repository transition to a Go-first codebase and captures the follow-up performance/reliability work completed in the same stream.
Highlights:
- Remove Python implementation and test suites (, , , ) and retire Python-specific docs/instructions.
- Move and standardize static web assets under , updating Bun/TypeScript build paths and server static resolution logic.
- Rewrite developer workflow to Makefile-first Go targets (vet/test/race/coverage/fuzz/build) and align repository guidance/docs accordingly.
- Update Docker and CI/CD for leaner artifacts:
- switch to Alpine-based multi-stage build with stripped Go binary
- install only minimal runtime deps (, )
- tighten Docker build context via
- ensure workflows build/publish the target.
- Improve runtime correctness/latency and reduce duplication:
- explicit WebSocket outbound frame typing (text vs binary) instead of payload-byte heuristics
- SSE activity fan-out outside global lock and safer subscriber lifecycle
- shared session output/snapshot helpers to reduce duplicated logic
- restart-safe channel lifecycle for Docker watcher/stats start-stop-start flows
- faster screenshot cold-start path (poll-until-ready within timeout vs fixed sleep).
- Add/expand regression coverage for the above lifecycle and helper paths.
Validation run:
- bun run build
[32mBundled 3 modules in 10ms[0m
[34mterminal.js[33m 0.68 MB [2m(entry point)[0m (Bun typecheck + bundle)
- cd go && go vet ./...
cd go && go test ./...
ok github.com/rcarmo/webterm-go-port/cmd/webterm (cached)
ok github.com/rcarmo/webterm-go-port/internal/terminalstate (cached)
ok github.com/rcarmo/webterm-go-port/webterm (cached)
cd go && go test ./webterm -coverprofile=coverage.out && go tool cover -func=coverage.out
ok github.com/rcarmo/webterm-go-port/webterm (cached) coverage: 81.0% of statements
github.com/rcarmo/webterm-go-port/webterm/cli.go:14: RunCLI 51.6%
github.com/rcarmo/webterm-go-port/webterm/config.go:25: DefaultConfig 100.0%
github.com/rcarmo/webterm-go-port/webterm/config.go:29: LoadLandingYAML 82.6%
github.com/rcarmo/webterm-go-port/webterm/config.go:70: LoadComposeManifest 76.9%
github.com/rcarmo/webterm-go-port/webterm/config.go:114: extractLabel 92.3%
github.com/rcarmo/webterm-go-port/webterm/config.go:138: asString 80.0%
github.com/rcarmo/webterm-go-port/webterm/constants.go:27: EnvBool 50.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:30: Read 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:56: NewDockerExecSession 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:72: Open 90.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:99: Start 85.7%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:119: readLoop 83.3%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:143: handleOutput 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:153: createExec 75.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:183: startExecSocket 60.7%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:219: resizeExec 83.3%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:237: Close 90.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:250: Wait 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:257: SetTerminalSize 81.8%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:274: ForceRedraw 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:281: SendBytes 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:294: SendMeta 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:298: IsRunning 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:304: GetReplayBuffer 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:308: GetScreenSnapshot 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_exec_session.go:316: UpdateConnector 80.0%
github.com/rcarmo/webterm-go-port/webterm/docker_http.go:23: DockerSocketPath 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_http.go:37: newUnixHTTPClient 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_http.go:47: sharedUnixClient 91.7%
github.com/rcarmo/webterm-go-port/webterm/docker_http.go:64: unixJSONRequest 84.2%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:33: NewDockerStatsCollector 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:47: Available 72.7%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:64: Start 80.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:78: Stop 75.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:90: AddService 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:101: RemoveService 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:115: GetCPUHistory 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:124: pollLoop 95.2%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:160: discoverContainers 65.4%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:198: pollContainer 77.8%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:223: calculateCPUPercent 69.2%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:260: RenderSparklineSVG 89.3%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:299: max 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:306: toAnyMap 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:323: toStringMap 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:331: toAnySlice 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:340: toStringSlice 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:351: toUint 91.7%
github.com/rcarmo/webterm-go-port/webterm/docker_stats.go:376: toInt 85.7%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:34: NewDockerWatcher 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:54: hasWebtermLabel 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:60: isAutoLabel 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:67: getContainerCommand 80.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:76: getContainerTheme 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:81: getContainerName 42.9%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:93: containerToSlug 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:98: addContainer 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:119: removeContainer 100.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:143: listLabeledContainers 94.1%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:168: handleEvent 80.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:202: watchEvents 85.7%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:239: ScanExisting 60.0%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:249: Start 83.3%
github.com/rcarmo/webterm-go-port/webterm/docker_watcher.go:265: Stop 81.8%
github.com/rcarmo/webterm-go-port/webterm/identity.go:12: GenerateID 94.1%
github.com/rcarmo/webterm-go-port/webterm/normalize.go:13: FilterDASequences 83.3%
github.com/rcarmo/webterm-go-port/webterm/replay.go:14: NewReplayBuffer 66.7%
github.com/rcarmo/webterm-go-port/webterm/replay.go:21: Add 100.0%
github.com/rcarmo/webterm-go-port/webterm/replay.go:43: Bytes 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:95: OnData 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go💯 OnBinary 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:105: OnMeta 0.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:107: OnClose 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:112: NewLocalServer 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:163: findStaticPath 62.5%
github.com/rcarmo/webterm-go-port/webterm/server.go:184: markRouteActivity 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:207: enqueueWSFrame 77.8%
github.com/rcarmo/webterm-go-port/webterm/server.go:233: stopWSClient 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:246: wsSender 80.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:256: createTerminalSession 66.7%
github.com/rcarmo/webterm-go-port/webterm/server.go:278: clampInt 60.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:288: parseResizePayload 88.9%
github.com/rcarmo/webterm-go-port/webterm/server.go:303: handleWebSocket 81.1%
github.com/rcarmo/webterm-go-port/webterm/server.go:425: chooseRouteForScreenshot 50.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:440: screenshotTTL 66.7%
github.com/rcarmo/webterm-go-port/webterm/server.go:457: handleScreenshot 55.7%
github.com/rcarmo/webterm-go-port/webterm/server.go:541: handleCPUSparkline 94.4%
github.com/rcarmo/webterm-go-port/webterm/server.go:566: handleEvents 76.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:602: toIntFromQuery 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:609: dashboardTiles 81.8%
github.com/rcarmo/webterm-go-port/webterm/server.go:631: handleTiles 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:636: getWSURL 65.2%
github.com/rcarmo/webterm-go-port/webterm/server.go:671: handleRoot 56.8%
github.com/rcarmo/webterm-go-port/webterm/server.go:732: htmlEscape 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:736: htmlAttrEscape 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:740: handleHealth 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:744: setupDockerFeatures 40.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:791: shutdown 62.5%
github.com/rcarmo/webterm-go-port/webterm/server.go:814: Handler 100.0%
github.com/rcarmo/webterm-go-port/webterm/server.go:829: Run 77.8%
github.com/rcarmo/webterm-go-port/webterm/session.go:31: OnData 0.0%
github.com/rcarmo/webterm-go-port/webterm/session.go:32: OnBinary 0.0%
github.com/rcarmo/webterm-go-port/webterm/session.go:33: OnMeta 0.0%
github.com/rcarmo/webterm-go-port/webterm/session.go:34: OnClose 0.0%
github.com/rcarmo/webterm-go-port/webterm/session.go:36: dispatchSessionOutput 100.0%
github.com/rcarmo/webterm-go-port/webterm/session.go:47: snapshotFromTracker 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:20: NewSessionManager 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:34: SetSessionFactory 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:40: defaultSessionFactory 87.5%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:57: splitCommand 75.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:65: shlexSplit 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:69: AddApp 87.5%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:88: RemoveApp 87.5%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:101: Apps 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:107: AppBySlug 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:114: GetDefaultApp 80.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:123: NewSession 50.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:167: OnSessionEnd 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:176: CloseAll 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:189: CloseSession 87.5%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:201: GetSession 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:207: GetSessionByRouteKey 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:217: GetSessionIDByRouteKey 100.0%
github.com/rcarmo/webterm-go-port/webterm/session_manager.go:223: GetFirstRunningSession 85.7%
github.com/rcarmo/webterm-go-port/webterm/shellsplit.go:5: shlexSplitImpl 100.0%
github.com/rcarmo/webterm-go-port/webterm/slugify.go:13: Slugify 100.0%
github.com/rcarmo/webterm-go-port/webterm/svg_exporter.go:35: RenderTerminalSVG 92.6%
github.com/rcarmo/webterm-go-port/webterm/svg_exporter.go:113: colorToHex 87.5%
github.com/rcarmo/webterm-go-port/webterm/svg_exporter.go:139: isHex 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:37: NewTerminalSession 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:49: Open 86.7%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:90: Start 85.7%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:110: readLoop 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:132: handleOutput 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:142: Close 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:160: Wait 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:167: SetTerminalSize 80.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:190: ForceRedraw 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:198: SendBytes 88.9%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:211: SendMeta 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:215: IsRunning 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:221: GetReplayBuffer 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:225: GetScreenSnapshot 100.0%
github.com/rcarmo/webterm-go-port/webterm/terminal_session.go:233: UpdateConnector 80.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:14: NewTwoWayMap 100.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:21: Set 88.9%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:36: DeleteKey 100.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:45: Get 100.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:52: GetKey 100.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:59: Keys 100.0%
github.com/rcarmo/webterm-go-port/webterm/twoway.go:70: UnsafeForward 100.0%
total: (statements) 81.0%
- cd go && go test -race ./...
ok github.com/rcarmo/webterm-go-port/cmd/webterm (cached)
ok github.com/rcarmo/webterm-go-port/internal/terminalstate (cached)
ok github.com/rcarmo/webterm-go-port/webterm (cached)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 18:03:28 +00:00
GitHub Copilot
5aa9eb9426
chore: incorporate relevant agentbox skel files
...
Add relevant skeleton files from rcarmo/agentbox/skel for this repo:
- .github/workflows/ci.yml (Makefile checks + conditional Go tests)
- .github/instructions/{00-project-detection,docker-image,frontend-bun,go,python}.instructions.md
Instruction files were adapted where needed to match current workflow names
and repository layout (Go module under go/, Docker workflow filename).
Validated with make check and go test ./... .
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 16:44:44 +00:00
GitHub Copilot
f5c2a80644
Fix tmux alt-screen handling
...
- handle DECSET ?47 as an alternate screen mode so tmux clear redraws don't overlay stale content in screenshots
- keep AltScreen mode checks aligned with 47/1047/1048/1049 variants used by full-screen TUIs
- document the screenshot debugging workflow in .github/skills/screenshot-debugging/SKILL.md for repeatable escape-sequence analysis
2026-02-04 07:13:26 +00:00
GitHub Copilot
074832cff2
fix: CI/CD + server bugs
2026-01-29 17:51:51 +00:00
GitHub Copilot
5a59f054a2
Add workflow cleanup pruning
2026-01-28 22:53:17 +00:00
GitHub Copilot
126a4bc712
Fix screenshot affecting terminal state in open sessions
...
- Add get_screen_snapshot() method that doesn't mutate terminal state
- Use change counter for reliable activity detection instead of dirty flag
- Update screenshot handler to use non-mutating snapshot method
- Refactor tests to use shared fixtures and reduce duplication
- Update copilot-instructions.md with detailed Makefile usage
2026-01-28 20:15:51 +00:00
GitHub Copilot
77288ff589
Bump version to 1.1.3 and fix CI/CD workflow
2026-01-28 19:55:40 +00:00
GitHub Copilot
b4d7f2e98a
Bump minor version and update ghostty-web
2026-01-28 16:13:08 +00:00
GitHub Copilot
8ee6f2d605
Fix proposeDimensions error by checking terminal readiness first
...
Add isTerminalReady() check before calling fitAddon.proposeDimensions()
in the initial fit loop to prevent 'viewport.scrollBarWidth' TypeError
when terminal is not fully initialized.
2026-01-28 00:39:37 +00:00
Rui Carmo
a0e31d43fd
merge
2026-01-21 23:53:57 +00:00