feat: expand EasyCode software factory workflows

This commit is contained in:
王鹏
2026-07-15 12:48:50 +08:00
parent fcfa4374d7
commit 79dea897bc
1108 changed files with 163774 additions and 21593 deletions

View File

@@ -0,0 +1,210 @@
# Style Preset UI Only 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:** Make page style presets affect generated UI tokens only, without changing generated page canvas/layout.
**Architecture:** Keep automatic layout selection inside `PageCompositionService.chooseLayout()`. Resolve the selected `PageStylePreset` only to write `stylePreset`, `styleTokens`, and composition metadata into layout JSON. Remove the canvas override path so presets cannot change table/card/split/dense layout structure.
**Tech Stack:** Java, JUnit 4, Jackson, Spring service classes in `ruoyi-generator`.
---
## File Structure
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageCompositionServiceStylePresetTest.java`
- Owns regression tests for `PageCompositionService` style preset behavior.
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageCompositionService.java`
- Owns deterministic page canvas selection and layout JSON composition.
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageStylePresetRegistryTest.java`
- Owns registry contract tests for style tokens, density, and fallback.
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageStylePresetRegistry.java`
- Owns available visual preset definitions.
### Task 1: Lock Style Presets Out Of Canvas Selection
**Files:**
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageCompositionServiceStylePresetTest.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageCompositionService.java`
- [ ] **Step 1: Write the failing frontend regression test**
Replace `cardPortalPresetPrefersCardCanvasForFrontendLists` with:
```java
@Test
public void cardPortalPresetKeepsAutomaticallySelectedFrontendCanvas()
{
FrontProjectPageDesign design = design("frontend", "list");
service.compose(design, table(), Arrays.asList(
column("title", "title", "1", "1", "1"),
column("status", "status", "1", "1", "1")), null, null, true, "card_portal");
Map<String, Object> layout = readLayout(design);
assertEquals("frontend-list-v1", layout.get("canvas"));
assertEquals("card_portal", layout.get("stylePreset"));
assertTrue(((Map<?, ?>) layout.get("styleTokens")).containsKey("primary"));
Map<?, ?> composition = (Map<?, ?>) layout.get("composition");
assertEquals("card_portal", composition.get("stylePreset"));
assertTrue(String.valueOf(composition.get("reasons")).contains("card_portal"));
}
```
- [ ] **Step 2: Write the failing admin regression test**
Replace `dataDensePresetPrefersDenseCanvasForAdminLists` with:
```java
@Test
public void dataDensePresetKeepsAutomaticallySelectedAdminCanvas()
{
FrontProjectPageDesign design = design("admin", "list");
service.compose(design, table(), Arrays.asList(
column("code", "code", "1", "1", "1"),
column("name", "name", "1", "1", "1")), null, null, true, "data_dense");
Map<String, Object> layout = readLayout(design);
assertEquals("admin-list-v1", layout.get("canvas"));
assertEquals("data_dense", layout.get("stylePreset"));
assertTrue(((Map<?, ?>) layout.get("styleTokens")).containsKey("primary"));
}
```
- [ ] **Step 3: Run tests to verify they fail**
Run:
```bash
mvn -pl ruoyi-generator -Dtest=PageCompositionServiceStylePresetTest test
```
Expected: both tests fail because the current implementation changes `canvas` to `frontend-list-card-v1` and `admin-list-dense-v1`.
- [ ] **Step 4: Implement minimal service change**
In `PageCompositionService.compose(...)`, replace:
```java
stylePreset = stylePresetRegistry.resolve(stylePresetCode);
applyStylePreset(decision, pageType, scope, stylePreset);
```
with:
```java
stylePreset = stylePresetRegistry.resolve(stylePresetCode);
decision.addReason("style preset " + stylePreset.getCode() + " applied visual tokens");
```
Then remove the unused `applyStylePreset(...)` method.
- [ ] **Step 5: Run tests to verify they pass**
Run:
```bash
mvn -pl ruoyi-generator -Dtest=PageCompositionServiceStylePresetTest test
```
Expected: `Tests run: 2, Failures: 0, Errors: 0`.
### Task 2: Remove Canvas Mapping From The Registry Contract
**Files:**
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageStylePresetRegistryTest.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageStylePresetRegistry.java`
- [ ] **Step 1: Write the failing registry contract test**
Replace `resolvesKnownPresetWithCanvasAndTokens` with:
```java
@Test
public void resolvesKnownPresetWithTokensOnly()
{
PageStylePresetRegistry registry = new PageStylePresetRegistry();
PageStylePresetRegistry.PageStylePreset preset = registry.resolve("card_portal");
assertEquals("card_portal", preset.getCode());
assertEquals("#167d83", preset.token("primary", ""));
assertEquals("#f6c85b", preset.token("accent", ""));
assertEquals("comfortable", preset.getDensity());
assertTrue(registry.options().size() >= 4);
}
```
Replace `unknownPresetFallsBackToBusinessClean` with:
```java
@Test
public void unknownPresetFallsBackToBusinessCleanTokens()
{
PageStylePresetRegistry registry = new PageStylePresetRegistry();
PageStylePresetRegistry.PageStylePreset preset = registry.resolve("not_real");
assertEquals("business_clean", preset.getCode());
assertEquals("#167d83", preset.token("primary", ""));
assertEquals("1200px", preset.token("contentWidth", ""));
}
```
- [ ] **Step 2: Run registry test before implementation**
Run:
```bash
mvn -pl ruoyi-generator -Dtest=PageStylePresetRegistryTest test
```
Expected: test compilation fails after removing frontend/admin canvas assertions from tests only if production still exposes unused API is not a compile failure; if tests pass immediately, continue with the cleanup as refactor under the Task 1 green state.
- [ ] **Step 3: Remove registry canvas API and definitions**
In `PageStylePresetRegistry`, remove:
```java
private final Map<String, String> frontendCanvases = new LinkedHashMap<String, String>();
private final Map<String, String> adminCanvases = new LinkedHashMap<String, String>();
```
Remove all `.frontend(...)` and `.admin(...)` calls from preset definitions. Remove the private builder methods `frontend(...)` and `admin(...)`. Remove public methods `frontendCanvas(...)` and `adminCanvas(...)`.
- [ ] **Step 4: Run registry tests**
Run:
```bash
mvn -pl ruoyi-generator -Dtest=PageStylePresetRegistryTest test
```
Expected: `Tests run: 2, Failures: 0, Errors: 0`.
### Task 3: Final Verification
**Files:**
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageCompositionServiceStylePresetTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageStylePresetRegistryTest.java`
- [ ] **Step 1: Run focused tests together**
Run:
```bash
mvn -pl ruoyi-generator -Dtest=PageCompositionServiceStylePresetTest,PageStylePresetRegistryTest test
```
Expected: both test classes pass.
- [ ] **Step 2: Inspect diff for scope**
Run:
```bash
git diff -- ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageCompositionService.java ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/PageStylePresetRegistry.java ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageCompositionServiceStylePresetTest.java ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/PageStylePresetRegistryTest.java
```
Expected: diff only changes style preset canvas coupling and corresponding tests.