izackp
ac18f65094
docs: update README, AGENTS.md, Makefile, and architecture docs
CI / check (push) Has been cancelled
2026-06-04 22:10:50 -04:00
GitHub Copilot
98e000e3be
Fix module path mismatch for go install
...
Resolve GitHub issue #2 by aligning the Go module identity with the repository path so works.
Changes made:
- Updated go.mod module path from github.com/rcarmo/webterm-go-port to github.com/rcarmo/webterm.
- Updated all internal import references to the new module path.
- Updated version ldflags in Makefile and Dockerfile to use github.com/rcarmo/webterm/webterm.Version.
- Added README quick-install section documenting the command.
Validation:
- Ran make check successfully after the rename/import updates.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-15 16:19:46 +00:00
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
0ca413f10c
webterm: restore Python-style dashboard search and add gzip
...
Restore dashboard typeahead behavior to match the Python version with floating results, keyboard navigation, tile highlighting, and Enter-to-open handling.
Add HTTP gzip compression middleware (while excluding WebSocket upgrades) to reduce SVG transfer size, and add a safe make push target that pushes current branch plus tags on HEAD.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 19:19:49 +00:00
GitHub Copilot
cb36beaf2e
build: add VERSION-based release workflow
...
Introduce VERSION as the app version source of truth and add make bump-patch to increment VERSION, commit, and create a matching vX.Y.Z tag.
Wire VERSION into build outputs by injecting it into webterm.Version for make build-go and Docker image builds, and include VERSION in Docker build context.
Also remove the visible dashboard container count subtitle while keeping count updates in browser console logs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-02-14 18:58:59 +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
19f455d293
fix: font initialization and DA1 response filtering
...
- Use terminal.loadFonts() API for proper font re-measurement after web fonts load
- Add documentation referencing ghostty-web commit feab41f9a8e4491f
- Handle DA1 responses split across socket reads with escape sequence buffering
- Update Makefile push target to explicitly push current tag
2026-01-29 18:54:50 +00:00
GitHub Copilot
8dc16b59e2
Add Docker exec PTY sessions
2026-01-29 13:18:31 +00:00
GitHub Copilot
f0afcd2ed6
Persist dev dependencies in Makefile
2026-01-28 21:11:38 +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
b4d7f2e98a
Bump minor version and update ghostty-web
2026-01-28 16:13:08 +00:00
GitHub Copilot
8463b37e9e
Fix theme support and improve tooling
...
- Fix ITheme property: selection -> selectionBackground (ghostty-web compat)
- Add dynamic body background color matching theme
- Add THEME_BACKGROUNDS mapping in local_server.py
- Add tsconfig.json for TypeScript type checking
- Update Makefile to use bun run for all frontend commands
- Add typecheck script to package.json (make build now typechecks)
- Add detailed console tracing for theme debugging
- Store fontFamily/fontSize in WebTerminal class for cell measurement
v0.6.5
2026-01-28 09:26:49 +00:00
GitHub Copilot
7945cf5ca5
Add bump-patch Makefile target for version management
2026-01-28 07:26:09 +00:00
GitHub Copilot
5dbb91ca32
Improve Makefile for reproducible builds
...
- Add build-all target for full clean rebuild
- Use file-based dependencies for proper incremental builds
- terminal.js depends on terminal.ts and node_modules
- ghostty-vt.wasm depends on node_modules
- Add build alias for bundle
- Add clean-all to remove everything
- Improve help text with organized sections
- Fix __pycache__ cleanup pattern
2026-01-28 00:57:22 +00:00
GitHub Copilot
315b87eefe
Update build scripts to copy WASM file
...
- package.json: build script now copies ghostty-vt.wasm after bundling
- Add copy-wasm script for standalone WASM copy
- Makefile: bundle-watch copies WASM before watching
- Makefile: bundle-clean removes WASM file too
- Fix bun.lockb -> bun.lock in clean target
2026-01-28 00:56:01 +00:00
GitHub Copilot
6f624b8565
Replace textual-serve with direct xterm.js 6.0 bundle
...
- Add package.json with @xterm/xterm 6.0 and all addons
- Create terminal.ts client with WebSocket protocol support
- Bundle with Bun (bun run build -> terminal.js)
- Remove textual-serve dependency from pyproject.toml
- Remove canvas monkey-patch workaround (no longer needed)
- Add scrollback support (configurable via data-scrollback)
- Update static file routing to serve from /static/
- Add Makefile targets: bundle, bundle-watch, bundle-clean
- Update tests for new static path structure
Benefits:
- Full control over xterm.js configuration
- Scrollback history now works (default 1000 lines)
- Custom font family without workarounds
- Smaller footprint (no unused Roboto Mono fonts)
- Latest xterm.js 6.0 features available
2026-01-25 12:45:50 +00:00
Rui Carmo
a0e31d43fd
merge
2026-01-21 23:53:57 +00:00