@shepai/cli 1.59.0 → 1.60.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 (267) 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/features/skills/category-filter.d.ts +8 -0
  5. package/dist/src/presentation/web/components/features/skills/category-filter.d.ts.map +1 -0
  6. package/dist/src/presentation/web/components/features/skills/category-filter.js +12 -0
  7. package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts +9 -0
  8. package/dist/src/presentation/web/components/features/skills/category-filter.stories.d.ts.map +1 -0
  9. package/dist/src/presentation/web/components/features/skills/category-filter.stories.js +36 -0
  10. package/dist/src/presentation/web/components/features/skills/index.d.ts +6 -0
  11. package/dist/src/presentation/web/components/features/skills/index.d.ts.map +1 -0
  12. package/dist/src/presentation/web/components/features/skills/index.js +5 -0
  13. package/dist/src/presentation/web/components/features/skills/skill-card.d.ts +7 -0
  14. package/dist/src/presentation/web/components/features/skills/skill-card.d.ts.map +1 -0
  15. package/dist/src/presentation/web/components/features/skills/skill-card.js +12 -0
  16. package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts +11 -0
  17. package/dist/src/presentation/web/components/features/skills/skill-card.stories.d.ts.map +1 -0
  18. package/dist/src/presentation/web/components/features/skills/skill-card.stories.js +88 -0
  19. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts +7 -0
  20. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts.map +1 -0
  21. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.js +13 -0
  22. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts +10 -0
  23. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.d.ts.map +1 -0
  24. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.stories.js +71 -0
  25. package/dist/src/presentation/web/components/features/skills/skill-list.d.ts +7 -0
  26. package/dist/src/presentation/web/components/features/skills/skill-list.d.ts.map +1 -0
  27. package/dist/src/presentation/web/components/features/skills/skill-list.js +21 -0
  28. package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts +9 -0
  29. package/dist/src/presentation/web/components/features/skills/skill-list.stories.d.ts.map +1 -0
  30. package/dist/src/presentation/web/components/features/skills/skill-list.stories.js +124 -0
  31. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +6 -0
  32. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -0
  33. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +52 -0
  34. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +16 -0
  35. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -0
  36. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +186 -0
  37. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +3 -2
  39. package/dist/src/presentation/web/lib/feature-flags.d.ts +10 -0
  40. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -0
  41. package/dist/src/presentation/web/lib/feature-flags.js +12 -0
  42. package/dist/src/presentation/web/lib/skills.d.ts +30 -0
  43. package/dist/src/presentation/web/lib/skills.d.ts.map +1 -0
  44. package/dist/src/presentation/web/lib/skills.js +137 -0
  45. package/dist/tsconfig.build.tsbuildinfo +1 -1
  46. package/package.json +1 -1
  47. package/web/.next/BUILD_ID +1 -1
  48. package/web/.next/app-path-routes-manifest.json +1 -0
  49. package/web/.next/build-manifest.json +4 -4
  50. package/web/.next/cache/.previewinfo +1 -1
  51. package/web/.next/cache/.rscinfo +1 -1
  52. package/web/.next/cache/.tsbuildinfo +1 -1
  53. package/web/.next/cache/config.json +3 -3
  54. package/web/.next/fallback-build-manifest.json +2 -2
  55. package/web/.next/prerender-manifest.json +3 -3
  56. package/web/.next/required-server-files.js +1 -1
  57. package/web/.next/required-server-files.json +1 -1
  58. package/web/.next/routes-manifest.json +6 -0
  59. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  60. package/web/.next/server/app/_global-error.html +2 -2
  61. package/web/.next/server/app/_global-error.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  63. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  65. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  67. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  68. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  69. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  70. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  72. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  73. package/web/.next/server/app/page/build-manifest.json +2 -2
  74. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  75. package/web/.next/server/app/page.js +1 -1
  76. package/web/.next/server/app/page.js.nft.json +1 -1
  77. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  79. package/web/.next/server/app/skills/page/build-manifest.json +17 -0
  80. package/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
  81. package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  82. package/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
  83. package/web/.next/server/app/skills/page.js +16 -0
  84. package/web/.next/server/app/skills/page.js.map +5 -0
  85. package/web/.next/server/app/skills/page.js.nft.json +1 -0
  86. package/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
  87. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  88. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  89. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  90. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  92. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  93. package/web/.next/server/app/version/page.js.nft.json +1 -1
  94. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app-paths-manifest.json +1 -0
  96. package/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  109. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js → server/chunks/ssr/[root-of-the-server]__b6839c3f._.js} +3 -3
  110. package/web/.next/server/chunks/ssr/{[root-of-the-server]__86c7bba5._.js.map → [root-of-the-server]__b6839c3f._.js.map} +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -0
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +1 -0
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js.map +1 -0
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  118. package/web/.next/server/chunks/ssr/_34627374._.js +6 -0
  119. package/web/.next/server/chunks/ssr/_34627374._.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
  121. package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -0
  122. package/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
  123. package/web/.next/server/chunks/ssr/_44cce4e0._.js.map +1 -0
  124. package/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
  125. package/web/.next/server/chunks/ssr/_9915d2a7._.js.map +1 -0
  126. package/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
  127. package/web/.next/server/chunks/ssr/{_e242b954._.js.map → _a64b7b24._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
  129. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js.map +1 -0
  130. 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
  131. package/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js.map +1 -0
  132. package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
  133. package/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js.map +1 -0
  134. package/web/.next/server/middleware-build-manifest.js +2 -2
  135. package/web/.next/server/pages/500.html +2 -2
  136. package/web/.next/server/server-reference-manifest.js +1 -1
  137. package/web/.next/server/server-reference-manifest.json +22 -15
  138. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  139. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
  140. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +4 -4
  141. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  142. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  143. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +6 -0
  144. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +2 -2
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/app-paths-manifest.json +3 -0
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +17 -0
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/next-font-manifest.json +6 -0
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -0
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +20 -0
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +16 -0
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.map +5 -0
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -0
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +2 -0
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +2 -2
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +2 -2
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js → [root-of-the-server]__e926de65._.js} +2 -2
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +3 -0
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +3 -0
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  188. package/web/.next/{server/chunks/ssr/[root-of-the-server]__86c7bba5._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js} +3 -3
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +4 -0
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +3 -0
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +3 -0
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_34627374._.js +6 -0
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +6 -0
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_44cce4e0._.js +4 -0
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9915d2a7._.js +3 -0
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a64b7b24._.js +3 -0
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e7a4b0e4._.js +3 -0
  199. 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
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_0286756b._.js +3 -0
  201. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +2 -2
  202. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  203. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -15
  205. package/web/.next/standalone/src/presentation/web/app/skills/page.tsx +12 -0
  206. package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.stories.tsx +57 -0
  207. package/web/.next/standalone/src/presentation/web/components/features/skills/category-filter.tsx +36 -0
  208. package/web/.next/standalone/src/presentation/web/components/features/skills/index.ts +5 -0
  209. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.stories.tsx +105 -0
  210. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-card.tsx +48 -0
  211. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.stories.tsx +96 -0
  212. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.tsx +100 -0
  213. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.stories.tsx +139 -0
  214. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-list.tsx +48 -0
  215. package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.stories.tsx +199 -0
  216. package/web/.next/standalone/src/presentation/web/components/features/skills/skills-page-client.tsx +112 -0
  217. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +10 -1
  218. package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +14 -0
  219. package/web/.next/standalone/src/presentation/web/lib/skills.ts +188 -0
  220. package/web/.next/standalone/src/presentation/web/package.json +2 -0
  221. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  222. package/web/.next/static/chunks/09d898be63c54f20.js +1 -0
  223. package/web/.next/static/chunks/{4f7d89c9e09aed99.js → 1fe24572a810eafa.js} +5 -5
  224. package/web/.next/static/chunks/25f42652257ff43d.js +1 -0
  225. package/web/.next/static/chunks/2934854f0378f815.js +1 -0
  226. package/web/.next/static/chunks/7d3c5ae8f47e74cd.js +1 -0
  227. package/web/.next/static/chunks/8b2879f911a05b55.css +2 -0
  228. package/web/.next/static/chunks/acdb8af5a21f1ae9.js +1 -0
  229. package/web/.next/static/chunks/bac5122e95f5c7eb.js +1 -0
  230. package/web/.next/static/chunks/{3d4dcf0be654a331.js → cb1b27e4a21415d3.js} +2 -2
  231. package/web/.next/static/chunks/d4379644a6145352.js +1 -0
  232. package/web/.next/static/chunks/{turbopack-6a11f2f1634ff6e0.js → turbopack-eb24b869babb34b4.js} +2 -2
  233. package/web/.next/trace +1 -1
  234. package/web/.next/trace-build +1 -1
  235. package/web/.next/types/link.d.ts +1 -0
  236. package/web/.next/types/routes.d.ts +2 -1
  237. package/web/.next/types/validator.ts +9 -0
  238. package/web/package.json +2 -0
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js.map +0 -1
  241. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +0 -1
  243. package/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
  244. package/web/.next/server/chunks/ssr/_027596cf._.js.map +0 -1
  245. package/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
  246. package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
  248. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
  250. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js.map +0 -1
  251. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js +0 -3
  252. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js +0 -3
  253. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_027596cf._.js +0 -6
  254. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e242b954._.js +0 -3
  255. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
  256. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +0 -3
  257. package/web/.next/static/chunks/0cd7c513169faee3.js +0 -1
  258. package/web/.next/static/chunks/67459433cc866344.js +0 -1
  259. package/web/.next/static/chunks/6d33cb9af6245c98.js +0 -1
  260. package/web/.next/static/chunks/a9c2b889c8749a94.js +0 -1
  261. package/web/.next/static/chunks/b511c65023ec1889.css +0 -2
  262. package/web/.next/static/chunks/cda11a2491d519fc.js +0 -1
  263. package/web/.next/static/chunks/d85b95e893db08bc.js +0 -1
  264. /package/web/.next/server/chunks/{[root-of-the-server]__bb619083._.js.map → [root-of-the-server]__e926de65._.js.map} +0 -0
  265. /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → enyZhg62FqP6oInxg1T3h}/_buildManifest.js +0 -0
  266. /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → enyZhg62FqP6oInxg1T3h}/_clientMiddlewareManifest.json +0 -0
  267. /package/web/.next/static/{xjc1tfvwTdK1Xv5Id2oaO → enyZhg62FqP6oInxg1T3h}/_ssgManifest.js +0 -0
@@ -0,0 +1,100 @@
1
+ 'use client';
2
+
3
+ import {
4
+ Sheet,
5
+ SheetContent,
6
+ SheetHeader,
7
+ SheetTitle,
8
+ SheetDescription,
9
+ } from '@/components/ui/sheet';
10
+ import { Badge } from '@/components/ui/badge';
11
+ import { ScrollArea } from '@/components/ui/scroll-area';
12
+ import { Separator } from '@/components/ui/separator';
13
+ import { FolderOpen } from 'lucide-react';
14
+ import type { SkillData } from '@/lib/skills';
15
+
16
+ export interface SkillDetailDrawerProps {
17
+ skill: SkillData | null;
18
+ onClose: () => void;
19
+ }
20
+
21
+ export function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {
22
+ return (
23
+ <Sheet
24
+ open={skill !== null}
25
+ onOpenChange={(open) => {
26
+ if (!open) onClose();
27
+ }}
28
+ >
29
+ <SheetContent side="right" className="w-full sm:max-w-lg">
30
+ {skill ? (
31
+ <>
32
+ <SheetHeader>
33
+ <SheetTitle>{skill.displayName}</SheetTitle>
34
+ <SheetDescription>{skill.name}</SheetDescription>
35
+ </SheetHeader>
36
+
37
+ <ScrollArea className="flex-1 px-4 pb-4">
38
+ {/* Description */}
39
+ <p className="text-muted-foreground text-sm">{skill.description}</p>
40
+
41
+ {/* Badges */}
42
+ <div className="mt-4 flex flex-wrap items-center gap-1.5">
43
+ <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>
44
+ {skill.source === 'project' ? 'Project' : 'Global'}
45
+ </Badge>
46
+ <Badge variant="outline">{skill.category}</Badge>
47
+ {skill.context ? <Badge variant="outline">{skill.context}</Badge> : null}
48
+ </div>
49
+
50
+ {/* Allowed Tools */}
51
+ {skill.allowedTools ? (
52
+ <>
53
+ <Separator className="my-4" />
54
+ <div>
55
+ <h3 className="text-sm font-semibold">Allowed Tools</h3>
56
+ <p className="text-muted-foreground mt-1 text-sm">{skill.allowedTools}</p>
57
+ </div>
58
+ </>
59
+ ) : null}
60
+
61
+ {/* Resources */}
62
+ {skill.resources.length > 0 ? (
63
+ <>
64
+ <Separator className="my-4" />
65
+ <div>
66
+ <h3 className="text-sm font-semibold">Resources</h3>
67
+ <ul className="mt-2 space-y-1.5">
68
+ {skill.resources.map((resource) => (
69
+ <li
70
+ key={resource.name}
71
+ className="text-muted-foreground flex items-center gap-2 text-sm"
72
+ >
73
+ <FolderOpen className="size-3.5 shrink-0" />
74
+ <span>
75
+ {resource.name}/ — {resource.fileCount}{' '}
76
+ {resource.fileCount === 1 ? 'file' : 'files'}
77
+ </span>
78
+ </li>
79
+ ))}
80
+ </ul>
81
+ </div>
82
+ </>
83
+ ) : null}
84
+
85
+ {/* Body */}
86
+ {skill.body ? (
87
+ <>
88
+ <Separator className="my-4" />
89
+ <pre className="text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap">
90
+ {skill.body}
91
+ </pre>
92
+ </>
93
+ ) : null}
94
+ </ScrollArea>
95
+ </>
96
+ ) : null}
97
+ </SheetContent>
98
+ </Sheet>
99
+ );
100
+ }
@@ -0,0 +1,139 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
3
+ import { SkillList } from './skill-list';
4
+ import type { SkillData } from '@/lib/skills';
5
+
6
+ const meta: Meta<typeof SkillList> = {
7
+ title: 'Features/SkillList',
8
+ component: SkillList,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ layout: 'padded',
12
+ },
13
+ args: {
14
+ onSkillSelect: fn(),
15
+ },
16
+ };
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ /* ---------------------------------------------------------------------------
22
+ * Data fixtures
23
+ * ------------------------------------------------------------------------- */
24
+
25
+ const workflowSkills: SkillData[] = [
26
+ {
27
+ name: 'shep-kit:implement',
28
+ displayName: 'implement',
29
+ description: 'Validate specs and autonomously execute implementation tasks.',
30
+ category: 'Workflow',
31
+ source: 'project',
32
+ body: '',
33
+ resources: [],
34
+ },
35
+ {
36
+ name: 'shep-kit:plan',
37
+ displayName: 'plan',
38
+ description: 'Create implementation plan and task breakdown.',
39
+ category: 'Workflow',
40
+ source: 'project',
41
+ body: '',
42
+ resources: [],
43
+ },
44
+ {
45
+ name: 'shep-kit:research',
46
+ displayName: 'research',
47
+ description: 'Analyze technical approach, evaluate libraries, document decisions.',
48
+ category: 'Workflow',
49
+ source: 'project',
50
+ body: '',
51
+ resources: [],
52
+ },
53
+ ];
54
+
55
+ const codeGenSkills: SkillData[] = [
56
+ {
57
+ name: 'shep:ui-component',
58
+ displayName: 'ui-component',
59
+ description: 'Use when creating, modifying, or reviewing web UI components.',
60
+ context: 'fork',
61
+ allowedTools: 'Read, Write, Bash, Edit, Glob',
62
+ category: 'Code Generation',
63
+ source: 'project',
64
+ body: '',
65
+ resources: [{ name: 'references', fileCount: 7 }],
66
+ },
67
+ ];
68
+
69
+ const analysisSkills: SkillData[] = [
70
+ {
71
+ name: 'architecture-reviewer',
72
+ displayName: 'architecture-reviewer',
73
+ description: 'Use when making architectural decisions or reviewing PRs.',
74
+ context: 'fork',
75
+ category: 'Analysis',
76
+ source: 'project',
77
+ body: '',
78
+ resources: [],
79
+ },
80
+ {
81
+ name: 'cross-validate-artifacts',
82
+ displayName: 'cross-validate-artifacts',
83
+ description: 'Cross-validate documentation and artifacts for consistency.',
84
+ category: 'Analysis',
85
+ source: 'project',
86
+ body: '',
87
+ resources: [],
88
+ },
89
+ ];
90
+
91
+ const referenceSkills: SkillData[] = [
92
+ {
93
+ name: 'shadcn-ui',
94
+ displayName: 'shadcn-ui',
95
+ description: 'Complete shadcn/ui component library patterns.',
96
+ category: 'Reference',
97
+ source: 'project',
98
+ body: '',
99
+ resources: [{ name: 'references', fileCount: 3 }],
100
+ },
101
+ {
102
+ name: 'vercel-react-best-practices',
103
+ displayName: 'vercel-react-best-practices',
104
+ description: 'React and Next.js performance optimization guidelines.',
105
+ category: 'Reference',
106
+ source: 'global',
107
+ body: '',
108
+ resources: [{ name: 'references', fileCount: 4 }],
109
+ },
110
+ ];
111
+
112
+ const allSkills: SkillData[] = [
113
+ ...workflowSkills,
114
+ ...codeGenSkills,
115
+ ...analysisSkills,
116
+ ...referenceSkills,
117
+ ];
118
+
119
+ /* ---------------------------------------------------------------------------
120
+ * Stories
121
+ * ------------------------------------------------------------------------- */
122
+
123
+ export const Default: Story = {
124
+ args: {
125
+ skills: allSkills,
126
+ },
127
+ };
128
+
129
+ export const SingleCategory: Story = {
130
+ args: {
131
+ skills: workflowSkills,
132
+ },
133
+ };
134
+
135
+ export const Empty: Story = {
136
+ args: {
137
+ skills: [],
138
+ },
139
+ };
@@ -0,0 +1,48 @@
1
+ import { SkillCard } from './skill-card';
2
+ import type { SkillCategory, SkillData } from '@/lib/skills';
3
+
4
+ const CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];
5
+
6
+ export interface SkillListProps {
7
+ skills: SkillData[];
8
+ onSkillSelect: (skill: SkillData) => void;
9
+ }
10
+
11
+ function groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {
12
+ const groups = new Map<SkillCategory, SkillData[]>();
13
+ for (const skill of skills) {
14
+ const group = groups.get(skill.category) ?? [];
15
+ group.push(skill);
16
+ groups.set(skill.category, group);
17
+ }
18
+ return groups;
19
+ }
20
+
21
+ export function SkillList({ skills, onSkillSelect }: SkillListProps) {
22
+ const groups = groupByCategory(skills);
23
+
24
+ return (
25
+ <div className="space-y-8">
26
+ {CATEGORY_ORDER.map((category) => {
27
+ const categorySkills = groups.get(category);
28
+ if (!categorySkills || categorySkills.length === 0) return null;
29
+
30
+ return (
31
+ <section key={category}>
32
+ <h2 className="mb-4 text-lg font-semibold">
33
+ {category}{' '}
34
+ <span className="text-muted-foreground text-sm font-normal">
35
+ ({categorySkills.length})
36
+ </span>
37
+ </h2>
38
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
39
+ {categorySkills.map((skill) => (
40
+ <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />
41
+ ))}
42
+ </div>
43
+ </section>
44
+ );
45
+ })}
46
+ </div>
47
+ );
48
+ }
@@ -0,0 +1,199 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SkillsPageClient } from './skills-page-client';
3
+ import type { SkillData } from '@/lib/skills';
4
+
5
+ const meta = {
6
+ title: 'Features/SkillsPageClient',
7
+ component: SkillsPageClient,
8
+ tags: ['autodocs'],
9
+ parameters: {
10
+ layout: 'fullscreen',
11
+ },
12
+ } satisfies Meta<typeof SkillsPageClient>;
13
+
14
+ export default meta;
15
+ type Story = StoryObj<typeof meta>;
16
+
17
+ /* ---------------------------------------------------------------------------
18
+ * Data fixtures
19
+ * ------------------------------------------------------------------------- */
20
+
21
+ const sampleSkills: SkillData[] = [
22
+ {
23
+ name: 'shep-kit:implement',
24
+ displayName: 'implement',
25
+ description:
26
+ 'Validate specs and autonomously execute implementation tasks with status tracking.',
27
+ category: 'Workflow',
28
+ source: 'project',
29
+ body: '## Usage\n\nRun /shep-kit:implement after planning is complete.',
30
+ resources: [],
31
+ },
32
+ {
33
+ name: 'shep-kit:plan',
34
+ displayName: 'plan',
35
+ description: 'Create implementation plan and task breakdown.',
36
+ category: 'Workflow',
37
+ source: 'project',
38
+ body: '',
39
+ resources: [],
40
+ },
41
+ {
42
+ name: 'shep-kit:research',
43
+ displayName: 'research',
44
+ description: 'Analyze technical approach, evaluate libraries, document decisions.',
45
+ category: 'Workflow',
46
+ source: 'project',
47
+ body: '',
48
+ resources: [],
49
+ },
50
+ {
51
+ name: 'shep:ui-component',
52
+ displayName: 'ui-component',
53
+ description: 'Use when creating, modifying, or reviewing web UI components.',
54
+ context: 'fork',
55
+ allowedTools: 'Read, Write, Bash, Edit, Glob',
56
+ category: 'Code Generation',
57
+ source: 'project',
58
+ body: '',
59
+ resources: [
60
+ { name: 'references', fileCount: 7 },
61
+ { name: 'templates', fileCount: 3 },
62
+ ],
63
+ },
64
+ {
65
+ name: 'architecture-reviewer',
66
+ displayName: 'architecture-reviewer',
67
+ description: 'Use when making architectural decisions, planning features, or reviewing PRs.',
68
+ context: 'fork',
69
+ category: 'Analysis',
70
+ source: 'project',
71
+ body: '',
72
+ resources: [],
73
+ },
74
+ {
75
+ name: 'cross-validate-artifacts',
76
+ displayName: 'cross-validate-artifacts',
77
+ description: 'Cross-validate documentation and artifacts for consistency.',
78
+ category: 'Analysis',
79
+ source: 'project',
80
+ body: '',
81
+ resources: [],
82
+ },
83
+ {
84
+ name: 'shadcn-ui',
85
+ displayName: 'shadcn-ui',
86
+ description: 'Complete shadcn/ui component library patterns and implementation.',
87
+ category: 'Reference',
88
+ source: 'project',
89
+ body: '',
90
+ resources: [{ name: 'references', fileCount: 3 }],
91
+ },
92
+ {
93
+ name: 'vercel-react-best-practices',
94
+ displayName: 'vercel-react-best-practices',
95
+ description: 'React and Next.js performance optimization guidelines from Vercel Engineering.',
96
+ category: 'Reference',
97
+ source: 'global',
98
+ body: '',
99
+ resources: [{ name: 'references', fileCount: 4 }],
100
+ },
101
+ ];
102
+
103
+ const manySkills: SkillData[] = [
104
+ ...sampleSkills,
105
+ {
106
+ name: 'shep-kit:commit-pr',
107
+ displayName: 'commit-pr',
108
+ description: 'Use when ready to commit, push, and create a PR with CI verification.',
109
+ category: 'Workflow',
110
+ source: 'project',
111
+ body: '',
112
+ resources: [],
113
+ },
114
+ {
115
+ name: 'shep-kit:new-feature',
116
+ displayName: 'new-feature',
117
+ description: 'Use when starting any new feature, functionality, or enhancement.',
118
+ category: 'Workflow',
119
+ source: 'project',
120
+ body: '',
121
+ resources: [],
122
+ },
123
+ {
124
+ name: 'shep-kit:new-feature-fast',
125
+ displayName: 'new-feature-fast',
126
+ description: 'Fast-track feature creation that collapses new-feature, research, and planning.',
127
+ category: 'Workflow',
128
+ source: 'project',
129
+ body: '',
130
+ resources: [],
131
+ },
132
+ {
133
+ name: 'shep-kit:merged',
134
+ displayName: 'merged',
135
+ description: 'Use after a PR has been merged to clean up branches.',
136
+ category: 'Workflow',
137
+ source: 'project',
138
+ body: '',
139
+ resources: [],
140
+ },
141
+ {
142
+ name: 'mermaid-diagrams',
143
+ displayName: 'mermaid-diagrams',
144
+ description: 'Comprehensive guide for creating software diagrams using Mermaid syntax.',
145
+ category: 'Reference',
146
+ source: 'project',
147
+ body: '',
148
+ resources: [{ name: 'references', fileCount: 2 }],
149
+ },
150
+ {
151
+ name: 'react-flow',
152
+ displayName: 'react-flow',
153
+ description: 'React Flow for workflow visualization with custom nodes and edges.',
154
+ category: 'Reference',
155
+ source: 'project',
156
+ body: '',
157
+ resources: [],
158
+ },
159
+ {
160
+ name: 'tsp-model',
161
+ displayName: 'tsp-model',
162
+ description: 'Use when creating, modifying, or documenting TypeSpec domain models.',
163
+ category: 'Reference',
164
+ source: 'project',
165
+ body: '',
166
+ resources: [{ name: 'references', fileCount: 5 }],
167
+ },
168
+ {
169
+ name: 'find-skills',
170
+ displayName: 'find-skills',
171
+ description: 'Helps users discover and install agent skills.',
172
+ category: 'Reference',
173
+ source: 'global',
174
+ body: '',
175
+ resources: [],
176
+ },
177
+ ];
178
+
179
+ /* ---------------------------------------------------------------------------
180
+ * Stories
181
+ * ------------------------------------------------------------------------- */
182
+
183
+ export const Default: Story = {
184
+ args: {
185
+ skills: sampleSkills,
186
+ },
187
+ };
188
+
189
+ export const Empty: Story = {
190
+ args: {
191
+ skills: [],
192
+ },
193
+ };
194
+
195
+ export const ManySkills: Story = {
196
+ args: {
197
+ skills: manySkills,
198
+ },
199
+ };
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+
3
+ import { useState, useMemo } from 'react';
4
+ import { Search, Puzzle } from 'lucide-react';
5
+ import { Input } from '@/components/ui/input';
6
+ import { Button } from '@/components/ui/button';
7
+ import { PageHeader } from '@/components/common/page-header';
8
+ import { EmptyState } from '@/components/common/empty-state';
9
+ import { SkillList } from './skill-list';
10
+ import { CategoryFilter } from './category-filter';
11
+ import { SkillDetailDrawer } from './skill-detail-drawer';
12
+ import type { SkillCategory, SkillData } from '@/lib/skills';
13
+
14
+ export interface SkillsPageClientProps {
15
+ skills: SkillData[];
16
+ }
17
+
18
+ function computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {
19
+ const counts: Record<SkillCategory, number> = {
20
+ Workflow: 0,
21
+ 'Code Generation': 0,
22
+ Analysis: 0,
23
+ Reference: 0,
24
+ };
25
+ for (const skill of skills) {
26
+ counts[skill.category]++;
27
+ }
28
+ return counts;
29
+ }
30
+
31
+ export function SkillsPageClient({ skills }: SkillsPageClientProps) {
32
+ const [searchQuery, setSearchQuery] = useState('');
33
+ const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);
34
+ const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);
35
+
36
+ const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);
37
+
38
+ const filteredSkills = useMemo(() => {
39
+ const query = searchQuery.toLowerCase();
40
+ return skills.filter((skill) => {
41
+ if (activeCategory && skill.category !== activeCategory) return false;
42
+ if (query) {
43
+ const matchesName = skill.name.toLowerCase().includes(query);
44
+ const matchesDescription = skill.description.toLowerCase().includes(query);
45
+ if (!matchesName && !matchesDescription) return false;
46
+ }
47
+ return true;
48
+ });
49
+ }, [skills, searchQuery, activeCategory]);
50
+
51
+ const clearFilters = () => {
52
+ setSearchQuery('');
53
+ setActiveCategory(null);
54
+ };
55
+
56
+ // No skills installed at all
57
+ if (skills.length === 0) {
58
+ return (
59
+ <div className="flex flex-col gap-6 p-6">
60
+ <PageHeader title="Skills" description="Claude Code skills installed in this project" />
61
+ <EmptyState
62
+ icon={<Puzzle className="size-10" />}
63
+ title="No skills found"
64
+ description="No Claude Code skills are installed. Add skills to .claude/skills/ to get started."
65
+ />
66
+ </div>
67
+ );
68
+ }
69
+
70
+ return (
71
+ <div className="flex flex-col gap-6 p-6">
72
+ <PageHeader title="Skills" description="Claude Code skills installed in this project" />
73
+
74
+ {/* Search */}
75
+ <div className="relative">
76
+ <Search className="text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" />
77
+ <Input
78
+ placeholder="Search skills..."
79
+ value={searchQuery}
80
+ onChange={(e) => setSearchQuery(e.target.value)}
81
+ className="pl-9"
82
+ />
83
+ </div>
84
+
85
+ {/* Category Filter */}
86
+ <CategoryFilter
87
+ activeCategory={activeCategory}
88
+ onCategoryChange={setActiveCategory}
89
+ counts={categoryCounts}
90
+ />
91
+
92
+ {/* Skill List or Empty Filter State */}
93
+ {filteredSkills.length > 0 ? (
94
+ <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />
95
+ ) : (
96
+ <EmptyState
97
+ icon={<Search className="size-10" />}
98
+ title="No matching skills"
99
+ description="No skills match your current search and filter criteria."
100
+ action={
101
+ <Button variant="outline" onClick={clearFilters}>
102
+ Clear filters
103
+ </Button>
104
+ }
105
+ />
106
+ )}
107
+
108
+ {/* Skill Detail Drawer */}
109
+ <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />
110
+ </div>
111
+ );
112
+ }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { usePathname } from 'next/navigation';
4
- import { Home, Wrench, Plus } from 'lucide-react';
4
+ import { Home, Wrench, Puzzle, Plus } from 'lucide-react';
5
5
  import {
6
6
  Sidebar,
7
7
  SidebarHeader,
@@ -23,6 +23,7 @@ import { SidebarSectionHeader } from '@/components/common/sidebar-section-header
23
23
  import { featureStatusConfig, featureStatusOrder } from '@/components/common/feature-status-config';
24
24
  import type { FeatureStatus } from '@/components/common/feature-status-config';
25
25
  import { useDeferredMount } from '@/hooks/use-deferred-mount';
26
+ import { featureFlags } from '@/lib/feature-flags';
26
27
 
27
28
  interface FeatureItem {
28
29
  name: string;
@@ -87,6 +88,14 @@ export function AppSidebar({
87
88
  href="/tools"
88
89
  active={pathname === '/tools'}
89
90
  />
91
+ {featureFlags.skills ? (
92
+ <SidebarNavItem
93
+ icon={Puzzle}
94
+ label="Skills"
95
+ href="/skills"
96
+ active={pathname === '/skills'}
97
+ />
98
+ ) : null}
90
99
  </SidebarMenu>
91
100
  </SidebarHeader>
92
101
 
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Feature flags for the web UI.
3
+ *
4
+ * Toggle via environment variables (NEXT_PUBLIC_ prefix for client access).
5
+ * All flags default to **off** unless explicitly set to "true" or "1".
6
+ */
7
+
8
+ function isEnabled(envVar: string | undefined): boolean {
9
+ return envVar === 'true' || envVar === '1';
10
+ }
11
+
12
+ export const featureFlags = {
13
+ skills: isEnabled(process.env.NEXT_PUBLIC_FLAG_SKILLS),
14
+ } as const;