{"owner":"Lakr233","repo":"Asspp","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n**Note**: `CLAUDE.md` is a symlink to `AGENTS.md`. Edit `AGENTS.md` directly.\n\n## Project Overview\n\nAsspp is a multi-account App Store management app (iOS + macOS) for searching, downloading, and installing IPA files. It uses an Xcode workspace (`Asspp.xcworkspace`) with SPM dependencies including [ApplePackage](https://github.com/Lakr233/ApplePackage), the core library for App Store API communication, IPA handling, and signature injection.\n\nBundle ID: `wiki.qaq.Asspp`. Deployment targets: iOS 17.0, macOS 15.0. Supports iPhone, iPad, and Mac (native, not Catalyst). No test targets exist.\n\n## Build Commands\n\n```bash\n# Build for iOS (device)\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'generic/platform=iOS' build | xcbeautify\n\n# Build for macOS\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=macOS' build | xcbeautify\n\n# Build for iOS simulator\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 16' build | xcbeautify\n\n# CI release build (iOS IPA, unsigned)\n./Resources/Scripts/compile.release.mobile.ci.sh \"$(pwd)\" \"$(pwd)/Asspp.ipa\"\n\n# CI release build (macOS zip)\n./Resources/Scripts/compile.release.osx.sh \"$(pwd)\" \"$(pwd)/Asspp.zip\"\n```\n\n**Important**: Always use `Asspp.xcworkspace` (not `.xcodeproj`) because the workspace manages SPM package resolution. Always pipe xcodebuild output through `xcbeautify` to reduce output verbosity and save tokens.\n\n## Code Signing Setup\n\n`Configuration/Developer.xcconfig` is gitignored and must exist for builds. It provides code signing settings:\n\n```\nDEVELOPMENT_TEAM = <your team ID>\nCODE_SIGN_STYLE = Automatic\nCODE_SIGN_IDENTITY = Apple Development\n```\n\nA build phase script errors if this file is missing. The CI scripts generate a no-signing version automatically.\n\n## Build Configuration\n\nxcconfig hierarchy: `Debug.xcconfig`/`Release.xcconfig` → `Base.xcconfig` → `Version.xcconfig`, plus `Developer.xcconfig` for signing. Version numbers are in `Configuration/Version.xcconfig` (single source of truth).\n\n## Architecture\n\n### App Entry Point\n\n`Asspp/App/main.swift` — initializes logging (`LogManagerHandler`), configures `ApplePackage` device identifier, sets up `Digger` download manager (max 3 concurrent), and starts the OTA installer on iOS. On iOS 26+, the main view switches to `NewMainView` (new `Tab` API); otherwise `MainView` is used.\n\n### Backend Layer (`Asspp/Backend/`)\n\n- **AppStore/**: `AppStore` singleton manages accounts and device identifier. `AuthenticationService` handles auth. `AppPackage`/`AppPackageArchive`/`UserAccount` are model wrappers around ApplePackage types.\n- **Downloader/**: `Downloads` singleton manages download queue via `Digger`. `PackageManifest` tracks per-download state and IPA signature injection. Downloads persist to `Documents/Asspp/Packages/`.\n- **Installer/**: iOS-only Vapor HTTPS server serving IPA files for OTA installation via `itms-services://` protocol. Uses TLS certs from `Certificates/localhost.qaq.wiki/` bundle.\n- **DeviceCTL/**: macOS-only device management via `devicectl` CLI. `DeviceManager` handles app installation to connected iOS devices.\n- **LogManager.swift**: Thread-safe log singleton feeding `Settings/LogView`.\n\n### Interface Layer (`Asspp/Interface/`)\n\nSwiftUI views organized by feature: Account, Search, Download, Installed (macOS only), Setting, Welcome. `MainView` uses `NavigationSplitView` sidebar on macOS and `TabView` on iOS.\n\n### Key Patterns\n\n- **Observation**: `AppStore`, `Downloads`, `Installer`, `DeviceManager`, `PackageManifest` all use `@Observable` (not legacy `ObservableObject`).\n- **Persistence**: Custom `@PublishedPersist` / `@Persist` property wrappers (in `Extension/PublishedPersist.swift`) back properties to file storage (`Documents/Config/`) or Keychain. Accounts stored in Keychain; downloads and settings use file storage.\n- **Platform branching**: Heavy use of `#if os(macOS)` / `#if os(iOS)` / `#if canImport(UIKit)` for platform-specific code paths.\n- **Singletons**: `AppStore.this`, `Downloads.this` are `@MainActor` singletons.\n- **Localization**: English + Simplified Chinese (zh-Hans) via `.xcstrings` format in `Asspp/App/`.\n\n## Dependencies (SPM via Xcode)\n\n- **ApplePackage** (remote) — App Store protocol, IPA handling\n- **Vapor** — HTTPS server for iOS OTA installation\n- **Digger** — Download manager with progress/speed tracking\n- **Kingfisher** — Async image loading\n- **ColorfulX** — Gradient animations (welcome screen)\n- **KeychainAccess** — Keychain storage for accounts\n- **AnyCodable** — Type-erased Codable values\n- **ButtonKit** — Async button actions\n- **swift-log** — Structured logging (`logger` global)\n\n## Swift Code Style\n\n- **Indentation**: 4 spaces. Opening brace on same line.\n- **Naming**: PascalCase for types, camelCase for properties/methods. PascalCase filenames for types, `+` prefix for extension files.\n- **Structure**: Early returns, guard statements for unwrapping, single responsibility per extension.\n- **Modern Swift**: `@Observable` macro, `async/await`, `@MainActor`, opaque `some` types.\n- **Memory**: `weak`/`unowned` references to break cycles, capture lists in closures.\n"},"files":{"AGENTS.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n**Note**: `CLAUDE.md` is a symlink to `AGENTS.md`. Edit `AGENTS.md` directly.\n\n## Project Overview\n\nAsspp is a multi-account App Store management app (iOS + macOS) for searching, downloading, and installing IPA files. It uses an Xcode workspace (`Asspp.xcworkspace`) with SPM dependencies including [ApplePackage](https://github.com/Lakr233/ApplePackage), the core library for App Store API communication, IPA handling, and signature injection.\n\nBundle ID: `wiki.qaq.Asspp`. Deployment targets: iOS 17.0, macOS 15.0. Supports iPhone, iPad, and Mac (native, not Catalyst). No test targets exist.\n\n## Build Commands\n\n```bash\n# Build for iOS (device)\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'generic/platform=iOS' build | xcbeautify\n\n# Build for macOS\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=macOS' build | xcbeautify\n\n# Build for iOS simulator\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 16' build | xcbeautify\n\n# CI release build (iOS IPA, unsigned)\n./Resources/Scripts/compile.release.mobile.ci.sh \"$(pwd)\" \"$(pwd)/Asspp.ipa\"\n\n# CI release build (macOS zip)\n./Resources/Scripts/compile.release.osx.sh \"$(pwd)\" \"$(pwd)/Asspp.zip\"\n```\n\n**Important**: Always use `Asspp.xcworkspace` (not `.xcodeproj`) because the workspace manages SPM package resolution. Always pipe xcodebuild output through `xcbeautify` to reduce output verbosity and save tokens.\n\n## Code Signing Setup\n\n`Configuration/Developer.xcconfig` is gitignored and must exist for builds. It provides code signing settings:\n\n```\nDEVELOPMENT_TEAM = <your team ID>\nCODE_SIGN_STYLE = Automatic\nCODE_SIGN_IDENTITY = Apple Development\n```\n\nA build phase script errors if this file is missing. The CI scripts generate a no-signing version automatically.\n\n## Build Configuration\n\nxcconfig hierarchy: `Debug.xcconfig`/`Release.xcconfig` → `Base.xcconfig` → `Version.xcconfig`, plus `Developer.xcconfig` for signing. Version numbers are in `Configuration/Version.xcconfig` (single source of truth).\n\n## Architecture\n\n### App Entry Point\n\n`Asspp/App/main.swift` — initializes logging (`LogManagerHandler`), configures `ApplePackage` device identifier, sets up `Digger` download manager (max 3 concurrent), and starts the OTA installer on iOS. On iOS 26+, the main view switches to `NewMainView` (new `Tab` API); otherwise `MainView` is used.\n\n### Backend Layer (`Asspp/Backend/`)\n\n- **AppStore/**: `AppStore` singleton manages accounts and device identifier. `AuthenticationService` handles auth. `AppPackage`/`AppPackageArchive`/`UserAccount` are model wrappers around ApplePackage types.\n- **Downloader/**: `Downloads` singleton manages download queue via `Digger`. `PackageManifest` tracks per-download state and IPA signature injection. Downloads persist to `Documents/Asspp/Packages/`.\n- **Installer/**: iOS-only Vapor HTTPS server serving IPA files for OTA installation via `itms-services://` protocol. Uses TLS certs from `Certificates/localhost.qaq.wiki/` bundle.\n- **DeviceCTL/**: macOS-only device management via `devicectl` CLI. `DeviceManager` handles app installation to connected iOS devices.\n- **LogManager.swift**: Thread-safe log singleton feeding `Settings/LogView`.\n\n### Interface Layer (`Asspp/Interface/`)\n\nSwiftUI views organized by feature: Account, Search, Download, Installed (macOS only), Setting, Welcome. `MainView` uses `NavigationSplitView` sidebar on macOS and `TabView` on iOS.\n\n### Key Patterns\n\n- **Observation**: `AppStore`, `Downloads`, `Installer`, `DeviceManager`, `PackageManifest` all use `@Observable` (not legacy `ObservableObject`).\n- **Persistence**: Custom `@PublishedPersist` / `@Persist` property wrappers (in `Extension/PublishedPersist.swift`) back properties to file storage (`Documents/Config/`) or Keychain. Accounts stored in Keychain; downloads and settings use file storage.\n- **Platform branching**: Heavy use of `#if os(macOS)` / `#if os(iOS)` / `#if canImport(UIKit)` for platform-specific code paths.\n- **Singletons**: `AppStore.this`, `Downloads.this` are `@MainActor` singletons.\n- **Localization**: English + Simplified Chinese (zh-Hans) via `.xcstrings` format in `Asspp/App/`.\n\n## Dependencies (SPM via Xcode)\n\n- **ApplePackage** (remote) — App Store protocol, IPA handling\n- **Vapor** — HTTPS server for iOS OTA installation\n- **Digger** — Download manager with progress/speed tracking\n- **Kingfisher** — Async image loading\n- **ColorfulX** — Gradient animations (welcome screen)\n- **KeychainAccess** — Keychain storage for accounts\n- **AnyCodable** — Type-erased Codable values\n- **ButtonKit** — Async button actions\n- **swift-log** — Structured logging (`logger` global)\n\n## Swift Code Style\n\n- **Indentation**: 4 spaces. Opening brace on same line.\n- **Naming**: PascalCase for types, camelCase for properties/methods. PascalCase filenames for types, `+` prefix for extension files.\n- **Structure**: Early returns, guard statements for unwrapping, single responsibility per extension.\n- **Modern Swift**: `@Observable` macro, `async/await`, `@MainActor`, opaque `some` types.\n- **Memory**: `weak`/`unowned` references to break cycles, capture lists in closures.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n**Note**: `CLAUDE.md` is a symlink to `AGENTS.md`. Edit `AGENTS.md` directly.\n\n## Project Overview\n\nAsspp is a multi-account App Store management app (iOS + macOS) for searching, downloading, and installing IPA files. It uses an Xcode workspace (`Asspp.xcworkspace`) with SPM dependencies including [ApplePackage](https://github.com/Lakr233/ApplePackage), the core library for App Store API communication, IPA handling, and signature injection.\n\nBundle ID: `wiki.qaq.Asspp`. Deployment targets: iOS 17.0, macOS 15.0. Supports iPhone, iPad, and Mac (native, not Catalyst). No test targets exist.\n\n## Build Commands\n\n```bash\n# Build for iOS (device)\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'generic/platform=iOS' build | xcbeautify\n\n# Build for macOS\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=macOS' build | xcbeautify\n\n# Build for iOS simulator\nxcodebuild -workspace Asspp.xcworkspace -scheme Asspp -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 16' build | xcbeautify\n\n# CI release build (iOS IPA, unsigned)\n./Resources/Scripts/compile.release.mobile.ci.sh \"$(pwd)\" \"$(pwd)/Asspp.ipa\"\n\n# CI release build (macOS zip)\n./Resources/Scripts/compile.release.osx.sh \"$(pwd)\" \"$(pwd)/Asspp.zip\"\n```\n\n**Important**: Always use `Asspp.xcworkspace` (not `.xcodeproj`) because the workspace manages SPM package resolution. Always pipe xcodebuild output through `xcbeautify` to reduce output verbosity and save tokens.\n\n## Code Signing Setup\n\n`Configuration/Developer.xcconfig` is gitignored and must exist for builds. It provides code signing settings:\n\n```\nDEVELOPMENT_TEAM = <your team ID>\nCODE_SIGN_STYLE = Automatic\nCODE_SIGN_IDENTITY = Apple Development\n```\n\nA build phase script errors if this file is missing. The CI scripts generate a no-signing version automatically.\n\n## Build Configuration\n\nxcconfig hierarchy: `Debug.xcconfig`/`Release.xcconfig` → `Base.xcconfig` → `Version.xcconfig`, plus `Developer.xcconfig` for signing. Version numbers are in `Configuration/Version.xcconfig` (single source of truth).\n\n## Architecture\n\n### App Entry Point\n\n`Asspp/App/main.swift` — initializes logging (`LogManagerHandler`), configures `ApplePackage` device identifier, sets up `Digger` download manager (max 3 concurrent), and starts the OTA installer on iOS. On iOS 26+, the main view switches to `NewMainView` (new `Tab` API); otherwise `MainView` is used.\n\n### Backend Layer (`Asspp/Backend/`)\n\n- **AppStore/**: `AppStore` singleton manages accounts and device identifier. `AuthenticationService` handles auth. `AppPackage`/`AppPackageArchive`/`UserAccount` are model wrappers around ApplePackage types.\n- **Downloader/**: `Downloads` singleton manages download queue via `Digger`. `PackageManifest` tracks per-download state and IPA signature injection. Downloads persist to `Documents/Asspp/Packages/`.\n- **Installer/**: iOS-only Vapor HTTPS server serving IPA files for OTA installation via `itms-services://` protocol. Uses TLS certs from `Certificates/localhost.qaq.wiki/` bundle.\n- **DeviceCTL/**: macOS-only device management via `devicectl` CLI. `DeviceManager` handles app installation to connected iOS devices.\n- **LogManager.swift**: Thread-safe log singleton feeding `Settings/LogView`.\n\n### Interface Layer (`Asspp/Interface/`)\n\nSwiftUI views organized by feature: Account, Search, Download, Installed (macOS only), Setting, Welcome. `MainView` uses `NavigationSplitView` sidebar on macOS and `TabView` on iOS.\n\n### Key Patterns\n\n- **Observation**: `AppStore`, `Downloads`, `Installer`, `DeviceManager`, `PackageManifest` all use `@Observable` (not legacy `ObservableObject`).\n- **Persistence**: Custom `@PublishedPersist` / `@Persist` property wrappers (in `Extension/PublishedPersist.swift`) back properties to file storage (`Documents/Config/`) or Keychain. Accounts stored in Keychain; downloads and settings use file storage.\n- **Platform branching**: Heavy use of `#if os(macOS)` / `#if os(iOS)` / `#if canImport(UIKit)` for platform-specific code paths.\n- **Singletons**: `AppStore.this`, `Downloads.this` are `@MainActor` singletons.\n- **Localization**: English + Simplified Chinese (zh-Hans) via `.xcstrings` format in `Asspp/App/`.\n\n## Dependencies (SPM via Xcode)\n\n- **ApplePackage** (remote) — App Store protocol, IPA handling\n- **Vapor** — HTTPS server for iOS OTA installation\n- **Digger** — Download manager with progress/speed tracking\n- **Kingfisher** — Async image loading\n- **ColorfulX** — Gradient animations (welcome screen)\n- **KeychainAccess** — Keychain storage for accounts\n- **AnyCodable** — Type-erased Codable values\n- **ButtonKit** — Async button actions\n- **swift-log** — Structured logging (`logger` global)\n\n## Swift Code Style\n\n- **Indentation**: 4 spaces. Opening brace on same line.\n- **Naming**: PascalCase for types, camelCase for properties/methods. PascalCase filenames for types, `+` prefix for extension files.\n- **Structure**: Early returns, guard statements for unwrapping, single responsibility per extension.\n- **Modern Swift**: `@Observable` macro, `async/await`, `@MainActor`, opaque `some` types.\n- **Memory**: `weak`/`unowned` references to break cycles, capture lists in closures.\n","category":"root","tokens":1346}]}