diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 31c1110..38abf02 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -12,7 +12,7 @@ "name": "firefly-agent-bridge", "source": "./integrations/claude-code", "description": "Local jobs and workflows through your configured official Codex or Claude Code subscription.", - "version": "0.2.18", + "version": "0.2.19", "author": { "name": "@ancongui", "url": "https://github.com/ancongui" diff --git a/CHANGELOG.md b/CHANGELOG.md index 06e0465..4117dcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ # Changelog +## 0.2.19 - 2026-10-22 + +- Show the desktop Connect screenshot across the desktop dashboard guide and keep the phone capture on narrow screens, with matching light and dark variants. +- Replace repeated Connect badges on locked navigation items with compact lock indicators. Preserve the accessible Connect required description and existing destination gate. +- Refresh the controlled console captures and release metadata together. Add browser checks for single-line navigation labels, accessible locked destinations and the guide screenshot selection. + ## 0.2.18 - 2026-10-22 - Reflow all nine architecture and workflow diagrams into two columns on wider pages and one column on phones. Light and dark variants embed Manrope and keep labels inside their cards. diff --git a/assets/docs.css b/assets/docs.css index cfe01dc..b1b15c1 100644 --- a/assets/docs.css +++ b/assets/docs.css @@ -617,6 +617,17 @@ .md-typeset .bridge-shot--phone .bridge-shot__link { max-width: min(100%, 320px); } +.bridge-shot__mobile { + display: none; +} +@media (max-width: 760px) { + .bridge-shot__desktop { + display: none; + } + .bridge-shot__mobile { + display: block; + } +} [data-md-color-scheme="default"] .bridge-shot__link.theme-dark, [data-md-color-scheme="slate"] .bridge-shot__link.theme-light { display: none; diff --git a/assets/screenshots/activity-desktop-dark.png b/assets/screenshots/activity-desktop-dark.png index cdfb89a..781dde2 100644 Binary files a/assets/screenshots/activity-desktop-dark.png and b/assets/screenshots/activity-desktop-dark.png differ diff --git a/assets/screenshots/activity-desktop-light.png b/assets/screenshots/activity-desktop-light.png index b90fad6..463e71d 100644 Binary files a/assets/screenshots/activity-desktop-light.png and b/assets/screenshots/activity-desktop-light.png differ diff --git a/assets/screenshots/activity-desktop.png b/assets/screenshots/activity-desktop.png index cd33985..6f4c13b 100644 Binary files a/assets/screenshots/activity-desktop.png and b/assets/screenshots/activity-desktop.png differ diff --git a/assets/screenshots/completion-desktop-dark.png b/assets/screenshots/completion-desktop-dark.png index fa4c67f..91120e5 100644 Binary files a/assets/screenshots/completion-desktop-dark.png and b/assets/screenshots/completion-desktop-dark.png differ diff --git a/assets/screenshots/completion-desktop-light.png b/assets/screenshots/completion-desktop-light.png index 99320a6..5581f5a 100644 Binary files a/assets/screenshots/completion-desktop-light.png and b/assets/screenshots/completion-desktop-light.png differ diff --git a/assets/screenshots/completion-desktop.png b/assets/screenshots/completion-desktop.png index a71853f..de20cd3 100644 Binary files a/assets/screenshots/completion-desktop.png and b/assets/screenshots/completion-desktop.png differ diff --git a/assets/screenshots/connect-desktop-dark.png b/assets/screenshots/connect-desktop-dark.png index 1178423..bb08d1d 100644 Binary files a/assets/screenshots/connect-desktop-dark.png and b/assets/screenshots/connect-desktop-dark.png differ diff --git a/assets/screenshots/connect-desktop-light.png b/assets/screenshots/connect-desktop-light.png index c4cfadb..76b141d 100644 Binary files a/assets/screenshots/connect-desktop-light.png and b/assets/screenshots/connect-desktop-light.png differ diff --git a/assets/screenshots/connect-desktop.png b/assets/screenshots/connect-desktop.png index 91d00b0..584c30a 100644 Binary files a/assets/screenshots/connect-desktop.png and b/assets/screenshots/connect-desktop.png differ diff --git a/assets/screenshots/connect-mobile-light.png b/assets/screenshots/connect-mobile-light.png index 16fae88..edc605d 100644 Binary files a/assets/screenshots/connect-mobile-light.png and b/assets/screenshots/connect-mobile-light.png differ diff --git a/assets/screenshots/dashboard-desktop-dark.png b/assets/screenshots/dashboard-desktop-dark.png index 5e70201..c969a81 100644 Binary files a/assets/screenshots/dashboard-desktop-dark.png and b/assets/screenshots/dashboard-desktop-dark.png differ diff --git a/assets/screenshots/dashboard-desktop-light.png b/assets/screenshots/dashboard-desktop-light.png index 4dd24bf..d4ac3bd 100644 Binary files a/assets/screenshots/dashboard-desktop-light.png and b/assets/screenshots/dashboard-desktop-light.png differ diff --git a/assets/screenshots/dashboard-desktop.png b/assets/screenshots/dashboard-desktop.png index c500390..c4ba276 100644 Binary files a/assets/screenshots/dashboard-desktop.png and b/assets/screenshots/dashboard-desktop.png differ diff --git a/assets/screenshots/diagnostics-dark-desktop.png b/assets/screenshots/diagnostics-dark-desktop.png index 91c918c..f168324 100644 Binary files a/assets/screenshots/diagnostics-dark-desktop.png and b/assets/screenshots/diagnostics-dark-desktop.png differ diff --git a/assets/screenshots/diagnostics-desktop-dark.png b/assets/screenshots/diagnostics-desktop-dark.png index ffae618..6f73b57 100644 Binary files a/assets/screenshots/diagnostics-desktop-dark.png and b/assets/screenshots/diagnostics-desktop-dark.png differ diff --git a/assets/screenshots/diagnostics-desktop-light.png b/assets/screenshots/diagnostics-desktop-light.png index 888ac82..62f679a 100644 Binary files a/assets/screenshots/diagnostics-desktop-light.png and b/assets/screenshots/diagnostics-desktop-light.png differ diff --git a/assets/screenshots/diagnostics-desktop.png b/assets/screenshots/diagnostics-desktop.png index 80400bf..6ec3c8b 100644 Binary files a/assets/screenshots/diagnostics-desktop.png and b/assets/screenshots/diagnostics-desktop.png differ diff --git a/assets/screenshots/diagnostics-light-desktop.png b/assets/screenshots/diagnostics-light-desktop.png index 57a9388..e737018 100644 Binary files a/assets/screenshots/diagnostics-light-desktop.png and b/assets/screenshots/diagnostics-light-desktop.png differ diff --git a/assets/screenshots/diagnostics-light-mobile.png b/assets/screenshots/diagnostics-light-mobile.png index f31e176..3109283 100644 Binary files a/assets/screenshots/diagnostics-light-mobile.png and b/assets/screenshots/diagnostics-light-mobile.png differ diff --git a/assets/screenshots/diagnostics-mobile-dark.png b/assets/screenshots/diagnostics-mobile-dark.png index c2711c7..48f1e24 100644 Binary files a/assets/screenshots/diagnostics-mobile-dark.png and b/assets/screenshots/diagnostics-mobile-dark.png differ diff --git a/assets/screenshots/diagnostics-mobile-light.png b/assets/screenshots/diagnostics-mobile-light.png index 7e035d0..9a7b876 100644 Binary files a/assets/screenshots/diagnostics-mobile-light.png and b/assets/screenshots/diagnostics-mobile-light.png differ diff --git a/assets/screenshots/diagnostics-mobile.png b/assets/screenshots/diagnostics-mobile.png index e652b01..025b017 100644 Binary files a/assets/screenshots/diagnostics-mobile.png and b/assets/screenshots/diagnostics-mobile.png differ diff --git a/assets/screenshots/diagnostics-tablet-dark.png b/assets/screenshots/diagnostics-tablet-dark.png index e11f366..7833635 100644 Binary files a/assets/screenshots/diagnostics-tablet-dark.png and b/assets/screenshots/diagnostics-tablet-dark.png differ diff --git a/assets/screenshots/diagnostics-tablet-light.png b/assets/screenshots/diagnostics-tablet-light.png index 838e66a..7a9e877 100644 Binary files a/assets/screenshots/diagnostics-tablet-light.png and b/assets/screenshots/diagnostics-tablet-light.png differ diff --git a/assets/screenshots/diagnostics-tablet.png b/assets/screenshots/diagnostics-tablet.png index 1587bf1..58fcac6 100644 Binary files a/assets/screenshots/diagnostics-tablet.png and b/assets/screenshots/diagnostics-tablet.png differ diff --git a/assets/screenshots/files-code-desktop-dark.png b/assets/screenshots/files-code-desktop-dark.png index a562cbf..c1976fa 100644 Binary files a/assets/screenshots/files-code-desktop-dark.png and b/assets/screenshots/files-code-desktop-dark.png differ diff --git a/assets/screenshots/files-code-desktop-light.png b/assets/screenshots/files-code-desktop-light.png index d7b3ad7..1e77a0f 100644 Binary files a/assets/screenshots/files-code-desktop-light.png and b/assets/screenshots/files-code-desktop-light.png differ diff --git a/assets/screenshots/files-desktop-dark.png b/assets/screenshots/files-desktop-dark.png index 004f95a..78baba3 100644 Binary files a/assets/screenshots/files-desktop-dark.png and b/assets/screenshots/files-desktop-dark.png differ diff --git a/assets/screenshots/files-desktop-light.png b/assets/screenshots/files-desktop-light.png index f090ff1..72da16e 100644 Binary files a/assets/screenshots/files-desktop-light.png and b/assets/screenshots/files-desktop-light.png differ diff --git a/assets/screenshots/files-desktop.png b/assets/screenshots/files-desktop.png index 44f2f40..b7263a2 100644 Binary files a/assets/screenshots/files-desktop.png and b/assets/screenshots/files-desktop.png differ diff --git a/assets/screenshots/jobs-dark-desktop.png b/assets/screenshots/jobs-dark-desktop.png index 78c6731..da916a4 100644 Binary files a/assets/screenshots/jobs-dark-desktop.png and b/assets/screenshots/jobs-dark-desktop.png differ diff --git a/assets/screenshots/jobs-dark-mobile.png b/assets/screenshots/jobs-dark-mobile.png index f672f08..a112b71 100644 Binary files a/assets/screenshots/jobs-dark-mobile.png and b/assets/screenshots/jobs-dark-mobile.png differ diff --git a/assets/screenshots/jobs-light-desktop.png b/assets/screenshots/jobs-light-desktop.png index eef23c0..1d7ffd3 100644 Binary files a/assets/screenshots/jobs-light-desktop.png and b/assets/screenshots/jobs-light-desktop.png differ diff --git a/assets/screenshots/jobs-light-mobile.png b/assets/screenshots/jobs-light-mobile.png index e3b280c..631e2da 100644 Binary files a/assets/screenshots/jobs-light-mobile.png and b/assets/screenshots/jobs-light-mobile.png differ diff --git a/assets/screenshots/new-job-desktop-dark.png b/assets/screenshots/new-job-desktop-dark.png index 3866b1c..3a51f74 100644 Binary files a/assets/screenshots/new-job-desktop-dark.png and b/assets/screenshots/new-job-desktop-dark.png differ diff --git a/assets/screenshots/new-job-desktop-light.png b/assets/screenshots/new-job-desktop-light.png index 2c14295..109e236 100644 Binary files a/assets/screenshots/new-job-desktop-light.png and b/assets/screenshots/new-job-desktop-light.png differ diff --git a/assets/screenshots/new-job-desktop.png b/assets/screenshots/new-job-desktop.png index 6dc18e6..8b59355 100644 Binary files a/assets/screenshots/new-job-desktop.png and b/assets/screenshots/new-job-desktop.png differ diff --git a/assets/screenshots/new-job-execution-desktop-dark.png b/assets/screenshots/new-job-execution-desktop-dark.png index 35cf0dd..d58410b 100644 Binary files a/assets/screenshots/new-job-execution-desktop-dark.png and b/assets/screenshots/new-job-execution-desktop-dark.png differ diff --git a/assets/screenshots/new-job-execution-desktop-light.png b/assets/screenshots/new-job-execution-desktop-light.png index 0d89999..b035725 100644 Binary files a/assets/screenshots/new-job-execution-desktop-light.png and b/assets/screenshots/new-job-execution-desktop-light.png differ diff --git a/assets/screenshots/new-job-execution-desktop.png b/assets/screenshots/new-job-execution-desktop.png index 9e46e4b..7fc5141 100644 Binary files a/assets/screenshots/new-job-execution-desktop.png and b/assets/screenshots/new-job-execution-desktop.png differ diff --git a/assets/screenshots/new-job-execution-mobile-dark.png b/assets/screenshots/new-job-execution-mobile-dark.png index c58d1c0..7094f83 100644 Binary files a/assets/screenshots/new-job-execution-mobile-dark.png and b/assets/screenshots/new-job-execution-mobile-dark.png differ diff --git a/assets/screenshots/new-job-execution-mobile-light.png b/assets/screenshots/new-job-execution-mobile-light.png index 2cc5e2f..58e248b 100644 Binary files a/assets/screenshots/new-job-execution-mobile-light.png and b/assets/screenshots/new-job-execution-mobile-light.png differ diff --git a/assets/screenshots/new-job-execution-mobile.png b/assets/screenshots/new-job-execution-mobile.png index 70da4ad..ac181cc 100644 Binary files a/assets/screenshots/new-job-execution-mobile.png and b/assets/screenshots/new-job-execution-mobile.png differ diff --git a/assets/screenshots/new-job-mobile-dark.png b/assets/screenshots/new-job-mobile-dark.png index 553559d..8cfb06d 100644 Binary files a/assets/screenshots/new-job-mobile-dark.png and b/assets/screenshots/new-job-mobile-dark.png differ diff --git a/assets/screenshots/new-job-mobile-light.png b/assets/screenshots/new-job-mobile-light.png index fabe546..ed68871 100644 Binary files a/assets/screenshots/new-job-mobile-light.png and b/assets/screenshots/new-job-mobile-light.png differ diff --git a/assets/screenshots/new-job-mobile.png b/assets/screenshots/new-job-mobile.png index b679a9d..404f3e9 100644 Binary files a/assets/screenshots/new-job-mobile.png and b/assets/screenshots/new-job-mobile.png differ diff --git a/assets/screenshots/new-job-review-desktop-dark.png b/assets/screenshots/new-job-review-desktop-dark.png index 9393fde..51ce522 100644 Binary files a/assets/screenshots/new-job-review-desktop-dark.png and b/assets/screenshots/new-job-review-desktop-dark.png differ diff --git a/assets/screenshots/new-job-review-desktop-light.png b/assets/screenshots/new-job-review-desktop-light.png index e26208c..2e74232 100644 Binary files a/assets/screenshots/new-job-review-desktop-light.png and b/assets/screenshots/new-job-review-desktop-light.png differ diff --git a/assets/screenshots/new-job-review-desktop.png b/assets/screenshots/new-job-review-desktop.png index c1694b4..223c73c 100644 Binary files a/assets/screenshots/new-job-review-desktop.png and b/assets/screenshots/new-job-review-desktop.png differ diff --git a/assets/screenshots/new-job-review-mobile-dark.png b/assets/screenshots/new-job-review-mobile-dark.png index 9ff5684..2c98673 100644 Binary files a/assets/screenshots/new-job-review-mobile-dark.png and b/assets/screenshots/new-job-review-mobile-dark.png differ diff --git a/assets/screenshots/new-job-review-mobile-light.png b/assets/screenshots/new-job-review-mobile-light.png index cce2f19..d87adde 100644 Binary files a/assets/screenshots/new-job-review-mobile-light.png and b/assets/screenshots/new-job-review-mobile-light.png differ diff --git a/assets/screenshots/new-job-review-mobile.png b/assets/screenshots/new-job-review-mobile.png index a6f8851..821b8c6 100644 Binary files a/assets/screenshots/new-job-review-mobile.png and b/assets/screenshots/new-job-review-mobile.png differ diff --git a/assets/screenshots/providers-dark-desktop.png b/assets/screenshots/providers-dark-desktop.png index fced2af..97e6f5e 100644 Binary files a/assets/screenshots/providers-dark-desktop.png and b/assets/screenshots/providers-dark-desktop.png differ diff --git a/assets/screenshots/providers-desktop-dark.png b/assets/screenshots/providers-desktop-dark.png index 7794fa9..db8d3c8 100644 Binary files a/assets/screenshots/providers-desktop-dark.png and b/assets/screenshots/providers-desktop-dark.png differ diff --git a/assets/screenshots/providers-desktop-light.png b/assets/screenshots/providers-desktop-light.png index fdf13be..430b996 100644 Binary files a/assets/screenshots/providers-desktop-light.png and b/assets/screenshots/providers-desktop-light.png differ diff --git a/assets/screenshots/providers-desktop.png b/assets/screenshots/providers-desktop.png index 84aa92f..d2036e2 100644 Binary files a/assets/screenshots/providers-desktop.png and b/assets/screenshots/providers-desktop.png differ diff --git a/assets/screenshots/providers-light-desktop.png b/assets/screenshots/providers-light-desktop.png index 5d4a304..682b03a 100644 Binary files a/assets/screenshots/providers-light-desktop.png and b/assets/screenshots/providers-light-desktop.png differ diff --git a/assets/screenshots/providers-mobile-dark.png b/assets/screenshots/providers-mobile-dark.png index 3e0e800..d507d45 100644 Binary files a/assets/screenshots/providers-mobile-dark.png and b/assets/screenshots/providers-mobile-dark.png differ diff --git a/assets/screenshots/providers-mobile-light.png b/assets/screenshots/providers-mobile-light.png index 7ea8792..3cf9983 100644 Binary files a/assets/screenshots/providers-mobile-light.png and b/assets/screenshots/providers-mobile-light.png differ diff --git a/assets/screenshots/providers-mobile.png b/assets/screenshots/providers-mobile.png index 300606a..8452f3c 100644 Binary files a/assets/screenshots/providers-mobile.png and b/assets/screenshots/providers-mobile.png differ diff --git a/assets/screenshots/setup-login-desktop-dark.png b/assets/screenshots/setup-login-desktop-dark.png index 6cbb594..9b035db 100644 Binary files a/assets/screenshots/setup-login-desktop-dark.png and b/assets/screenshots/setup-login-desktop-dark.png differ diff --git a/assets/screenshots/setup-login-desktop-light.png b/assets/screenshots/setup-login-desktop-light.png index 8d67957..fea4dcb 100644 Binary files a/assets/screenshots/setup-login-desktop-light.png and b/assets/screenshots/setup-login-desktop-light.png differ diff --git a/assets/screenshots/setup-login-desktop.png b/assets/screenshots/setup-login-desktop.png index 83ce00c..6b45d37 100644 Binary files a/assets/screenshots/setup-login-desktop.png and b/assets/screenshots/setup-login-desktop.png differ diff --git a/assets/screenshots/setup-profile-desktop-dark.png b/assets/screenshots/setup-profile-desktop-dark.png index f6ff922..6073bf4 100644 Binary files a/assets/screenshots/setup-profile-desktop-dark.png and b/assets/screenshots/setup-profile-desktop-dark.png differ diff --git a/assets/screenshots/setup-profile-desktop-light.png b/assets/screenshots/setup-profile-desktop-light.png index dca1631..abddb94 100644 Binary files a/assets/screenshots/setup-profile-desktop-light.png and b/assets/screenshots/setup-profile-desktop-light.png differ diff --git a/assets/screenshots/setup-profile-desktop.png b/assets/screenshots/setup-profile-desktop.png index 430075a..3bc36c7 100644 Binary files a/assets/screenshots/setup-profile-desktop.png and b/assets/screenshots/setup-profile-desktop.png differ diff --git a/assets/screenshots/setup-provider-desktop-dark.png b/assets/screenshots/setup-provider-desktop-dark.png index 716ad8d..809ec1d 100644 Binary files a/assets/screenshots/setup-provider-desktop-dark.png and b/assets/screenshots/setup-provider-desktop-dark.png differ diff --git a/assets/screenshots/setup-provider-desktop-light.png b/assets/screenshots/setup-provider-desktop-light.png index e9072cd..8aa468c 100644 Binary files a/assets/screenshots/setup-provider-desktop-light.png and b/assets/screenshots/setup-provider-desktop-light.png differ diff --git a/assets/screenshots/setup-provider-desktop.png b/assets/screenshots/setup-provider-desktop.png index b176d1a..d3f80a6 100644 Binary files a/assets/screenshots/setup-provider-desktop.png and b/assets/screenshots/setup-provider-desktop.png differ diff --git a/assets/screenshots/setup-tools-desktop-dark.png b/assets/screenshots/setup-tools-desktop-dark.png index e4654ba..8032f7d 100644 Binary files a/assets/screenshots/setup-tools-desktop-dark.png and b/assets/screenshots/setup-tools-desktop-dark.png differ diff --git a/assets/screenshots/setup-tools-desktop-light.png b/assets/screenshots/setup-tools-desktop-light.png index 571b033..d4aa93a 100644 Binary files a/assets/screenshots/setup-tools-desktop-light.png and b/assets/screenshots/setup-tools-desktop-light.png differ diff --git a/assets/screenshots/setup-tools-desktop.png b/assets/screenshots/setup-tools-desktop.png index f761260..1140baf 100644 Binary files a/assets/screenshots/setup-tools-desktop.png and b/assets/screenshots/setup-tools-desktop.png differ diff --git a/assets/screenshots/template-editor-desktop-dark.png b/assets/screenshots/template-editor-desktop-dark.png index d27abc2..91a2615 100644 Binary files a/assets/screenshots/template-editor-desktop-dark.png and b/assets/screenshots/template-editor-desktop-dark.png differ diff --git a/assets/screenshots/template-editor-desktop-light.png b/assets/screenshots/template-editor-desktop-light.png index 8529d99..c6d56ec 100644 Binary files a/assets/screenshots/template-editor-desktop-light.png and b/assets/screenshots/template-editor-desktop-light.png differ diff --git a/assets/screenshots/template-editor-desktop.png b/assets/screenshots/template-editor-desktop.png index f5dd718..2fc5fcf 100644 Binary files a/assets/screenshots/template-editor-desktop.png and b/assets/screenshots/template-editor-desktop.png differ diff --git a/assets/screenshots/template-editor-mobile-dark.png b/assets/screenshots/template-editor-mobile-dark.png index 844b661..c5b25ba 100644 Binary files a/assets/screenshots/template-editor-mobile-dark.png and b/assets/screenshots/template-editor-mobile-dark.png differ diff --git a/assets/screenshots/template-editor-mobile-light.png b/assets/screenshots/template-editor-mobile-light.png index 4da3109..00a212b 100644 Binary files a/assets/screenshots/template-editor-mobile-light.png and b/assets/screenshots/template-editor-mobile-light.png differ diff --git a/assets/screenshots/template-editor-mobile.png b/assets/screenshots/template-editor-mobile.png index ece9e1b..be91e7d 100644 Binary files a/assets/screenshots/template-editor-mobile.png and b/assets/screenshots/template-editor-mobile.png differ diff --git a/assets/screenshots/template-editor-steps-desktop-dark.png b/assets/screenshots/template-editor-steps-desktop-dark.png index 5f31dd0..e9e2bc6 100644 Binary files a/assets/screenshots/template-editor-steps-desktop-dark.png and b/assets/screenshots/template-editor-steps-desktop-dark.png differ diff --git a/assets/screenshots/template-editor-steps-desktop-light.png b/assets/screenshots/template-editor-steps-desktop-light.png index 7f0057a..5736bfa 100644 Binary files a/assets/screenshots/template-editor-steps-desktop-light.png and b/assets/screenshots/template-editor-steps-desktop-light.png differ diff --git a/assets/screenshots/template-editor-steps-desktop.png b/assets/screenshots/template-editor-steps-desktop.png index 4a9a7ab..215f952 100644 Binary files a/assets/screenshots/template-editor-steps-desktop.png and b/assets/screenshots/template-editor-steps-desktop.png differ diff --git a/assets/screenshots/template-editor-steps-mobile-dark.png b/assets/screenshots/template-editor-steps-mobile-dark.png index 9ece698..5ac24a9 100644 Binary files a/assets/screenshots/template-editor-steps-mobile-dark.png and b/assets/screenshots/template-editor-steps-mobile-dark.png differ diff --git a/assets/screenshots/workflows-dark-desktop.png b/assets/screenshots/workflows-dark-desktop.png index 352e47a..b8c56c6 100644 Binary files a/assets/screenshots/workflows-dark-desktop.png and b/assets/screenshots/workflows-dark-desktop.png differ diff --git a/assets/screenshots/workflows-desktop-dark.png b/assets/screenshots/workflows-desktop-dark.png index c615e52..da3e582 100644 Binary files a/assets/screenshots/workflows-desktop-dark.png and b/assets/screenshots/workflows-desktop-dark.png differ diff --git a/assets/screenshots/workflows-desktop-light.png b/assets/screenshots/workflows-desktop-light.png index ce2ec82..e7df763 100644 Binary files a/assets/screenshots/workflows-desktop-light.png and b/assets/screenshots/workflows-desktop-light.png differ diff --git a/assets/screenshots/workflows-desktop.png b/assets/screenshots/workflows-desktop.png index 26c69f3..b82d03c 100644 Binary files a/assets/screenshots/workflows-desktop.png and b/assets/screenshots/workflows-desktop.png differ diff --git a/assets/screenshots/workflows-light-desktop.png b/assets/screenshots/workflows-light-desktop.png index 2545326..d773531 100644 Binary files a/assets/screenshots/workflows-light-desktop.png and b/assets/screenshots/workflows-light-desktop.png differ diff --git a/assets/screenshots/workflows-mobile-light.png b/assets/screenshots/workflows-mobile-light.png index 4c44ab2..15dde8d 100644 Binary files a/assets/screenshots/workflows-mobile-light.png and b/assets/screenshots/workflows-mobile-light.png differ diff --git a/assets/screenshots/workflows-mobile.png b/assets/screenshots/workflows-mobile.png index e4c0e0b..a768afa 100644 Binary files a/assets/screenshots/workflows-mobile.png and b/assets/screenshots/workflows-mobile.png differ diff --git a/docs/dashboard.md b/docs/dashboard.md index d438230..31ffb3e 100644 --- a/docs/dashboard.md +++ b/docs/dashboard.md @@ -12,7 +12,7 @@ Open the local console URL returned by `bridge_panel` and authenticate with a br Select any screenshot to open its full capture. Images follow the page's light or dark appearance. -The screenshots show Bridge 0.2.18 running in an isolated local fixture service at the configured desktop and mobile sizes. Jobs, tool observations, workflow results and provider states use deterministic fixtures. Sign-in, quota reports and dispatch appear separately; a signed-in or enabled state does not establish remaining quota or context capacity. The controlled scenes do not measure a real subscription. Historical checks with authenticated official CLIs remain in [verification](verification.md). +The screenshots show Bridge 0.2.19 running in an isolated local fixture service at the configured desktop and mobile sizes. Jobs, tool observations, workflow results and provider states use deterministic fixtures. Sign-in, quota reports and dispatch appear separately; a signed-in or enabled state does not establish remaining quota or context capacity. The controlled scenes do not measure a real subscription. Historical checks with authenticated official CLIs remain in [verification](verification.md). ## Connect @@ -20,10 +20,20 @@ At **Connect**, choose a destination from the sidebar or phone menu. The console Paste an owner or application token into **Bridge token**. It remains in tab memory and is cleared from the form after connection. Reloading or disconnecting clears the session. Expired or revoked access returns to the connection gate and clears loaded private details. -
+
+ +
+ +![Connect gate on desktop](../assets/screenshots/connect-desktop-light.png) + +
+ +
![Connect gate on a phone](../assets/screenshots/connect-mobile-light.png) +
+
Connection gate before authentication. Choose your destination, enter a bridge token, then select Connect. Private job details appear only after access is accepted.
diff --git a/docs/installation.md b/docs/installation.md index 49db428..2beda2a 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -42,27 +42,27 @@ The bridge uses that CLI's existing login. Do not copy its credentials into the ## Install a native archive -Download the platform archive and its checksum list over HTTPS. These examples select version 0.2.18; confirm it is available on the [release page](https://github.com/fireflyframework/firefly-agent-bridge/releases) before downloading: +Download the platform archive and its checksum list over HTTPS. These examples select version 0.2.19; confirm it is available on the [release page](https://github.com/fireflyframework/firefly-agent-bridge/releases) before downloading: ```sh curl --fail --location --remote-name \ - https://github.com/fireflyframework/firefly-agent-bridge/releases/download/v0.2.18/firefly-agent-bridge-0.2.18-darwin-arm64.tar.gz + https://github.com/fireflyframework/firefly-agent-bridge/releases/download/v0.2.19/firefly-agent-bridge-0.2.19-darwin-arm64.tar.gz curl --fail --location --remote-name \ - https://github.com/fireflyframework/firefly-agent-bridge/releases/download/v0.2.18/SHA256SUMS -shasum -a 256 firefly-agent-bridge-0.2.18-darwin-arm64.tar.gz + https://github.com/fireflyframework/firefly-agent-bridge/releases/download/v0.2.19/SHA256SUMS +shasum -a 256 firefly-agent-bridge-0.2.19-darwin-arm64.tar.gz ``` Compare the digest with that archive's entry in `SHA256SUMS` before extracting. On Linux, choose the `linux-x64` archive and use `sha256sum`. On Windows, choose `win32-x64` and use PowerShell: ```powershell -Get-FileHash .\firefly-agent-bridge-0.2.18-win32-x64.tar.gz -Algorithm SHA256 +Get-FileHash .\firefly-agent-bridge-0.2.19-win32-x64.tar.gz -Algorithm SHA256 ``` Extract the complete archive into a new directory. Keep all included license and runtime files together. For macOS or Linux: ```sh mkdir firefly-bridge-local -tar -xzf firefly-agent-bridge-0.2.18-darwin-arm64.tar.gz -C firefly-bridge-local +tar -xzf firefly-agent-bridge-0.2.19-darwin-arm64.tar.gz -C firefly-bridge-local cd firefly-bridge-local ./firefly-bridge init --worker codex ./firefly-bridge serve @@ -72,7 +72,7 @@ On Windows, run the matching executable: ```powershell New-Item -ItemType Directory firefly-bridge-local -tar -xzf .\firefly-agent-bridge-0.2.18-win32-x64.tar.gz -C firefly-bridge-local +tar -xzf .\firefly-agent-bridge-0.2.19-win32-x64.tar.gz -C firefly-bridge-local Set-Location firefly-bridge-local .\firefly-bridge.exe init --worker codex .\firefly-bridge.exe serve diff --git a/docs/integrations.md b/docs/integrations.md index b882cad..385059b 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -39,7 +39,7 @@ claude --plugin-dir /absolute/path/to/firefly-agent-bridge/integrations/claude-c The native archive includes a Codex plugin manifest, operation skill, MCP configuration, and local artwork beside the executable. Register it in a trusted local marketplace and install it through your supported Codex surface. The manifest uses the documented compatibility layout. See [OpenAI plugin packaging](https://developers.openai.com/plugins/build/plugins) and [local marketplaces](https://learn.chatgpt.com/docs/changelog). -Register the extracted native archive as a local marketplace, then install its plugin. The following identifier matches the 0.2.18 package metadata: +Register the extracted native archive as a local marketplace, then install its plugin. The following identifier matches the 0.2.19 package metadata: ```sh codex plugin marketplace add /absolute/path/to/firefly-bridge-local diff --git a/docs/openapi.json b/docs/openapi.json index 46e5d39..7c12496 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "Firefly Agent Bridge API", - "version": "0.2.18", + "version": "0.2.19", "description": "OpenAI-compatible Chat Completions and unified /v1/bridge orchestration extensions. Copyright 2026 Firefly Software Foundation. Author @ancongui.", "license": { "name": "Apache-2.0", "identifier": "Apache-2.0" } }, diff --git a/docs/verification.md b/docs/verification.md index b6dff49..ed0d684 100644 --- a/docs/verification.md +++ b/docs/verification.md @@ -30,6 +30,12 @@ The home-page illustration is an original Bridge span mesh rendered with pinned The prose check catches a small set of editorial regressions outside code and links. It does not automate the Humanizer's contextual judgment. Manual review preserves technical claims, API labels, commands, and limitations while removing repetitive or promotional wording. +## 0.2.19 Connect guide and locked navigation + +The dashboard guide selects the existing desktop and phone captures at the reading viewport and matches the selected theme. Browser checks verify native image dimensions, the full-image keyboard link, one caption and no horizontal overflow at 1440 and 390 pixels in both themes. The locked navigation checks keep every destination label on one line, retain the accessible Connect required description and exercise the existing sign-in gate without submitting jobs. + +The canonical screenshots come from isolated services and deterministic workers. These checks do not establish actual provider sign-in or model execution. + ## 0.2.18 diagram readability The documentation browser checks measure the smallest rendered SVG label at 320, 390, 768, 1024 and 1440 pixels in both themes. Labels stay at least 12 CSS pixels high, the selected theme and narrow variant match the viewport, and the page stays within its viewport. A separate check loads all 36 generated SVGs, verifies the embedded Manrope face and checks every label against its canvas and card bounds. The source build tests preserve escaped alternative text and relative asset paths on the landing page and guide pages. diff --git a/integrations/claude-code/.claude-plugin/plugin.json b/integrations/claude-code/.claude-plugin/plugin.json index 1a8daa9..3e6c1a3 100644 --- a/integrations/claude-code/.claude-plugin/plugin.json +++ b/integrations/claude-code/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "firefly-agent-bridge", - "version": "0.2.18", + "version": "0.2.19", "description": "Local jobs and workflows through your configured official Codex or Claude Code subscription.", "author": { "name": "@ancongui", diff --git a/integrations/claude-code/scripts/bootstrap.sh b/integrations/claude-code/scripts/bootstrap.sh index df530c8..11e4a72 100644 --- a/integrations/claude-code/scripts/bootstrap.sh +++ b/integrations/claude-code/scripts/bootstrap.sh @@ -17,7 +17,7 @@ # limitations under the License. # set -euo pipefail -version="0.2.18" +version="0.2.19" build="release-1" repository="fireflyframework/firefly-agent-bridge" case "$(uname -s)" in diff --git a/integrations/codex/.codex-plugin/plugin.json b/integrations/codex/.codex-plugin/plugin.json index 0ab1500..7bfc086 100644 --- a/integrations/codex/.codex-plugin/plugin.json +++ b/integrations/codex/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "firefly-agent-bridge", - "version": "0.2.18", + "version": "0.2.19", "description": "Local jobs and workflows through your official Codex or Claude Code subscription.", "author": { "name": "Firefly Software Foundation", diff --git a/integrations/desktop/manifest.json b/integrations/desktop/manifest.json index e06e396..6c803b0 100644 --- a/integrations/desktop/manifest.json +++ b/integrations/desktop/manifest.json @@ -2,7 +2,7 @@ "manifest_version": "0.3", "name": "firefly-agent-bridge", "display_name": "Firefly Agent Bridge", - "version": "0.2.18", + "version": "0.2.19", "description": "Local developer jobs and workflows through official coding agents.", "long_description": "Run a durable local queue, scoped authentication, workflows, audit and a management console. Claude Code or Codex uses your own official subscription login. Default permissions are enabled; explicit bypass requires a trusted host.", "author": { diff --git a/package-lock.json b/package-lock.json index a40b1fc..1c413a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "firefly-agent-bridge", - "version": "0.2.18", + "version": "0.2.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "firefly-agent-bridge", - "version": "0.2.18", + "version": "0.2.19", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "1.32.1", diff --git a/package.json b/package.json index 2017d8a..b9f8288 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firefly-agent-bridge", - "version": "0.2.18", + "version": "0.2.19", "description": "Local coding jobs and workflows through official Claude Code and Codex subscriptions", "type": "module", "license": "Apache-2.0", diff --git a/scripts/docs-browser/connect-lead.spec.mjs b/scripts/docs-browser/connect-lead.spec.mjs new file mode 100644 index 0000000..03ebfc9 --- /dev/null +++ b/scripts/docs-browser/connect-lead.spec.mjs @@ -0,0 +1,62 @@ +/* Copyright 2026 Firefly Software Foundation. SPDX-License-Identifier: Apache-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 */ +import { test, expect } from "@playwright/test"; +import { readyStylesheets } from "./stylesheet-readiness.mjs"; +import { readyImages } from "./image-readiness.mjs"; + +for (const width of [1440, 390]) + for (const theme of ["light", "dark"]) { + test(`Connect lead uses its actual ${width}px ${theme} capture`, async ({ + page, + }, testInfo) => { + await page.setViewportSize({ width, height: width === 1440 ? 960 : 844 }); + await page.emulateMedia({ colorScheme: theme, reducedMotion: "reduce" }); + await page.goto("/dashboard/"); + await readyStylesheets(page); + await page.evaluate(() => document.fonts.ready); + await expect(page.locator("body")).toHaveAttribute( + "data-md-color-scheme", + theme === "dark" ? "slate" : "default", + ); + const figure = page.locator("article .bridge-shot").first(); + const links = figure.locator(".bridge-shot__link:visible"); + await expect(links).toHaveCount(1); + const image = links.locator("img"); + await readyImages(image); + await figure.evaluate((el) => + scrollTo(0, el.getBoundingClientRect().top + scrollY - 110), + ); + await page.screenshot({ + path: testInfo.outputPath("connect-lead.png"), + animations: "disabled", + }); + const size = width === 1440 ? "desktop" : "mobile"; + await expect(image).toHaveAttribute( + "src", + new RegExp(`connect-${size}-${theme}\\.png$`), + ); + await expect(links).toHaveAccessibleName(/Open full screenshot:/); + const shape = await image.evaluate((el) => ({ + width: el.getBoundingClientRect().width, + figureWidth: el.closest("figure").getBoundingClientRect().width, + natural: el.naturalWidth, + src: el.getAttribute("src"), + href: el.closest("a").getAttribute("href"), + })); + expect(shape.natural).toBe(width); + expect(shape.width).toBeGreaterThanOrEqual(shape.figureWidth * 0.95); + expect(shape.width).toBeLessThanOrEqual(shape.natural); + expect(shape.href).toBe(shape.src); + await expect(figure.locator("figcaption")).toHaveCount(1); + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ).toBe(true); + await links.focus(); + await page.keyboard.press("Enter"); + await expect(page).toHaveURL( + new RegExp(`connect-${size}-${theme}\\.png$`), + ); + }); + } diff --git a/scripts/docs-browser/screenshot-gallery.spec.mjs b/scripts/docs-browser/screenshot-gallery.spec.mjs index e27b909..0179e90 100644 --- a/scripts/docs-browser/screenshot-gallery.spec.mjs +++ b/scripts/docs-browser/screenshot-gallery.spec.mjs @@ -97,11 +97,16 @@ for (const width of [1440, 390, 375]) { await page.goto("/dashboard/"); await readyStylesheets(page); const imageLink = page - .locator(".bridge-shot--phone .bridge-shot__link:visible") - .first(); + .locator("article .bridge-shot") + .first() + .locator(".bridge-shot__link:visible"); await imageLink.focus(); await page.keyboard.press("Enter"); - await expect(page).toHaveURL(/connect-mobile-(light|dark)\.png$/); + await expect(page).toHaveURL( + new RegExp( + `connect-${width === 1440 ? "desktop" : "mobile"}-(light|dark)\\.png$`, + ), + ); }); } } diff --git a/src/cli.ts b/src/cli.ts index 55087bd..4cec0c5 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -47,13 +47,13 @@ async function main() { }, }); if (values.version) { - console.log("0.2.18"); + console.log("0.2.19"); return; } const command = positionals[0] ?? "help", dataDir = resolve(values["data-dir"] ?? defaultDataDir()); if (command === "help" || values.help) { - console.log(`Firefly Agent Bridge 0.2.18 + console.log(`Firefly Agent Bridge 0.2.19 Usage: firefly-bridge [--data-dir PATH] init Initialize local configuration (--worker codex|claude) serve Run the service (--managed follows host leases) diff --git a/src/http.ts b/src/http.ts index c49d7ae..793f867 100644 --- a/src/http.ts +++ b/src/http.ts @@ -246,7 +246,7 @@ export function createHttpService(d: HttpDependencies) { app.get("/v1/bridge/status", async (req) => { const p = requireScope(req, "read"); return { - version: "0.2.18", + version: "0.2.19", protocolVersion: 2, completionRecovery: { version: 1, diff --git a/src/mcp.ts b/src/mcp.ts index 88c9440..594a979 100644 --- a/src/mcp.ts +++ b/src/mcp.ts @@ -31,7 +31,7 @@ export function createAdapter( ) { const hostId = randomUUID(); const server = new McpServer( - { name: "firefly-agent-bridge", version: "0.2.18" }, + { name: "firefly-agent-bridge", version: "0.2.19" }, { capabilities: channel ? { experimental: { "claude/channel": {} } } : {}, instructions: bridgePrompt("mcp/server"), diff --git a/src/ui/app.css b/src/ui/app.css index 61a803b..996606c 100644 --- a/src/ui/app.css +++ b/src/ui/app.css @@ -2085,10 +2085,15 @@ body { } .rail nav button[data-access="locked"]::after, #mobile-nav-slot nav button[data-access="locked"]::after { - content: "Connect"; + content: ""; + width: 12px; + height: 14px; + flex: none; margin-left: auto; color: var(--dim); - font-size: 11px; + background: currentColor; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='10' width='16' height='11' rx='2'/%3E%3Cpath d='M8 10V7a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E") + center / contain no-repeat; } .rail-footer, main > footer { diff --git a/src/ui/index.html b/src/ui/index.html index 3a73db0..db707ba 100644 --- a/src/ui/index.html +++ b/src/ui/index.html @@ -95,7 +95,7 @@
Disconnectedv0.2.18 + >v0.2.19
diff --git a/tests/browser/locked-navigation.spec.ts b/tests/browser/locked-navigation.spec.ts new file mode 100644 index 0000000..f73d478 --- /dev/null +++ b/tests/browser/locked-navigation.spec.ts @@ -0,0 +1,123 @@ +/* Copyright 2026 Firefly Software Foundation. SPDX-License-Identifier: Apache-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 */ +import { test, expect } from "@playwright/test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; +import { startService } from "../../src/service.js"; +import { parseConfig } from "../../src/config.js"; + +let service: Awaited>, directory: string; +test.beforeAll(async () => { + directory = mkdtempSync(join(tmpdir(), "bridge-locked-nav-")); + service = await startService( + parseConfig({ + dataDir: directory, + workspace: join(directory, "jobs"), + claudePath: process.execPath, + port: 0, + }), + { + worker: () => ({ + ready: async () => ({ ready: true }), + run: async () => { + throw new Error("No jobs in navigation fixture"); + }, + }), + }, + ); +}); +test.afterAll(async () => { + await service?.close(); + if (directory) rmSync(directory, { recursive: true, force: true }); +}); + +for (const width of [1440, 390]) + for (const theme of ["light", "dark"] as const) { + test(`locked destinations fit and explain access at ${width}px in ${theme}`, async ({ + page, + }, testInfo) => { + await page.setViewportSize({ width, height: width === 1440 ? 960 : 844 }); + await page.emulateMedia({ colorScheme: theme, reducedMotion: "reduce" }); + await page.goto(service.address); + await page.evaluate(() => document.fonts.ready); + await expect(page.locator("html")).toHaveAttribute("data-theme", theme); + if (width === 390) + await page.getByRole("button", { name: "Menu", exact: true }).click(); + const nav = page.getByRole("navigation", { name: "Main navigation" }); + await expect(nav).toBeVisible(); + await expect( + nav.getByText("Connect required", { exact: true }), + ).toBeVisible(); + await page.screenshot({ + path: testInfo.outputPath("locked-navigation.png"), + animations: "disabled", + }); + for (const label of [ + "Providers & setup", + "Jobs", + "Workflows", + "Diagnostics", + ]) { + const button = nav.getByRole("button", { name: label, exact: true }); + await expect(button).toHaveAccessibleDescription("Connect required"); + const shape = await button.evaluate((element) => { + const label = element.querySelector("span")!; + const range = document.createRange(); + range.selectNodeContents(label); + const box = element.getBoundingClientRect(), + text = label.getBoundingClientRect(); + const marker = getComputedStyle(element, "::after"); + return { + lines: range.getClientRects().length, + left: text.left, + right: text.right, + buttonLeft: box.left, + buttonRight: box.right, + marker: marker.content, + mask: marker.maskImage, + width: parseFloat(marker.width), + }; + }); + expect(shape.lines, label).toBe(1); + expect(shape.left).toBeGreaterThan(shape.buttonLeft); + expect(shape.right).toBeLessThan(shape.buttonRight); + expect(shape.marker).not.toContain("Connect"); + expect(shape.mask).not.toBe("none"); + expect(shape.width).toBeGreaterThan(0); + expect(shape.width).toBeLessThanOrEqual(16); + } + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ).toBe(true); + await nav + .getByRole("button", { name: "Providers & setup", exact: true }) + .click(); + await expect(page.locator("#view-title")).toHaveText("Connect"); + await expect(page.locator("#connection-destination")).toContainText( + "Providers & setup", + ); + await expect(page.locator("#job-count")).toBeHidden(); + if (width === 390) + await expect(page.locator("#mobile-menu")).not.toBeVisible(); + await page + .getByLabel("Bridge token", { exact: true }) + .fill(service.ownerToken); + await page.getByRole("button", { name: "Connect", exact: true }).click(); + await expect(page.locator("#view-title")).toHaveText("Providers & setup"); + await expect(page.locator('[data-view="providers"]')).not.toHaveAttribute( + "aria-describedby", + "nav-access-state", + ); + await expect(page.locator("main > footer")).toHaveCount(1); + expect( + service.store.list({ + id: "fixture", + owner: true, + profiles: ["default"], + }), + ).toHaveLength(0); + }); + }