diff --git a/CHANGELOG.md b/CHANGELOG.md index b558ea8..383d55f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,7 +85,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Specs Designed in the Phase 7 detailed-design update (00-common-specs.md 0.4.6/0.4.7, 01-setup-settings.md) but not implemented -on either platform yet — tracked for a later release: +on either platform yet — this is the rest of Phase 7's scope (SP3 the bulk lane, SP4 Wi-Fi Direct) still to be done, open for a later topic: - **Wi-Fi Direct** (A7.5 / M7.5): randomly-generated SSID and passphrase per group, the Mac socket bound to the P2P interface only, and the Android 10–12 Location prompt it needs. No Android or Apple code exists for this today. diff --git a/CHANGELOG.vi.md b/CHANGELOG.vi.md index a60ad29..3889a1c 100644 --- a/CHANGELOG.vi.md +++ b/CHANGELOG.vi.md @@ -47,7 +47,7 @@ Các thay đổi đáng chú ý của kho hub HandLive (tài liệu và kế ho ### Specs Đã thiết kế trong bản cập nhật spec Phase 7 (00-common-specs.md 0.4.6/0.4.7, 01-setup-settings.md) nhưng chưa code trên -nền tảng nào — để lại cho bản phát hành sau: +nền tảng nào — đây là phần còn lại của Phase 7 (SP3 làn bulk, SP4 Wi-Fi Direct) vẫn phải làm, để lại cho topic sau: - **Wi-Fi Direct** (A7.5 / M7.5): SSID và passphrase sinh ngẫu nhiên mỗi nhóm, socket Mac ràng buộc chỉ với interface P2P, và prompt Location Android 10–12 mà nó cần. Chưa có code Android hay Apple nào cho phần này. diff --git a/CLAUDE.md b/CLAUDE.md index e6067fa..e72c8fd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. -## Project status: Phase 0–3 on `main`; Phase 5–6 spikes on `main`; Phase 7 (Bluetooth offline connectivity) released in `v0.2.0` (2026-10-30), BLE L2CAP pairing/control channel on `main` (Wi-Fi Direct and relay bulk dropped from this phase's scope); latest tagged release `v0.2.0` (2026-10-30); G1/G2/G5/G6 open; G4 closed (Phase 4 stopped, owner decision 2026-10-12) +## Project status: Phase 0–3 on `main`; Phase 5–6 spikes on `main`; Phase 7 (Bluetooth offline connectivity) in progress — SP1 (BLE L2CAP control channel) and SP2 (BLE pairing) released in `v0.2.0` (2026-10-30) on `main`; SP3 (per-connection bulk lane, `K_bulk`) and SP4 (Wi-Fi Direct) are specced but not yet implemented, open for a later topic; only bulk-over-relay is out of scope (dropped 2026-10-28); latest tagged release `v0.2.0` (2026-10-30); G1/G2/G5/G6 open; G4 closed (Phase 4 stopped, owner decision 2026-10-12) Phase 0–3 product code is on `main` (clipboard, SMS, iOS shell, Rust relay, call metadata/control). Phase 4–6 **spike probes** are also on `main` (merged 2026-09-30): `HFPSpike`, `CameraSpike`, Android `tools/web-spike`, diff --git a/README.md b/README.md index 9fbe5d2..1b6ade8 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Phases ship in order, each as a usable slice. One exception (owner, 2026-09-28): | **4** Call audio | Bluetooth HFP/SCO and Opus fallback | **Stopped** (owner decision, 2026-10-12) · G4 closed: only macOS 27 is available, so calls stay notification + answer/decline/end, no audio | | **5** Virtual camera / mic | CMIOExtension and AudioServerPlugin | **Spike on `main`** (`CameraSpike`) · G5 needs a paid Apple Developer team | | **6** Continue Browsing | Foreground URL handover across devices | **Spike on `main`** · Chrome and Samsung Internet measured; browser go/no-go pending | -| **7** Connect anywhere | Auto link without a shared Wi-Fi network | **Released in `v0.2.0`** (2026-10-30) · Bluetooth offline pairing (QR flow B, PIN flow C via CPace-X25519-SHA512) shipped on `main`; Wi-Fi Direct and relay bulk specced but dropped from this phase's scope | +| **7** Connect anywhere | Auto link without a shared Wi-Fi network | **In progress** · SP1+SP2 (Bluetooth control channel; QR flow B, PIN flow C via CPace-X25519-SHA512) **released in `v0.2.0`** (2026-10-30) on `main`; SP3 (per-connection bulk lane, `K_bulk`) and SP4 (Wi-Fi Direct) are specced but not yet implemented; only bulk-over-relay is dropped from scope | | **G0** Vectors | Shared cross-platform crypto test vectors | **Done** | | **G1** Real devices | Real-device Phase 1 matrix validation | **Open** (before 1.0) · App Store Connect screenshots recaptured at native 1320×2868 (2026-10-12) | | **G2** Play Console | SMS and call log permissions declaration | **Open** (before 1.0; Plan B: F-Droid/APK) · Play Console screenshots recaptured at 1080×1920 (2026-10-12) | diff --git a/README.vi.md b/README.vi.md index e8de585..e359472 100644 --- a/README.vi.md +++ b/README.vi.md @@ -67,7 +67,7 @@ HandLive xây lần lượt. Mỗi phase là một phần dùng được. Ngoạ | **4** Âm thanh cuộc gọi | Bluetooth HFP/SCO và dự phòng Opus | **Dừng** (quyết định của chủ dự án, 12/10/2026) · G4 đóng: chỉ có macOS 27, cuộc gọi chỉ còn thông báo và nút nghe/từ chối/kết thúc, không âm thanh | | **5** Camera / mic ảo | CMIOExtension và AudioServerPlugin | **Spike trên `main`** (`CameraSpike`) · G5 cần Apple Developer trả phí | | **6** Duyệt web tiếp | Chuyển tiếp URL đang mở giữa các thiết bị | **Spike trên `main`** · đã đo Chrome và Samsung Internet; còn go/no-go trình duyệt | -| **7** Kết nối mọi nơi | Tự kết nối khi không chung mạng Wi-Fi | **Đã phát hành ở `v0.2.0`** (30/10/2026) · ghép đôi Bluetooth offline (luồng B QR, luồng C PIN qua CPace-X25519-SHA512) đã lên `main`; Wi-Fi Direct và bulk qua relay đã có đặc tả nhưng bị cắt khỏi phạm vi phase này | +| **7** Kết nối mọi nơi | Tự kết nối khi không chung mạng Wi-Fi | **Đang làm** · SP1+SP2 (kênh điều khiển Bluetooth; luồng B QR, luồng C PIN qua CPace-X25519-SHA512) **đã phát hành ở `v0.2.0`** (30/10/2026) trên `main`; SP3 (làn bulk theo từng kết nối, `K_bulk`) và SP4 (Wi-Fi Direct) đã có đặc tả nhưng chưa code; chỉ bulk qua relay bị bỏ khỏi phạm vi | | **G0** Vector mã hóa | Vector kiểm thử mã hóa dùng chung giữa các nền tảng | **Xong** | | **G1** Máy thật | Kiểm thực tế ma trận máy thật Phase 1 | **Mở** (trước 1.0) · ảnh App Store Connect đã chụp lại ở kích thước gốc 1320×2868 (12/10/2026) | | **G2** Play Console | Tờ khai quyền SMS và nhật ký cuộc gọi | **Mở** (trước 1.0; phương án B: F-Droid/APK) · ảnh Play Console đã chụp lại ở 1080×1920 (12/10/2026) | diff --git a/docs/project-roadmap.md b/docs/project-roadmap.md index 4bd3862..b6856a6 100644 --- a/docs/project-roadmap.md +++ b/docs/project-roadmap.md @@ -8,7 +8,7 @@ HandLive brings ecosystem-native features, such as Apple Handoff, to Android. Th ## Progress snapshot (2026-10-30) -**Latest release:** [`v0.2.0`](https://github.com/HandLive/handlive/releases/tag/v0.2.0) (2026-10-30): Phase 7 offline connectivity — when both devices are near each other without a network, they connect over Bluetooth L2CAP (control channel only: clipboard text, SMS and call notifications); first pairing over Bluetooth by QR (flow B) or a PIN through CPace-X25519-SHA512 (flow C); Bluetooth admission policy and pre-auth bans; "Connected via Bluetooth" label on Android and Mac. No relay deployment in this release; Wi-Fi Direct and relay bulk are specced but not implemented (tracked for a later release). Every change since v0.1.1 passed a security scan: 0 critical, 0 high, 0 medium, 0 low ([deployment guide](deployment-guide.md)). Live table: hub [`README.md`](../README.md#status). +**Latest release:** [`v0.2.0`](https://github.com/HandLive/handlive/releases/tag/v0.2.0) (2026-10-30): Phase 7 offline connectivity — when both devices are near each other without a network, they connect over Bluetooth L2CAP (control channel only: clipboard text, SMS and call notifications); first pairing over Bluetooth by QR (flow B) or a PIN through CPace-X25519-SHA512 (flow C); Bluetooth admission policy and pre-auth bans; "Connected via Bluetooth" label on Android and Mac. No relay deployment in this release; bulk-over-relay is dropped from scope, while SP3 (per-connection bulk lane, `K_bulk`) and SP4 (Wi-Fi Direct) are specced but not yet implemented (open for a later topic). Every change since v0.1.1 passed a security scan: 0 critical, 0 high, 0 medium, 0 low ([deployment guide](deployment-guide.md)). Live table: hub [`README.md`](../README.md#status). **Previous release:** [`v0.1.1`](https://github.com/HandLive/handlive/releases/tag/v0.1.1) (2026-10-22): the first tag without a pre-release suffix; Google Play readiness on Android (application id `com.handlive.android`, target API 36, R8 on release, signed Play bundle on CI) and the paid-team identifiers on iPhone and iPad (App Group `group.app.hxd.handlive`), the clipboard URI policy (android #13 fixed), the Mac welcome window returns to the menu bar on close; same three files on one page: Mac DMG signed ad hoc (Open Anyway once), iOS IPA (unsigned, for sideloading), Android APK (`foss`, signed). A beta install on Android must be removed first (new application id) and an iPhone beta install must pair again. Every change since beta.3 passed a security scan ([deployment guide](deployment-guide.md)). Live table: hub [`README.md`](../README.md#status). @@ -21,7 +21,7 @@ HandLive brings ecosystem-native features, such as Apple Handoff, to Android. Th | 4 | Stopped (owner decision, 2026-10-12) | G4 closed: only macOS 27 available, calls stay notification + answer/decline/end, no audio | | 5 | Spike on `main` (`CameraSpike`, merged 2026-09-30) | G5: need paid Apple Developer team | | 6 | Spike probes on `main` (Apple+Android merged 2026-09-30); product cards not started | G6: owner browser decisions; Firefox/Edge/Brave rows | -| 7 | Released in `v0.2.0` (2026-10-30) | Spike G7 done; Bluetooth offline pairing (QR flow B, PIN flow C via CPace-X25519-SHA512) shipped; Wi-Fi Direct and relay bulk specced, not implemented | +| 7 | In progress (SP1+SP2 released in `v0.2.0`, 2026-10-30) | Spike G7 done; Bluetooth offline pairing (QR flow B, PIN flow C via CPace-X25519-SHA512) shipped; SP3 (bulk lane, `K_bulk`) and SP4 (Wi-Fi Direct) specced, not implemented; only bulk-over-relay is out of scope | | G0 | Done | Test vectors | | G1 | Open (before 1.0) | Real-device Phase 1 matrix | | G2 | Open (before 1.0) | Play Console SMS / call-log (Plan B: F-Droid/APK) | @@ -62,7 +62,7 @@ decision. ## Phase 7. Connect anywhere (started) -**Started on 2026-10-28 by the project owner's decision, with the G7 spike (about one week), without waiting for gates G4, G5 and G6.** After the first QR pairing the phone and the Mac near each other connect by themselves when neither has a network (the owner's case), and neither device ever leaves or changes its current Wi-Fi; the same Bluetooth path also covers phone on mobile data and Mac on another Wi-Fi while they are near each other. A Bluetooth link (BLE or classic, chosen by G7) carries the control channel; a new bulk lane carries images over the LAN, Wi-Fi Direct (only while the Mac's Wi-Fi is idle) or Bluetooth; first pairing also works offline over BLE. Dropped on 2026-10-28: bulk over the relay (the relay is not deployed) and automatic HFP bonding (Phase 4 is stopped). If G7 fails there is no relay fallback and the product stays LAN only. Every Bluetooth path is secured beyond the session handshake (link-security layer, admission policy). Plan: `plans/20260925-implementation/phase-07-ket-noi-moi-noi.md`. +**Started on 2026-10-28 by the project owner's decision, with the G7 spike (about one week), without waiting for gates G4, G5 and G6.** After the first QR pairing the phone and the Mac near each other connect by themselves when neither has a network (the owner's case), and neither device ever leaves or changes its current Wi-Fi; the same Bluetooth path also covers phone on mobile data and Mac on another Wi-Fi while they are near each other. A Bluetooth link (BLE or classic, chosen by G7) carries the control channel; a new bulk lane (SP3) carries images over the LAN, Wi-Fi Direct (SP4, only while the Mac's Wi-Fi is idle) or Bluetooth; first pairing also works offline over BLE. Dropped on 2026-10-28: bulk over the relay (the relay is not deployed) and automatic HFP bonding (Phase 4 is stopped) — SP3 and SP4 themselves are not dropped, just not implemented yet. If G7 fails there is no relay fallback and the product stays LAN only. Every Bluetooth path is secured beyond the session handshake (link-security layer, admission policy). Plan: `plans/20260925-implementation/phase-07-ket-noi-moi-noi.md`. **Measure:** text under 50 ms on the LAN and within 200 ms over Bluetooth; a 5 MB image within 2 s on the LAN, the first one offline within 10 s; no device changes its Wi-Fi. **Effort:** estimated after G7. ## Total effort diff --git a/docs/project-roadmap.vi.md b/docs/project-roadmap.vi.md index 23627d6..6c58a9d 100644 --- a/docs/project-roadmap.vi.md +++ b/docs/project-roadmap.vi.md @@ -8,7 +8,7 @@ HandLive đưa các tính năng native riêng trong từng hệ sinh thái, như ## Tiến độ tóm tắt (30/10/2026) -**Bản phát hành mới nhất:** [`v0.2.0`](https://github.com/HandLive/handlive/releases/tag/v0.2.0) (30/10/2026): Phase 7 kết nối offline — khi cả hai thiết bị ở gần nhau và không có mạng, chúng tự kết nối qua Bluetooth L2CAP (chỉ kênh điều khiển: chữ trong bảng nhớ tạm, SMS và thông báo cuộc gọi); ghép đôi đầu qua Bluetooth bằng QR (luồng B) hoặc PIN qua CPace-X25519-SHA512 (luồng C); có chính sách admission và chặn brute-force trên Bluetooth; nhãn "Đã kết nối qua Bluetooth" trên Android và Mac. Không triển khai relay trong bản này; Wi-Fi Direct và bulk qua relay đã có đặc tả nhưng chưa code (để lại cho bản sau). Mọi thay đổi từ v0.1.1 đã qua quét bảo mật: 0 critical, 0 high, 0 medium, 0 low ([hướng dẫn phân phối](deployment-guide.vi.md)). Bảng trực tiếp: hub [`README.vi.md`](../README.vi.md#trạng-thái). +**Bản phát hành mới nhất:** [`v0.2.0`](https://github.com/HandLive/handlive/releases/tag/v0.2.0) (30/10/2026): Phase 7 kết nối offline — khi cả hai thiết bị ở gần nhau và không có mạng, chúng tự kết nối qua Bluetooth L2CAP (chỉ kênh điều khiển: chữ trong bảng nhớ tạm, SMS và thông báo cuộc gọi); ghép đôi đầu qua Bluetooth bằng QR (luồng B) hoặc PIN qua CPace-X25519-SHA512 (luồng C); có chính sách admission và chặn brute-force trên Bluetooth; nhãn "Đã kết nối qua Bluetooth" trên Android và Mac. Không triển khai relay trong bản này; bulk qua relay bị bỏ khỏi phạm vi, còn SP3 (làn bulk theo từng kết nối, `K_bulk`) và SP4 (Wi-Fi Direct) đã có đặc tả nhưng chưa code (để lại cho topic sau). Mọi thay đổi từ v0.1.1 đã qua quét bảo mật: 0 critical, 0 high, 0 medium, 0 low ([hướng dẫn phân phối](deployment-guide.vi.md)). Bảng trực tiếp: hub [`README.vi.md`](../README.vi.md#trạng-thái). **Bản phát hành trước:** [`v0.1.1`](https://github.com/HandLive/handlive/releases/tag/v0.1.1) (22/10/2026): thẻ đầu tiên không có hậu tố tiền phát hành; Android sẵn sàng cho Google Play (mã ứng dụng `com.handlive.android`, target API 36, R8 cho bản phát hành, gói Play ký trên CI) và định danh của nhóm trả phí trên iPhone, iPad (App Group `group.app.hxd.handlive`), chính sách URI bảng nhớ tạm (đã sửa android #13), cửa sổ chào trên Mac trở về thanh menu khi đóng; vẫn 3 tệp trên một trang: DMG Mac ký ad hoc (Open Anyway một lần), IPA iOS (chưa ký, để sideload), APK Android (`foss`, đã ký). Bản beta trên Android phải gỡ trước (mã ứng dụng mới) và bản beta trên iPhone phải ghép đôi lại. Mọi thay đổi từ beta.3 đã qua rà soát bảo mật ([hướng dẫn phân phối](deployment-guide.vi.md)). Bảng sống: [`README.vi.md`](../README.vi.md#trạng-thái). @@ -21,7 +21,7 @@ HandLive đưa các tính năng native riêng trong từng hệ sinh thái, như | 4 | Đã dừng (quyết định của chủ dự án, 12/10/2026) | G4 đóng: chỉ có macOS 27, cuộc gọi chỉ còn thông báo và nút nghe/từ chối/kết thúc, không âm thanh | | 5 | Spike trên `main` (`CameraSpike`, merge 30/09/2026) | G5: cần Apple Developer trả phí | | 6 | Probe spike trên `main` (Apple+Android merge 30/09/2026); chưa mở thẻ sản phẩm | G6: quyết định trình duyệt; hàng Firefox/Edge/Brave | -| 7 | Đã phát hành ở `v0.2.0` (30/10/2026) | Spike G7 xong; ghép đôi Bluetooth offline (luồng B QR, luồng C PIN qua CPace-X25519-SHA512) đã phát hành; Wi-Fi Direct và bulk qua relay đã có đặc tả, chưa code | +| 7 | Đang làm (SP1+SP2 đã phát hành ở `v0.2.0`, 30/10/2026) | Spike G7 xong; ghép đôi Bluetooth offline (luồng B QR, luồng C PIN qua CPace-X25519-SHA512) đã phát hành; SP3 (làn bulk, `K_bulk`) và SP4 (Wi-Fi Direct) đã có đặc tả, chưa code; chỉ bulk qua relay nằm ngoài phạm vi | | G0 | Xong | Vector kiểm thử | | G1 | Mở (trước 1.0) | Ma trận Phase 1 máy thật | | G2 | Mở (trước 1.0) | Tờ khai SMS / nhật ký Play Console (phương án B: F-Droid/APK) | @@ -62,7 +62,7 @@ dự án quyết định sau. ## Phase 7. Kết nối mọi nơi (đã bắt đầu) -**Bắt đầu 28/10/2026, spike G7 (khoảng một tuần), không chờ G4, G5, G6.** Sau ghép đôi QR, điện thoại và Mac ở gần tự kết nối khi cả hai offline (trường hợp chủ dự án), không rời hay đổi Wi-Fi; cùng đường Bluetooth phủ trường hợp điện thoại dùng 4G và Mac ở Wi-Fi khác khi gần nhau. Liên kết Bluetooth (BLE hoặc cổ điển, G7 chọn) chở kênh điều khiển; làn dữ liệu lớn mới chở ảnh qua LAN, Wi-Fi Direct (nhu cầu, Wi-Fi Mac rảnh), Bluetooth; ghép đôi đầu offline qua BLE. Bỏ: bulk relay (không deploy), ghép đôi HFP (P4 dừng). Nếu G7 hỏng thì không relay dự phòng, chỉ còn LAN. Bluetooth được bảo mật ngoài bắt tay phiên (lớp bảo mật link, chính sách admission). Plan: `plans/20260925-implementation/phase-07-ket-noi-moi-noi.vi.md`. +**Bắt đầu 28/10/2026, spike G7 (khoảng một tuần), không chờ G4, G5, G6.** Sau ghép đôi QR, điện thoại và Mac ở gần tự kết nối khi cả hai offline (trường hợp chủ dự án), không rời hay đổi Wi-Fi; cùng đường Bluetooth phủ trường hợp điện thoại dùng 4G và Mac ở Wi-Fi khác khi gần nhau. Liên kết Bluetooth (BLE hoặc cổ điển, G7 chọn) chở kênh điều khiển; làn dữ liệu lớn mới (SP3) chở ảnh qua LAN, Wi-Fi Direct (SP4, nhu cầu, Wi-Fi Mac rảnh), Bluetooth; ghép đôi đầu offline qua BLE. Bỏ: bulk relay (không deploy), ghép đôi HFP (P4 dừng) — SP3 và SP4 không bị bỏ, chỉ là chưa code. Nếu G7 hỏng thì không relay dự phòng, chỉ còn LAN. Bluetooth được bảo mật ngoài bắt tay phiên (lớp bảo mật link, chính sách admission). Plan: `plans/20260925-implementation/phase-07-ket-noi-moi-noi.vi.md`. **Đo:** văn bản dưới 50 ms trên LAN và trong 200 ms qua Bluetooth; ảnh 5 MB trong 2 s trên LAN, ảnh đầu khi offline trong 10 s; không máy nào bị đổi Wi-Fi. **Công:** ước lượng sau G7. ## Công tổng diff --git a/tools/git-status-all.sh b/tools/git-status-all.sh new file mode 100644 index 0000000..871ca21 --- /dev/null +++ b/tools/git-status-all.sh @@ -0,0 +1,43 @@ +#!/bin/zsh +# In trạng thái git của tất cả 6 repo (hub, shared, android, apple, relay, .github-org) +# theo bố cục cạnh nhau: mọi repo nằm ngang hàng trong thư mục cha của hub. +# +# zsh handlive/tools/git-status-all.sh +# +# Với mỗi repo: in '== ' rồi git status -sb, log -1 --oneline. +# Repo nào không có .git thì in 'không có repo' và đi tiếp. +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +HUB_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +WORKSPACE_ROOT="$(cd "$HUB_ROOT/.." && pwd)" + +typeset -a REPO_NAMES +typeset -a REPO_PATHS +REPO_NAMES=(hub shared android apple relay github-org) +REPO_PATHS=( + "$HUB_ROOT" + "$WORKSPACE_ROOT/handlive-shared" + "$WORKSPACE_ROOT/handlive-android" + "$WORKSPACE_ROOT/handlive-apple" + "$WORKSPACE_ROOT/handlive-relay" + "$WORKSPACE_ROOT/.github-org" +) + +i=1 +while [ "$i" -le "${#REPO_NAMES[@]}" ]; do + name="${REPO_NAMES[$i]}" + repo_path="${REPO_PATHS[$i]}" + i=$((i + 1)) + + echo "== $name ($repo_path) ==" + + if [ ! -d "$repo_path/.git" ]; then + echo "không có repo" + continue + fi + + echo "$(cd "$repo_path" && git status -sb)" + echo "$(cd "$repo_path" && git log -1 --oneline)" + echo +done