@shepai/cli 1.59.0 → 1.61.0
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/dist/src/presentation/web/app/skills/page.d.ts +2 -0
- package/dist/src/presentation/web/app/skills/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/skills/page.js +11 -0
- package/dist/src/presentation/web/components/common/action-button/action-button.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.js +7 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.js +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +10 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +20 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +68 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +21 -2
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +16 -3
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.js +14 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.js +2 -0
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.js +4 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.js +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +14 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.js +13 -0
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.js +2 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- 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 +7 -13
- package/dist/src/presentation/web/components/features/skills/category-filter.d.ts +8 -0
- package/dist/src/presentation/web/components/features/skills/category-filter.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/category-filter.js +12 -0
- package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/category-filter.stories.js +36 -0
- package/dist/src/presentation/web/components/features/skills/index.d.ts +6 -0
- package/dist/src/presentation/web/components/features/skills/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/index.js +5 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.d.ts +7 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.js +12 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts +11 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-card.stories.js +88 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts +7 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.js +13 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.js +71 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.d.ts +7 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.js +21 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skill-list.stories.js +124 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +6 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.js +52 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +186 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +3 -2
- package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-notifications.js +18 -18
- package/dist/src/presentation/web/hooks/use-sound-action.d.ts +100 -0
- package/dist/src/presentation/web/hooks/use-sound-action.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-sound-action.js +42 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts +6 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.js +61 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts +10 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/feature-flags.js +12 -0
- package/dist/src/presentation/web/lib/skills.d.ts +30 -0
- package/dist/src/presentation/web/lib/skills.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/skills.js +137 -0
- 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 +4 -4
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- 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/tools/[id]/install/route.js +1 -1
- package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/server/app/page/build-manifest.json +2 -2
- package/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/page.js +1 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/skills/page/build-manifest.json +17 -0
- package/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
- package/web/.next/server/app/skills/page.js +16 -0
- package/web/.next/server/app/skills/page.js.map +5 -0
- package/web/.next/server/app/skills/page.js.nft.json +1 -0
- package/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/tools/page/build-manifest.json +2 -2
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- 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/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js → [root-of-the-server]__b6839c3f._.js} +3 -3
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js.map → [root-of-the-server]__b6839c3f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
- package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
- package/web/.next/server/chunks/ssr/_44cce4e0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
- package/web/.next/server/chunks/ssr/_9915d2a7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
- package/web/.next/server/chunks/ssr/{_e242b954._.js.map → _a64b7b24._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_d3711354._.js +6 -0
- package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
- package/web/.next/server/chunks/ssr/_e7a4b0e4._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js → server/chunks/ssr/node_modules__pnpm_fe355030._.js} +2 -2
- package/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +2 -2
- 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 +22 -15
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +4 -4
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +17 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +16 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js → [root-of-the-server]__b6839c3f._.js} +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
- package/web/.next/{server/chunks/ssr/node_modules__pnpm_d26a7485._.js → standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -15
- package/web/.next/standalone/src/presentation/web/app/skills/page.tsx +12 -0
- package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +82 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +16 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +27 -3
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +14 -2
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +17 -4
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx +14 -1
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx +6 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -1
- package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.tsx +14 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +2 -2
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +7 -12
- package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.stories.tsx +57 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.tsx +36 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/index.ts +5 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.stories.tsx +105 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.tsx +48 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.stories.tsx +96 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.tsx +100 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.stories.tsx +139 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.tsx +48 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.stories.tsx +199 -0
- package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.tsx +112 -0
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +10 -1
- package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +20 -19
- package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.stories.tsx +107 -0
- package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.ts +53 -0
- package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +14 -0
- package/web/.next/standalone/src/presentation/web/lib/skills.ts +188 -0
- package/web/.next/standalone/src/presentation/web/package.json +2 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/09d898be63c54f20.js +1 -0
- package/web/.next/static/chunks/13664c029245afc8.js +1 -0
- package/web/.next/static/chunks/25f42652257ff43d.js +1 -0
- package/web/.next/static/chunks/2934854f0378f815.js +1 -0
- package/web/.next/static/chunks/2960a70537e4fd12.js +10 -0
- package/web/.next/static/chunks/45f510f84c7c417d.css +2 -0
- package/web/.next/static/chunks/79718b1f5713fdc0.js +1 -0
- package/web/.next/static/chunks/acdb8af5a21f1ae9.js +1 -0
- package/web/.next/static/chunks/{3d4dcf0be654a331.js → cb1b27e4a21415d3.js} +2 -2
- package/web/.next/static/chunks/d4379644a6145352.js +1 -0
- package/web/.next/static/chunks/{turbopack-6a11f2f1634ff6e0.js → turbopack-eb24b869babb34b4.js} +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/link.d.ts +1 -0
- package/web/.next/types/routes.d.ts +2 -1
- package/web/.next/types/validator.ts +9 -0
- package/web/package.json +2 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
- package/web/.next/server/chunks/ssr/_027596cf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
- package/web/.next/static/chunks/0cd7c513169faee3.js +0 -1
- package/web/.next/static/chunks/4f7d89c9e09aed99.js +0 -10
- package/web/.next/static/chunks/67459433cc866344.js +0 -1
- package/web/.next/static/chunks/6d33cb9af6245c98.js +0 -1
- package/web/.next/static/chunks/a9c2b889c8749a94.js +0 -1
- package/web/.next/static/chunks/b511c65023ec1889.css +0 -2
- package/web/.next/static/chunks/cda11a2491d519fc.js +0 -1
- package/web/.next/static/chunks/d85b95e893db08bc.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js.map → [root-of-the-server]__e926de65._.js.map} +0 -0
- /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → _DBWexyU1QkK02q15qod2}/_buildManifest.js +0 -0
- /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → _DBWexyU1QkK02q15qod2}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → _DBWexyU1QkK02q15qod2}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,7 @@ import { TechDecisionsDrawer } from './tech-decisions-drawer.js';
|
|
|
4
4
|
declare const meta: Meta<typeof TechDecisionsReview>;
|
|
5
5
|
export default meta;
|
|
6
6
|
type Story = StoryObj<typeof TechDecisionsReview>;
|
|
7
|
-
/** Default — scrollable list of decisions taken. */
|
|
7
|
+
/** Default — scrollable list of decisions taken. "Other Options Considered" toggle plays expand/collapse sounds. */
|
|
8
8
|
export declare const Default: Story;
|
|
9
9
|
/** Processing state — approve button disabled. */
|
|
10
10
|
export declare const Processing: Story;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-decisions-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA0C9D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAc1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"tech-decisions-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA0C9D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAc1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAElD,oHAAoH;AACpH,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAIF,KAAK,WAAW,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AA8BxD,uCAAuC;AACvC,eAAO,MAAM,QAAQ,EAAE,WAWtB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,EAAE,WAY9B,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,WAa3B,CAAC;AAIF,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
|
|
@@ -47,7 +47,7 @@ const meta = {
|
|
|
47
47
|
],
|
|
48
48
|
};
|
|
49
49
|
export default meta;
|
|
50
|
-
/** Default — scrollable list of decisions taken. */
|
|
50
|
+
/** Default — scrollable list of decisions taken. "Other Options Considered" toggle plays expand/collapse sounds. */
|
|
51
51
|
export const Default = {
|
|
52
52
|
args: {
|
|
53
53
|
data: mockData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/theme-toggle/theme-toggle.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/theme-toggle/theme-toggle.tsx"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,4CAsC1B"}
|
|
@@ -3,9 +3,22 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Moon, Sun } from 'lucide-react';
|
|
4
4
|
import { Button } from '../../ui/button.js';
|
|
5
5
|
import { useTheme } from '../../../hooks/useTheme.js';
|
|
6
|
+
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
6
7
|
export function ThemeToggle() {
|
|
7
8
|
const { theme, resolvedTheme, setTheme } = useTheme();
|
|
9
|
+
const toggleOnSound = useSoundAction('toggle-on');
|
|
10
|
+
const toggleOffSound = useSoundAction('toggle-off');
|
|
8
11
|
const toggleTheme = () => {
|
|
12
|
+
// Determine target theme before switching
|
|
13
|
+
const currentResolved = theme === 'system' ? resolvedTheme : theme;
|
|
14
|
+
const goingToDark = currentResolved !== 'dark';
|
|
15
|
+
// Play sound before setTheme for immediate feedback
|
|
16
|
+
if (goingToDark) {
|
|
17
|
+
toggleOnSound.play();
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
toggleOffSound.play();
|
|
21
|
+
}
|
|
9
22
|
// If system theme, switch to explicit light/dark
|
|
10
23
|
// If explicit, toggle between light and dark
|
|
11
24
|
if (theme === 'system') {
|
|
@@ -3,6 +3,8 @@ import { ThemeToggle } from './theme-toggle.js';
|
|
|
3
3
|
declare const meta: Meta<typeof ThemeToggle>;
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof meta>;
|
|
6
|
+
/** Default — click to toggle theme. Plays toggle-on (dark) or toggle-off (light) sound. */
|
|
6
7
|
export declare const Default: Story;
|
|
8
|
+
/** In context with label. Sounds play on each toggle click. */
|
|
7
9
|
export declare const InContext: Story;
|
|
8
10
|
//# sourceMappingURL=theme-toggle.stories.d.ts.map
|
package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-toggle.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAOlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"theme-toggle.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAOlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,2FAA2F;AAC3F,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC"}
|
|
@@ -9,9 +9,11 @@ const meta = {
|
|
|
9
9
|
tags: ['autodocs'],
|
|
10
10
|
};
|
|
11
11
|
export default meta;
|
|
12
|
+
/** Default — click to toggle theme. Plays toggle-on (dark) or toggle-off (light) sound. */
|
|
12
13
|
export const Default = {
|
|
13
14
|
render: () => _jsx(ThemeToggle, {}),
|
|
14
15
|
};
|
|
16
|
+
/** In context with label. Sounds play on each toggle click. */
|
|
15
17
|
export const InContext = {
|
|
16
18
|
render: () => (_jsxs("div", { className: "flex items-center gap-4 rounded-lg border p-4", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: "Toggle theme:" }), _jsx(ThemeToggle, {})] })),
|
|
17
19
|
};
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -14,7 +14,7 @@ import { PrdQuestionnaireDrawer } from '../../common/prd-questionnaire/index.js'
|
|
|
14
14
|
import { TechDecisionsDrawer } from '../../common/tech-decisions-review/index.js';
|
|
15
15
|
import { MergeReviewDrawer } from '../../common/merge-review/index.js';
|
|
16
16
|
import { NotificationPermissionBanner } from '../../common/notification-permission-banner/index.js';
|
|
17
|
-
import {
|
|
17
|
+
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
18
18
|
import { ControlCenterEmptyState } from './control-center-empty-state.js';
|
|
19
19
|
import { useControlCenterState } from './use-control-center-state.js';
|
|
20
20
|
export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
@@ -43,7 +43,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
43
43
|
const [isLoadingQuestionnaire, setIsLoadingQuestionnaire] = useState(false);
|
|
44
44
|
// Reject state (shared by both drawers)
|
|
45
45
|
const [isRejecting, setIsRejecting] = useState(false);
|
|
46
|
-
const rejectSound =
|
|
46
|
+
const rejectSound = useSoundAction('reject');
|
|
47
47
|
// Tech decisions drawer state
|
|
48
48
|
const [techDecisionsData, setTechDecisionsData] = useState(null);
|
|
49
49
|
const [isLoadingTechDecisions, setIsLoadingTechDecisions] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAYhF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,yBAAyB,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAChE,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,KACpC,MAAM,CAAC;IACZ,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAYhF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,yBAAyB,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAChE,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,KACpC,MAAM,CAAC;IACZ,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA2sBpB"}
|
package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js
CHANGED
|
@@ -9,7 +9,7 @@ import { deleteFeature } from '../../../app/actions/delete-feature.js';
|
|
|
9
9
|
import { addRepository } from '../../../app/actions/add-repository.js';
|
|
10
10
|
import { deleteRepository } from '../../../app/actions/delete-repository.js';
|
|
11
11
|
import { useAgentEventsContext } from '../../../hooks/agent-events-provider.js';
|
|
12
|
-
import {
|
|
12
|
+
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
13
13
|
import { mapEventTypeToState, mapPhaseNameToLifecycle, } from '../../common/feature-node/derive-feature-state.js';
|
|
14
14
|
let nextFeatureId = 0;
|
|
15
15
|
export function useControlCenterState(initialNodes, initialEdges) {
|
|
@@ -30,9 +30,9 @@ export function useControlCenterState(initialNodes, initialEdges) {
|
|
|
30
30
|
const [selectedNode, setSelectedNode] = useState(null);
|
|
31
31
|
const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false);
|
|
32
32
|
const [isDeleting, setIsDeleting] = useState(false);
|
|
33
|
-
const deleteSound =
|
|
34
|
-
const createSound =
|
|
35
|
-
const clickSound =
|
|
33
|
+
const deleteSound = useSoundAction('delete');
|
|
34
|
+
const createSound = useSoundAction('create');
|
|
35
|
+
const clickSound = useSoundAction('click');
|
|
36
36
|
const [pendingRepoNodeId, setPendingRepoNodeId] = useState(null);
|
|
37
37
|
// Sync server props into local state when router.refresh() delivers new data
|
|
38
38
|
const initialNodeKey = initialNodes
|
|
@@ -189,14 +189,9 @@ export function useControlCenterState(initialNodes, initialEdges) {
|
|
|
189
189
|
const onNodesChange = useCallback((changes) => {
|
|
190
190
|
setNodes((ns) => applyNodeChanges(changes, ns));
|
|
191
191
|
}, []);
|
|
192
|
-
const closeSound = useSound('transition_down', { volume: 0.01 });
|
|
193
192
|
const clearSelection = useCallback(() => {
|
|
194
|
-
setSelectedNode(
|
|
195
|
-
|
|
196
|
-
closeSound.play();
|
|
197
|
-
return null;
|
|
198
|
-
});
|
|
199
|
-
}, [closeSound]);
|
|
193
|
+
setSelectedNode(null);
|
|
194
|
+
}, []);
|
|
200
195
|
const handleNodeClick = useCallback((_event, node) => {
|
|
201
196
|
if (node.type === 'featureNode') {
|
|
202
197
|
const data = node.data;
|
|
@@ -395,10 +390,9 @@ export function useControlCenterState(initialNodes, initialEdges) {
|
|
|
395
390
|
});
|
|
396
391
|
}, [router, createFeatureNode, pendingRepoNodeId, createSound, pendingParentFeatureId, setEdges]);
|
|
397
392
|
const closeCreateDrawer = useCallback(() => {
|
|
398
|
-
closeSound.play();
|
|
399
393
|
setIsCreateDrawerOpen(false);
|
|
400
394
|
setPendingParentFeatureId(undefined);
|
|
401
|
-
}, [
|
|
395
|
+
}, []);
|
|
402
396
|
const handleDeleteFeature = useCallback(async (featureId) => {
|
|
403
397
|
setIsDeleting(true);
|
|
404
398
|
try {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SkillCategory } from '../../../lib/skills.js';
|
|
2
|
+
export interface CategoryFilterProps {
|
|
3
|
+
activeCategory: SkillCategory | null;
|
|
4
|
+
onCategoryChange: (category: SkillCategory | null) => void;
|
|
5
|
+
counts?: Record<SkillCategory, number>;
|
|
6
|
+
}
|
|
7
|
+
export declare function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=category-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-filter.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,cAAc,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CAkB/F"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../../ui/button.js';
|
|
3
|
+
const CATEGORIES = [
|
|
4
|
+
{ label: 'All', value: null },
|
|
5
|
+
{ label: 'Workflow', value: 'Workflow' },
|
|
6
|
+
{ label: 'Code Generation', value: 'Code Generation' },
|
|
7
|
+
{ label: 'Analysis', value: 'Analysis' },
|
|
8
|
+
{ label: 'Reference', value: 'Reference' },
|
|
9
|
+
];
|
|
10
|
+
export function CategoryFilter({ activeCategory, onCategoryChange, counts }) {
|
|
11
|
+
return (_jsx("div", { className: "flex flex-wrap gap-2", role: "group", "aria-label": "Filter by category", children: CATEGORIES.map(({ label, value }) => (_jsxs(Button, { variant: activeCategory === value ? 'default' : 'outline', size: "sm", onClick: () => onCategoryChange(value), children: [label, counts && value ? (_jsxs("span", { className: "ml-1 text-xs opacity-70", children: ["(", counts[value], ")"] })) : null] }, label))) }));
|
|
12
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { CategoryFilter } from './category-filter.js';
|
|
3
|
+
declare const meta: Meta<typeof CategoryFilter>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof CategoryFilter>;
|
|
6
|
+
export declare const AllSelected: Story;
|
|
7
|
+
export declare const WorkflowSelected: Story;
|
|
8
|
+
export declare const WithCounts: Story;
|
|
9
|
+
//# sourceMappingURL=category-filter.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-filter.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/category-filter.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAOrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAqB7C,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { CategoryFilter } from './category-filter.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Features/CategoryFilter',
|
|
6
|
+
component: CategoryFilter,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'padded',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
export default meta;
|
|
13
|
+
/* ---------------------------------------------------------------------------
|
|
14
|
+
* Interactive wrapper — manages activeCategory state
|
|
15
|
+
* ------------------------------------------------------------------------- */
|
|
16
|
+
function InteractiveCategoryFilter({ initial, counts, }) {
|
|
17
|
+
const [active, setActive] = useState(initial);
|
|
18
|
+
return _jsx(CategoryFilter, { activeCategory: active, onCategoryChange: setActive, counts: counts });
|
|
19
|
+
}
|
|
20
|
+
/* ---------------------------------------------------------------------------
|
|
21
|
+
* Stories
|
|
22
|
+
* ------------------------------------------------------------------------- */
|
|
23
|
+
export const AllSelected = {
|
|
24
|
+
render: () => _jsx(InteractiveCategoryFilter, { initial: null }),
|
|
25
|
+
};
|
|
26
|
+
export const WorkflowSelected = {
|
|
27
|
+
render: () => _jsx(InteractiveCategoryFilter, { initial: "Workflow" }),
|
|
28
|
+
};
|
|
29
|
+
export const WithCounts = {
|
|
30
|
+
render: () => (_jsx(InteractiveCategoryFilter, { initial: null, counts: {
|
|
31
|
+
Workflow: 8,
|
|
32
|
+
'Code Generation': 1,
|
|
33
|
+
Analysis: 2,
|
|
34
|
+
Reference: 7,
|
|
35
|
+
} })),
|
|
36
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { SkillsPageClient, type SkillsPageClientProps } from './skills-page-client.js';
|
|
2
|
+
export { SkillCard, type SkillCardProps } from './skill-card.js';
|
|
3
|
+
export { CategoryFilter, type CategoryFilterProps } from './category-filter.js';
|
|
4
|
+
export { SkillList, type SkillListProps } from './skill-list.js';
|
|
5
|
+
export { SkillDetailDrawer, type SkillDetailDrawerProps } from './skill-detail-drawer.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SkillsPageClient } from './skills-page-client.js';
|
|
2
|
+
export { SkillCard } from './skill-card.js';
|
|
3
|
+
export { CategoryFilter } from './category-filter.js';
|
|
4
|
+
export { SkillList } from './skill-list.js';
|
|
5
|
+
export { SkillDetailDrawer } from './skill-detail-drawer.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkillData } from '../../../lib/skills.js';
|
|
2
|
+
export interface SkillCardProps {
|
|
3
|
+
skill: SkillData;
|
|
4
|
+
onSelect: (skill: SkillData) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function SkillCard({ skill, onSelect }: SkillCardProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=skill-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAqC5D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardContent, CardHeader, CardTitle } from '../../ui/card.js';
|
|
3
|
+
import { Badge } from '../../ui/badge.js';
|
|
4
|
+
import { FolderOpen } from 'lucide-react';
|
|
5
|
+
export function SkillCard({ skill, onSelect }) {
|
|
6
|
+
return (_jsxs(Card, { className: "hover:border-primary/50 cursor-pointer transition-colors", role: "button", tabIndex: 0, onClick: () => onSelect(skill), onKeyDown: (e) => {
|
|
7
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
8
|
+
e.preventDefault();
|
|
9
|
+
onSelect(skill);
|
|
10
|
+
}
|
|
11
|
+
}, "data-testid": `skill-card-${skill.name}`, children: [_jsxs(CardHeader, { className: "pb-3", children: [_jsx(CardTitle, { className: "text-base", children: skill.displayName }), _jsx("p", { className: "text-muted-foreground font-mono text-xs", children: skill.name })] }), _jsxs(CardContent, { className: "space-y-3", children: [_jsx("p", { className: "text-muted-foreground line-clamp-2 text-sm", children: skill.description }), _jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx(Badge, { variant: skill.source === 'project' ? 'secondary' : 'outline', children: skill.source === 'project' ? 'Project' : 'Global' }), skill.context ? _jsx(Badge, { variant: "outline", children: skill.context }) : null, skill.allowedTools ? _jsx(Badge, { variant: "outline", children: "Tools" }) : null, skill.resources.length > 0 ? (_jsxs("span", { className: "text-muted-foreground inline-flex items-center gap-1 text-xs", children: [_jsx(FolderOpen, { className: "size-3" }), skill.resources.length, " ", skill.resources.length === 1 ? 'resource' : 'resources'] })) : null] })] })] }));
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { SkillCard } from './skill-card.js';
|
|
3
|
+
declare const meta: Meta<typeof SkillCard>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const WithContext: Story;
|
|
8
|
+
export declare const WithAllBadges: Story;
|
|
9
|
+
export declare const ProjectSource: Story;
|
|
10
|
+
export declare const GlobalSource: Story;
|
|
11
|
+
//# sourceMappingURL=skill-card.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-card.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-card.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAUhC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0DnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { fn } from '@storybook/test';
|
|
2
|
+
import { SkillCard } from './skill-card.js';
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Features/SkillCard',
|
|
5
|
+
component: SkillCard,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: 'centered',
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
onSelect: fn(),
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
/* ---------------------------------------------------------------------------
|
|
16
|
+
* Data fixtures
|
|
17
|
+
* ------------------------------------------------------------------------- */
|
|
18
|
+
const baseSkill = {
|
|
19
|
+
name: 'shep-kit:implement',
|
|
20
|
+
displayName: 'implement',
|
|
21
|
+
description: 'Validate specs and autonomously execute implementation tasks with status tracking.',
|
|
22
|
+
category: 'Workflow',
|
|
23
|
+
source: 'project',
|
|
24
|
+
body: '## Usage\n\nRun /shep-kit:implement after planning is complete.',
|
|
25
|
+
resources: [],
|
|
26
|
+
};
|
|
27
|
+
const skillWithAllBadges = {
|
|
28
|
+
name: 'shep:ui-component',
|
|
29
|
+
displayName: 'ui-component',
|
|
30
|
+
description: 'Use when creating, modifying, or reviewing web UI components. Triggers include "new component", "add component", "create UI".',
|
|
31
|
+
context: 'fork',
|
|
32
|
+
allowedTools: 'Read, Write, Bash, Edit, Glob',
|
|
33
|
+
category: 'Code Generation',
|
|
34
|
+
source: 'project',
|
|
35
|
+
body: '## Overview\n\nScaffolds UI components following the four-tier hierarchy.',
|
|
36
|
+
resources: [
|
|
37
|
+
{ name: 'references', fileCount: 7 },
|
|
38
|
+
{ name: 'templates', fileCount: 3 },
|
|
39
|
+
{ name: 'rules', fileCount: 2 },
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
const globalSkill = {
|
|
43
|
+
name: 'vercel-react-best-practices',
|
|
44
|
+
displayName: 'vercel-react-best-practices',
|
|
45
|
+
description: 'React and Next.js performance optimization guidelines from Vercel Engineering.',
|
|
46
|
+
category: 'Reference',
|
|
47
|
+
source: 'global',
|
|
48
|
+
body: 'Performance patterns for React and Next.js applications.',
|
|
49
|
+
resources: [{ name: 'references', fileCount: 4 }],
|
|
50
|
+
};
|
|
51
|
+
const skillWithContext = {
|
|
52
|
+
name: 'architecture-reviewer',
|
|
53
|
+
displayName: 'architecture-reviewer',
|
|
54
|
+
description: 'Use when making architectural decisions, planning features, or reviewing PRs.',
|
|
55
|
+
context: 'fork',
|
|
56
|
+
category: 'Analysis',
|
|
57
|
+
source: 'project',
|
|
58
|
+
body: '',
|
|
59
|
+
resources: [],
|
|
60
|
+
};
|
|
61
|
+
/* ---------------------------------------------------------------------------
|
|
62
|
+
* Stories
|
|
63
|
+
* ------------------------------------------------------------------------- */
|
|
64
|
+
export const Default = {
|
|
65
|
+
args: {
|
|
66
|
+
skill: baseSkill,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
export const WithContext = {
|
|
70
|
+
args: {
|
|
71
|
+
skill: skillWithContext,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
export const WithAllBadges = {
|
|
75
|
+
args: {
|
|
76
|
+
skill: skillWithAllBadges,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
export const ProjectSource = {
|
|
80
|
+
args: {
|
|
81
|
+
skill: baseSkill,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
export const GlobalSource = {
|
|
85
|
+
args: {
|
|
86
|
+
skill: globalSkill,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkillData } from '../../../lib/skills.js';
|
|
2
|
+
export interface SkillDetailDrawerProps {
|
|
3
|
+
skill: SkillData | null;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=skill-detail-drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-detail-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,sBAAsB,2CA+E3E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, } from '../../ui/sheet.js';
|
|
4
|
+
import { Badge } from '../../ui/badge.js';
|
|
5
|
+
import { ScrollArea } from '../../ui/scroll-area.js';
|
|
6
|
+
import { Separator } from '../../ui/separator.js';
|
|
7
|
+
import { FolderOpen } from 'lucide-react';
|
|
8
|
+
export function SkillDetailDrawer({ skill, onClose }) {
|
|
9
|
+
return (_jsx(Sheet, { open: skill !== null, onOpenChange: (open) => {
|
|
10
|
+
if (!open)
|
|
11
|
+
onClose();
|
|
12
|
+
}, children: _jsx(SheetContent, { side: "right", className: "w-full sm:max-w-lg", children: skill ? (_jsxs(_Fragment, { children: [_jsxs(SheetHeader, { children: [_jsx(SheetTitle, { children: skill.displayName }), _jsx(SheetDescription, { children: skill.name })] }), _jsxs(ScrollArea, { className: "flex-1 px-4 pb-4", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: skill.description }), _jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-1.5", children: [_jsx(Badge, { variant: skill.source === 'project' ? 'secondary' : 'outline', children: skill.source === 'project' ? 'Project' : 'Global' }), _jsx(Badge, { variant: "outline", children: skill.category }), skill.context ? _jsx(Badge, { variant: "outline", children: skill.context }) : null] }), skill.allowedTools ? (_jsxs(_Fragment, { children: [_jsx(Separator, { className: "my-4" }), _jsxs("div", { children: [_jsx("h3", { className: "text-sm font-semibold", children: "Allowed Tools" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: skill.allowedTools })] })] })) : null, skill.resources.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(Separator, { className: "my-4" }), _jsxs("div", { children: [_jsx("h3", { className: "text-sm font-semibold", children: "Resources" }), _jsx("ul", { className: "mt-2 space-y-1.5", children: skill.resources.map((resource) => (_jsxs("li", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(FolderOpen, { className: "size-3.5 shrink-0" }), _jsxs("span", { children: [resource.name, "/ \u2014 ", resource.fileCount, ' ', resource.fileCount === 1 ? 'file' : 'files'] })] }, resource.name))) })] })] })) : null, skill.body ? (_jsxs(_Fragment, { children: [_jsx(Separator, { className: "my-4" }), _jsx("pre", { className: "text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap", children: skill.body })] })) : null] })] })) : null }) }));
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { SkillDetailDrawer } from './skill-detail-drawer.js';
|
|
3
|
+
declare const meta: Meta<typeof SkillDetailDrawer>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof SkillDetailDrawer>;
|
|
6
|
+
export declare const Open: Story;
|
|
7
|
+
export declare const WithResources: Story;
|
|
8
|
+
export declare const WithoutResources: Story;
|
|
9
|
+
export declare const MinimalSkill: Story;
|
|
10
|
+
//# sourceMappingURL=skill-detail-drawer.stories.d.ts.map
|
package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-detail-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAOxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAiEhD,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { SkillDetailDrawer } from './skill-detail-drawer.js';
|
|
4
|
+
import { Button } from '../../ui/button.js';
|
|
5
|
+
const meta = {
|
|
6
|
+
title: 'Features/SkillDetailDrawer',
|
|
7
|
+
component: SkillDetailDrawer,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'fullscreen',
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export default meta;
|
|
14
|
+
/* ---------------------------------------------------------------------------
|
|
15
|
+
* Data fixtures
|
|
16
|
+
* ------------------------------------------------------------------------- */
|
|
17
|
+
const skillWithResources = {
|
|
18
|
+
name: 'shep:ui-component',
|
|
19
|
+
displayName: 'ui-component',
|
|
20
|
+
description: 'Use when creating, modifying, or reviewing web UI components. Triggers include "new component", "add component", "create UI", "build a widget".',
|
|
21
|
+
context: 'fork',
|
|
22
|
+
allowedTools: 'Read, Write, Bash, Edit, Glob, Grep',
|
|
23
|
+
category: 'Code Generation',
|
|
24
|
+
source: 'project',
|
|
25
|
+
body: '## Overview\n\nScaffolds UI components following the four-tier hierarchy.\n\n## Usage\n\nRun /shep:ui-component when you need to create or modify components.',
|
|
26
|
+
resources: [
|
|
27
|
+
{ name: 'references', fileCount: 7 },
|
|
28
|
+
{ name: 'templates', fileCount: 3 },
|
|
29
|
+
{ name: 'rules', fileCount: 2 },
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
const skillWithoutResources = {
|
|
33
|
+
name: 'shep-kit:implement',
|
|
34
|
+
displayName: 'implement',
|
|
35
|
+
description: 'Validate specs and autonomously execute implementation tasks with status tracking. Use after /shep-kit:plan when ready to start implementation.',
|
|
36
|
+
category: 'Workflow',
|
|
37
|
+
source: 'project',
|
|
38
|
+
body: '## Usage\n\nRun /shep-kit:implement after planning is complete to start autonomous implementation.\n\n## What it does\n\n1. Pre-Implementation Validation Gate\n2. Autonomous Execution\n3. Status Tracking',
|
|
39
|
+
resources: [],
|
|
40
|
+
};
|
|
41
|
+
const minimalSkill = {
|
|
42
|
+
name: 'find-skills',
|
|
43
|
+
displayName: 'find-skills',
|
|
44
|
+
description: 'Helps users discover and install agent skills.',
|
|
45
|
+
category: 'Reference',
|
|
46
|
+
source: 'global',
|
|
47
|
+
body: '',
|
|
48
|
+
resources: [],
|
|
49
|
+
};
|
|
50
|
+
/* ---------------------------------------------------------------------------
|
|
51
|
+
* Trigger wrapper — starts closed, click to open
|
|
52
|
+
* ------------------------------------------------------------------------- */
|
|
53
|
+
function DrawerTrigger({ skill, label }) {
|
|
54
|
+
const [selected, setSelected] = useState(null);
|
|
55
|
+
return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setSelected(skill), children: label }), _jsx(SkillDetailDrawer, { skill: selected, onClose: () => setSelected(null) })] }));
|
|
56
|
+
}
|
|
57
|
+
/* ---------------------------------------------------------------------------
|
|
58
|
+
* Stories
|
|
59
|
+
* ------------------------------------------------------------------------- */
|
|
60
|
+
export const Open = {
|
|
61
|
+
render: () => _jsx(DrawerTrigger, { skill: skillWithResources, label: "Open Skill Detail" }),
|
|
62
|
+
};
|
|
63
|
+
export const WithResources = {
|
|
64
|
+
render: () => _jsx(DrawerTrigger, { skill: skillWithResources, label: "Open With Resources" }),
|
|
65
|
+
};
|
|
66
|
+
export const WithoutResources = {
|
|
67
|
+
render: () => _jsx(DrawerTrigger, { skill: skillWithoutResources, label: "Open Without Resources" }),
|
|
68
|
+
};
|
|
69
|
+
export const MinimalSkill = {
|
|
70
|
+
render: () => _jsx(DrawerTrigger, { skill: minimalSkill, label: "Open Minimal Skill" }),
|
|
71
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkillData } from '../../../lib/skills.js';
|
|
2
|
+
export interface SkillListProps {
|
|
3
|
+
skills: SkillData[];
|
|
4
|
+
onSkillSelect: (skill: SkillData) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function SkillList({ skills, onSkillSelect }: SkillListProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=skill-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-list.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC3C;AAYD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,cAAc,2CA2BlE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { SkillCard } from './skill-card.js';
|
|
3
|
+
const CATEGORY_ORDER = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];
|
|
4
|
+
function groupByCategory(skills) {
|
|
5
|
+
const groups = new Map();
|
|
6
|
+
for (const skill of skills) {
|
|
7
|
+
const group = groups.get(skill.category) ?? [];
|
|
8
|
+
group.push(skill);
|
|
9
|
+
groups.set(skill.category, group);
|
|
10
|
+
}
|
|
11
|
+
return groups;
|
|
12
|
+
}
|
|
13
|
+
export function SkillList({ skills, onSkillSelect }) {
|
|
14
|
+
const groups = groupByCategory(skills);
|
|
15
|
+
return (_jsx("div", { className: "space-y-8", children: CATEGORY_ORDER.map((category) => {
|
|
16
|
+
const categorySkills = groups.get(category);
|
|
17
|
+
if (!categorySkills || categorySkills.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
return (_jsxs("section", { children: [_jsxs("h2", { className: "mb-4 text-lg font-semibold", children: [category, ' ', _jsxs("span", { className: "text-muted-foreground text-sm font-normal", children: ["(", categorySkills.length, ")"] })] }), _jsx("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3", children: categorySkills.map((skill) => (_jsx(SkillCard, { skill: skill, onSelect: onSkillSelect }, skill.name))) })] }, category));
|
|
20
|
+
}) }));
|
|
21
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { SkillList } from './skill-list.js';
|
|
3
|
+
declare const meta: Meta<typeof SkillList>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const SingleCategory: Story;
|
|
8
|
+
export declare const Empty: Story;
|
|
9
|
+
//# sourceMappingURL=skill-list.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-list.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/skills/skill-list.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAUhC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAwGnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAI5B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC"}
|