diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 949ad92a..46af8d9f 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -1778,6 +1778,9 @@ "viewMember": "View skill: {{name}}", "pinnedVersion": "Pinned version v{{version}}", "entrySkill": "Entry skill", + "startWithEntry": "Start with the entry skill", + "startWithEntryDescription": "Installing this suite gives you {{count}} version-pinned skills. Open the entry skill first to understand the primary way to use them together.", + "viewEntrySkill": "View entry skill", "versionHistory": "Version history", "validationRequired": "Complete the required fields and select at least one skill", "draftUpdated": "Suite draft updated", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 2676815a..d9d37237 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -1775,6 +1775,9 @@ "viewMember": "Открыть навык: {{name}}", "pinnedVersion": "Зафиксированная версия v{{version}}", "entrySkill": "Входной навык", + "startWithEntry": "Начните с входного навыка", + "startWithEntryDescription": "После установки набора вы получите {{count}} навыков с зафиксированными версиями. Сначала откройте входной навык, чтобы понять основной сценарий их совместного использования.", + "viewEntrySkill": "Открыть входной навык", "versionHistory": "История версий", "validationRequired": "Заполните обязательные поля и выберите хотя бы один навык", "draftUpdated": "Черновик набора обновлён", diff --git a/web/src/i18n/locales/zh.json b/web/src/i18n/locales/zh.json index cc14067b..309425b1 100644 --- a/web/src/i18n/locales/zh.json +++ b/web/src/i18n/locales/zh.json @@ -1777,6 +1777,9 @@ "viewMember": "查看技能:{{name}}", "pinnedVersion": "固定版本 v{{version}}", "entrySkill": "入口技能", + "startWithEntry": "从入口技能开始", + "startWithEntryDescription": "安装套件后将获得 {{count}} 个固定版本的技能。先打开入口技能,了解这组技能的主要使用方式。", + "viewEntrySkill": "查看入口技能", "versionHistory": "版本历史", "validationRequired": "请填写必填项并至少选择一个技能", "draftUpdated": "套件草稿已更新", diff --git a/web/src/pages/suite-detail.test.tsx b/web/src/pages/suite-detail.test.tsx index c0fd8e03..3128a974 100644 --- a/web/src/pages/suite-detail.test.tsx +++ b/web/src/pages/suite-detail.test.tsx @@ -93,13 +93,19 @@ describe('SuiteDetailPage', () => { vi.clearAllMocks() }) - it('separates the Markdown overview from browsable member skills', () => { + it('adds entry skill guidance to the overview and keeps the full member grid separate', () => { mocks.detail = { data: suite(), isLoading: false, error: null } render() expect(screen.getByTestId('suite-overview').textContent).toContain('Run the entry skill first.') - expect(screen.queryByText('Medical Records')).toBeNull() + expect(screen.getByText('suite.startWithEntry')).not.toBeNull() + expect(screen.getByText('suite.startWithEntryDescription')).not.toBeNull() + expect(screen.getByText('Medical Records')).not.toBeNull() + expect(screen.getByText('@global/medical-records@1.0.0')).not.toBeNull() + expect(screen.getByRole('link', { name: 'suite.viewEntrySkill' }).getAttribute('href')) + .toContain('/space/global/medical-records') + expect(screen.queryByText('@global/deleted-helper')).toBeNull() fireEvent.click(screen.getByRole('tab', { name: 'suite.membersTab' })) diff --git a/web/src/pages/suite-detail.tsx b/web/src/pages/suite-detail.tsx index 933836dc..e1c78f60 100644 --- a/web/src/pages/suite-detail.tsx +++ b/web/src/pages/suite-detail.tsx @@ -7,7 +7,7 @@ import { suiteBlockingReasonLabel, suiteStatusLabel, suiteVisibilityLabel } from import { SuiteManagementActions } from '@/features/suite/suite-management-actions' import { MarkdownRenderer } from '@/features/skill/markdown-renderer' import { Card } from '@/shared/ui/card' -import { Button } from '@/shared/ui/button' +import { Button, buttonVariants } from '@/shared/ui/button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/shared/ui/tabs' import { SkeletonList } from '@/shared/components/skeleton-loader' import { NamespaceBadge } from '@/shared/components/namespace-badge' @@ -53,6 +53,7 @@ export function SuiteDetailPage() { const hasPrimaryActions = suite.allowedActions.includes('EDIT') || suite.allowedActions.includes('SUBMIT') || suite.allowedActions.includes('PUBLISH_PRIVATE') + const entryMember = suite.members.find(member => member.entry) return (
@@ -94,14 +95,60 @@ export function SuiteDetailPage() { - - {suite.overview ? ( - - ) : ( -

- {suite.summary || t('suite.noOverview')} -

- )} + +
+ {suite.overview ? ( + + ) : ( +

+ {suite.summary || t('suite.noOverview')} +

+ )} +
+ + {entryMember ? ( +
+
+
+

+ {t('suite.startWithEntry')} +

+

+ {t('suite.startWithEntryDescription', { count: suite.members.length })} +

+
+ {entryMember.browsable && !entryMember.blockingReason + && entryMember.skillId && entryMember.skillVersionId ? ( + + {t('suite.viewEntrySkill')} +
+ +
+

+

+

+ @{entryMember.namespace}/{entryMember.slug}@{entryMember.version} +

+ {entryMember.blockingReason ? ( + + {suiteBlockingReasonLabel(t, entryMember.blockingReason)} + + ) : null} +
+
+ ) : null}