feat: iOS 런칭 트랙 — 서버 주소 런타임 설정 + PWA 설치 지원 - #26
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n test Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ount confirmed) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 14b271b24a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| } = useProjectRegistryOps({ | ||
| wsUrl: WS_URL, | ||
| wsUrl, |
There was a problem hiding this comment.
Do not forward the previous server token to a new host
When a user with a saved maestro.server.api-token changes the address to another host, useProjectRegistryOps immediately reruns its refresh for this new wsUrl, while src/hooks/useProjectRegistryOps.js:83,123-129,156-158 reuses the globally stored token in the Authorization header. Merely saving a replacement server therefore discloses the old server's bearer credential to that host; clear the token when the origin changes or scope stored tokens by normalized server origin.
Useful? React with 👍 / 👎.
| disconnectWebSocket(); | ||
| if (isPlayingRef.current) { | ||
| connectWebSocket(); |
There was a problem hiding this comment.
Clear old-server approval notes before reconnecting
If the address is changed while a session has pending notes, this transition disconnects and reconnects but leaves notes and notesRef populated from the old server. A subsequent lane action sends one of those retained request IDs through the new socket, so an approval card from server A is actioned against server B, where it can remain stuck or affect a colliding request; reset server-scoped pending state when wsUrl changes.
Useful? React with 👍 / 👎.
Summary
아이패드(Safari)를 보조 컨트롤 데크로 쓰기 위한 iOS 런칭 트랙 0~1단계 구현입니다. 스펙:
docs/superpowers/specs/2026-07-21-ios-launch-track-design.md0단계 — 서버 주소 런타임 설정
VITE_WS_URL)이던 것을 런타임 해석으로 전환: localStorage(maestro.server.ws-url) >VITE_WS_URL>ws://<페이지 호스트>:8080서버 <host:port>버튼 → 주소 입력/정규화(IP만 입력해도ws://IP:8080)/연결 테스트/저장/기본값 복원 모달VITE_WS_URLenv 주입은 불변1단계 — PWA
manifest.webmanifest+ apple-mobile-web-app 메타태그 + 아이콘(180/192/512/maskable) → iPad Safari '홈 화면에 추가' 시 standalone 전체화면scripts/generate-pwa-icons.mjs(기존 Playwright devDependency)로 재생성 가능Test plan
npm run qa— 단위/UI 100 tests + production build PASSnpm run test:e2e— 기존 승인/반려 플로우 + 신규 서버 주소 패널 + PWA 어서션 3/3 PASS🤖 Generated with Claude Code