<feed xmlns='http://www.w3.org/2005/Atom'>
<title>soryu/makima/ios/README.md, branch makima-ios-m2-auth</title>
<subtitle>soryu-co/soryu mirror</subtitle>
<id>http://src.eirin.xyz/soryu/atom?h=makima-ios-m2-auth</id>
<link rel='self' href='http://src.eirin.xyz/soryu/atom?h=makima-ios-m2-auth'/>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/'/>
<updated>2026-04-24T16:45:51+00:00</updated>
<entry>
<title>Makima iOS M3-M8 — Home, Tasks, WebSocket, notifications, polish</title>
<updated>2026-04-24T16:45:51+00:00</updated>
<author>
<name>soryu-co</name>
<email>bot@soryu.co</email>
</author>
<published>2026-04-24T16:45:51+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=105730ceaa292b1e3589c23d5aad8f35ccf04b8e'/>
<id>urn:sha1:105730ceaa292b1e3589c23d5aad8f35ccf04b8e</id>
<content type='text'>
Extends the M2 auth scaffold with the rest of the v1 surface area. All
milestones from docs/ios-v1-plan.md land here.

M3 — Composite Home dashboard
- HomeStore (@Observable): parallel fetch of contracts, daemons, directives,
  tasks, latest listen session. Each card degrades independently on error.
- HomeView: NavigationStack routing to Contracts, Tasks, Daemons, Directives,
  Listen, and per-item detail views. Pull-to-refresh.
- HomeCards: SectionCard chrome + Contracts/Daemons/Directives/Listen/
  RecentTasks cards with StatusDot, CountPill, relative-time helpers.

M4 — Contracts + Tasks
- ContractsListView: filter (active/completed/archived/all), sorted by
  updatedAt.
- ContractDetailView: phase card + per-contract tasks.
- TasksListView: status filter pills.
- TaskDetailView: metadata card, completion-gate card (rendered only when
  &lt;COMPLETION_GATE&gt; present in output), output card that merges polled body
  with live WS events. Polls every 8s as a fallback when WS is offline.

M5 — WebSocket + markdown/code rendering
- TaskWebSocket: URLSessionWebSocketTask wrapper for
  /api/v1/mesh/tasks/subscribe. Wire messages match mesh_ws.rs
  (subscribeAll / subscribe / subscribeOutput / taskUpdated / taskOutput /
  error). Exponential-backoff reconnect (1s -&gt; 30s cap), status callback
  feeds the masthead WS pill.
- CompletionGate: parses &lt;COMPLETION_GATE&gt;…&lt;/COMPLETION_GATE&gt; into
  {ready, reason, progress, blockers}. CompletionGateView renders it as a
  status card with dashed accent border (ok/warn tint).
- MarkdownBlocks: hand-rolled split-on-fences renderer. Prose blocks via
  AttributedString(markdown:), code blocks via a monospaced, horizontally-
  scrollable CodeBlockView with optional language chip.
- TaskOutputRenderer: merges polled body + streamed LIVE// events with
  per-kind colour (assistant / tool_use / tool_result / error).

M6 — Directives, Daemons, Listen (read-only)
- DirectivesListView: status dot (pending -&gt; warn), goal preview. Notes
  that answering questions is web-only in v1.
- DaemonsListView: online/total, heartbeat relative time, task concurrency.
- ListenHistoryView: session preview list; tolerates 404 if the endpoint
  isn't deployed on the user's instance. Notes that live listen is
  web-only in v1.
- ScreenShell: shared chrome (back chevron, title, WS pill, grid bg) for
  all detail screens.

M7 — Notifications + deep links
- NotificationCenterBridge: requests .alert/.badge/.sound auth on first
  launch; fires local notifications on task-done/failed/blocked and
  directive-question events with a makima:// deepLink in userInfo.
- DeepLink enum: parses makima://task/&lt;uuid&gt;, makima://contract/&lt;uuid&gt;,
  makima://directive/&lt;uuid&gt;. Wired in MakimaApp via .onOpenURL; AppState
  holds a pendingDeepLink for consumers.
- URL scheme registered in project.yml's CFBundleURLTypes.

M8 — Polish
- RELEASING.md: pre-flight checklist, xcodebuild archive/export flow,
  ExportOptions.plist template, App Store submission checklist.
- README: full 'what's implemented' matrix, architecture overview, deep-link
  reference, privacy statement.

M2 bug fixes rolled in
- ListEnvelope&lt;Item&gt;: generic decoder for the daemons/tasks/contracts/
  directives/orders wrapper endpoints ({items:[...], total:N}). Falls back
  to a bare array for resilience.
- AuthStore: now uses ListEnvelope&lt;Daemon&gt; for the probe (was bare array).
- rotateKey: accepts both apiKey and api_key casings in the response.
- Logo: adds missing import UIKit.

Tests added
- CompletionGateTests: parse ready=true, blockers list, nil on missing.
- MarkdownBlocksTests: prose/code splitting, pure prose.
- DeepLinkTests: task/directive parsing, wrong-scheme rejection, unknown
  host rejection.
- ListEnvelopeTests: daemons wrapper, tasks wrapper, bare-array fallback.
- APIClientTests: updated stub to return the envelope shape.

Not wired (deferred to v1.1 per plan)
- Supabase OAuth (Authorization: Bearer path)
- APNs push via services/push-proxy/
- Answer directive questions in-app
- Live Listen with mic + transcription
- Speak (TTS)
- Files editor, mesh merge UI, worktree diff viewer, daemon reauth flow

File count: 34 new/modified, ~2670 LOC.
</content>
</entry>
<entry>
<title>Add Makima iOS app scaffold (M0 + M1 design system)</title>
<updated>2026-04-24T13:21:12+00:00</updated>
<author>
<name>soryu-co</name>
<email>bot@soryu.co</email>
</author>
<published>2026-04-24T13:15:29+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=db092c79a175e3283f479ee0b234b24bde3c736e'/>
<id>urn:sha1:db092c79a175e3283f479ee0b234b24bde3c736e</id>
<content type='text'>
Pure-native SwiftUI client for makima.jp under makima/ios/.

M0 (scaffold)
- XcodeGen project (iOS 18+, Swift 5.10, bundle co.soryu.makima)
- Makefile targets: bootstrap, xcgen, ios-sim-fast, ios-device-fast, test, lint
- GitHub Actions workflow ios-ci.yml — builds + runs XCTest on macos-14
- MIT repo root license already in place

M1 (design system, web-aesthetic port)
- Palette: #0c1729 background, #9bc3ff accent, #3f6fb3 border (ported from Tailwind)
- Typography: SF Mono for chrome, uppercase tracked nav labels
- Components: DashedBorder, GridOverlay, MastheadBar + WebSocketStatus pill,
  NavStripPlaceholder (NAV// prefix), JapaneseLongPressText (mobile analogue
  of JapaneseHoverText), Logo (reuses frontend/public/logo/makima-logo.svg with
  Canvas concentric-ring fallback), Badge
- RootView demo screen: masthead, nav strip, logo, CONTROL SYSTEM badge,
  SYSTEM// status card, GLOSSARY// card with 命令/契約/聴取/史料 long-press terms

Auth (v1 plan, not wired here): x-makima-api-key header — verified against
src/server/auth.rs. Authorization: Bearer reserved for v1.1 Supabase OAuth.

v1 plan doc: makima/ios/docs/ios-v1-plan.md
Not in this PR: networking, WebSocket client, stores, feature surfaces
(Home/Contracts/Tasks/Directives/Daemons/Listen), notifications. Those land
across M2-M8 per the plan.
</content>
</entry>
</feed>
