@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.
Files changed (339) hide show
  1. package/dist/src/presentation/web/app/skills/page.d.ts +2 -0
  2. package/dist/src/presentation/web/app/skills/page.d.ts.map +1 -0
  3. package/dist/src/presentation/web/app/skills/page.js +11 -0
  4. package/dist/src/presentation/web/components/common/action-button/action-button.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/action-button/action-button.js +7 -1
  6. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts +1 -1
  7. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/common/action-button/action-button.stories.js +1 -1
  9. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  10. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +10 -1
  11. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +20 -0
  12. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -0
  13. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +68 -0
  14. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +21 -2
  16. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
  18. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +16 -3
  20. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +1 -1
  21. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
  23. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.js +14 -1
  25. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts +2 -0
  26. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.js +2 -0
  28. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.js +4 -1
  30. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts +1 -0
  31. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.js +1 -0
  33. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +14 -1
  35. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +1 -1
  36. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -1
  38. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.js +13 -0
  40. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts +2 -0
  41. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.js +2 -0
  43. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  44. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +7 -13
  46. package/dist/src/presentation/web/components/features/skills/category-filter.d.ts +8 -0
  47. package/dist/src/presentation/web/components/features/skills/category-filter.d.ts.map +1 -0
  48. package/dist/src/presentation/web/components/features/skills/category-filter.js +12 -0
  49. package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts +9 -0
  50. package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts.map +1 -0
  51. package/dist/src/presentation/web/components/features/skills/category-filter.stories.js +36 -0
  52. package/dist/src/presentation/web/components/features/skills/index.d.ts +6 -0
  53. package/dist/src/presentation/web/components/features/skills/index.d.ts.map +1 -0
  54. package/dist/src/presentation/web/components/features/skills/index.js +5 -0
  55. package/dist/src/presentation/web/components/features/skills/skill-card.d.ts +7 -0
  56. package/dist/src/presentation/web/components/features/skills/skill-card.d.ts.map +1 -0
  57. package/dist/src/presentation/web/components/features/skills/skill-card.js +12 -0
  58. package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts +11 -0
  59. package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts.map +1 -0
  60. package/dist/src/presentation/web/components/features/skills/skill-card.stories.js +88 -0
  61. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts +7 -0
  62. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts.map +1 -0
  63. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.js +13 -0
  64. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts +10 -0
  65. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts.map +1 -0
  66. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.js +71 -0
  67. package/dist/src/presentation/web/components/features/skills/skill-list.d.ts +7 -0
  68. package/dist/src/presentation/web/components/features/skills/skill-list.d.ts.map +1 -0
  69. package/dist/src/presentation/web/components/features/skills/skill-list.js +21 -0
  70. package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts +9 -0
  71. package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts.map +1 -0
  72. package/dist/src/presentation/web/components/features/skills/skill-list.stories.js +124 -0
  73. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +6 -0
  74. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -0
  75. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +52 -0
  76. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +16 -0
  77. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +186 -0
  79. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +3 -2
  81. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  82. package/dist/src/presentation/web/hooks/use-notifications.js +18 -18
  83. package/dist/src/presentation/web/hooks/use-sound-action.d.ts +100 -0
  84. package/dist/src/presentation/web/hooks/use-sound-action.d.ts.map +1 -0
  85. package/dist/src/presentation/web/hooks/use-sound-action.js +42 -0
  86. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts +6 -0
  87. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts.map +1 -0
  88. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +61 -0
  89. package/dist/src/presentation/web/lib/feature-flags.d.ts +10 -0
  90. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -0
  91. package/dist/src/presentation/web/lib/feature-flags.js +12 -0
  92. package/dist/src/presentation/web/lib/skills.d.ts +30 -0
  93. package/dist/src/presentation/web/lib/skills.d.ts.map +1 -0
  94. package/dist/src/presentation/web/lib/skills.js +137 -0
  95. package/dist/tsconfig.build.tsbuildinfo +1 -1
  96. package/package.json +1 -1
  97. package/web/.next/BUILD_ID +1 -1
  98. package/web/.next/app-path-routes-manifest.json +1 -0
  99. package/web/.next/build-manifest.json +4 -4
  100. package/web/.next/cache/.previewinfo +1 -1
  101. package/web/.next/cache/.rscinfo +1 -1
  102. package/web/.next/cache/.tsbuildinfo +1 -1
  103. package/web/.next/cache/config.json +3 -3
  104. package/web/.next/fallback-build-manifest.json +2 -2
  105. package/web/.next/prerender-manifest.json +3 -3
  106. package/web/.next/required-server-files.js +1 -1
  107. package/web/.next/required-server-files.json +1 -1
  108. package/web/.next/routes-manifest.json +6 -0
  109. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  110. package/web/.next/server/app/_global-error.html +2 -2
  111. package/web/.next/server/app/_global-error.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  116. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  117. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  118. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  119. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  120. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  122. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  123. package/web/.next/server/app/page/build-manifest.json +2 -2
  124. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  125. package/web/.next/server/app/page.js +1 -1
  126. package/web/.next/server/app/page.js.nft.json +1 -1
  127. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  129. package/web/.next/server/app/skills/page/build-manifest.json +17 -0
  130. package/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
  131. package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  132. package/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
  133. package/web/.next/server/app/skills/page.js +16 -0
  134. package/web/.next/server/app/skills/page.js.map +5 -0
  135. package/web/.next/server/app/skills/page.js.nft.json +1 -0
  136. package/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
  137. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  138. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  139. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  140. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  142. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  143. package/web/.next/server/app/version/page.js.nft.json +1 -1
  144. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  145. package/web/.next/server/app-paths-manifest.json +1 -0
  146. package/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -0
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js → [root-of-the-server]__b6839c3f._.js} +3 -3
  160. package/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js.map → [root-of-the-server]__b6839c3f._.js.map} +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -0
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +1 -0
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js.map +1 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  168. package/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
  169. package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
  171. package/web/.next/server/chunks/ssr/_44cce4e0._.js.map +1 -0
  172. package/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
  173. package/web/.next/server/chunks/ssr/_9915d2a7._.js.map +1 -0
  174. package/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
  175. package/web/.next/server/chunks/ssr/{_e242b954._.js.map → _a64b7b24._.js.map} +1 -1
  176. package/web/.next/server/chunks/ssr/_d3711354._.js +6 -0
  177. package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -0
  178. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
  179. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js.map +1 -0
  180. 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
  181. package/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
  183. package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js.map +1 -0
  184. package/web/.next/server/middleware-build-manifest.js +2 -2
  185. package/web/.next/server/pages/500.html +2 -2
  186. package/web/.next/server/server-reference-manifest.js +1 -1
  187. package/web/.next/server/server-reference-manifest.json +22 -15
  188. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
  190. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +4 -4
  191. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  192. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +6 -0
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  203. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  205. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +2 -2
  209. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  210. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  213. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  214. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +17 -0
  215. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
  216. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  217. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
  218. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +16 -0
  219. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.map +5 -0
  220. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -0
  221. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
  222. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +2 -2
  223. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  224. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  225. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  226. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +2 -2
  227. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  228. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  229. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  230. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
  231. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
  232. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  233. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
  234. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  235. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  236. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
  237. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  238. 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
  239. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
  240. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
  241. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
  242. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  243. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
  244. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
  245. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
  246. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
  247. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +6 -0
  248. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
  249. 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
  250. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
  251. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +2 -2
  252. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  253. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  254. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -15
  255. package/web/.next/standalone/src/presentation/web/app/skills/page.tsx +12 -0
  256. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.stories.tsx +1 -1
  257. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx +9 -1
  258. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +82 -0
  259. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +16 -2
  260. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +27 -3
  261. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +14 -2
  262. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -1
  263. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +17 -4
  264. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.tsx +2 -0
  265. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx +14 -1
  266. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.tsx +1 -0
  267. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx +6 -1
  268. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -1
  269. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -1
  270. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx +2 -0
  271. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.tsx +14 -0
  272. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +2 -2
  273. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +7 -12
  274. package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.stories.tsx +57 -0
  275. package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.tsx +36 -0
  276. package/web/.next/standalone/src/presentation/web/components/features/skills/index.ts +5 -0
  277. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.stories.tsx +105 -0
  278. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.tsx +48 -0
  279. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.stories.tsx +96 -0
  280. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.tsx +100 -0
  281. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.stories.tsx +139 -0
  282. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.tsx +48 -0
  283. package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.stories.tsx +199 -0
  284. package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.tsx +112 -0
  285. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +10 -1
  286. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +20 -19
  287. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.stories.tsx +107 -0
  288. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.ts +53 -0
  289. package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +14 -0
  290. package/web/.next/standalone/src/presentation/web/lib/skills.ts +188 -0
  291. package/web/.next/standalone/src/presentation/web/package.json +2 -0
  292. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  293. package/web/.next/static/chunks/09d898be63c54f20.js +1 -0
  294. package/web/.next/static/chunks/13664c029245afc8.js +1 -0
  295. package/web/.next/static/chunks/25f42652257ff43d.js +1 -0
  296. package/web/.next/static/chunks/2934854f0378f815.js +1 -0
  297. package/web/.next/static/chunks/2960a70537e4fd12.js +10 -0
  298. package/web/.next/static/chunks/45f510f84c7c417d.css +2 -0
  299. package/web/.next/static/chunks/79718b1f5713fdc0.js +1 -0
  300. package/web/.next/static/chunks/acdb8af5a21f1ae9.js +1 -0
  301. package/web/.next/static/chunks/{3d4dcf0be654a331.js → cb1b27e4a21415d3.js} +2 -2
  302. package/web/.next/static/chunks/d4379644a6145352.js +1 -0
  303. package/web/.next/static/chunks/{turbopack-6a11f2f1634ff6e0.js → turbopack-eb24b869babb34b4.js} +2 -2
  304. package/web/.next/trace +1 -1
  305. package/web/.next/trace-build +1 -1
  306. package/web/.next/types/link.d.ts +1 -0
  307. package/web/.next/types/routes.d.ts +2 -1
  308. package/web/.next/types/validator.ts +9 -0
  309. package/web/package.json +2 -0
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
  315. package/web/.next/server/chunks/ssr/_027596cf._.js.map +0 -1
  316. package/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
  317. package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js.map +0 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
  319. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +0 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js.map +0 -1
  322. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
  323. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
  324. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
  325. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
  326. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
  327. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
  328. package/web/.next/static/chunks/0cd7c513169faee3.js +0 -1
  329. package/web/.next/static/chunks/4f7d89c9e09aed99.js +0 -10
  330. package/web/.next/static/chunks/67459433cc866344.js +0 -1
  331. package/web/.next/static/chunks/6d33cb9af6245c98.js +0 -1
  332. package/web/.next/static/chunks/a9c2b889c8749a94.js +0 -1
  333. package/web/.next/static/chunks/b511c65023ec1889.css +0 -2
  334. package/web/.next/static/chunks/cda11a2491d519fc.js +0 -1
  335. package/web/.next/static/chunks/d85b95e893db08bc.js +0 -1
  336. /package/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js.map → [root-of-the-server]__e926de65._.js.map} +0 -0
  337. /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → _DBWexyU1QkK02q15qod2}/_buildManifest.js +0 -0
  338. /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → _DBWexyU1QkK02q15qod2}/_clientMiddlewareManifest.json +0 -0
  339. /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,oDAAoD;AACpD,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"}
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":"AAMA,wBAAgB,WAAW,4CAyB1B"}
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
@@ -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
  };
@@ -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 { useSound } from '../../../hooks/use-sound.js';
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 = useSound('caution', { volume: 0.5 });
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,CAgtBpB"}
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"}
@@ -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 { useSound } from '../../../hooks/use-sound.js';
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 = useSound('transition_down', { volume: 0.5 });
34
- const createSound = useSound('transition_up', { volume: 0.5 });
35
- const clickSound = useSound('tap_01', { volume: 0.3 });
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((prev) => {
195
- if (prev)
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
- }, [closeSound]);
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
@@ -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"}