# Update Execution And Provider Contract Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Make `aim update` actually apply updates through the existing install engine and tighten the adapter trait so providers share required normalize and resolve operations. **Architecture:** Add an update executor in `aim-core` that rebuilds install intent from each registered app and reuses `build_add_plan(...)` plus `install_app(...)` for the actual replacement. In parallel, extend the `SourceAdapter` trait with `normalize` and `resolve`, add a shared adapter error type, and migrate GitHub and GitLab adapters to that contract. **Tech Stack:** Rust, Cargo workspace, existing install engine in `aim-core`, serde registry state, clap CLI, fixture-backed tests in `crates/aim-core/tests` and `crates/aim-cli/tests`. --- ### Task 1: Add red tests for update execution **Files:** - Modify: `crates/aim-cli/tests/end_to_end_cli.rs` - Modify: `crates/aim-core/tests/update_planning.rs` **Step 1: Write the failing tests** Add focused tests that assert: - `aim update` updates installed apps rather than only rendering a summary - update failures retain the previous app record **Step 2: Run tests to verify they fail** Run: `cargo test update_command_applies_updates --package aim-cli --test end_to_end_cli` Expected: FAIL because `aim update` only reviews. **Step 3: Keep the tests minimal** Use fixture mode and registry tempdirs. Assert on command output and registry state. **Step 4: Re-run to confirm clean red state** Expected: FAIL for missing update execution, not setup issues. **Step 5: Commit** ```bash git add crates/aim-cli/tests/end_to_end_cli.rs crates/aim-core/tests/update_planning.rs git commit -m "test: cover executable update flow" ``` ### Task 2: Implement update execution in aim-core **Files:** - Modify: `crates/aim-core/src/app/update.rs` - Modify: `crates/aim-core/src/app/add.rs` - Modify: `crates/aim-core/src/domain/update.rs` **Step 1: Write minimal implementation** Implement per-app update execution that: - reconstructs query from stored app data - determines install scope from persisted install metadata - reuses `build_add_plan(...)` and `install_app(...)` - keeps previous app records on failure - returns structured execution results **Step 2: Run focused tests** Run: `cargo test update_command_applies_updates --package aim-cli --test end_to_end_cli` Expected: PASS. **Step 3: Add failure reporting** Capture updated count, failed count, and per-app messages. **Step 4: Re-run the update-related tests** Run: `cargo test --package aim-core --test update_planning` Expected: PASS. **Step 5: Commit** ```bash git add crates/aim-core/src/app/update.rs crates/aim-core/src/app/add.rs crates/aim-core/src/domain/update.rs crates/aim-core/tests/update_planning.rs crates/aim-cli/tests/end_to_end_cli.rs git commit -m "feat: execute updates through install engine" ``` ### Task 3: Wire update execution through the CLI **Files:** - Modify: `crates/aim-cli/src/cli/args.rs` - Modify: `crates/aim-cli/src/lib.rs` - Modify: `crates/aim-cli/src/ui/render.rs` - Test: `crates/aim-cli/tests/end_to_end_cli.rs` **Step 1: Implement CLI execution behavior** Keep no-arg review behavior, but make `aim update` execute the updates and render a result summary. **Step 2: Run focused CLI tests** Run: `cargo test update_command_applies_updates --package aim-cli --test end_to_end_cli` Expected: PASS. **Step 3: Preserve review-only path** Ensure plain `aim` with no args still shows the update review summary. **Step 4: Re-run the CLI end-to-end test file** Run: `cargo test --package aim-cli --test end_to_end_cli` Expected: PASS. **Step 5: Commit** ```bash git add crates/aim-cli/src/cli/args.rs crates/aim-cli/src/lib.rs crates/aim-cli/src/ui/render.rs crates/aim-cli/tests/end_to_end_cli.rs git commit -m "feat: run updates from cli update command" ``` ### Task 4: Tighten the provider contract **Files:** - Modify: `crates/aim-core/src/adapters/traits.rs` - Modify: `crates/aim-core/src/adapters/github.rs` - Modify: `crates/aim-core/src/adapters/gitlab.rs` - Modify: `crates/aim-core/tests/adapter_contract.rs` **Step 1: Write the failing tests** Add contract tests that verify GitHub and GitLab implement normalize and resolve through the shared `SourceAdapter` trait. **Step 2: Run tests to verify they fail** Run: `cargo test --package aim-core --test adapter_contract` Expected: FAIL because the trait does not yet require those methods. **Step 3: Write minimal implementation** Add: - shared adapter error enum - `normalize` and `resolve` trait methods - GitHub and GitLab implementations under that shared contract **Step 4: Run adapter contract tests** Run: `cargo test --package aim-core --test adapter_contract` Expected: PASS. **Step 5: Commit** ```bash git add crates/aim-core/src/adapters/traits.rs crates/aim-core/src/adapters/github.rs crates/aim-core/src/adapters/gitlab.rs crates/aim-core/tests/adapter_contract.rs git commit -m "refactor: tighten provider adapter contract" ``` ### Task 5: Full verification **Files:** - Modify: none expected **Step 1: Run format check** Run: `cargo fmt --check` Expected: PASS. **Step 2: Run clippy** Run: `cargo clippy --workspace --all-targets --all-features -- -D warnings` Expected: PASS. **Step 3: Run tests** Run: `cargo test --workspace` Expected: PASS. **Step 4: Fix only update-execution and provider-contract regressions if needed and re-run verification** **Step 5: Commit** ```bash git add -A git commit -m "test: verify update execution and provider contract" ```