# Installed Apps Modal Actions Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Restore launch and detail entry points from the installed-apps modal by wiring explicit `打开` and `查看详情` actions back to the existing parent handlers.
**Architecture:** Keep the fix local to the installed-apps modal and `App.vue`. Add two emitted events from `InstalledAppsModal.vue`, conditionally render the detail action when the app has usable store metadata, and connect those events to the existing `openDownloadedApp()` and `openDetail()` logic in the parent.
**Tech Stack:** Vue 3, TypeScript, Vitest, Testing Library Vue
---
## File Structure
- Modify: `src/components/InstalledAppsModal.vue`
Responsibility: render open/detail actions for installed app rows and emit events upward.
- Modify: `src/App.vue`
Responsibility: wire modal events to existing launch/detail handlers.
- Modify: `src/__tests__/unit/InstalledAppsModal.test.ts`
Responsibility: prove action buttons render and emit correctly.
### Task 1: Add Failing Modal Tests
**Files:**
- Modify: `src/__tests__/unit/InstalledAppsModal.test.ts`
- [ ] **Step 1: Write failing tests for open/detail actions**
```ts
it("renders open and detail actions for a store-backed installed app", async () => {
// render with one installed app whose category is not unknown
// expect 打开 and 查看详情 buttons to exist
});
it("emits open-app when clicking 打开", async () => {
// click open button
// expect emitted()['open-app']
});
it("emits open-detail when clicking 查看详情", async () => {
// click detail button
// expect emitted()['open-detail']
});
it("hides 查看详情 for unknown-category apps", () => {
// render app with category unknown
// expect no 查看详情 button
});
```
- [ ] **Step 2: Run test to verify it fails**
Run: `npx vitest run src/__tests__/unit/InstalledAppsModal.test.ts`
Expected: FAIL because the modal does not yet render or emit the new actions
### Task 2: Implement Modal Actions
**Files:**
- Modify: `src/components/InstalledAppsModal.vue`
- Modify: `src/App.vue`
- [ ] **Step 1: Add minimal modal action rendering and emits**
```ts
defineEmits<{
(e: "close"): void;
(e: "refresh"): void;
(e: "uninstall", app: App): void;
(e: "switch-origin", origin: "apm" | "spark"): void;
(e: "open-app", app: App): void;
(e: "open-detail", app: App): void;
}>();
```
- [ ] **Step 2: Add a simple detail-eligibility helper**
```ts
const canOpenDetail = (app: App) => {
return (
app.category !== "unknown" ||
Boolean(app.more) ||
Boolean(app.website) ||
Boolean(app.author) ||
(app.img_urls?.length ?? 0) > 0
);
};
```
- [ ] **Step 3: Add 打开 / 查看详情 buttons to each row**
```vue
```
- [ ] **Step 4: Wire parent events to existing handlers**
```vue
```
- [ ] **Step 5: Run test to verify it passes**
Run: `npx vitest run src/__tests__/unit/InstalledAppsModal.test.ts`
Expected: PASS
### Task 3: Verification And Commit
**Files:**
- Modify: `src/components/InstalledAppsModal.vue`
- Modify: `src/App.vue`
- Modify: `src/__tests__/unit/InstalledAppsModal.test.ts`
- [ ] **Step 1: Run focused modal test**
Run: `npx vitest run src/__tests__/unit/InstalledAppsModal.test.ts`
Expected: PASS
- [ ] **Step 2: Run repository lint**
Run: `npm run lint`
Expected: exit 0
- [ ] **Step 3: Run repository build**
Run: `npm run build:vite`
Expected: exit 0
- [ ] **Step 4: Review final diff**
Run: `git diff -- src/components/InstalledAppsModal.vue src/App.vue src/__tests__/unit/InstalledAppsModal.test.ts docs/superpowers/specs/2026-04-15-installed-apps-modal-actions-design.md docs/superpowers/plans/2026-04-15-installed-apps-modal-actions.md`
Expected: only installed-app actions and docs changes appear
- [ ] **Step 5: Commit**
```bash
git add src/components/InstalledAppsModal.vue src/App.vue src/__tests__/unit/InstalledAppsModal.test.ts docs/superpowers/specs/2026-04-15-installed-apps-modal-actions-design.md docs/superpowers/plans/2026-04-15-installed-apps-modal-actions.md
git commit -m "fix(installed-apps): restore open and detail actions"
```