@shepai/cli 1.178.0 → 1.178.1-pr536.42a22c6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/Application.yaml +40 -0
- package/apis/json-schema/ApplicationStatus.yaml +8 -0
- package/dist/packages/core/src/application/ports/output/repositories/application-repository.interface.d.ts +17 -0
- package/dist/packages/core/src/application/ports/output/repositories/application-repository.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/repositories/application-repository.interface.js +6 -0
- package/dist/packages/core/src/application/ports/output/repositories/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/repositories/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts +29 -0
- package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js +135 -0
- package/dist/packages/core/src/application/use-cases/applications/delete-application.use-case.d.ts +15 -0
- package/dist/packages/core/src/application/use-cases/applications/delete-application.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/delete-application.use-case.js +45 -0
- package/dist/packages/core/src/application/use-cases/applications/get-application.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/applications/get-application.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/get-application.use-case.js +33 -0
- package/dist/packages/core/src/application/use-cases/applications/index.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/applications/index.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/index.js +10 -0
- package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.js +33 -0
- package/dist/packages/core/src/application/use-cases/applications/update-application.use-case.d.ts +14 -0
- package/dist/packages/core/src/application/use-cases/applications/update-application.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/applications/update-application.use-case.js +33 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +42 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +6 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +32 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts +37 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.js +52 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-create-applications-table.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-create-applications-table.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-create-applications-table.js +34 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts +21 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.js +98 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +31 -5
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +14 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +63 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +57 -10
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +11 -1
- package/dist/src/presentation/web/app/actions/check-all-agents-status.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/check-all-agents-status.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/check-all-agents-status.js +30 -0
- package/dist/src/presentation/web/app/actions/create-application.d.ts +13 -0
- package/dist/src/presentation/web/app/actions/create-application.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/create-application.js +20 -0
- package/dist/src/presentation/web/app/actions/create-project-and-feature.d.ts +20 -0
- package/dist/src/presentation/web/app/actions/create-project-and-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/create-project-and-feature.js +84 -0
- package/dist/src/presentation/web/app/actions/delete-application.d.ts +4 -0
- package/dist/src/presentation/web/app/actions/delete-application.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/delete-application.js +16 -0
- package/dist/src/presentation/web/app/application/[id]/page.d.ts +11 -0
- package/dist/src/presentation/web/app/application/[id]/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/application/[id]/page.js +16 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +3 -1
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +19 -0
- package/dist/src/presentation/web/components/common/application-node/application-node-config.d.ts +24 -0
- package/dist/src/presentation/web/components/common/application-node/application-node-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/application-node/application-node-config.js +1 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.d.ts +7 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.js +41 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/application-node/application-node.stories.js +100 -0
- package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.js +1 -1
- package/dist/src/presentation/web/components/features/application-page/application-page.d.ts +8 -0
- package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/application-page/application-page.js +86 -0
- package/dist/src/presentation/web/components/features/application-page/application-page.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/features/application-page/application-page.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/application-page/application-page.stories.js +51 -0
- package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatSheet.js +4 -2
- package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts +5 -1
- package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatTab.js +3 -3
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts +3 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +181 -120
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts +4 -16
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.js +16 -109
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +21 -3
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +4 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +25 -1
- package/dist/src/presentation/web/components/features/control-center/use-fab-actions.d.ts +2 -1
- package/dist/src/presentation/web/components/features/control-center/use-fab-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-fab-actions.js +9 -2
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +2 -9
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts +3 -1
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +9 -4
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts +5 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +37 -2
- package/dist/src/presentation/web/lib/derive-graph.d.ts +11 -1
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +35 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -0
- package/dist/translations/ar/web.json +2 -1
- package/dist/translations/de/web.json +2 -1
- package/dist/translations/en/web.json +2 -1
- package/dist/translations/es/web.json +2 -1
- package/dist/translations/fr/web.json +2 -1
- package/dist/translations/he/web.json +2 -1
- package/dist/translations/pt/web.json +2 -1
- package/dist/translations/ru/web.json +2 -1
- package/dist/translations/uk/web.json +2 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/routes-manifest.json +8 -0
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +96 -81
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +92 -77
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +98 -83
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +114 -99
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +114 -99
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +94 -79
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +94 -79
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +92 -77
- package/web/.next/server/app/(dashboard)/chat/page.js +4 -3
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +98 -83
- package/web/.next/server/app/(dashboard)/create/page.js +4 -3
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +114 -99
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +114 -99
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +92 -77
- package/web/.next/server/app/(dashboard)/page.js +4 -3
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +94 -79
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +94 -79
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +4 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +27 -12
- package/web/.next/server/app/_not-found/page.js +2 -2
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/application/[id]/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/application/[id]/page/build-manifest.json +18 -0
- package/web/.next/server/app/application/[id]/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +110 -0
- package/web/.next/server/app/application/[id]/page.js +18 -0
- package/web/.next/server/app/application/[id]/page.js.map +5 -0
- package/web/.next/server/app/application/[id]/page.js.nft.json +1 -0
- package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/features/page/server-reference-manifest.json +27 -12
- package/web/.next/server/app/features/page.js +2 -2
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +33 -18
- package/web/.next/server/app/settings/page.js +2 -2
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +41 -26
- package/web/.next/server/app/skills/page.js +2 -2
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +37 -22
- package/web/.next/server/app/tools/page.js +2 -2
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +27 -12
- package/web/.next/server/app/version/page.js +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__ea653642._.js → [root-of-the-server]__a5879003._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__ea653642._.js.map → [root-of-the-server]__a5879003._.js.map} +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_17d0c3c1.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_17d0c3c1.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_717a531e.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_717a531e.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_6ed3ab8b.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_6ed3ab8b.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_281e0ef8._.js +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_281e0ef8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_a593f310._.js +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_a593f310._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00efb844._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__00efb844._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__d1040bd1._.js → [root-of-the-server]__090f24cb._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__d1040bd1._.js.map → [root-of-the-server]__090f24cb._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0d64745d._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0d64745d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__28c4e836._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__28c4e836._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3b7cba7e._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3b7cba7e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__63272afd._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__63272afd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7e2919._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7e2919._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__efeeaed4._.js → [root-of-the-server]__7aa484f5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__efeeaed4._.js.map → [root-of-the-server]__7aa484f5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__964b00e8._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__964b00e8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df7bfd53._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df7bfd53._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f5f982ad._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f5f982ad._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
- package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_2bea8166._.js +4 -0
- package/web/.next/server/chunks/ssr/_2bea8166._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_46a35540._.js +3 -0
- package/web/.next/server/chunks/ssr/_46a35540._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_4e42f1b7._.js +3 -0
- package/web/.next/server/chunks/ssr/_4e42f1b7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6dff070a._.js +3 -0
- package/web/.next/server/chunks/ssr/_6dff070a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_73e62e34._.js +7 -0
- package/web/.next/server/chunks/ssr/_73e62e34._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_83e1c526._.js → _946a7fc6._.js} +3 -3
- package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_b0311e50._.js +3 -0
- package/web/.next/server/chunks/ssr/_b0311e50._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_b7a43c05._.js +1 -1
- package/web/.next/server/chunks/ssr/_b7a43c05._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d485d3b9._.js +3 -0
- package/web/.next/server/chunks/ssr/_d485d3b9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f3cd7f63._.js +9 -0
- package/web/.next/server/chunks/ssr/_f3cd7f63._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_496c9117._.js → _f86fc1bf._.js} +2 -2
- package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f916587a._.js +3 -0
- package/web/.next/server/chunks/ssr/_f916587a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_49b9ba41._.js → _fb9934d4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_49b9ba41._.js.map → _fb9934d4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_2478c24c._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_2478c24c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_25da4cf4._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_25da4cf4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_35084e19._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_35084e19._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_4ed08aa4._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_4ed08aa4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5149e11b.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5149e11b.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1619f987.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1619f987.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_1b3c83ff.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_1b3c83ff.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_a9f3bc05._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_a9f3bc05._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +32 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_b360e85a._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_b360e85a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +898 -701
- package/web/.next/static/chunks/{25a0d3f50b0a26c1.js → 04b48827bdc55056.js} +1 -1
- package/web/.next/static/chunks/07dd0cd365169ac6.js +1 -0
- package/web/.next/static/chunks/0dbc8228223540f0.js +1 -0
- package/web/.next/static/chunks/14742749d118b339.js +1 -0
- package/web/.next/static/chunks/{2cc487403c107f3f.js → 48b1ee6f9460e08a.js} +2 -2
- package/web/.next/static/chunks/54a8ad22d3f9a857.js +3 -0
- package/web/.next/static/chunks/57cc43fa9970f8d7.js +1 -0
- package/web/.next/static/chunks/63e6ce2311b8c44f.js +7 -0
- package/web/.next/static/chunks/73e5026c618f964b.css +1 -0
- package/web/.next/static/chunks/771b8283dff48366.js +5 -0
- package/web/.next/static/chunks/79f687a9b9f2dca3.js +1 -0
- package/web/.next/static/chunks/{35bf9838f21d1818.js → 82189e222fa39768.js} +1 -1
- package/web/.next/static/chunks/{e167803ac69c66c7.js → 9718f0d839d204ee.js} +1 -1
- package/web/.next/static/chunks/994f0ac30cd8661a.js +1 -0
- package/web/.next/static/chunks/a9dbf887ff5ea94d.js +1 -0
- package/web/.next/static/chunks/afd205387569eb16.js +1 -0
- package/web/.next/static/chunks/b99506a6f7bc2fa8.js +1 -0
- package/web/.next/static/chunks/{09edd35d194bec06.js → bcbae49e0f6d65ca.js} +3 -3
- package/web/.next/static/chunks/{5f57f0d80d3db147.js → c5e9b56c67a4f3d4.js} +1 -1
- package/web/.next/static/chunks/c9bd1dea77920749.js +1 -0
- package/web/.next/static/chunks/ce8d4b5094c4dd62.js +1 -0
- package/web/.next/static/chunks/e2644573ed9ceb22.js +1 -0
- package/web/.next/static/chunks/{36e3d626ed8defca.js → f202967c5b0ff87f.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__46b10380._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__46b10380._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b512877._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b512877._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__990dba2d._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__990dba2d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cc9c7bbb._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cc9c7bbb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_43ba79e7._.js +0 -3
- package/web/.next/server/chunks/ssr/_43ba79e7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_496c9117._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_64efdf53._.js +0 -3
- package/web/.next/server/chunks/ssr/_64efdf53._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js +0 -3
- package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7cb0396e._.js +0 -3
- package/web/.next/server/chunks/ssr/_7cb0396e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_83e1c526._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d9c0a97a._.js +0 -7
- package/web/.next/server/chunks/ssr/_d9c0a97a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e680c57c._.js +0 -9
- package/web/.next/server/chunks/ssr/_e680c57c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_06109d28._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_06109d28._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_0bca70f8._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_0bca70f8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_367cdbe0._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_367cdbe0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_57fed7fd._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_57fed7fd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_7f567f6d._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_7f567f6d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_972f58d5._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_972f58d5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a71b18a2._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_a71b18a2._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_bebe675e._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_bebe675e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c93e8bc6._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_c93e8bc6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e729f44a._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e729f44a._.js.map +0 -1
- package/web/.next/static/chunks/0b7251e5d717dd17.js +0 -1
- package/web/.next/static/chunks/0fd39d549d277843.js +0 -1
- package/web/.next/static/chunks/124b79a5d2a760fb.css +0 -1
- package/web/.next/static/chunks/4052a4971fbbac9c.js +0 -1
- package/web/.next/static/chunks/46e2693dbc9262fd.js +0 -5
- package/web/.next/static/chunks/5df9da8b40e298ee.js +0 -7
- package/web/.next/static/chunks/8286914ac835a1cc.js +0 -1
- package/web/.next/static/chunks/8777b2a0a2e85fd1.js +0 -3
- package/web/.next/static/chunks/8b0a9cb5109fe899.js +0 -1
- package/web/.next/static/chunks/971e52f3f386ccfd.js +0 -1
- package/web/.next/static/chunks/9e9cddf8e38342e8.js +0 -1
- package/web/.next/static/chunks/ac586c86d71187fc.js +0 -1
- package/web/.next/static/chunks/b63e6727c84f30e2.js +0 -1
- package/web/.next/static/chunks/c10c0d6d458453bc.js +0 -1
- package/web/.next/static/chunks/c6fdd161a9e5b554.js +0 -1
- /package/web/.next/static/{sfBZvlx-erv7S1C49vRSU → gxMya5XttXE_aSwszy4nE}/_buildManifest.js +0 -0
- /package/web/.next/static/{sfBZvlx-erv7S1C49vRSU → gxMya5XttXE_aSwszy4nE}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{sfBZvlx-erv7S1C49vRSU → gxMya5XttXE_aSwszy4nE}/_ssgManifest.js +0 -0
package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[228,a=>{"use strict";var b=a.i(12656);a.i(78454);var c=a.i(24255),d=a.i(2824),e=a.i(58339),f=a.i(13126),g=a.i(3195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},74468,a=>{"use strict";var b=a.i(12656),c=a.i(96960),d=a.i(31378),e=a.i(67424),f=a.i(90920),g=a.i(18948);a.i(55135);var h=a.i(75550);a.i(38702);var i=a.i(16223),j=a.i(84117),k=a.i(58339),l=a.i(3195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(228),s=a.i(13126),t=a.i(69845),u=a.i(67837),v=a.i(2807),w=a.i(52313),x=a.i(25674);let y=(0,x.createServerReference)("4091f06620a11c5b0e3e989efd9ba0c324d6ca717d",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(45670),A=a.i(584),B=a.i(41305);let C=(0,x.createServerReference)("401a5d76447f8dc4839a337e2e75da3f34278582e7",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],74468)}];
|
|
1
|
+
module.exports=[228,a=>{"use strict";var b=a.i(12656);a.i(78454);var c=a.i(24255),d=a.i(2824),e=a.i(58339),f=a.i(13126),g=a.i(3195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},74468,a=>{"use strict";var b=a.i(12656),c=a.i(96960),d=a.i(31378),e=a.i(67424),f=a.i(90920),g=a.i(18948);a.i(55135);var h=a.i(75550);a.i(38702);var i=a.i(16223),j=a.i(84117),k=a.i(58339),l=a.i(3195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(228),s=a.i(13126),t=a.i(69845),u=a.i(67837),v=a.i(2807),w=a.i(52313),x=a.i(25674);let y=(0,x.createServerReference)("40a42ea78a16cddfd60279044415311cdc99873491",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(45670),A=a.i(584),B=a.i(41305);let C=(0,x.createServerReference)("40a924f38aa37abf034276f9df3a027caf141a9253",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],74468)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_presentation_web_components_features_skills_8a174cac._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A11fa18%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3A14fc7f%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4091f06620a11c5b0e3e989efd9ba0c324d6ca717d\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4091f06620a11c5b0e3e989efd9ba0c324d6ca717d\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"401a5d76447f8dc4839a337e2e75da3f34278582e7\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"401a5d76447f8dc4839a337e2e75da3f34278582e7\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A541b77%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ad1fee8%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40a42ea78a16cddfd60279044415311cdc99873491\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40a42ea78a16cddfd60279044415311cdc99873491\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40a924f38aa37abf034276f9df3a027caf141a9253\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40a924f38aa37abf034276f9df3a027caf141a9253\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"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"}
|