Some checks failed
Build & Test / Analyze (javascript, blocksuite) (push) Failing after 3s
Build & Test / Rust test filter (push) Failing after 3s
Build & Test / E2E BlockSuite Test (2) (push) Failing after 3s
Build & Test / E2E BlockSuite Test (3) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (4) (push) Failing after 3s
Build & Test / E2E BlockSuite Cross Browser Test (push) Failing after 3s
Build & Test / E2E Mobile Test (1) (push) Failing after 3s
Build & Test / E2E Mobile Test (2) (push) Failing after 3s
Build & Test / Build AFFiNE native (x86_64-unknown-linux-gnu) (push) Failing after 4s
Build & Test / Unit Test (1) (push) Has been skipped
Build & Test / Unit Test (2) (push) Has been skipped
Build & Test / Unit Test (3) (push) Has been skipped
Build & Test / Build Server native (push) Failing after 3s
Build & Test / Check Git Status (push) Has been skipped
Build & Test / Server Test (0, 4) (push) Has been skipped
Build & Test / Server Test (1, 4) (push) Has been skipped
Build & Test / Analyze (javascript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, blocksuite) (push) Failing after 3s
Build & Test / Mobile native build filter (push) Failing after 3s
Build & Test / Check yarn binary (push) Failing after 3s
Build & Test / E2E BlockSuite Test (1) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (5) (push) Failing after 3s
Build & Test / Unit Test (4) (push) Has been skipped
Build & Test / Unit Test (5) (push) Has been skipped
Build & Test / Native Unit Test (push) Has been skipped
Build & Test / Server Test (2, 4) (push) Has been skipped
Build & Test / Server Test (3, 4) (push) Has been skipped
Build & Test / Server Test with Elasticsearch (push) Has been skipped
Build & Test / Server Test with Embedded Search (push) Has been skipped
Build & Test / Server Test with Manticore Search (push) Has been skipped
Build & Test / Server E2E Test (push) Has been skipped
Build & Test / Cloud Desktop E2E Test (push) Has been skipped
Build & Test / Cloud E2E Test 1/2 (push) Has been skipped
Build & Test / Cloud E2E Test 2/2 (push) Has been skipped
Build & Test / Build @affine/electron renderer (push) Failing after 3s
Build & Test / Copilot test filter (push) Failing after 4s
Build & Test / Lint Rust (push) Has been skipped
Build & Test / Build Android app (push) Has been skipped
Build & Test / Test Android app (push) Has been skipped
Build & Test / Run native tests (push) Has been skipped
Build & Test / Server Copilot Api Test (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (3, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (4, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (1, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (2, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (5, 5) (push) Has been skipped
Build & Test / Desktop Test (ubuntu-latest, linux, x64, x86_64-unknown-linux-gnu, true) (push) Has been cancelled
Build & Test / Desktop Test (windows-latest, windows, x64, x86_64-pc-windows-msvc, true) (push) Has been cancelled
Build & Test / 3, 2, 1 Launch (push) Has been cancelled
Build & Test / Lint (push) Has been cancelled
Build & Test / Typecheck (push) Has been cancelled
Build & Test / Build iOS app (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-apple-darwin) (push) Has been cancelled
Build & Test / E2E Test (1) (push) Has been cancelled
Build & Test / E2E Test (2) (push) Has been cancelled
Build & Test / E2E Test (3) (push) Has been cancelled
Build & Test / E2E Test (4) (push) Has been cancelled
Build & Test / E2E Test (5) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-apple-darwin) (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, arm64, aarch64-apple-darwin, true) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, x64, x86_64-apple-darwin, false) (push) Has been cancelled
4.6 KiB
4.6 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is the AFFiNE iOS application built with Capacitor, React, and TypeScript. It's a hybrid mobile app that wraps a React web application in a native iOS shell.
Development Commands
Build and Development
yarn dev- Start development server with live reloadyarn build- Build the web applicationyarn sync- Sync web assets with Capacitor iOS projectyarn sync:dev- Sync with development server (CAP_SERVER_URL=http://localhost:8080)yarn xcode- Open Xcode projectyarn codegen- Generate GraphQL and Rust bindingsxcodebuild -workspace App.xcworkspace -scheme App -destination 'platform=iOS Simulator,name=iPhone 15' build | xcbeautify- Build iOS project with xcbeautify
iOS Build Process
BUILD_TYPE=canary PUBLIC_PATH="/" yarn affine @affine/ios build- Build web assetsyarn affine @affine/ios cap sync- Sync with iOS projectyarn affine @affine/ios cap open ios- Open in Xcode
Live Reload Setup
- Run
yarn devand selectiosfor Distribution option - Run
yarn affine @affine/ios sync:dev - Run
yarn affine @affine/ios cap open ios
Architecture
Core Technologies
- Capacitor 7.x - Native iOS bridge
- React 19 - UI framework
- TypeScript - Language
- Blocksuite - Document editor
- DI Framework - Dependency injection via
@toeverything/infra
Key Directories
src/- React application sourceApp/- Native iOS Swift codedist/- Built web assetscapacitor-cordova-ios-plugins/- Capacitor plugins
Native Bridge Integration
The app exposes JavaScript APIs to native iOS code through window object:
getCurrentServerBaseUrl()- Get current server URLgetCurrentI18nLocale()- Get current localegetAiButtonFeatureFlag()- Check AI button feature flaggetCurrentWorkspaceId()- Get current workspace IDgetCurrentDocId()- Get current document IDgetCurrentDocContentInMarkdown()- Export current doc as markdowncreateNewDocByMarkdownInCurrentWorkspace()- Import markdown as new doc
Swift Code Style
Follow the guidelines in AGENTS.md:
- 2-space indentation
- PascalCase for types, camelCase for properties/methods
- Modern Swift features:
@Observable,async/await,actor - Protocol-oriented design, dependency injection
- Early returns, guard statements for optional unwrapping
Build Configuration
- TypeScript config extends
../../../../tsconfig.web.json - Webpack bundling via
@affine-tools/cli - Capacitor config in
capacitor.config.ts - GraphQL codegen via Apollo
- Rust bindings generated via Uniffi
Dependencies
- Workspace packages:
@affine/core,@affine/component,@affine/env - Capacitor plugins: App, Browser, Haptics, Keyboard
- React ecosystem: React Router, Next Themes
- Storage: IDB, Yjs for collaborative editing
Testing and Quality
- TypeScript strict mode enabled
- Oxlint/Oxfmt configuration from workspace root
- No specific test commands in this package (tests likely in workspace root)
Swift Code Style Guidelines
Core Style
- Indentation: 2 spaces
- Braces: Opening brace on same line
- Spacing: Single space around operators and commas
- Naming: PascalCase for types, camelCase for properties/methods
File Organization
- Logical directory grouping
- PascalCase files for types,
+for extensions - Modular design with extensions
Modern Swift Features
- @Observable macro: Replace
ObservableObject/@Published - Swift concurrency:
async/await,Task,actor,@MainActor - Result builders: Declarative APIs
- Property wrappers: Use line breaks for long declarations
- Opaque types:
somefor protocol returns
Code Structure
- Early returns to reduce nesting
- Guard statements for optional unwrapping
- Single responsibility per type/extension
- Value types over reference types
Error Handling
Resultenum for typed errorsthrows/tryfor propagation- Optional chaining with
guard let/if let - Typed error definitions
Architecture
- Avoid using protocol-oriented design unless necessary
- Dependency injection over singletons
- Composition over inheritance
- Factory/Repository patterns
Debug Assertions
- Use
assert()for development-time invariant checking - Use
assertionFailure()for unreachable code paths - Assertions removed in release builds for performance
- Precondition checking with
precondition()for fatal errors
Memory Management
weakreferences for cyclesunownedwhen guaranteed non-nil- Capture lists in closures
deinitfor cleanup