# Template Reverse Generator 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:** Build a backend-admin template reverse generator that uploads a complete project ZIP, identifies backend/admin frontend/user frontend/SQL assets, produces an extraction report, and prepares the data needed to publish a template bundle. **Architecture:** Keep the first implementation safe by separating scan/report generation from template bundle publishing. The scanner is a pure Java service that classifies project files; the controller exposes upload/analyze endpoints in the RuoYi admin backend; the `ruoyi-ui` page shows the report and keeps publish actions explicit. **Tech Stack:** Java 8, Spring Boot, MyBatis/RuoYi admin APIs, Vue 2 + Element UI, JUnit 4. --- ### Task 1: Core Project Scanner **Files:** - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportComponent.java` - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportReport.java` - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportScanner.java` - Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/TemplateImportScannerTest.java` - [ ] **Step 1: Write failing tests** Create tests that build temporary project trees and verify: - A RuoYi-style project with backend, admin frontend, user frontend, and SQL is reported as four components. - Build artifacts and dependency folders are skipped. - A backend/admin/sql-only project does not claim `frontend` support. - [ ] **Step 2: Run scanner tests and verify failure** Run: `mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test` Expected: FAIL because `TemplateImportScanner` does not exist. - [ ] **Step 3: Implement minimal scanner** Implement path walking with ignored directories: `.git`, `.idea`, `node_modules`, `target`, `dist`, `build`. Classify: - `backend`: directory containing `pom.xml` and `src/main/java`. - `admin_frontend`: Vue project with `package.json` plus admin markers such as `src/permission.js`, `src/layout`, `src/views/system`, `src/views/tool/gen`, or Element UI dependency. - `frontend`: Vue project with `package.json` plus `src/views` or `src/pages`, without admin markers. - `sql`: any `.sql` files outside ignored directories. - [ ] **Step 4: Run scanner tests and verify pass** Run: `mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test` Expected: PASS. ### Task 2: Upload And Analysis Service **Files:** - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportAnalyzeResult.java` - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/ITemplateImportService.java` - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportServiceImpl.java` - Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/TemplateImportServiceImplTest.java` - [ ] **Step 1: Write failing tests** Verify ZIP extraction rejects path traversal entries such as `../evil.txt`, stores files under a configured workspace, and delegates to `TemplateImportScanner`. - [ ] **Step 2: Run tests and verify failure** Run: `mvn -pl ruoyi-generator -Dtest=TemplateImportServiceImplTest test` Expected: FAIL because the service does not exist. - [ ] **Step 3: Implement upload analysis** Use `ZipInputStream`, normalize each target path, reject entries escaping the task workspace, and return the scanner report. Keep the first version in filesystem workspace only; publishing to template tables is a later task. - [ ] **Step 4: Run tests and verify pass** Run: `mvn -pl ruoyi-generator -Dtest=TemplateImportServiceImplTest test` Expected: PASS. ### Task 3: Admin Backend API **Files:** - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/controller/TemplateImportController.java` - Modify: `ruoyi-admin/src/main/resources/application.yml` - [ ] **Step 1: Add API endpoints** Expose: - `POST /generator/templateImport/analyze` with `MultipartFile file`, `bundleCode`, and `bundleName`. - `GET /generator/templateImport/capabilities` returning supported component types. Use permission `generator:template:import`. - [ ] **Step 2: Verify compilation** Run: `mvn -pl ruoyi-generator -DskipTests compile` Expected: SUCCESS. ### Task 4: Admin Frontend Page **Files:** - Create: `ruoyi-ui/src/api/generator/templateImport.js` - Create: `ruoyi-ui/src/views/generator/templateImport/index.vue` - [ ] **Step 1: Add API wrapper** Implement `analyzeTemplateImport(formData)` and `getTemplateImportCapabilities()`. - [ ] **Step 2: Add page** Build a Vue 2 + Element UI admin page with ZIP upload, bundle code/name fields, analyze button, component cards for `backend`, `admin_frontend`, `frontend`, and `sql`, warnings, and file counts. - [ ] **Step 3: Build frontend** Run: `cd ruoyi-ui && npm run build:prod` Expected: SUCCESS. ### Task 5: Publishing Preparation **Files:** - Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportScanner.java` - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportPublishDraft.java` - [ ] **Step 1: Extend scanner output** Add safe draft data: `supportBackend`, `supportAdminFrontend`, `supportFrontend`, `supportSql`, detected root paths, skipped file count, and suggested template types. - [ ] **Step 2: Verify tests** Run: `mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test` Expected: PASS. ### Task 6: Final Verification **Files:** - No new files. - [ ] **Step 1: Backend tests** Run: `mvn -pl ruoyi-generator test` Expected: PASS. - [ ] **Step 2: Frontend build** Run: `cd ruoyi-ui && npm run build:prod` Expected: PASS. - [ ] **Step 3: Manual smoke test** Upload a sample ZIP containing backend, admin frontend, user frontend, and SQL. Confirm all four cards appear and `frontend` is optional when absent. ### Self-Review - Spec coverage: Covers backend/admin frontend/frontend/sql detection, admin-side upload, safe ZIP handling, and report UI. - Scope: Publishing into live template tables is deliberately separated from first scan/report delivery, because enabling templates changes generation behavior globally. - No placeholders: Each task has concrete files, commands, and expected behavior.