Commit 576f45e
v2.0.0-alpha.1 (#68)
* Add Task Master and Claude Code integration documentation and configuration (#28)
* Setup Subrepos for v2.0.0 development (#42)
* Add Task Master and Claude Code integration documentation and configuration (#28)
* docs(infra/task-11): add git-subrepo workflow documentation (#41)
* git subrepo clone --branch=v1.0.0 git@github.com:brightdigit/SundialKitStream.git Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "e30ba8a"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "e30ba8a"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo clone --branch=v1.0.0 git@github.com:brightdigit/SundialKitBinary.git Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "7efef58"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "7efef58"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo clone --branch=v1.0.0 git@github.com:brightdigit/SundialKitCombine.git Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "7afd90c"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "7afd90c"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo clone --branch=v1.0.0 git@github.com:brightdigit/SundialKitMessagable.git Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "ecab13c"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "ecab13c"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* chore(infra): add GitHub workflows and project.yml to all plugin subrepos
- Add comprehensive CI/CD workflows for SundialKitBinary, SundialKitCombine, and SundialKitMessagable
- Update SundialKitStream workflow to match full test matrix
- Add project.yml files to all four plugin subrepos for XcodeGen integration
- Workflows include Ubuntu/macOS builds, iOS/watchOS testing, coverage, and linting
- All subrepos now have consistent CI/CD and tooling configuration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "2e15512"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "2e15512"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "2a31776"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "2a31776"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "b3c36dd"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "b3c36dd"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "e36ee24"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "e36ee24"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "b850a25"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "b850a25"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "e70e5d7"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "e70e5d7"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "c7f66b9"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "c7f66b9"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "5e9dfd2"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "5e9dfd2"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* feat(stream): add skeletal Sources, Tests, and CodeQL workflow
* feat(binary): add skeletal Sources, Tests, and CodeQL workflow
* feat(combine): add skeletal Sources, Tests, and CodeQL workflow
* feat(messagable): add skeletal Sources, Tests, and CodeQL workflow
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "899561b"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "899561b"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "0962254"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "0962254"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "47271ee"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "47271ee"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "44066d6"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "44066d6"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* feat(infra): add dependency management and update CI workflows
- Add Scripts/toggle-dependencies.sh for local/remote dependency switching
- Add Scripts/ensure-remote-deps.sh to each subrepo for CI safety
- Add Scripts/lint-all.sh for monorepo-wide linting
- Update all subrepo workflows to ensure remote dependencies before build
- Remove pre-Swift 6.1 versions from SundialKitBinary and SundialKitStream matrices
- Run linting and apply formatting fixes across all subrepos
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "e1c1c5a"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "e1c1c5a"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "8cd5b67"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "8cd5b67"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "60dfb9d"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "60dfb9d"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "9b17dd6"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "9b17dd6"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* fix(infra): make ensure-remote-deps.sh cross-platform
- Detect OS type using $OSTYPE
- Use sed -i '' on macOS (darwin)
- Use sed -i on Linux
- Fixes CI failures in GitHub Actions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "6e39305"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "6e39305"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "a475d83"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "a475d83"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "92364fa"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "92364fa"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "9e00e46"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "9e00e46"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* feat(combine,messagable): add SundialKit dependency to Package.swift
- Add remote SundialKit dependency to both Package.swift and Package@swift-6.1.swift
- Configure product dependency in target definitions
- Resolves missing dependency declarations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "32ee3c9"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "32ee3c9"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "fc519ee"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "fc519ee"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* chore(ci): update subrepo workflows to use no-resolved branch
Update all plugin subrepo workflows to use the no-resolved branch of
swift-build action and add skip-package-resolved option.
Changes:
- Switch from brightdigit/swift-build@v1.3.4 to @no-resolved
- Add skip-package-resolved: true for subrepos with remote dependencies
- Applies to: SundialKitBinary, SundialKitCombine, SundialKitMessagable, SundialKitStream
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "c62bb35"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "c62bb35"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "a7755ff"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "a7755ff"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "4e3b6ad"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "4e3b6ad"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "097fb72"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "097fb72"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* Adding SubRepos to .swiftlint.yml Ignore
* fix(binary): ensure remote dependencies in lint job
- Add ensure-remote-deps.sh step to lint workflow
- Fix SwiftLint ACL violations in test file with internal keywords
- Resolves GitHub Actions lint failure in CI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "ba5bba5"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "ba5bba5"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* Fixing Linting Issues
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "421ca2e"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "421ca2e"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "52fbc26"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "52fbc26"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "e600706"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "e600706"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* updating to use swift-build v1.4.0
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "0dfc8b8"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "0dfc8b8"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "fdf6806"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "fdf6806"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "a466fb2"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "a466fb2"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "62e0818"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "62e0818"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* fixing swift-build run
* git subrepo push Packages/SundialKitBinary
subrepo:
subdir: "Packages/SundialKitBinary"
merged: "e9d4abb"
upstream:
origin: "git@github.com:brightdigit/SundialKitBinary.git"
branch: "v1.0.0"
commit: "e9d4abb"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "1060a3c"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "1060a3c"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitMessagable
subrepo:
subdir: "Packages/SundialKitMessagable"
merged: "0d183a3"
upstream:
origin: "git@github.com:brightdigit/SundialKitMessagable.git"
branch: "v1.0.0"
commit: "0d183a3"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "3b3e8bf"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "3b3e8bf"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "999134536e"
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Create SundialKitCore with protocols and typed error (#44)
* feat(network): Task 2 - Extract NetworkMonitor from NetworkObserver (#46)
* Extract ConnectivityManager from ConnectivityObserver (#47)
* Adding Setup for Examples Demo (#50)
* Posting First Version of Demo Application (#55)
* Adding Message Lab View (#51)
* updating tasks
* chore(taskmaster): Prioritize demo app (Task 13) over test migration
Update task priorities to validate core functionality with demo app before
investing in comprehensive test migration:
- Task 13 (Demo app): medium → high priority, status → in-progress
- Task 9 (Test migration): high → medium priority, add Task 13 dependency
- Task 9: Update description to note deferral until demo validates core
Rationale: Testing code that doesn't work is premature. The demo app provides
real-world integration validation of NetworkMonitor and ConnectivityManager
implementations before committing to extensive XCTest → Swift Testing migration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* starting work on example
* docs(demo/task-13): Add comprehensive implementation plan and resume guide
Added detailed documentation for Sundial demo Phase 1 completion:
- IMPLEMENTATION_PLAN.md: Complete 5-phase implementation roadmap
- RESUME_HERE.md: Quick start guide for next development session
Phase 1 Complete:
- Protocol Buffer schemas (color, complex, latency test)
- BinaryMessagable direct conformance (no wrapper pattern)
- Shared infrastructure (TransportMethod, LatencyTracker)
- Utility extensions (Color, Date)
- Package.swift and build scripts
Next Phase: Shared UI components and Combine variant implementation
Task Master: Task 13.2 (v1.0.0 validation baseline)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo/task-13): Complete Phase 2 - Shared UI components and protobuf generation
Implemented all Phase 2 deliverables for Sundial demo application:
## Build Tools Setup
- Created Mintfile for managing swift-protobuf@1.28.2
- Updated generate-protos.sh to use Mint instead of homebrew
- Script follows same pattern as main project's lint.sh
- Cross-platform support (macOS/Linux/GitHub Actions)
## Protobuf Code Generation
Generated Swift code from 3 .proto schemas:
- color_message.pb.swift (4.2KB) - Simple color messages
- complex_message.pb.swift (11KB) - Nested complex messages
- latency_test.pb.swift (12KB) - Ping/pong latency tests
## Shared UI Components (6 components)
Created Sources/Shared/Views/ with production-ready components:
1. **MetricCard.swift** - Reusable metric display cards
- Used for RTT, payload sizes, success rates, encode/decode times
- Props: title, value, subtitle, icon, color
2. **ColorPreview.swift** - Color circle with metadata
- Shows sent/received colors with timestamp and source
- Configurable size, optional metadata display
3. **TransportBadge.swift** - Transport method indicators
- Visual badges for sendMessage, sendMessageData, updateApplicationContext
- Active/inactive states with color coding
4. **ConnectionStatusView.swift** - Connection health footer
- Compact status showing reachability and activation state
- Color-coded indicators (green=reachable, orange=not reachable, red=inactive)
5. **LatencyGraph.swift** - Line chart for RTT history
- iOS 16+/watchOS 9+ using SwiftUI Charts
- Displays last 20 measurements with transport method color coding
6. **MessageHistoryRow.swift** - Message log list rows
- Shows timestamp, method, size, RTT, success status
- Used in Diagnostics tab message history
All components include:
- Full MIT license headers with BrightDigit copyright
- Comprehensive documentation comments
- SwiftUI previews for rapid iteration
- Platform availability annotations (@available)
- Accessibility considerations
## Phase 3 Ready
Foundation complete for implementing Combine and Stream app variants.
Next: Create SundialDemoCombine app structure with TabView and first tab.
Task Master: Task 13.2 (v1.0.0 validation baseline)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(demo/task-13): Update RESUME_HERE.md for Phase 3 start
Updated resume guide to reflect Phase 2 completion:
- Added checklist of 8 new files in Phase 2
- Updated file tree showing Generated/ and Views/ directories
- Modified next steps to focus on Phase 3 (Combine app structure)
- Added quick start commands for creating app scaffolding
- Updated status: Phase 2 Complete ✅ → Phase 3 Next 📋
Task Master: Task 13.2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo/task-13): Implement Phase 3 - Combine app structure (WIP)
Implemented Combine variant app structure for Sundial demo:
## App Foundation
- SundialApp.swift: @main entry point for Combine variant
- ContentView.swift: TabView with 4 tabs (Transport, Latency, Protocol, Diagnostics)
- Placeholder views for tabs 2-4 (to be implemented in future phases)
## Tab 1: Message Transport Lab
- MessageLabViewModel.swift: @MainActor Combine-based ViewModel
- ConnectivityObserver integration for WatchConnectivity
- Color selection and payload complexity control
- Transport method selection (sendMessage, sendMessageData, updateApplicationContext)
- Message building with protobuf (ColorMessage, ComplexMessage)
- Send statistics tracking
- MessageLabView.swift: Interactive SwiftUI UI
- Payload Builder section (color picker + complexity slider)
- Transport Control section (method badges + send button)
- Results Display section (sent/received color previews)
- Connection Status footer
- Uses shared components (ColorPreview, TransportBadge, MetricCard, ConnectionStatusView)
## Shared Infrastructure Updates
- TransportMethod.swift: Added `icon` alias and `color` property for UI
- Date+Milliseconds.swift: Added `millisecondsSince1970` alias
- All shared Views: Cross-platform Color support (iOS/watchOS/macOS)
- MetricCard, TransportBadge, ConnectionStatusView, LatencyGraph, MessageHistoryRow
- Replace Color(.systemBackground) with platform-specific variants
## Placeholders
- SundialDemoStream/main.swift: Placeholder for Phase 4 Stream variant
- Tests/PlaceholderTests.swift: Test structure for Phase 5
## Known Issues (To Fix)
- Build errors: Proto types not accessible from ViewModel
- macOS unavailability: Need @available annotations for iOS/watchOS only
- Message handling: Need proper binary Data <-> ConnectivityMessage bridge
- Color.rgbaComponents: Need extension for RGBA component extraction
Next: Fix build errors, add platform annotations, implement binary message handling
Task Master: Task 13.2 (v1.0.0 validation baseline)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(taskmaster): Update task 13.2 with Phase 3 progress notes
Updated subtask 13.2 with Phase 3 implementation status:
- Combine app structure complete
- Tab 1 fully implemented (UI + ViewModel)
- Cross-platform color support added
- Known build issues documented
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo/task-13): Create Xcode project with library-based architecture
Set up complete Xcode project infrastructure for iOS and watchOS apps:
Architecture:
- Convert Package.swift products from .executable() to .library()
- Make SundialApp and ContentView public in library
- Create thin app entry points (Apps/SundialCombine, Apps/SundialStream)
- Both iOS and watchOS targets share same entry point code
XcodeGen Configuration (project.yml):
- 4 app targets: SundialCombine-iOS/watchOS, SundialStream-iOS/watchOS
- Each links against library product (no source duplication)
- App targets only contain @main wrapper + resources
Resources:
- iOS: Info.plist, Assets.xcassets with AppIcon
- watchOS: Info.plist, Assets.xcassets with AppIcon
Protobuf Generation:
- Fixed Scripts/generate-protos.sh to use Visibility=Public
- Regenerated all protobuf types as public for module accessibility
- ColorMessage, ComplexMessage, LatencyTest now accessible from apps
Structure:
- Swift Package provides reusable libraries
- Xcode apps are minimal wrappers linking libraries
- Proper separation of concerns (library vs app code)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(demo/combine): Fix ComplexMessage property usage and Color extension
Fixed missing properties on Sundial_Demo_ComplexMessage:
- Changed deviceInfo.platform to deviceInfo.deviceID (platform field doesn't exist in proto)
- Changed message.sensorData to message.sensors (correct proto field name)
- Added proper SensorData struct creation with temperature, humidity, pressure, readingTimeMs
- Populated all DeviceInfo fields: deviceID, osVersion, appVersion, locale, bootTimeMs
Added Color.rgbaComponents alias:
- Created alias for Color.components to match ViewModel usage
- Maintains backward compatibility with existing components property
Build now succeeds for SundialDemoCombine scheme.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(demo): Fix watchOS build compatibility and bundle ID configuration
- Fix ColorPicker availability for watchOS (use color grid instead)
- Fix platform-specific color APIs (WKInterfaceDevice vs UIDevice)
- Correct watchOS bundle IDs to include iOS parent prefix
- Add separate Info.plist files for Combine and Stream watchOS apps
- Configure explicit schemes to pair iOS and watchOS apps correctly
- Add watchOS apps as embedded dependencies in iOS apps
- Support DEVELOPMENT_TEAM environment variable in XcodeGen
Resolves WatchKit 2.0 bundle ID validation errors and platform
API compatibility issues for both Combine and Stream demo apps.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(demo/combine): Split ContentView and ProtoExtensions into focused files
- Rename ContentView to SundialTabView for better clarity
- Extract LatencyDashboardView, ProtocolComparisonView, and DiagnosticsView into separate files
- Split ProtoExtensions.swift into 5 message-specific extension files:
- ColorMessageExtensions.swift (BinaryMessagable + SwiftUI helpers)
- ComplexMessageExtensions.swift (BinaryMessagable + sample() + estimatedSize)
- LatencyTestRequestExtensions.swift (BinaryMessagable + create())
- LatencyTestReplyExtensions.swift (BinaryMessagable + create() + roundTripTime())
- LatencyStatsExtensions.swift (BinaryMessagable only)
- Replace #if DEBUG PreviewProvider with modern #Preview macro (iOS 17+)
- Maintain view availability at iOS 16.0/watchOS 9.0 for backward compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(demo/shared): Optimize ConnectionStatusView for watchOS compact display
- Replace activation state text with tiny circle symbol (6pt) on watchOS
- Reduce relative time font to 10pt on watchOS
- Reduce vertical padding from 8 to 4 on watchOS
- Maintain full layout for iOS/macOS
- Update preview to use modern #Preview macro (iOS 17+)
This significantly reduces the height of the status bar on Apple Watch while
maintaining readability through color-coded symbols.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(demo/combine): Optimize MessageLabView layout for watchOS
- Replace VStack with LazyVStack for better scrolling performance
- Move ConnectionStatusView to pinned section header for always-visible status
- Replace .safeAreaInset with section header for better watchOS compatibility
- Shorten "Select Color" label to "Color" for compact display
- Use icon-only shuffle button on watchOS (full label on iOS/macOS)
These changes significantly improve the layout on Apple Watch by keeping
the connection status always visible while scrolling and reducing text clutter.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fixing backgorund color
* refactor(demo/combine): Extract PayloadBuilderView into focused subcomponents
Split PayloadBuilderView into three specialized, reusable SwiftUI views:
- ColorGridPickerView: watchOS-specific color grid picker
- ColorSelectorView: Platform-adaptive color selection with preview
- PayloadComplexityView: Complexity slider with dynamic message labels
Benefits:
- Single responsibility: Each view has one focused purpose
- Reusability: Components can be used independently
- Maintainability: Reduced PayloadBuilderView from 182 to 65 lines (64% reduction)
- Platform isolation: watchOS-specific code isolated in ColorGridPickerView
- Testability: Each component has dedicated previews
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(demo/combine): Extract MessageLabView into focused subviews
Breaks down MessageLabView into smaller, focused components:
- ErrorSectionView: Handles error display
- ResultsView: Manages message results display
- TransportControlView: Controls transport selection
- New Models directory for view-specific data structures
Also updates shared views with improved styling and watchOS optimization.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactoring and optimizing for watchOS
* fix(demo/connectivity): Fix message sending and memory alignment crash
## Issues Fixed:
1. **Memory Alignment Crash (BinaryMessageEncoder.swift:86)**
- Fixed fatal error: load from misaligned raw pointer
- Changed from unsafe direct load to safe copy to aligned buffer
- Uses copyBytes(to:from:) instead of load(as:) on Data slice
2. **Message Communication Issues (MessageLabViewModel.swift)**
- Fixed incorrect async/await on synchronous activate() method
- Added MessageDecoder initialization for binary message decoding
- Subscribed to typedMessageReceived instead of messageReceived
- Implemented complete message handling for ColorMessage and ComplexMessage
- Added defer block to ensure isSending always resets
- Added comprehensive debug logging throughout message flow
## Technical Details:
**BinaryMessageEncoder alignment fix:**
- Data slices don't guarantee proper alignment for UInt32
- Now copies 4 bytes to aligned UInt32 variable before reading
- Prevents intermittent crashes depending on memory addresses
**MessageLabViewModel improvements:**
- Removed await from synchronous activate() call
- Platform-specific init for iOS/watchOS (WatchConnectivity unavailable on macOS)
- Proper message type detection and color extraction
- Emoji-prefixed logs for easy debugging (✅📤📡🔄❌)
## Testing:
- All 51 tests pass
- iOS and watchOS builds succeed
- Linter passes with no new errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(combine): Call reply handler to complete send operations
## The Bug:
The "Sending..." button stayed stuck because the receiving side never
called the WatchConnectivity reply handler. When binary messages are sent
via `sendMessageData()`, WatchConnectivity requires the receiver to call
the `replyHandler` closure to acknowledge receipt. Without this call, the
sender's continuation waits forever, blocking the UI.
## The Fix:
**ConnectivityObserver+Delegate.swift (line 191-193):**
- Added `replyHandler(Data())` call after processing received message
- Sends empty Data as acknowledgment since no reply payload is needed
- Completes the sender's `withCheckedContinuation` allowing UI to update
**MessageLabViewModel.swift (line 135-139):**
- Fixed macOS init to use designated initializer with `NeverConnectivitySession`
- Resolves build error where convenience init is unavailable on macOS
## Technical Details:
WatchConnectivity's `sendMessageData(_:replyHandler:)` requires the
receiver to call the reply handler even if no reply data is needed.
This completes the async operation on the sender's side.
Without the reply handler call:
1. Sender calls `sendMessageData()` → waits for reply
2. Receiver gets message → publishes to stream → **never replies**
3. Sender's continuation never resumes
4. `defer { isSending = false }` never executes
5. Button stays in "Sending..." state forever
With the fix:
1. Sender calls `sendMessageData()` → waits for reply
2. Receiver gets message → publishes to stream → **calls replyHandler(Data())**
3. Sender's continuation resumes with empty reply
4. `defer` block executes, resetting `isSending = false`
5. Button returns to normal state
## Testing:
- All tests pass
- iOS and watchOS builds succeed
- Linter passes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fixing Reply Handler
* docs(demo): Add comprehensive TestFlight setup plan for Pulse & Flow apps
Create detailed 10-phase implementation plan for setting up fastlane-based
TestFlight distribution of SundialKit demo applications. Plan includes:
- Version management and display names configuration in project.yml
- Fastlane setup following Bitness repository patterns
- Code signing with existing AppCerts repository
- GitHub Actions CI/CD workflow with build + lint + deploy
- Makefile integration for local development
- App Store Connect setup for internal testing
- Comprehensive deployment documentation
Apps to be distributed:
- Pulse (SundialCombine - Combine variant demo)
- Flow (SundialStream - AsyncStream variant demo)
Plan saved to .taskmaster/docs/testflight-plan.md for future implementation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Setup TestFlight deployment infrastructure for Pulse & Flow apps
Implements comprehensive TestFlight setup for both SundialCombine (Pulse)
and SundialStream (Flow) demo applications following the testflight-plan.md.
Phase 1: Display Names & Version Management
- Add MARKETING_VERSION: "1.0.0" and CURRENT_PROJECT_VERSION: "1" to project.yml
- Configure PRODUCT_DISPLAY_NAME: "Pulse" for SundialCombine targets
- Configure PRODUCT_DISPLAY_NAME: "Flow" for SundialStream targets
Phase 2: Code Signing Configuration
- Add manual code signing settings to all 4 targets (iOS/watchOS for both apps)
- Configure provisioning profile specifiers for App Store distribution
- Set CODE_SIGN_IDENTITY to "iPhone Distribution"
Phase 3 & 4: Fastlane Setup
- Create Fastlane/Appfile with team and Apple ID configuration
- Create Fastlane/Fastfile with beta lanes for Pulse and Flow
- Add Gemfile and Gemfile.lock with fastlane dependency
Phase 5: App Icon Structure
- Create separate AppIcon sets for Pulse (warm colors) and Flow (cool colors)
- iOS: AppIcon-Pulse.appiconset and AppIcon-Flow.appiconset
- watchOS: AppIcon-Pulse.appiconset and AppIcon-Flow.appiconset
- Update project.yml to reference correct icon sets per target
Phase 6: GitHub Actions CI/CD Workflow
- Create .github/workflows/sundial-demo.yml
- Build jobs for iOS and watchOS on both Pulse and Flow variants
- Lint job for code quality checks
- TestFlight deployment job (manual trigger or on demo-v* tags)
- Uses Xcode 16.1 with iPhone 16 Pro and Apple Watch Series 10 simulators
Phase 7: Makefile Targets
- demo-generate: Generate Xcode project from project.yml
- demo-build-pulse/flow: Local build commands
- demo-beta-pulse/flow/all: TestFlight deployment commands
- demo-install-certs/update-certs: Certificate management
Phase 10: Documentation
- Create DEPLOYMENT.md with comprehensive deployment guide
- Includes prerequisites, local development, TestFlight deployment
- Troubleshooting section with common issues
- App icon design specifications (warm vs cool themes)
- Required GitHub secrets documentation
Bundle Identifiers:
- Pulse iOS: com.brightdigit.sundial.combine.ios
- Pulse watchOS: com.brightdigit.sundial.combine.ios.watchkitapp
- Flow iOS: com.brightdigit.sundial.stream.ios
- Flow watchOS: com.brightdigit.sundial.stream.ios.watchkitapp
Remaining: App Store Connect setup, certificate sync, app icon design
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(demo): Add mise configuration for Ruby version management
Add .mise.toml to manage Ruby 3.3.0 for Fastlane demo app deployment.
This ensures consistent Ruby version across development environments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Complete Fastlane match and lane setup for Pulse & Flow
Implement comprehensive Fastlane configuration for deploying both Pulse
(SundialCombine) and Flow (SundialStream) apps to TestFlight with their
watchOS companions.
**Matchfile** (new):
- Configure match for certificate/provisioning profile management
- Git repository: git@github.com:brightdigit/AppCerts.git
- All 4 bundle IDs configured:
* com.brightdigit.sundial.combine.ios (Pulse iOS)
* com.brightdigit.sundial.combine.ios.watchkitapp (Pulse watchOS)
* com.brightdigit.sundial.stream.ios (Flow iOS)
* com.brightdigit.sundial.stream.ios.watchkitapp (Flow watchOS)
- Certificate type: appstore
- Storage mode: git
- Username: ci-appstore@brightdigit.com
**Fastfile** (updated):
- Replace generic beta lane with app-specific lanes
- beta_pulse: Build and upload Pulse (iOS + watchOS) to TestFlight
- beta_flow: Build and upload Flow (iOS + watchOS) to TestFlight
- beta_all: Deploy both apps sequentially
- sync_certs: Readonly certificate sync (for CI)
- update_appstore_certs: Update certificates locally with force_for_new_devices
- build_and_upload (private): Shared helper lane that:
* Generates Xcode project via xcodegen
* Authenticates with App Store Connect API
* Syncs certificates via match (readonly in CI)
* Builds app with proper scheme and provisioning profiles
* Uploads to TestFlight with skip_waiting_for_build_processing
**Appfile** (updated):
- Remove single app_identifier (was Pulse-only)
- Support multi-app deployment via Fastfile lanes
- Apple ID: leogdion@brightdigit.com
- Team IDs: MLT7M394S7 (Developer Portal), 2108001 (App Store Connect)
**Available Commands:**
```bash
bundle exec fastlane beta_pulse # Deploy Pulse
bundle exec fastlane beta_flow # Deploy Flow
bundle exec fastlane beta_all # Deploy both
bundle exec fastlane sync_certs # Sync certificates
bundle exec fastlane update_appstore_certs # Update certificates
```
**Makefile Integration:**
- make demo-beta-pulse
- make demo-beta-flow
- make demo-beta-all
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(demo): Add gitignore for Fastlane auto-generated files
Ignore Fastlane-generated files to keep repository clean:
- README.md (auto-generated fastlane documentation)
- report.xml (execution reports)
- test_output/ (test results)
- .env* files (except .env.sample)
These files are generated during fastlane execution and should not
be tracked in version control.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Add export compliance and Mint to Mise migration plan
- Add ITSAppUsesNonExemptEncryption: false to all 4 demo app targets
- Add new Phase 5 for Mint to Mise migration in TestFlight plan
- Update testflight-plan.md with completion status for all phases
- Mark Phases 1-4, 8-10 as complete
- Renumber remaining phases (App Icons→6, CI/CD→7, Docs→11)
- Add progress status section for quick reference
- Update summary and next steps
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Add distinct app icons for Pulse and Flow apps
Create visually distinct app icons for the two demo applications:
- Pulse (SundialCombine): Warm orange/amber gradient with concentric pulse rings and heartbeat waveform
- Flow (SundialStream): Cool cyan/teal gradient with flowing wave patterns and stream droplets
Assets:
- Created SVG source files for scalability
- Generated 1024x1024 PNG icons for iOS and watchOS
- Updated Contents.json to reference icon assets
Phase 6 (App Icons) of TestFlight setup plan complete.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Migrate app icons to Icon Composer format
Replace traditional asset catalog app icons with Icon Composer bundles for Pulse and Flow apps. Icon Composer provides Liquid Glass effects on supported devices and auto-generates backward-compatible versions.
Changes:
- Add Sundial-Pulse.icon and Sundial-Flow.icon bundles to iOS/watchOS resources
- Add Sundial-Base.icon for shared icon assets
- Update project.yml to reference Icon Composer files
- Remove legacy AppIcon-Pulse and AppIcon-Flow appiconsets
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: merge mise migration changes from 48-demo-application-part-1-mise
This merge brings in the Mint to Mise migration changes including:
- Migration of development tooling from Mint to Mise
- Updated CI/CD workflows for mise-based linting
- Subrepo tracking updates to v1.0.0 branches for both SundialKitStream and SundialKitCombine
- Various subrepo synchronization commits
* feat(demo): Add CI archive testing and refactor Fastlane lanes
**Fastfile Changes:**
- Refactor build_and_upload to eliminate code duplication
- Create build_only private lane (builds & archives without upload)
- Add public build_only_pulse and build_only_flow lanes for CI
**GitHub Actions Workflow:**
- Add archive-demo job to test code signing on every push
- Generate random keychain password per run (no secret needed)
- Update deploy-testflight to use generated keychain password
- Comment out tag-based deployment (preserved for future use)
- Deploy job now requires archive-demo to pass first
**Documentation:**
- Mark Phase 7 (GitHub Actions CI/CD) as COMPLETE
- Update summary and next steps
This allows testing secrets and code signing without uploading to
TestFlight on every push, while keeping manual deployment available.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(demo): Modernize CI workflow with Xcode 26 and Swift Package builds
- Use brightdigit/swift-build action for comprehensive matrix testing
- 8 parallel builds: iOS/watchOS × Pulse/Flow × Xcode 26.0/26.1
- All builds on macos-26 with latest Xcode versions
- Proper working-directory parameter usage
- Add xcodegen to mise for consistent tool management
- Create build_only_all Fastlane lane for combined archiving
- Simplify archive-demo job (single build on macos-26 with Xcode 26.0)
- Update deploy-testflight to use macos-26 with Xcode 26.0
- Remove xcodegen dependency from build-demo (Swift Package builds only)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor(demo): Simplify build matrix to single package build per platform
- Reduce from 8 builds to 4 (remove duplicate scheme builds)
- Build entire Sundial package once per platform/Xcode combination
- All targets (Shared, Combine, Stream) built together in single pass
- Matrix: iOS/watchOS × Xcode 26.0/26.1 on macOS-26
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fixup! refactor(demo): Simplify build matrix to single package build per platform
* fix(infra): Add SSH deploy key support for AppCerts repository access
Configure GitHub Actions to use organizational APPCERTS_DEPLOY_KEY secret
for accessing the private certificate repository. This fixes the failing
"Test Archive & Code Signing" job by enabling proper SSH authentication.
Changes:
- Add webfactory/ssh-agent step to archive-demo job
- Add webfactory/ssh-agent step to deploy-testflight job
- Document APPCERTS_DEPLOY_KEY organizational secret in DEPLOYMENT.md
- Add SSH authentication troubleshooting guide
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(infra): Add GitHub known_hosts to prevent SSH prompt hang
Fixes the hanging "Test Archive & Code Signing" job by pre-populating
SSH known_hosts with GitHub's official host keys. This prevents the
interactive "Are you sure you want to continue connecting?" prompt
that was blocking the fastlane match certificate fetch.
The workflow was hanging because SSH encountered an unknown host when
cloning the AppCerts repository, resulting in "no local code signing
identities found" errors.
Changes:
- Add .github/known_hosts with GitHub's official SSH host keys
- Update archive-demo job to copy known_hosts before fastlane
- Update deploy-testflight job to copy known_hosts before fastlane
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(infra): Create dedicated keychain for CI code signing
Fixes "The user name or passphrase you entered is not correct" errors
by creating a custom temporary keychain for CI environments instead of
attempting to use the login keychain.
The login keychain on GitHub Actions runners has an unknown password,
causing match to fail when installing certificates. This change creates
a fresh keychain with a known password for each CI run, while keeping
local development unchanged.
Changes:
- CI: Create fastlane_tmp_keychain with generated password
- CI: Configure match to use custom keychain
- CI: Pass keychain to build_app via OTHER_CODE_SIGN_FLAGS
- CI: Clean up temporary keychain after build completes
- Local: Use default keychain (no changes to local workflow)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(demo): Add Demo Applications section to README
- Document Pulse and Flow demo apps
- Link to DEPLOYMENT.md guide
- Complete Phase 11 of TestFlight plan
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(infra): Replace hardcoded team ID with DEVELOPMENT_TEAM secret
Remove all hardcoded references to team ID MLT7M394S7 and replace with
environment variable/secret for better security and maintainability.
Changes:
- GitHub workflow: Use ${{ secrets.DEVELOPMENT_TEAM }}
- Fastlane Appfile: Use ENV["DEVELOPMENT_TEAM"]
- XcodeGen config: Use ${DEVELOPMENT_TEAM} placeholder
- Documentation: Reference environment variable and add setup instructions
- Remove completed testflight-plan.md (implementation now in DEPLOYMENT.md)
Addresses PR #51 feedback point 4 about hardcoded team ID.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Creating Streaming Flow Demo Application (#54)
* feat(demo): implement SundialDemoStream with AsyncStream architecture
Implements Stream demo variant using modern Swift concurrency patterns
(actors, AsyncStream, @Observable) as alternative to Combine approach.
Major Changes:
- Created StreamMessageLabViewModel with actor-based ConnectivityObserver
- Implemented AsyncStream consumption for reachability, activation, messages
- Created StreamMessageLabView using @State instead of @StateObject
- Created app structure (StreamTabView, SundialStreamApp)
- Added placeholder views for remaining tabs
Refactoring:
- Moved shared views from SundialDemoCombine to SundialDemoShared:
* PayloadBuilderView, TransportControlView, ResultsView, ErrorSectionView
* ColorSelectorView, PayloadComplexityView, ColorGridPickerView
- Moved ColorWithMetadata model to SundialDemoShared
- Removed SundialDemoCombine dependency from SundialDemoStream target
Build Status:
- ✅ swift build --target SundialDemoStream: SUCCESS
- ✅ swift build --target SundialDemoCombine: SUCCESS
- ⚠️ xcodebuild: Project configuration issues remain (separate task)
Component: Demo
Task: 13.3 (Stream demo implementation)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fixup! feat(demo): implement SundialDemoStream with AsyncStream architecture
* fix(demo): configure automatic signing and implement SundialStream app
- Configure automatic code signing for Debug builds on all 4 app targets
(SundialCombine-iOS, SundialCombine-watchOS, SundialStream-iOS, SundialStream-watchOS)
- Keep manual signing with App Store distribution profiles for Release builds
- Implement SundialStreamAppMain to use actual StreamTabView() from SundialDemoStream
- Update Stream app deployment targets to iOS 17.0 and watchOS 10.0 to match
@Observable and AsyncStream requirements
- Remove placeholder "Coming in Phase 4" text
This fixes the code signing error that prevented deployment to physical devices:
"Attempted to install a Beta profile without the proper entitlement"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(demo): configure Icon Composer integration with XcodeGen
Add XcodeGen fileTypes configuration to treat .icon packages as atomic
files instead of unpacking their contents. Update resource references
from folder-level to individual file-level for proper icon placement.
Changes:
- Add fileTypes.icon.file=true to prevent .icon package unpacking
- Replace folder references with individual .icon file references
- Include Assets.xcassets and Info.plist files explicitly
- Ensures icons are processed correctly at build time for iOS 26+
Verified:
- SundialStream (Flow) generates Sundial-Flow icons
- SundialCombine (Pulse) generates Sundial-Pulse icons
- Both iOS and watchOS variants work correctly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* chore(examples): remove Sundial-Reference and extract IpifyPing
- Remove outdated Sundial-Reference directory with old demo code
- Extract and modernize IpifyPing.swift to Shared/Utilities
- Update IpifyPing for Swift 6.1 with explicit Sendable conformance
- Add comprehensive documentation and usage examples
- Make IpifyPing public for use in both Combine and Stream demos
The old Sundial-Reference demo has been superseded by the modern
Pulse and Flow applications. IpifyPing is preserved as a working
example of a NetworkPing implementation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fixup! chore(examples): remove Sundial-Reference and extract IpifyPing
* fix(examples): resolve Swift test issues in Sundial demo
- Add missing SundialKitNetwork dependency to SundialDemoShared target
(resolves undefined symbol linker error for NetworkPing protocol)
- Remove self-imports of SundialDemoShared from view files
(eliminates 5 compiler warnings)
Tests now run successfully with 'swift test'.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(ci): automate TestFlight deployment on v2.0.0/main branches
- Add upload_only fastlane lane to upload pre-built IPAs
- Modify archive-demo job to upload IPA artifacts
- Update deploy-testflight job to:
- Trigger automatically on v2.0.0 or main branch pushes
- Download and reuse IPAs from archive-demo (saves ~10-15 min)
- Upload both Pulse and Flow apps to TestFlight
- Auto-increment build number in project.yml after successful upload
- Commit with [skip ci] flag to prevent infinite loops
This replaces manual TestFlight deployment with fully automated workflow.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(tests): increase test timeouts to prevent intermittent CI failures
Increase hardcoded sleep durations and improve waitUntil helper to address
intermittent test failures on slow CI runners (exit code 65).
Changes:
- NetworkMonitorTests: 50ms→200ms, 100ms→300ms, 200ms→500ms (13 occurrences)
- ConnectivityManagerActivationTests: 200ms→500ms (3 occurrences)
- ObserverRegistryTests: 50ms→200ms (2 occurrences)
- waitUntil helper: polling 10ms→50ms, added debug logging for timeouts
All 51 tests pass locally with increased timeouts providing better resilience
to actor scheduling delays and dispatch queue latency on CI environments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* chore: trigger sundial-demo CI workflow
The workflow file was introduced in the previous commit, so GitHub Actions
didn't run it for that push. This empty commit triggers the workflow.
* chore: bump build number to 2 [skip ci]
* Fixing Transport Tab (#59)
* chore: bump build number to 3 [skip ci]
* Fixing TestFlight Deployment (#65)
* fix(ci): add build processing validation and revert to build 2
- Revert build number to 2 (was incorrectly bumped without successful upload)
- Remove skip_waiting_for_build_processing to wait for Apple's validation
- Add wait_processing_timeout_duration: 1800 (30 min) for each app
- Add 90-minute timeout for deploy job to accommodate processing wait
- This will reveal any validation errors that caused build 2 to disappear
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* ci: temporarily add fix branch to deploy condition
* chore: bump build number to 3 [skip ci]
* fix(demo): use build settings for version numbers in Info.plist files
Replaces hardcoded CFBundleVersion and CFBundleShortVersionString values
with $(CURRENT_PROJECT_VERSION) and $(MARKETING_VERSION) respectively.
This allows CI to properly increment build numbers for TestFlight uploads.
Also resets build number to 2 since App Store Connect only has build 1.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: bump build number to 3 [skip ci]
* fix(ci): remove temporary branch and gitignore generated plists [skip ci]
- Remove fix/build-2-upload-validation from deploy condition
- Add *.plist to gitignore for xcodegen-generated files
- Remove tracked Info.plist files (now auto-generated)
- Reset build number to 2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Updating Documentation (#66)
* docs: update DocC documentation for v2.0.0 architecture
- Add DocC landing pages for SundialKitCombine and SundialKitStream plugins
- Update main Documentation.md to reflect v2.0.0 three-layer architecture
- Remove deprecated ConnectivityObserver.md and NetworkObserver.md (moved to plugins)
- Add .gitignore to exclude .docc-build directories
- Mark tasks 9 (Swift Testing migration) and 13 (demo app) as complete
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(docs): add DocC preview script with auto-rebuild
Adds preview-docs.sh script to enable local DocC documentation preview with automatic rebuilding on file changes. The script uses xcrun docc preview for serving and fswatch for monitoring Swift source changes, avoiding the need to add swift-docc as a package dependency.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "899c22a"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "899c22a"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "e8b7739de9"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "7bc90df"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "7bc90df"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "e8b7739de9"
* docs: rewrite DocC overview to focus on use cases
- Lead with practical use cases (cross-device communication, network-aware apps)
- Add "What Can You Build?" section with real-world examples
- Add "Available Packages" section with placeholder links to targets
- Remove architectural details from overview (not relevant to new users)
- Remove mentions of Heartwitch, Swift 6.1 concurrency details
- Focus on developer capabilities rather than technical implementation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* removing enum
* docs(docc): fix API examples and add improvement TODOs
Major documentation corrections:
- Fix NWPathMonitorAdapter → NWPathMonitor (adapter class doesn't exist)
- Fix sendMessage(dict) → send(message) to use typed Messagable API
- Fix Messagable: init? → init throws with Sendable parameters
- Fix BinaryMessagable: binaryData/from → encode/init methods
- Reorder sections: explain Messagable/BinaryMessagable before WatchConnectivity
- Add typed message receiving examples (typedMessageReceived, typedMessageStream)
Improvements:
- Add TODO warnings as DocC asides for future enhancements
- TODOs cover: explanatory text, default initializers, protocol details
Also fixes:
- ColorMessageExtensions: serializedData → serializedBytes (correct protobuf API)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(docc): address TODOs and add NetworkObserver default initializers
- Add default init() to NetworkObserver in SundialKitStream and SundialKitCombine
- Simplify Network Monitoring section with Quick Start and Advanced subsections
- Streamline Type-Safe Messaging section with key behavior as brief note
- Improve Binary Messaging section with real protobuf examples and swift-protobuf link
- Update WatchConnectivity examples to show both Messagable and BinaryMessagable types
- Add message size limit note (65KB) with link to Apple's WatchConnectivity docs
- Remove all 9 TODO warnings from Documentation.md
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(docc): add DocC documentation and improve preview script
Documentation improvements:
- Add SundialKitCore.docc with comprehensive package overview
- Document all core protocols, types, and error types
- Clean up structure by removing redundant content
- Add SundialError to Error Types section
Script enhancements:
- Improve preview-docs.sh with better error handling
- Add support for multiple .docc catalogs
- Update Makefile with new documentation targets
API documentation additions:
- Add detailed docs to ActivationState enum
- Add comprehensive docs to ConnectivityMessage typealias
- Enhance Interfaceable protocol documentation
- Expand PathStatus documentation with all cases
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs(docc): enhance documentation with narrative flow and remove advanced sections
- Remove Architecture sections (redundant with main SundialKit docs)
- Remove Advanced Usage sections (not needed for typical users)
- Add Getting Started sections explaining plugin selection
- Add introductory text before code examples explaining use cases
- Add concluding text after examples summarizing key concepts
- Enhance inline documentation for result/context types
Changes focus documentation on practical usage patterns and improve
readability with better narrative structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fixing Makefile for Network and Connectivity
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "0b8ae65"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "0b8ae65"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "e8b7739de9"
* git subrepo push Packages/SundialKitStream
subrepo:
subdir: "Packages/SundialKitStream"
merged: "8234353"
upstream:
origin: "git@github.com:brightdigit/SundialKitStream.git"
branch: "v1.0.0"
commit: "8234353"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "e8b7739de9"
* docs(docc): remove MainActor references and transport selection details
- Remove @MainActor mentions from SundialKitCombine descriptions
- Remove "all updates happen on main thread" explanations
- Remove automatic transport selection details from connectivity docs
- Preserve actor-based descriptions for SundialKitStream
- Simplify plugin comparison focusing on observation patterns
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* git subrepo push Packages/SundialKitCombine
subrepo:
subdir: "Packages/SundialKitCombine"
merged: "cbcd2cc"
upstream:
origin: "git@github.com:brightdigit/SundialKitCombine.git"
branch: "v1.0.0"
commit: "cbcd2cc"
git-subrepo:
version: "0.4.9"
origin: "https://github.com/Homebrew/brew"
commit: "e8b7739de9"
* Fixing CI Unit Test Issues with watchOS and iOS (#67)
* fix(connectivity): eliminate observer registration race condition
Convert observer management methods to async to fix intermittent CI test failures.
## Problem
ConnectivityManager Observer Tests were failing intermittently (62% failure rate) due to race conditions:
- addObserver() used nonisolated + unstructured Task pattern
- Tests called addObserver() then immediately triggered state changes
- Observers weren't registered when notifications fired
- Tests timed out after ~35 seconds waiting for events
## Changes
- Make addObserver/removeObserver/removeObservers async in protocol
- Remove nonisolated modifier and Task wrappers from actor extension
- Add await to all test call sites (7 locations)
- Pattern now matches NetworkMonitor (already async)
## Impact
- Eliminates race condition entirely
- Observers guaranteed regis…1 parent e2348fe commit 576f45e
File tree
331 files changed
+26452
-3441
lines changed- .claude
- agents
- commands/tm
- add-dependency
- add-subtask
- add-task
- analyze-complexity
- clear-subtasks
- complexity-report
- expand
- fix-dependencies
- generate
- init
- list
- models
- next
- parse-prd
- remove-dependency
- remove-subtask
- remove-task
- set-status
- setup
- show
- status
- sync-readme
- update
- utils
- validate-dependencies
- workflows
- .cursor
- rules
- taskmaster
- .devcontainer
- swift-6.1-nightly
- swift-6.1
- swift-6.2-nightly
- swift-6.2
- .github
- workflows
- Assets
- Examples/Sundial
- Apps
- SundialCombine
- SundialStream
- Documentation
- Examples/Sundial
- Examples/Sundial/Tests
- Fastlane
- Protos
- Resources
- iOS
- Assets.xcassets
- AppIcon.appiconset
- Sundial-Flow.icon
- Assets
- Sundial-Pulse.icon
- Assets
- watchOS
- Assets.xcassets
- AppIcon.appiconset
- Sundial-Flow.icon
- Assets
- Sundial-Pulse.icon
- Assets
- Scripts
- Sources
- SundialDemoCombine
- App
- ViewModels
- Views
- SundialDemoStream
- App
- ViewModels
- Views
- Sundial-Base.icon
- Assets
- Tests
- Scripts
- Sources
- SundialKitConnectivity
- Extensions
- SundialKitConnectivity.docc
- Resources
- SundialKitCore
- SundialKitCore.docc
- SundialKitNetwork
- Extensions
- SundialKitNetwork.docc
- Resources
- SundialKit
- Network
- SundialKit.docc
- Resources
- WatchConnectivity
- Tests
- SundialKitConnectivityTests
- SundialKitCoreTests
- SundialKitNetworkTests
- SundialKitTests
- Network
- Extensions
- WatchConnectivity
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
331 files changed
+26452
-3441
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
0 commit comments