diff --git a/e2e/README.md b/e2e/README.md index 548f56fad2..5766c609c6 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -90,7 +90,7 @@ Feature: Community Smoke Tests @COMMUNITY-SMOKE-001 @P0 Scenario: Load community assistant list page - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" Then the page should load without errors And I should see the page body And I should see the search bar diff --git a/e2e/src/features/community/detail-pages.feature b/e2e/src/features/community/detail-pages.feature index a7c431537b..4ce66db1dd 100644 --- a/e2e/src/features/community/detail-pages.feature +++ b/e2e/src/features/community/detail-pages.feature @@ -11,7 +11,7 @@ Feature: Discover Detail Pages @COMMUNITY-DETAIL-001 @P1 Scenario: Load assistant detail page and verify content - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" And I wait for the page to fully load When I click on the first assistant card Then I should be on an assistant detail page @@ -22,7 +22,7 @@ Feature: Discover Detail Pages @COMMUNITY-DETAIL-002 @P1 Scenario: Navigate back from assistant detail page - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" And I wait for the page to fully load And I click on the first assistant card When I click the back button diff --git a/e2e/src/features/community/interactions.feature b/e2e/src/features/community/interactions.feature index 3ddeb17aee..a78291ebcd 100644 --- a/e2e/src/features/community/interactions.feature +++ b/e2e/src/features/community/interactions.feature @@ -11,14 +11,14 @@ Feature: Discover Interactions @COMMUNITY-INTERACT-001 @P1 Scenario: Search for assistants - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" When I type "developer" in the search bar And I wait for the search results to load Then I should see filtered assistant cards @COMMUNITY-INTERACT-002 @P1 Scenario: Filter assistants by category - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" When I click on a category in the category menu And I wait for the filtered results to load Then I should see assistant cards filtered by the selected category @@ -26,7 +26,7 @@ Feature: Discover Interactions @COMMUNITY-INTERACT-003 @P1 Scenario: Navigate to next page of assistants - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" When I click the next page button And I wait for the next page to load Then I should see different assistant cards @@ -34,7 +34,7 @@ Feature: Discover Interactions @COMMUNITY-INTERACT-004 @P1 Scenario: Navigate to assistant detail page - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" When I click on the first assistant card Then I should be navigated to the assistant detail page And I should see the assistant detail content @@ -95,7 +95,7 @@ Feature: Discover Interactions Scenario: Navigate from home to assistant list Given I navigate to "/community" When I click on the "more" link in the featured assistants section - Then I should be navigated to "/community/assistant" + Then I should be navigated to "/community/agent" And I should see the page body @COMMUNITY-INTERACT-011 @P1 diff --git a/e2e/src/features/community/smoke.feature b/e2e/src/features/community/smoke.feature index 16a7c77319..77c71ab925 100644 --- a/e2e/src/features/community/smoke.feature +++ b/e2e/src/features/community/smoke.feature @@ -12,7 +12,7 @@ Feature: Community Smoke Tests @COMMUNITY-SMOKE-002 @P0 Scenario: Load Assistant List Page - Given I navigate to "/community/assistant" + Given I navigate to "/community/agent" Then the page should load without errors And I should see the page body And I should see the search bar diff --git a/e2e/src/steps/community/detail-pages.steps.ts b/e2e/src/steps/community/detail-pages.steps.ts index c7d31be1e8..c3a21e13ee 100644 --- a/e2e/src/steps/community/detail-pages.steps.ts +++ b/e2e/src/steps/community/detail-pages.steps.ts @@ -8,7 +8,7 @@ import { CustomWorld } from '../../support/world'; // ============================================ Given('I wait for the page to fully load', async function (this: CustomWorld) { - // Use domcontentloaded instead of networkidle to avoid hanging on persistent connections + // Use domcontentloaded instead of networkidle to avoid hanging on persistent connections await this.page.waitForLoadState('domcontentloaded', { timeout: 10_000 }); // Short wait for React hydration await this.page.waitForTimeout(1000); @@ -135,9 +135,9 @@ Then('I should be on the assistant list page', async function (this: CustomWorld const currentUrl = this.page.url(); // Check if URL is assistant list (not detail page) or community home - // After back navigation, URL should be /community/assistant or /community + // After back navigation, URL should be /community/agent or /community const isListPage = - (currentUrl.includes('/community/assistant') && + (currentUrl.includes('/community/agent') && !/\/community\/assistant\/[\dA-Za-z-]+$/.test(currentUrl)) || currentUrl.endsWith('/community') || currentUrl.includes('/community#'); @@ -176,7 +176,9 @@ Then('I should see the model description', async function (this: CustomWorld) { // Model detail page shows description below the title, it might be a placeholder like "model.description" // or actual content. Just verify the page structure is correct. - const descriptionArea = this.page.locator('main, article, [class*="detail"], [class*="content"]').first(); + const descriptionArea = this.page + .locator('main, article, [class*="detail"], [class*="content"]') + .first(); const isVisible = await descriptionArea.isVisible().catch(() => false); // Pass if any content area is visible - the description might be a placeholder diff --git a/e2e/src/steps/community/interactions.steps.ts b/e2e/src/steps/community/interactions.steps.ts index 418e1e31fd..f43e21beb8 100644 --- a/e2e/src/steps/community/interactions.steps.ts +++ b/e2e/src/steps/community/interactions.steps.ts @@ -376,11 +376,11 @@ Then('the URL should contain the category parameter', async function (this: Cust console.log(` 📍 Selected category: ${this.testContext.selectedCategory}`); // Check if URL contains a category-related parameter - // The URL format is: /community/assistant?category=xxx + // The URL format is: /community/agent?category=xxx const hasCategory = currentUrl.includes('category=') || currentUrl.includes('tag=') || - // For path-based routing like /community/assistant/category-name + // For path-based routing like /community/agent/category-name /\/community\/assistant\/[^/?]+/.test(currentUrl); expect( @@ -418,7 +418,7 @@ Then('the URL should contain the page parameter', async function (this: CustomWo if (this.testContext.usedInfiniteScroll) { console.log(' 📍 Used infinite scroll, page parameter not expected'); // Just verify we're still on the assistant page - expect(currentUrl.includes('/community/assistant')).toBeTruthy(); + expect(currentUrl.includes('/community/agent')).toBeTruthy(); return; } diff --git a/src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishResultModal.tsx b/src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishResultModal.tsx index 14989bfdcb..d59545fecd 100644 --- a/src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishResultModal.tsx +++ b/src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishResultModal.tsx @@ -19,7 +19,7 @@ const PublishResultModal = memo(({ identifier, onCancel const handleGoToMarket = () => { if (identifier) { - navigate(`/community/assistant/${identifier}`); + navigate(`/community/agent/${identifier}`); } onCancel(); }; diff --git a/src/app/[variants]/(main)/community/(detail)/_layout/Header.tsx b/src/app/[variants]/(main)/community/(detail)/_layout/Header.tsx index b6c4302822..1ac3ff3cb3 100644 --- a/src/app/[variants]/(main)/community/(detail)/_layout/Header.tsx +++ b/src/app/[variants]/(main)/community/(detail)/_layout/Header.tsx @@ -18,11 +18,23 @@ const Header = memo(() => { const navigate = useNavigate(); const handleGoBack = () => { - // Extract the path segment (assistant, model, provider, mcp) + // Extract the path segment (agent, model, provider, mcp, group_agent, user) const path = location.pathname.split('/').filter(Boolean); - if (path[1] && path[1] !== 'user') { - navigate(urlJoin('/community', path[1])); + const detailType = path[1]; + + // group_agent goes back to agent list page + if (detailType === 'group_agent') { + navigate('/community/agent'); + return; + } + + // Types that have their own list pages + const typesWithListPage = ['agent', 'model', 'provider', 'mcp']; + + if (detailType && typesWithListPage.includes(detailType)) { + navigate(urlJoin('/community', detailType)); } else { + // For user or any other type without a list page navigate('/community'); } }; diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/DetailProvider.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/DetailProvider.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/DetailProvider.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/DetailProvider.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Block.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Block.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Block.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Block.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Knowledge.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Knowledge.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Knowledge.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Knowledge.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/KnowledgeItem.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/KnowledgeItem.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/KnowledgeItem.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/KnowledgeItem.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/PluginItem.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/PluginItem.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/PluginItem.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/PluginItem.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Plugins.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Plugins.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/Plugins.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/Plugins.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/index.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Capabilities/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/index.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Nav.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Nav.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Nav.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Nav.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Overview/TagList.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Overview/TagList.tsx similarity index 96% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Overview/TagList.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Overview/TagList.tsx index c75034e846..969734d6e5 100644 --- a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Overview/TagList.tsx +++ b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Overview/TagList.tsx @@ -38,7 +38,7 @@ const TagList = memo<{ tags: string[] }>(({ tags }) => { q: tag, source: marketSource, }, - url: '/community/assistant', + url: '/community/agent', }, { skipNull: true }, )} diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Overview/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Overview/index.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Overview/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Overview/index.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Related/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Related/index.tsx similarity index 90% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Related/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Related/index.tsx index edbda98d1b..ef8d4810b5 100644 --- a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Related/index.tsx +++ b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Related/index.tsx @@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next'; import { useQuery } from '@/hooks/useQuery'; import { type AssistantMarketSource } from '@/types/discover'; -import McpList from '../../../../../(list)/assistant/features/List'; +import McpList from '../../../../../(list)/agent/features/List'; import Title from '../../../../../features/Title'; import { useDetailContext } from '../../DetailProvider'; @@ -25,7 +25,7 @@ const Related = memo(() => { category, source: marketSource, }, - url: '/community/assistant', + url: '/community/agent', }, { skipNull: true }, )} diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/TagList.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/TagList.tsx similarity index 96% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/TagList.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/TagList.tsx index c75034e846..969734d6e5 100644 --- a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/TagList.tsx +++ b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/TagList.tsx @@ -38,7 +38,7 @@ const TagList = memo<{ tags: string[] }>(({ tags }) => { q: tag, source: marketSource, }, - url: '/community/assistant', + url: '/community/agent', }, { skipNull: true }, )} diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/index.tsx similarity index 96% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/index.tsx index f0860539e3..7ab3977d1d 100644 --- a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/SystemRole/index.tsx +++ b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/SystemRole/index.tsx @@ -4,7 +4,7 @@ import { MessageCircleHeartIcon, MessageCircleQuestionIcon } from 'lucide-react' import { memo } from 'react'; import { useTranslation } from 'react-i18next'; -import TokenTag from '../../../../../(list)/assistant/features/List/TokenTag'; +import TokenTag from '../../../../../(list)/agent/features/List/TokenTag'; import Title from '../../../../../features/Title'; import MarkdownRender from '../../../../features/MakedownRender'; import { useDetailContext } from '../../DetailProvider'; diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Versions/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/Versions/index.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Versions/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/Versions/index.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/index.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Details/index.tsx similarity index 100% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Details/index.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Details/index.tsx diff --git a/src/app/[variants]/(main)/community/(detail)/assistant/features/Header.tsx b/src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx similarity index 98% rename from src/app/[variants]/(main)/community/(detail)/assistant/features/Header.tsx rename to src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx index dfef9fa485..6dfa3ce234 100644 --- a/src/app/[variants]/(main)/community/(detail)/assistant/features/Header.tsx +++ b/src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx @@ -32,7 +32,7 @@ import { useMarketAuth } from '@/layout/AuthProvider/MarketAuth'; import { socialService } from '@/services/social'; import { formatIntergerNumber } from '@/utils/format'; -import { useCategory } from '../../../(list)/assistant/features/Category/useCategory'; +import { useCategory } from '../../../(list)/agent/features/Category/useCategory'; import PublishedTime from '../../../../../../../components/PublishedTime'; import { useDetailContext } from './DetailProvider'; @@ -142,7 +142,7 @@ const Header = memo<{ mobile?: boolean }>(({ mobile: isMobile }) => {