ui: show Agents first in module chooser
This commit is contained in:
1 parent
4e33d6ade6
commit
9317d0acc7
4 files changed
+24
-11
No files matched your search
@@ -14,11 +14,13 @@
|
|||||||
|
|
||||||
- Replace the Agents module chooser placeholder with a generated cinematic illustration in `src/assets/module-agents.webp`.
|
- Replace the Agents module chooser placeholder with a generated cinematic illustration in `src/assets/module-agents.webp`.
|
||||||
- Follow-up: replace the Agents description in `src/lib/ai-modules.ts` with the user's corrected exact slogan `打造你想象中的AI助手`.
|
- Follow-up: replace the Agents description in `src/lib/ai-modules.ts` with the user's corrected exact slogan `打造你想象中的AI助手`.
|
||||||
|
- Ordering follow-up: place Agents first in the module catalog; remaining visual/DOM order is Code, Canvas, Robot. Preserve ID-based navigation and the new artwork/slogan.
|
||||||
- Reuse the existing module image container, center crop, accessibility text, disabled grayscale and navigation. Require artwork for all four module entries and remove the now-unused placeholder branch.
|
- Reuse the existing module image container, center crop, accessibility text, disabled grayscale and navigation. Require artwork for all four module entries and remove the now-unused placeholder branch.
|
||||||
- Update existing module navigation unit/Electron coverage and this task record only.
|
- Update existing module navigation unit/Electron coverage and this task record only.
|
||||||
|
|
||||||
## Intent And Constraints
|
## Intent And Constraints
|
||||||
|
|
||||||
|
- Same-task ordering follow-up: official check/start/status passed in this clean worktree; reused already loaded project/peer context and confirmed module catalog consumers. Planning Gate Passed. Only chooser ordering changes; `getAiModuleForPath` still returns the same IDs and default Code route. Extend the existing UI order assertions and rerun the existing Electron layout test to verify the now-first Agents card at both window sizes.
|
||||||
- Same-task slogan follow-up: official check/start/status passed and reused this clean feature worktree and the already loaded project/peer context. Planning Gate Passed. User corrected `想像` to `想象`; use the corrected text verbatim, without extra spaces or quotation marks in the UI. This is a copy-only change; existing tests are sufficient and no new interaction test is needed.
|
- Same-task slogan follow-up: official check/start/status passed and reused this clean feature worktree and the already loaded project/peer context. Planning Gate Passed. User corrected `想像` to `想象`; use the corrected text verbatim, without extra spaces or quotation marks in the UI. This is a copy-only change; existing tests are sufficient and no new interaction test is needed.
|
||||||
- Concurrent Task Gate and Planning Gate passed. Official start exited 0 and status matched the task ID, feature mode, branch, absolute worktree and base above. All subsequent operations use this isolated worktree; primary `main` has other ownership and three pre-existing untracked task records.
|
- Concurrent Task Gate and Planning Gate passed. Official start exited 0 and status matched the task ID, feature mode, branch, absolute worktree and base above. All subsequent operations use this isolated worktree; primary `main` has other ownership and three pre-existing untracked task records.
|
||||||
- Loaded the planning entry, own task, memory index, integrated current state, positioning, decision index, architecture, relevant domain/success criteria, accepted personal-cloud-Agent ADR, README and peer scope/intent/promotion sections. Registry holds 28 other planning tasks and 162 ready tasks; historical placeholder scopes remain unknown coordination state. The recent WeChat diagnosis is read-only, and prior Agents entry/platform work is integrated. No concrete semantic dependency on this artwork was identified.
|
- Loaded the planning entry, own task, memory index, integrated current state, positioning, decision index, architecture, relevant domain/success criteria, accepted personal-cloud-Agent ADR, README and peer scope/intent/promotion sections. Registry holds 28 other planning tasks and 162 ready tasks; historical placeholder scopes remain unknown coordination state. The recent WeChat diagnosis is read-only, and prior Agents entry/platform work is integrated. No concrete semantic dependency on this artwork was identified.
|
||||||
@@ -28,6 +30,7 @@
|
|||||||
|
|
||||||
## Outcome
|
## Outcome
|
||||||
|
|
||||||
|
- Ordering follow-up completed: final chooser order is Agents, Code, Canvas, Robot in both DOM and visual layout. Real Electron screenshot confirms the first card uses the generated Agent image and `打造你想象中的AI助手`. Module routes remain ID-based and unchanged.
|
||||||
- Slogan follow-up completed: the Agents entry description and its accessible button label now use `打造你想象中的AI助手`, matching the user's spelling correction. Existing generated artwork is retained.
|
- Slogan follow-up completed: the Agents entry description and its accessible button label now use `打造你想象中的AI助手`, matching the user's spelling correction. Existing generated artwork is retained.
|
||||||
- Generated and connected the blue/violet holographic Agent artwork. All four entries use the same bundled-image rendering; obsolete violet placeholder markup is removed. Existing card spacing, image crop, labels, policy state and routes are preserved.
|
- Generated and connected the blue/violet holographic Agent artwork. All four entries use the same bundled-image rendering; obsolete violet placeholder markup is removed. Existing card spacing, image crop, labels, policy state and routes are preserved.
|
||||||
- Visually inspected the real 1280x800 Electron chooser screenshot: the central figure remains recognizable inside the same 164x132 image region as its neighbors. The existing E2E also verifies the layout after resizing to 1100x700.
|
- Visually inspected the real 1280x800 Electron chooser screenshot: the central figure remains recognizable inside the same 164x132 image region as its neighbors. The existing E2E also verifies the layout after resizing to 1100x700.
|
||||||
@@ -35,6 +38,7 @@
|
|||||||
|
|
||||||
## Verification
|
## Verification
|
||||||
|
|
||||||
|
- Ordering follow-up: 12/12 module navigation/access unit tests, typecheck, scoped ESLint and all Vite production targets passed. Existing Electron layout test passed 1/1 with explicit four-entry order, first-card slogan, image decode and 1280x800/1100x700 checks. Inspected its refreshed screenshot and full cumulative changes since base; whitespace and task documentation boundary checks passed.
|
||||||
- Slogan follow-up: typecheck and all Vite production targets passed; existing module navigation/access tests passed 12/12. Reviewed the single source-string diff; no interaction or layout rule changed.
|
- Slogan follow-up: typecheck and all Vite production targets passed; existing module navigation/access tests passed 12/12. Reviewed the single source-string diff; no interaction or layout rule changed.
|
||||||
- Frozen install succeeded using the exact pinned pnpm 10.33.4. Generated WebP is 960x540, 90,688 bytes.
|
- Frozen install succeeded using the exact pinned pnpm 10.33.4. Generated WebP is 960x540, 90,688 bytes.
|
||||||
- `pnpm run typecheck`: passed.
|
- `pnpm run typecheck`: passed.
|
||||||
|
|||||||
+10
-10
@@ -18,6 +18,16 @@ export type AiModuleDefinition = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const aiModules: readonly AiModuleDefinition[] = [
|
export const aiModules: readonly AiModuleDefinition[] = [
|
||||||
|
{
|
||||||
|
id: 'cloud_agents',
|
||||||
|
title: 'Makelore Agents',
|
||||||
|
subtitle: 'AI 智能体',
|
||||||
|
description: '打造你想象中的AI助手',
|
||||||
|
route: '/cloud-agents',
|
||||||
|
enabled: true,
|
||||||
|
Icon: Sparkles,
|
||||||
|
switcherLabel: 'Agents 智能体',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'programming',
|
id: 'programming',
|
||||||
title: 'Makelore Code',
|
title: 'Makelore Code',
|
||||||
@@ -46,16 +56,6 @@ export const aiModules: readonly AiModuleDefinition[] = [
|
|||||||
Icon: Bot,
|
Icon: Bot,
|
||||||
switcherLabel: 'Robot 机器',
|
switcherLabel: 'Robot 机器',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'cloud_agents',
|
|
||||||
title: 'Makelore Agents',
|
|
||||||
subtitle: 'AI 智能体',
|
|
||||||
description: '打造你想象中的AI助手',
|
|
||||||
route: '/cloud-agents',
|
|
||||||
enabled: true,
|
|
||||||
Icon: Sparkles,
|
|
||||||
switcherLabel: 'Agents 智能体',
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const moduleAccessKeyById: Record<AiModuleId, ModuleAccessKey> = {
|
const moduleAccessKeyById: Record<AiModuleId, ModuleAccessKey> = {
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ test.describe('Makelore module navigation without setup flow', () => {
|
|||||||
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
|
await expect(page.getByTestId('ai-module-selection-page')).toBeVisible();
|
||||||
|
|
||||||
const moduleCards = page.locator('[data-testid^="ai-module-option-"]');
|
const moduleCards = page.locator('[data-testid^="ai-module-option-"]');
|
||||||
|
await expect(moduleCards.locator('.module-option-card-title')).toHaveText([
|
||||||
|
'Agents 智能体', 'Code 编程', 'Canvas 设计', 'Robot 机器',
|
||||||
|
]);
|
||||||
|
await expect(moduleCards.first().locator('.module-option-card-description')).toHaveText('打造你想象中的AI助手');
|
||||||
await expect(moduleCards.locator('img')).toHaveCount(4);
|
await expect(moduleCards.locator('img')).toHaveCount(4);
|
||||||
await expect.poll(async () => await moduleCards.locator('img').evaluateAll((images) =>
|
await expect.poll(async () => await moduleCards.locator('img').evaluateAll((images) =>
|
||||||
images.every((image) => image.complete && image.naturalWidth > 0),
|
images.every((image) => image.complete && image.naturalWidth > 0),
|
||||||
|
|||||||
@@ -71,7 +71,12 @@ describe('AI module navigation', () => {
|
|||||||
for (const moduleId of ['programming', 'painting', 'robot', 'cloud_agents'] as const) {
|
for (const moduleId of ['programming', 'painting', 'robot', 'cloud_agents'] as const) {
|
||||||
expect(screen.getByTestId(`ai-module-option-${moduleId}`).querySelector('.module-option-artwork')).toBeNull();
|
expect(screen.getByTestId(`ai-module-option-${moduleId}`).querySelector('.module-option-artwork')).toBeNull();
|
||||||
}
|
}
|
||||||
expect(screen.getAllByTestId(/^ai-module-option-/u)).toHaveLength(4);
|
expect(screen.getAllByTestId(/^ai-module-option-/u).map((option) => option.dataset.testid)).toEqual([
|
||||||
|
'ai-module-option-cloud_agents',
|
||||||
|
'ai-module-option-programming',
|
||||||
|
'ai-module-option-painting',
|
||||||
|
'ai-module-option-robot',
|
||||||
|
]);
|
||||||
expect(screen.queryByTestId('ai-module-option-learning')).not.toBeInTheDocument();
|
expect(screen.queryByTestId('ai-module-option-learning')).not.toBeInTheDocument();
|
||||||
expect(screen.queryByText('先选一个入口。进入后,你还可以从左下角随时切换到其他模块。')).not.toBeInTheDocument();
|
expect(screen.queryByText('先选一个入口。进入后,你还可以从左下角随时切换到其他模块。')).not.toBeInTheDocument();
|
||||||
expect(screen.queryByText('选择创作空间。你可以随时从侧边栏切换。')).not.toBeInTheDocument();
|
expect(screen.queryByText('选择创作空间。你可以随时从侧边栏切换。')).not.toBeInTheDocument();
|
||||||
|
|||||||
Reference in new issue
Block a user