# Workflow: Add a Feature to an Existing App **Read these reference files NOW:** 1. references/app-architecture.md 2. references/swiftui-patterns.md **Plus relevant refs based on feature type** (see Step 2). ## Step 1: Understand the Feature Ask the user: - What should the feature do? - Where in the app does it belong? - Any specific requirements or constraints? ## Step 2: Read Relevant References Based on feature type, read additional references: | Feature Type | Additional References | |--------------|----------------------| | Data persistence | references/data-persistence.md | | Networking/API | references/networking.md | | File handling | references/document-apps.md | | Background tasks | references/concurrency-patterns.md | | System integration | references/system-apis.md | | Menu bar | references/menu-bar-apps.md | | Extensions | references/app-extensions.md | | UI polish | references/design-system.md, references/macos-polish.md | ## Step 3: Understand Existing Code Read the relevant parts of the existing codebase: - App entry point (usually AppName.swift or AppNameApp.swift) - State management (AppState, models) - Existing views related to the feature area Identify: - How state flows through the app - Existing patterns to follow - Where the new feature fits ## Step 4: Plan the Implementation Before writing code: 1. Identify new files/types needed 2. Identify existing files to modify 3. Plan the data flow 4. Consider edge cases ## Step 5: Implement with TDD Follow test-driven development: 1. Write failing test for new behavior 2. Run → RED 3. Implement minimal code 4. Run → GREEN 5. Refactor 6. Repeat ## Step 6: Integrate - Wire up new views to navigation - Connect to existing state management - Add menu items/shortcuts if applicable - Handle errors gracefully ## Step 7: Build and Test ```bash # Build xcodebuild -project AppName.xcodeproj -scheme AppName build 2>&1 | xcsift # Run tests xcodebuild test -project AppName.xcodeproj -scheme AppName # Launch for manual testing open ./build/Build/Products/Debug/AppName.app ``` ## Step 8: Polish - Add keyboard shortcuts (references/macos-polish.md) - Ensure accessibility - Match existing UI patterns **Adding to state:** ```swift // In AppState @Observable class AppState { // Add new property var newFeatureData: [NewType] = [] // Add new methods func performNewFeature() { ... } } ``` **Adding a new view:** ```swift struct NewFeatureView: View { @Environment(AppState.self) private var appState var body: some View { // Use existing patterns from app } } ``` **Adding to navigation:** ```swift // In existing NavigationSplitView or similar NavigationLink("New Feature", destination: NewFeatureView()) ``` **Adding menu command:** ```swift struct AppCommands: Commands { var body: some Commands { CommandGroup(after: .newItem) { Button("New Feature Action") { // action } .keyboardShortcut("N", modifiers: [.command, .shift]) } } } ``` Feature is complete when: - Functionality works as specified - Tests pass - Follows existing code patterns - UI matches app style - Keyboard shortcuts work - No regressions in existing features