Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS. Use when asked to "implement", "write code", "add screen", "create feature", "new view", "new processor", "add service", or when translating a design doc into actual Swift code.
Use this skill to implement Bitwarden iOS features following established patterns.
.claude/outputs/plans/<ticket-id>.md. If not, invoke planning-ios-implementation first.Docs/Architecture.md — it is the authoritative source for all patterns. This skill references it, not replaces it.From the plan, identify:
BitwardenShared, AuthenticatorShared, or BitwardenKit?Auth/, Autofill/, Platform/, Tools/, Vault/?See templates.md for file-set skeletons.
Implement from the bottom up:
Data Models (if needed)
Core/<Domain>/Models/Request/ and Response/Core/<Domain>/Models/Enum/Persistence (if needed)
DataStore (add entities to Bitwarden.xcdatamodeld)AppSettingsStore (backed by UserDefaults)KeychainRepositoryStateService. Prefer adding a separate protocol over extending StateService, AppSettingsStore, or KeychainRepository directly, to maintain interface segregation.Services / Repositories
// sourcery: AutoMockableDefault<Name>Service / Default<Name>RepositoryHas<Name> protocoltemplates.md for service skeletonFor new screens, create all required files together (see templates.md):
Services typealiasstruct) holding all view-observable datareceive(_:)perform(_:)StateProcessor subclass, business logic onlystore.binding, store.perform, @ObservedObjectAfter creating a new service/repository:
Has<Name> conformance to ServiceContainer via extensionHas<Name> to the Services typealias of any processor that needs itBefore finishing:
BitwardenSdk for all encryption/decryptionKeychainRepository, not AppSettingsStoreInputValidatorNonLoggableErrorAll new public types and methods require DocC (///) documentation.
Exceptions: protocol property/function implementations (docs live in the protocol), mock classes.
Use pragma marks to organize code. // MARK: - is used to denote different objects in the same file; // MARK: is used to denote different sections within an object.