Guide for implementing features in ClaudeBar following architecture-first design, TDD, rich domain models, and Swift 6.2 patterns. Use this skill when: (1) Adding new functionality to the app (2) Creating domain models that follow user's mental model (3) Building SwiftUI views that consume domain models directly (4) User asks "how do I implement X" or "add feature Y" (5) Implementing any feature that spans Domain, Infrastructure, and App layers
68
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Implement features using architecture-first design, TDD, rich domain models, and Swift 6.2 patterns.
┌─────────────────────────────────────────────────────────────┐
│ 1. ARCHITECTURE DESIGN (Required - User Approval Needed) │
├─────────────────────────────────────────────────────────────┤
│ • Analyze requirements │
│ • Create component diagram │
│ • Show data flow and interactions │
│ • Present to user for review │
│ • Wait for approval before proceeding │
└─────────────────────────────────────────────────────────────┘
│
▼ (User Approves)
┌─────────────────────────────────────────────────────────────┐
│ 2. TDD IMPLEMENTATION │
├─────────────────────────────────────────────────────────────┤
│ • Domain model tests → Domain models │
│ • Infrastructure tests → Implementations │
│ • Integration and views │
└─────────────────────────────────────────────────────────────┘Before writing any code, create an architecture diagram and get user approval.
Identify:
Use ASCII diagram showing all components and their interactions:
Example: Adding a new AI provider
┌─────────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ External │ │ Infrastructure │ │ Domain │ │
│ └─────────────┘ └──────────────────┘ └──────────────────┘ │
│ │
│ ┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ CLI Tool │────▶│ NewUsageProbe │────▶│ UsageSnapshot │ │
│ │ (new-cli) │ │ (implements │ │ (existing) │ │
│ └─────────────┘ │ UsageProbe) │ └──────────────────┘ │
│ └──────────────────┘ │ │
│ │ ▼ │
│ │ ┌──────────────────┐ │
│ │ │ NewProvider │ │
│ └─────────────▶│ (AIProvider) │ │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ App Layer │ │
│ │ ┌────────────────────────────┐ │ │
│ │ │ ClaudeBarApp.swift │ │ │
│ │ │ (register new provider) │ │ │
│ │ └────────────────────────────┘ │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘List each component with:
Example:
| Component | Purpose | Inputs | Outputs | Dependencies |
|----------------|------------------------|-----------------|----------------|-----------------|
| NewUsageProbe | Fetch usage from CLI | CLI command | UsageSnapshot | CLIExecutor |
| NewProvider | Manages probe lifecycle| UsageProbe | snapshot state | UsageProbe |IMPORTANT: Always ask user to review the architecture before implementing.
Use AskUserQuestion tool with options:
Do NOT proceed to Phase 1 until user explicitly approves.
Domain models encapsulate behavior, not just data:
// Rich domain model with behavior
public struct UsageQuota: Sendable, Equatable {
public let percentRemaining: Double
// Domain behavior - computed from state
public var status: QuotaStatus {
QuotaStatus.from(percentRemaining: percentRemaining)
}
public var isDepleted: Bool { percentRemaining <= 0 }
public var needsAttention: Bool { status.needsAttention }
}Views consume domain models directly from QuotaMonitor:
// QuotaMonitor is the single source of truth
public actor QuotaMonitor {
private let providers: AIProviders // Hidden - use delegation methods
// Delegation methods (nonisolated for UI access)
public nonisolated var allProviders: [any AIProvider]
public nonisolated var enabledProviders: [any AIProvider]
public nonisolated func provider(for id: String) -> (any AIProvider)?
public nonisolated func addProvider(_ provider: any AIProvider)
public nonisolated func removeProvider(id: String)
// Selection state
public nonisolated var selectedProviderId: String
public nonisolated var selectedProvider: (any AIProvider)?
public nonisolated var selectedProviderStatus: QuotaStatus
}
// Views consume domain directly - NO AppState layer
struct MenuContentView: View {
let monitor: QuotaMonitor // Injected from app
var body: some View {
// Use delegation methods, not monitor.providers.enabled
ForEach(monitor.enabledProviders, id: \.id) { provider in
ProviderPill(provider: provider)
}
}
}@Mockable
public protocol UsageProbe: Sendable {
func probe() async throws -> UsageSnapshot
func isAvailable() async -> Bool
}Full documentation: docs/ARCHITECTURE.md
| Layer | Location | Purpose |
|---|---|---|
| Domain | Sources/Domain/ | QuotaMonitor (single source of truth), rich models, protocols |
| Infrastructure | Sources/Infrastructure/ | Probes, storage, adapters |
| App | Sources/App/ | SwiftUI views consuming domain directly (no ViewModel) |
Key patterns:
ZaiSettingsRepository, CopilotSettingsRepository)@Mockable for testingWe follow Chicago school TDD (state-based testing):
Test state and computed properties:
@Suite
struct FeatureModelTests {
@Test func `model computes status from state`() {
// Given - set up initial state
let model = FeatureModel(value: 50)
// When/Then - verify state/return value
#expect(model.status == .normal)
}
@Test func `model state changes correctly`() {
// Given
var model = FeatureModel(value: 100)
// When - perform action
model.consume(30)
// Then - verify new state
#expect(model.value == 70)
#expect(model.status == .healthy)
}
}Stub dependencies to return data, assert on resulting state:
@Suite
struct FeatureServiceTests {
@Test func `service returns parsed data on success`() async throws {
// Given - stub dependency to return data (not verify calls)
let mockClient = MockNetworkClient()
given(mockClient).fetch(any()).willReturn(validResponseData)
let service = FeatureService(client: mockClient)
// When
let result = try await service.fetch()
// Then - verify returned state, not interactions
#expect(result.items.count == 3)
#expect(result.status == .loaded)
}
}Wire up in ClaudeBarApp.swift and create views.
Sources/Domain/ with behavior@Mockable for external dependenciesSources/Infrastructure/swift test to verify all tests pass80de433
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.