@shepai/cli 1.194.3-pr586.23e3597 → 1.194.4

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 (302) hide show
  1. package/package.json +1 -1
  2. package/web/.next/BUILD_ID +1 -1
  3. package/web/.next/build-manifest.json +2 -2
  4. package/web/.next/fallback-build-manifest.json +2 -2
  5. package/web/.next/prerender-manifest.json +3 -3
  6. package/web/.next/required-server-files.js +2 -2
  7. package/web/.next/required-server-files.json +2 -2
  8. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +3 -3
  9. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +36 -36
  10. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +3 -3
  13. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +34 -34
  14. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +3 -3
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +37 -37
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +3 -3
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +46 -46
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +3 -3
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +46 -46
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +3 -3
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +35 -35
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +3 -3
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +35 -35
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +3 -3
  37. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +34 -34
  38. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/control-center/page/react-loadable-manifest.json +3 -3
  41. package/web/.next/server/app/(dashboard)/control-center/page/server-reference-manifest.json +34 -34
  42. package/web/.next/server/app/(dashboard)/control-center/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/control-center/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +3 -3
  45. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +37 -37
  46. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +3 -3
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +46 -46
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +3 -3
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +46 -46
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +3 -3
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +35 -35
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +3 -3
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +35 -35
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +3 -3
  72. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +8 -8
  73. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +3 -3
  75. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +17 -17
  76. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/applications/page/react-loadable-manifest.json +3 -3
  79. package/web/.next/server/app/applications/page/server-reference-manifest.json +18 -18
  80. package/web/.next/server/app/applications/page.js.nft.json +1 -1
  81. package/web/.next/server/app/applications/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/features/page/react-loadable-manifest.json +3 -3
  83. package/web/.next/server/app/features/page/server-reference-manifest.json +30 -30
  84. package/web/.next/server/app/features/page.js.nft.json +1 -1
  85. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/page/react-loadable-manifest.json +3 -3
  87. package/web/.next/server/app/page/server-reference-manifest.json +8 -8
  88. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/react-loadable-manifest.json +3 -3
  90. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/server-reference-manifest.json +15 -15
  91. package/web/.next/server/app/projects/[slug]/items/[itemId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +3 -3
  93. package/web/.next/server/app/projects/[slug]/page/server-reference-manifest.json +27 -27
  94. package/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/projects/[slug]/pages/page/react-loadable-manifest.json +3 -3
  96. package/web/.next/server/app/projects/[slug]/pages/page/server-reference-manifest.json +11 -11
  97. package/web/.next/server/app/projects/[slug]/pages/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/projects/[slug]/settings/page/react-loadable-manifest.json +3 -3
  99. package/web/.next/server/app/projects/[slug]/settings/page/server-reference-manifest.json +17 -17
  100. package/web/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/projects/page/react-loadable-manifest.json +3 -3
  102. package/web/.next/server/app/projects/page/server-reference-manifest.json +9 -9
  103. package/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/settings/page/react-loadable-manifest.json +3 -3
  105. package/web/.next/server/app/settings/page/server-reference-manifest.json +11 -11
  106. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/skills/page/react-loadable-manifest.json +3 -3
  108. package/web/.next/server/app/skills/page/server-reference-manifest.json +16 -16
  109. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/tools/page/react-loadable-manifest.json +3 -3
  111. package/web/.next/server/app/tools/page/server-reference-manifest.json +14 -14
  112. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/version/page/react-loadable-manifest.json +3 -3
  114. package/web/.next/server/app/version/page/server-reference-manifest.json +8 -8
  115. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/chunks/[root-of-the-server]__10e976f3._.js +1 -1
  117. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99cb41a4.js +1 -1
  118. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99cb41a4.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_3bcbcc2f.js +1 -1
  120. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_3bcbcc2f.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_059f6735.js +1 -1
  122. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_059f6735.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_control-center_page_actions_86edeb51.js +1 -1
  124. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_control-center_page_actions_86edeb51.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js +1 -1
  126. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js +1 -1
  128. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  130. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__012a0e7d._.js +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__012a0e7d._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__0462fa34._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__0462fa34._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__1973d644._.js +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a86d5fe._.js +1 -1
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a86d5fe._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__30326387._.js +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__30326387._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__3438c354._.js +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__3438c354._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__361129f0._.js +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__361129f0._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__4adb4a94._.js +3 -3
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__4adb4a94._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__5c25ef9b._.js +2 -2
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__5c25ef9b._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__5c5f9704._.js +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__5c5f9704._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__638955bc._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__78e1366f._.js +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__78e1366f._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0d04b8e2._.js → [root-of-the-server]__8ccbc357._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0d04b8e2._.js.map → [root-of-the-server]__8ccbc357._.js.map} +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__97b6831c._.js +3 -3
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__9b16348d._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__9b16348d._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1e902e32._.js → [root-of-the-server]__b2926b69._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1e902e32._.js.map → [root-of-the-server]__b2926b69._.js.map} +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3bc9689._.js +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3bc9689._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba8cbee2._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba8cbee2._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__dbde193f._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__dbde193f._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__f6adb460._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__f6adb460._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/_101de7c3._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_101de7c3._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/_12ba4a07._.js +1 -1
  172. package/web/.next/server/chunks/ssr/_12ba4a07._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/_15634d5b._.js +1 -1
  174. package/web/.next/server/chunks/ssr/_15634d5b._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/_27c2f774._.js +1 -1
  176. package/web/.next/server/chunks/ssr/_27c2f774._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_30787024._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_30787024._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/_3bd60fa3._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_402d53bf._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_402d53bf._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_6868b4b1._.js +1 -1
  185. package/web/.next/server/chunks/ssr/{_3906be1d._.js → _759e7aaa._.js} +2 -2
  186. package/web/.next/server/chunks/ssr/{_3906be1d._.js.map → _759e7aaa._.js.map} +1 -1
  187. package/web/.next/server/chunks/ssr/{_12f37a55._.js → _7cd98562._.js} +2 -2
  188. package/web/.next/server/chunks/ssr/{_12f37a55._.js.map → _7cd98562._.js.map} +1 -1
  189. package/web/.next/server/chunks/ssr/_805ae1aa._.js +1 -1
  190. package/web/.next/server/chunks/ssr/_805ae1aa._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/_8a700ff4._.js +1 -1
  192. package/web/.next/server/chunks/ssr/_8a700ff4._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/_8f4f8aa1._.js +1 -1
  194. package/web/.next/server/chunks/ssr/_8f4f8aa1._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/{_fe68c1e2._.js → _9df39bfe._.js} +2 -2
  196. package/web/.next/server/chunks/ssr/{_fe68c1e2._.js.map → _9df39bfe._.js.map} +1 -1
  197. package/web/.next/server/chunks/ssr/{_1055ec32._.js → _a31c3a42._.js} +2 -2
  198. package/web/.next/server/chunks/ssr/{_1055ec32._.js.map → _a31c3a42._.js.map} +1 -1
  199. package/web/.next/server/chunks/ssr/_b40a4fc3._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_b40a4fc3._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_c44ec376._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_c44ec376._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/_cd641c61._.js +1 -1
  204. package/web/.next/server/chunks/ssr/_cd641c61._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/_d53224a9._.js +1 -1
  206. package/web/.next/server/chunks/ssr/_d53224a9._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/{_60246ee2._.js → _de93c45c._.js} +2 -2
  208. package/web/.next/server/chunks/ssr/{_60246ee2._.js.map → _de93c45c._.js.map} +1 -1
  209. package/web/.next/server/chunks/ssr/{_8ee3123d._.js → _e0e86221._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_8ee3123d._.js.map → _e0e86221._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_e6271303._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_e6271303._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_ed8fd56c._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_ed8fd56c._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/_f602cc9f._.js +1 -1
  216. package/web/.next/server/chunks/ssr/_f602cc9f._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  218. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_05bba4dc._.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_05bba4dc._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web_43451480._.js +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web_43451480._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web_4b306bb3._.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web_4b306bb3._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/{src_presentation_web_1f525bd4._.js → src_presentation_web_5c844690._.js} +2 -2
  227. package/web/.next/server/chunks/ssr/{src_presentation_web_1f525bd4._.js.map → src_presentation_web_5c844690._.js.map} +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_81dd84ae._.js +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_81dd84ae._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_7ab26c98._.js +3 -3
  233. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_b504e3e2._.js +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_b504e3e2._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_b5838705._.js +1 -1
  242. package/web/.next/server/chunks/ssr/src_presentation_web_b5838705._.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web_b6b4baa1._.js +1 -1
  244. package/web/.next/server/chunks/ssr/src_presentation_web_b6b4baa1._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_c3d0de23._.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_c3d0de23._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js +1 -1
  248. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js.map +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  252. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/{src_presentation_web_dc5ba3cf._.js → src_presentation_web_e596fda8._.js} +2 -2
  254. package/web/.next/server/chunks/ssr/{src_presentation_web_dc5ba3cf._.js.map → src_presentation_web_e596fda8._.js.map} +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_fc29283f._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_fc29283f._.js.map +1 -1
  257. package/web/.next/server/pages/500.html +2 -2
  258. package/web/.next/server/server-reference-manifest.js +1 -1
  259. package/web/.next/server/server-reference-manifest.json +98 -98
  260. package/web/.next/static/chunks/{1d72f699758c6d3a.js → 089bd320dc4b1575.js} +1 -1
  261. package/web/.next/static/chunks/{913f8613ffba3e5c.js → 0fc17b433aa79b46.js} +1 -1
  262. package/web/.next/static/chunks/105bb00cb34ccd38.js +1 -0
  263. package/web/.next/static/chunks/{d5b120471ecd81c3.js → 18be29465f4a1def.js} +1 -1
  264. package/web/.next/static/chunks/1f42ad4a0931acd3.js +1 -0
  265. package/web/.next/static/chunks/{dddb3a86ceab0299.js → 298594ed8c886cbf.js} +1 -1
  266. package/web/.next/static/chunks/{6d5150e080c53d51.js → 33317caa5c5abd6b.js} +1 -1
  267. package/web/.next/static/chunks/{6ac3de2ae9fd6923.js → 34593f30cd188c4a.js} +1 -1
  268. package/web/.next/static/chunks/{3be081e466e5c38f.js → 37ea114b14bec27f.js} +1 -1
  269. package/web/.next/static/chunks/{5d7f74c25dacc25c.js → 3c250fbfb60ee24f.js} +1 -1
  270. package/web/.next/static/chunks/{79865a986c6f7b78.js → 3c98769f57d9cab5.js} +1 -1
  271. package/web/.next/static/chunks/{88de900956cc7c59.js → 3d2af4aff402ec27.js} +1 -1
  272. package/web/.next/static/chunks/{60fd7ec231b71fe6.js → 424eadec8be0f312.js} +1 -1
  273. package/web/.next/static/chunks/{600304d205fb6d78.js → 4936903aae95a25f.js} +1 -1
  274. package/web/.next/static/chunks/4d47b81085b62d87.js +1 -0
  275. package/web/.next/static/chunks/{127b0c5b93da3ad5.js → 4e2de41996b256eb.js} +1 -1
  276. package/web/.next/static/chunks/{e09a852e65d50ea9.js → 512f87d97c19d83c.js} +1 -1
  277. package/web/.next/static/chunks/{d8a8d0ea290869a7.js → 51de8a6b0bdc70c9.js} +1 -1
  278. package/web/.next/static/chunks/57a7139e142ed273.js +1 -0
  279. package/web/.next/static/chunks/{31eb52265493ef76.js → 61757ff9dcbbd032.js} +1 -1
  280. package/web/.next/static/chunks/674e4d59f39b85e2.js +1 -0
  281. package/web/.next/static/chunks/93ea366bd74183ac.js +1 -0
  282. package/web/.next/static/chunks/{b0658275cec08831.js → ae7430dbb2e98782.js} +1 -1
  283. package/web/.next/static/chunks/{07361c8c12a5843e.js → b2abfb9855755aa4.js} +1 -1
  284. package/web/.next/static/chunks/{eb53dfcd51b8c265.js → c3d369f4301955a1.js} +1 -1
  285. package/web/.next/static/chunks/{07c57742ecdf243e.js → cd057f6e3acdf607.js} +1 -1
  286. package/web/.next/static/chunks/{afc90b9d319294e0.js → d5563287e193adaa.js} +1 -1
  287. package/web/.next/static/chunks/{c777b5c3be68f05b.js → d861a3318a70ff49.js} +1 -1
  288. package/web/.next/static/chunks/{88cebfaa6dd82cc7.js → da7737afc53217ed.js} +3 -3
  289. package/web/.next/static/chunks/{4cecc66a490b21f7.js → e115c6778a53c0b0.js} +1 -1
  290. package/web/.next/static/chunks/{39b106ba3f6b82ea.js → ea904b744cea3776.js} +1 -1
  291. package/web/.next/static/chunks/{6ae0cf4dd1f41683.js → f0c7b0a956112e63.js} +1 -1
  292. package/web/.next/static/chunks/{a59dfab21ca0ba91.js → f31db8ecfc2d481e.js} +1 -1
  293. package/web/.next/static/chunks/{a98de0590c6ebab9.js → f8a21f4841d519ff.js} +1 -1
  294. package/web/.next/static/chunks/00f78bad91244b81.js +0 -1
  295. package/web/.next/static/chunks/55b11c087456741a.js +0 -1
  296. package/web/.next/static/chunks/64b32c7716c3cde3.js +0 -1
  297. package/web/.next/static/chunks/83b6dc76bfe00b00.js +0 -1
  298. package/web/.next/static/chunks/a29ef3fcc3085a7d.js +0 -1
  299. package/web/.next/static/chunks/b6f72b83e6cf64bc.js +0 -1
  300. /package/web/.next/static/{VT3SIc3eQMRpCzfl2igIb → wfZhz3kojQGb8pd6OW9Lk}/_buildManifest.js +0 -0
  301. /package/web/.next/static/{VT3SIc3eQMRpCzfl2igIb → wfZhz3kojQGb8pd6OW9Lk}/_clientMiddlewareManifest.json +0 -0
  302. /package/web/.next/static/{VT3SIc3eQMRpCzfl2igIb → wfZhz3kojQGb8pd6OW9Lk}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[100228,a=>{"use strict";var b=a.i(556365);a.i(478454);var c=a.i(124255),d=a.i(302824),e=a.i(658339),f=a.i(513126),g=a.i(403195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},274468,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(531378),e=a.i(167424),f=a.i(390920),g=a.i(118948);a.i(955135);var h=a.i(975550);a.i(738702);var i=a.i(516223),j=a.i(184117),k=a.i(658339),l=a.i(403195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(100228),s=a.i(513126),t=a.i(91109),u=a.i(867837),v=a.i(302807),w=a.i(952313),x=a.i(289111);let y=(0,x.createServerReference)("40b7e42dced0c506098ce80d6dd69b9d518ddd233d",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(645670),A=a.i(758860),B=a.i(441305);let C=(0,x.createServerReference)("4014482fd7351535c4d97816542861a3f91fae1bcf",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],274468)}];
1
+ module.exports=[100228,a=>{"use strict";var b=a.i(556365);a.i(478454);var c=a.i(124255),d=a.i(302824),e=a.i(658339),f=a.i(513126),g=a.i(403195);function h({skill:a,onClose:h}){return(0,b.jsx)(c.BaseDrawer,{open:null!==a,onClose:h,size:"sm",modal:!0,"data-testid":"skill-detail-drawer",header:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.DrawerTitle,{children:a.displayName}),(0,b.jsx)(d.DrawerDescription,{children:a.name})]}):void 0,children:a?(0,b.jsxs)("div",{className:"px-4 pb-4",children:[(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:a.description}),(0,b.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(e.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),(0,b.jsx)(e.Badge,{variant:"outline",children:a.category}),a.context?(0,b.jsx)(e.Badge,{variant:"outline",children:a.context}):null]}),a.allowedTools?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Allowed Tools"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-1 text-sm",children:a.allowedTools})]})]}):null,a.resources.length>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-sm font-semibold",children:"Resources"}),(0,b.jsx)("ul",{className:"mt-2 space-y-1.5",children:a.resources.map(a=>(0,b.jsxs)("li",{className:"text-muted-foreground flex items-center gap-2 text-sm",children:[(0,b.jsx)(g.FolderOpen,{className:"size-3.5 shrink-0"}),(0,b.jsxs)("span",{children:[a.name,"/ — ",a.fileCount," ",1===a.fileCount?"file":"files"]})]},a.name))})]})]}):null,a.body?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(f.Separator,{className:"my-4"}),(0,b.jsx)("pre",{className:"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap",children:a.body})]}):null]}):null})}a.s(["SkillDetailDrawer",()=>h])},274468,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(531378),e=a.i(167424),f=a.i(390920),g=a.i(118948);a.i(955135);var h=a.i(975550);a.i(738702);var i=a.i(516223),j=a.i(184117),k=a.i(658339),l=a.i(403195);function m({skill:a,onSelect:c}){return(0,b.jsxs)(j.Card,{className:"hover:border-primary/50 cursor-pointer transition-colors",role:"button",tabIndex:0,onClick:()=>c(a),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),c(a))},"data-testid":`skill-card-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"pb-3",children:[(0,b.jsx)(j.CardTitle,{className:"text-base",children:a.displayName}),(0,b.jsx)("p",{className:"text-muted-foreground font-mono text-xs",children:a.name})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-3",children:[(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-sm",children:a.description}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"project"===a.source?"secondary":"outline",children:"project"===a.source?"Project":"Global"}),a.context?(0,b.jsx)(k.Badge,{variant:"outline",children:a.context}):null,a.allowedTools?(0,b.jsx)(k.Badge,{variant:"outline",children:"Tools"}):null,a.resources.length>0?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex items-center gap-1 text-xs",children:[(0,b.jsx)(l.FolderOpen,{className:"size-3"}),a.resources.length," ",1===a.resources.length?"resource":"resources"]}):null]})]})]})}let n=["Workflow","Code Generation","Analysis","Reference"];function o({skills:a,onSkillSelect:c}){let d=function(a){let b=new Map;for(let c of a){let a=b.get(c.category)??[];a.push(c),b.set(c.category,a)}return b}(a);return(0,b.jsx)("div",{className:"space-y-8",children:n.map(a=>{let e=d.get(a);return e&&0!==e.length?(0,b.jsxs)("section",{children:[(0,b.jsxs)("h2",{className:"mb-4 text-lg font-semibold",children:[a," ",(0,b.jsxs)("span",{className:"text-muted-foreground text-sm font-normal",children:["(",e.length,")"]})]}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:e.map(a=>(0,b.jsx)(m,{skill:a,onSelect:c},a.name))})]},a):null})})}let p=[{label:"All",value:null},{label:"Workflow",value:"Workflow"},{label:"Code Generation",value:"Code Generation"},{label:"Analysis",value:"Analysis"},{label:"Reference",value:"Reference"}];function q({activeCategory:a,onCategoryChange:c,counts:d}){return(0,b.jsx)("div",{className:"flex flex-wrap gap-2",role:"group","aria-label":"Filter by category",children:p.map(({label:e,value:f})=>(0,b.jsxs)(g.Button,{variant:a===f?"default":"outline",size:"sm",onClick:()=>c(f),children:[e,d&&f?(0,b.jsxs)("span",{className:"ms-1 text-xs opacity-70",children:["(",d[f],")"]}):null]},e))})}var r=a.i(100228),s=a.i(513126),t=a.i(91109),u=a.i(867837),v=a.i(302807),w=a.i(952313),x=a.i(289111);let y=(0,x.createServerReference)("40dc9e73a6706c6a625c6853f2d4b9a1727527de15",x.callServer,void 0,x.findSourceMapURL,"removeInjectedSkill");var z=a.i(645670),A=a.i(758860),B=a.i(441305);let C=(0,x.createServerReference)("40f3fe5bbe5d87571cfc707d79d6f5f3cf37edff01",x.callServer,void 0,x.findSourceMapURL,"addInjectedSkill");function D({open:a,onOpenChange:d,onAdded:e,discoveredSkills:h,existingSkillNames:i}){let[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r=h.filter(a=>!i.includes(a.name)),s=async a=>{k(!0);let b=await C({name:a.name,type:"local",source:`.claude/skills/${a.name}`});(k(!1),b.success)?(w.toast.success(`Added "${a.name}" to feature skills`),e()):w.toast.error(b.error??"Failed to add skill")},t=async()=>{if(!l.trim()||!n.trim())return void w.toast.error("Name and source are required");k(!0);let a=await C({name:l.trim(),type:"remote",source:n.trim(),...p.trim()&&{remoteSkillName:p.trim()}});(k(!1),a.success)?(w.toast.success(`Added "${l.trim()}" to feature skills`),m(""),o(""),q(""),e()):w.toast.error(a.error??"Failed to add skill")};return(0,b.jsx)(z.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(z.DialogContent,{className:"sm:max-w-md","data-testid":"add-skill-dialog",children:[(0,b.jsx)(z.DialogHeader,{children:(0,b.jsx)(z.DialogTitle,{children:"Add Skill to Features"})}),(0,b.jsxs)(B.Tabs,{defaultValue:"local",children:[(0,b.jsxs)(B.TabsList,{className:"w-full",children:[(0,b.jsx)(B.TabsTrigger,{value:"local",className:"flex-1",children:"Local"}),(0,b.jsx)(B.TabsTrigger,{value:"remote",className:"flex-1",children:"Remote"})]}),(0,b.jsx)(B.TabsContent,{value:"local",className:"mt-4",children:0===r.length?(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"All discovered skills are already configured."}):(0,b.jsx)("div",{className:"flex max-h-60 flex-col gap-2 overflow-y-auto",children:r.map(a=>(0,b.jsxs)("button",{type:"button",className:"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors",onClick:()=>s(a),disabled:j,"data-testid":`add-local-skill-${a.name}`,children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:a.displayName}),(0,b.jsx)("span",{className:"text-muted-foreground line-clamp-1 text-xs",children:a.description})]},a.name))})}),(0,b.jsx)(B.TabsContent,{value:"remote",className:"mt-4",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-name",children:"Name"}),(0,b.jsx)(f.Input,{id:"remote-name",placeholder:"e.g. remotion-best-practices",value:l,onChange:a=>m(a.target.value),"data-testid":"remote-skill-name"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-source",children:"Source (npm package or URL)"}),(0,b.jsx)(f.Input,{id:"remote-source",placeholder:"e.g. @anthropic/remotion-skills",value:n,onChange:a=>o(a.target.value),"data-testid":"remote-skill-source"})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(A.Label,{htmlFor:"remote-skill-name",children:"Skill Name (optional)"}),(0,b.jsx)(f.Input,{id:"remote-skill-name",placeholder:"e.g. remotion-best-practices",value:p,onChange:a=>q(a.target.value),"data-testid":"remote-skill-skill-name"})]}),(0,b.jsx)(z.DialogFooter,{children:(0,b.jsx)(g.Button,{onClick:t,disabled:j||!l.trim()||!n.trim(),"data-testid":"add-remote-skill-submit",children:"Add Remote Skill"})})]})})]})]})})}function E({config:a,discoveredSkills:d}){let e=(0,t.useRouter)(),[f,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(null),k=(0,c.useMemo)(()=>{let a=new Map;for(let b of d)a.set(b.name,b.description);return a},[d]),l=async a=>{j(a);let b=await y(a);(j(null),b.success)?(w.toast.success(`Removed "${a}" from feature skills`),e.refresh()):w.toast.error(b.error??"Failed to remove skill")};return(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-base font-semibold",children:"Feature Skills"}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"Curated skills included in new feature worktrees to guide the agent"})]}),a.skills.length>0?(0,b.jsx)("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.skills.map(a=>(0,b.jsx)(F,{skill:a,description:k.get(a.name),onRemove:()=>l(a.name),isRemoving:i===a.name},a.name))}):(0,b.jsx)("p",{className:"text-muted-foreground text-sm",children:"No skills configured. Add skills to guide the agent when working on new features."}),(0,b.jsx)("div",{children:(0,b.jsxs)(g.Button,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"add-injected-skill-button",children:[(0,b.jsx)(u.Plus,{className:"mr-1.5 size-4"}),"Add Skill"]})}),(0,b.jsx)(D,{open:f,onOpenChange:h,onAdded:()=>{h(!1),e.refresh()},discoveredSkills:d,existingSkillNames:a.skills.map(a=>a.name)})]})}function F({skill:a,description:c,onRemove:d,isRemoving:e}){return(0,b.jsxs)(j.Card,{"data-testid":`injected-skill-${a.name}`,children:[(0,b.jsxs)(j.CardHeader,{className:"flex flex-row items-start justify-between gap-2 pb-2",children:[(0,b.jsx)("div",{className:"min-w-0",children:(0,b.jsx)(j.CardTitle,{className:"truncate text-sm",children:a.name})}),(0,b.jsx)(g.Button,{variant:"ghost",size:"icon-sm",className:"shrink-0",onClick:d,disabled:e,"aria-label":`Remove ${a.name}`,"data-testid":`remove-injected-skill-${a.name}`,children:(0,b.jsx)(v.X,{className:"size-4"})})]}),(0,b.jsxs)(j.CardContent,{className:"space-y-2 pt-0",children:[c?(0,b.jsx)("p",{className:"text-muted-foreground line-clamp-2 text-xs",children:c}):null,(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(k.Badge,{variant:"local"===a.type?"secondary":"outline",className:"text-xs",children:"local"===a.type?"Local":"Remote"}),(0,b.jsx)("span",{className:"text-muted-foreground max-w-37.5 truncate text-xs",children:a.source})]})]})]})}function G({skills:a,injectionConfig:j}){let[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(null),[p,t]=(0,c.useState)(null),u=(0,c.useMemo)(()=>(function(a){let b={Workflow:0,"Code Generation":0,Analysis:0,Reference:0};for(let c of a)b[c.category]++;return b})(a),[a]),v=(0,c.useMemo)(()=>{let b=k.toLowerCase();return a.filter(a=>{if(m&&a.category!==m)return!1;if(b){let c=a.name.toLowerCase().includes(b),d=a.description.toLowerCase().includes(b);if(!c&&!d)return!1}return!0})},[a,k,m]);return 0===a.length?(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(e.Puzzle,{className:"size-10"}),title:"No skills found",description:"No Claude Code skills are installed. Add skills to .claude/skills/ to get started."})]}):(0,b.jsxs)("div",{className:"flex flex-col gap-6 p-6",children:[(0,b.jsx)(h.PageHeader,{title:"Skills",description:"Claude Code skills available to this project"}),(0,b.jsx)(E,{config:j,discoveredSkills:a}),(0,b.jsx)(s.Separator,{}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)(d.Search,{className:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),(0,b.jsx)(f.Input,{placeholder:"Search skills...",value:k,onChange:a=>l(a.target.value),className:"ps-9"})]}),(0,b.jsx)(q,{activeCategory:m,onCategoryChange:n,counts:u}),v.length>0?(0,b.jsx)(o,{skills:v,onSkillSelect:t}):(0,b.jsx)(i.EmptyState,{icon:(0,b.jsx)(d.Search,{className:"size-10"}),title:"No matching skills",description:"No skills match your current search and filter criteria.",action:(0,b.jsx)(g.Button,{variant:"outline",onClick:()=>{l(""),n(null)},children:"Clear filters"})}),(0,b.jsx)(r.SkillDetailDrawer,{skill:p,onClose:()=>t(null)})]})}a.s(["SkillsPageClient",()=>G],274468)}];
2
2
 
3
3
  //# sourceMappingURL=src_presentation_web_components_features_skills_8a174cac._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A3dacda%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ab0f3ee%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b7e42dced0c506098ce80d6dd69b9d518ddd233d\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b7e42dced0c506098ce80d6dd69b9d518ddd233d\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4014482fd7351535c4d97816542861a3f91fae1bcf\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4014482fd7351535c4d97816542861a3f91fae1bcf\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/skills/skill-detail-drawer.tsx","../../../../../../../src/presentation/web/components/features/skills/skills-page-client.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-card.tsx","../../../../../../../src/presentation/web/components/features/skills/skill-list.tsx","../../../../../../../src/presentation/web/components/features/skills/category-filter.tsx","../../../../../../../src/presentation/web/components/features/skills/auto-injected-skills-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A548df2%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/skills/add-skill-dialog.tsx","../../../../../../../src/presentation/web/app/actions/data%3A6912bf%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { FolderOpen } from 'lucide-react';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface SkillDetailDrawerProps {\n skill: SkillData | null;\n onClose: () => void;\n}\n\nexport function SkillDetailDrawer({ skill, onClose }: SkillDetailDrawerProps) {\n return (\n <BaseDrawer\n open={skill !== null}\n onClose={onClose}\n size=\"sm\"\n modal\n data-testid=\"skill-detail-drawer\"\n header={\n skill ? (\n <>\n <DrawerTitle>{skill.displayName}</DrawerTitle>\n <DrawerDescription>{skill.name}</DrawerDescription>\n </>\n ) : undefined\n }\n >\n {skill ? (\n <div className=\"px-4 pb-4\">\n {/* Description */}\n <p className=\"text-muted-foreground text-sm\">{skill.description}</p>\n\n {/* Badges */}\n <div className=\"mt-4 flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n <Badge variant=\"outline\">{skill.category}</Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n </div>\n\n {/* Allowed Tools */}\n {skill.allowedTools ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Allowed Tools</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">{skill.allowedTools}</p>\n </div>\n </>\n ) : null}\n\n {/* Resources */}\n {skill.resources.length > 0 ? (\n <>\n <Separator className=\"my-4\" />\n <div>\n <h3 className=\"text-sm font-semibold\">Resources</h3>\n <ul className=\"mt-2 space-y-1.5\">\n {skill.resources.map((resource) => (\n <li\n key={resource.name}\n className=\"text-muted-foreground flex items-center gap-2 text-sm\"\n >\n <FolderOpen className=\"size-3.5 shrink-0\" />\n <span>\n {resource.name}/ — {resource.fileCount}{' '}\n {resource.fileCount === 1 ? 'file' : 'files'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n ) : null}\n\n {/* Body */}\n {skill.body ? (\n <>\n <Separator className=\"my-4\" />\n <pre className=\"text-muted-foreground text-sm leading-relaxed whitespace-pre-wrap\">\n {skill.body}\n </pre>\n </>\n ) : null}\n </div>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from 'react';\nimport { Search, Puzzle } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { PageHeader } from '@/components/common/page-header';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { SkillList } from './skill-list';\nimport { CategoryFilter } from './category-filter';\nimport { SkillDetailDrawer } from './skill-detail-drawer';\nimport type { SkillInjectionConfig } from '@shepai/core/domain/generated/output';\nimport { Separator } from '@/components/ui/separator';\nimport { AutoInjectedSkillsSection } from './auto-injected-skills-section';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nexport interface SkillsPageClientProps {\n skills: SkillData[];\n injectionConfig: SkillInjectionConfig;\n}\n\nfunction computeCategoryCounts(skills: SkillData[]): Record<SkillCategory, number> {\n const counts: Record<SkillCategory, number> = {\n Workflow: 0,\n 'Code Generation': 0,\n Analysis: 0,\n Reference: 0,\n };\n for (const skill of skills) {\n counts[skill.category]++;\n }\n return counts;\n}\n\nexport function SkillsPageClient({ skills, injectionConfig }: SkillsPageClientProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState<SkillCategory | null>(null);\n const [selectedSkill, setSelectedSkill] = useState<SkillData | null>(null);\n\n const categoryCounts = useMemo(() => computeCategoryCounts(skills), [skills]);\n\n const filteredSkills = useMemo(() => {\n const query = searchQuery.toLowerCase();\n return skills.filter((skill) => {\n if (activeCategory && skill.category !== activeCategory) return false;\n if (query) {\n const matchesName = skill.name.toLowerCase().includes(query);\n const matchesDescription = skill.description.toLowerCase().includes(query);\n if (!matchesName && !matchesDescription) return false;\n }\n return true;\n });\n }, [skills, searchQuery, activeCategory]);\n\n const clearFilters = () => {\n setSearchQuery('');\n setActiveCategory(null);\n };\n\n // No skills installed at all\n if (skills.length === 0) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n <EmptyState\n icon={<Puzzle className=\"size-10\" />}\n title=\"No skills found\"\n description=\"No Claude Code skills are installed. Add skills to .claude/skills/ to get started.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <PageHeader title=\"Skills\" description=\"Claude Code skills available to this project\" />\n\n {/* Feature Skills */}\n <AutoInjectedSkillsSection config={injectionConfig} discoveredSkills={skills} />\n <Separator />\n\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search skills...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-9\"\n />\n </div>\n\n {/* Category Filter */}\n <CategoryFilter\n activeCategory={activeCategory}\n onCategoryChange={setActiveCategory}\n counts={categoryCounts}\n />\n\n {/* Skill List or Empty Filter State */}\n {filteredSkills.length > 0 ? (\n <SkillList skills={filteredSkills} onSkillSelect={setSelectedSkill} />\n ) : (\n <EmptyState\n icon={<Search className=\"size-10\" />}\n title=\"No matching skills\"\n description=\"No skills match your current search and filter criteria.\"\n action={\n <Button variant=\"outline\" onClick={clearFilters}>\n Clear filters\n </Button>\n }\n />\n )}\n\n {/* Skill Detail Drawer */}\n <SkillDetailDrawer skill={selectedSkill} onClose={() => setSelectedSkill(null)} />\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport type { SkillData } from '@/lib/skills';\nimport { FolderOpen } from 'lucide-react';\n\nexport interface SkillCardProps {\n skill: SkillData;\n onSelect: (skill: SkillData) => void;\n}\n\nexport function SkillCard({ skill, onSelect }: SkillCardProps) {\n return (\n <Card\n className=\"hover:border-primary/50 cursor-pointer transition-colors\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(skill)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(skill);\n }\n }}\n data-testid={`skill-card-${skill.name}`}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">{skill.displayName}</CardTitle>\n <p className=\"text-muted-foreground font-mono text-xs\">{skill.name}</p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-muted-foreground line-clamp-2 text-sm\">{skill.description}</p>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={skill.source === 'project' ? 'secondary' : 'outline'}>\n {skill.source === 'project' ? 'Project' : 'Global'}\n </Badge>\n {skill.context ? <Badge variant=\"outline\">{skill.context}</Badge> : null}\n {skill.allowedTools ? <Badge variant=\"outline\">Tools</Badge> : null}\n {skill.resources.length > 0 ? (\n <span className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <FolderOpen className=\"size-3\" />\n {skill.resources.length} {skill.resources.length === 1 ? 'resource' : 'resources'}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n );\n}\n","import { SkillCard } from './skill-card';\nimport type { SkillCategory, SkillData } from '@/lib/skills';\n\nconst CATEGORY_ORDER: SkillCategory[] = ['Workflow', 'Code Generation', 'Analysis', 'Reference'];\n\nexport interface SkillListProps {\n skills: SkillData[];\n onSkillSelect: (skill: SkillData) => void;\n}\n\nfunction groupByCategory(skills: SkillData[]): Map<SkillCategory, SkillData[]> {\n const groups = new Map<SkillCategory, SkillData[]>();\n for (const skill of skills) {\n const group = groups.get(skill.category) ?? [];\n group.push(skill);\n groups.set(skill.category, group);\n }\n return groups;\n}\n\nexport function SkillList({ skills, onSkillSelect }: SkillListProps) {\n const groups = groupByCategory(skills);\n\n return (\n <div className=\"space-y-8\">\n {CATEGORY_ORDER.map((category) => {\n const categorySkills = groups.get(category);\n if (!categorySkills || categorySkills.length === 0) return null;\n\n return (\n <section key={category}>\n <h2 className=\"mb-4 text-lg font-semibold\">\n {category}{' '}\n <span className=\"text-muted-foreground text-sm font-normal\">\n ({categorySkills.length})\n </span>\n </h2>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {categorySkills.map((skill) => (\n <SkillCard key={skill.name} skill={skill} onSelect={onSkillSelect} />\n ))}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import { Button } from '@/components/ui/button';\nimport type { SkillCategory } from '@/lib/skills';\n\nconst CATEGORIES: { label: string; value: SkillCategory | null }[] = [\n { label: 'All', value: null },\n { label: 'Workflow', value: 'Workflow' },\n { label: 'Code Generation', value: 'Code Generation' },\n { label: 'Analysis', value: 'Analysis' },\n { label: 'Reference', value: 'Reference' },\n];\n\nexport interface CategoryFilterProps {\n activeCategory: SkillCategory | null;\n onCategoryChange: (category: SkillCategory | null) => void;\n counts?: Record<SkillCategory, number>;\n}\n\nexport function CategoryFilter({ activeCategory, onCategoryChange, counts }: CategoryFilterProps) {\n return (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Filter by category\">\n {CATEGORIES.map(({ label, value }) => (\n <Button\n key={label}\n variant={activeCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => onCategoryChange(value)}\n >\n {label}\n {counts && value ? (\n <span className=\"ms-1 text-xs opacity-70\">({counts[value]})</span>\n ) : null}\n </Button>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, X } from 'lucide-react';\nimport { toast } from 'sonner';\nimport type { SkillInjectionConfig, SkillSource } from '@shepai/core/domain/generated/output';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { removeInjectedSkill } from '@/app/actions/remove-injected-skill';\nimport { AddSkillDialog } from './add-skill-dialog';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AutoInjectedSkillsSectionProps {\n config: SkillInjectionConfig;\n discoveredSkills: SkillData[];\n}\n\nexport function AutoInjectedSkillsSection({\n config,\n discoveredSkills,\n}: AutoInjectedSkillsSectionProps) {\n const router = useRouter();\n const [addDialogOpen, setAddDialogOpen] = useState(false);\n const [removingSkill, setRemovingSkill] = useState<string | null>(null);\n\n const skillDescriptions = useMemo(() => {\n const map = new Map<string, string>();\n for (const s of discoveredSkills) {\n map.set(s.name, s.description);\n }\n return map;\n }, [discoveredSkills]);\n\n const handleRemove = async (skillName: string) => {\n setRemovingSkill(skillName);\n const result = await removeInjectedSkill(skillName);\n setRemovingSkill(null);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove skill');\n return;\n }\n toast.success(`Removed \"${skillName}\" from feature skills`);\n router.refresh();\n };\n\n const handleAdded = () => {\n setAddDialogOpen(false);\n router.refresh();\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Feature Skills</h2>\n <p className=\"text-muted-foreground text-sm\">\n Curated skills included in new feature worktrees to guide the agent\n </p>\n </div>\n {config.skills.length > 0 ? (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {config.skills.map((skill) => (\n <InjectedSkillCard\n key={skill.name}\n skill={skill}\n description={skillDescriptions.get(skill.name)}\n onRemove={() => handleRemove(skill.name)}\n isRemoving={removingSkill === skill.name}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n No skills configured. Add skills to guide the agent when working on new features.\n </p>\n )}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setAddDialogOpen(true)}\n data-testid=\"add-injected-skill-button\"\n >\n <Plus className=\"mr-1.5 size-4\" />\n Add Skill\n </Button>\n </div>\n <AddSkillDialog\n open={addDialogOpen}\n onOpenChange={setAddDialogOpen}\n onAdded={handleAdded}\n discoveredSkills={discoveredSkills}\n existingSkillNames={config.skills.map((s) => s.name)}\n />\n </div>\n );\n}\n\nfunction InjectedSkillCard({\n skill,\n description,\n onRemove,\n isRemoving,\n}: {\n skill: SkillSource;\n description?: string;\n onRemove: () => void;\n isRemoving: boolean;\n}) {\n return (\n <Card data-testid={`injected-skill-${skill.name}`}>\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 pb-2\">\n <div className=\"min-w-0\">\n <CardTitle className=\"truncate text-sm\">{skill.name}</CardTitle>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n onClick={onRemove}\n disabled={isRemoving}\n aria-label={`Remove ${skill.name}`}\n data-testid={`remove-injected-skill-${skill.name}`}\n >\n <X className=\"size-4\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-2 pt-0\">\n {description ? (\n <p className=\"text-muted-foreground line-clamp-2 text-xs\">{description}</p>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Badge variant={skill.type === 'local' ? 'secondary' : 'outline'} className=\"text-xs\">\n {skill.type === 'local' ? 'Local' : 'Remote'}\n </Badge>\n <span className=\"text-muted-foreground max-w-37.5 truncate text-xs\">{skill.source}</span>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40dc9e73a6706c6a625c6853f2d4b9a1727527de15\":\"removeInjectedSkill\"},\"src/presentation/web/app/actions/remove-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40dc9e73a6706c6a625c6853f2d4b9a1727527de15\",callServer,void 0,findSourceMapURL,\"removeInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as removeInjectedSkill};","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport type { SkillSourceType } from '@shepai/core/domain/generated/output';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { addInjectedSkill } from '@/app/actions/add-injected-skill';\nimport type { SkillData } from '@/lib/skills';\n\nexport interface AddSkillDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAdded: () => void;\n discoveredSkills: SkillData[];\n existingSkillNames: string[];\n}\n\nexport function AddSkillDialog({\n open,\n onOpenChange,\n onAdded,\n discoveredSkills,\n existingSkillNames,\n}: AddSkillDialogProps) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [remoteName, setRemoteName] = useState('');\n const [remoteSource, setRemoteSource] = useState('');\n const [remoteSkillName, setRemoteSkillName] = useState('');\n\n const availableSkills = discoveredSkills.filter((s) => !existingSkillNames.includes(s.name));\n\n const handleAddLocal = async (skill: SkillData) => {\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: skill.name,\n type: 'local' as SkillSourceType,\n source: `.claude/skills/${skill.name}`,\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${skill.name}\" to feature skills`);\n onAdded();\n };\n\n const handleAddRemote = async () => {\n if (!remoteName.trim() || !remoteSource.trim()) {\n toast.error('Name and source are required');\n return;\n }\n setIsSubmitting(true);\n const result = await addInjectedSkill({\n name: remoteName.trim(),\n type: 'remote' as SkillSourceType,\n source: remoteSource.trim(),\n ...(remoteSkillName.trim() && { remoteSkillName: remoteSkillName.trim() }),\n });\n setIsSubmitting(false);\n if (!result.success) {\n toast.error(result.error ?? 'Failed to add skill');\n return;\n }\n toast.success(`Added \"${remoteName.trim()}\" to feature skills`);\n setRemoteName('');\n setRemoteSource('');\n setRemoteSkillName('');\n onAdded();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"add-skill-dialog\">\n <DialogHeader>\n <DialogTitle>Add Skill to Features</DialogTitle>\n </DialogHeader>\n <Tabs defaultValue=\"local\">\n <TabsList className=\"w-full\">\n <TabsTrigger value=\"local\" className=\"flex-1\">\n Local\n </TabsTrigger>\n <TabsTrigger value=\"remote\" className=\"flex-1\">\n Remote\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"local\" className=\"mt-4\">\n {availableSkills.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n All discovered skills are already configured.\n </p>\n ) : (\n <div className=\"flex max-h-60 flex-col gap-2 overflow-y-auto\">\n {availableSkills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className=\"hover:bg-accent flex flex-col gap-0.5 rounded-md border p-3 text-left transition-colors\"\n onClick={() => handleAddLocal(skill)}\n disabled={isSubmitting}\n data-testid={`add-local-skill-${skill.name}`}\n >\n <span className=\"text-sm font-medium\">{skill.displayName}</span>\n <span className=\"text-muted-foreground line-clamp-1 text-xs\">\n {skill.description}\n </span>\n </button>\n ))}\n </div>\n )}\n </TabsContent>\n <TabsContent value=\"remote\" className=\"mt-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-name\">Name</Label>\n <Input\n id=\"remote-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteName}\n onChange={(e) => setRemoteName(e.target.value)}\n data-testid=\"remote-skill-name\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-source\">Source (npm package or URL)</Label>\n <Input\n id=\"remote-source\"\n placeholder=\"e.g. @anthropic/remotion-skills\"\n value={remoteSource}\n onChange={(e) => setRemoteSource(e.target.value)}\n data-testid=\"remote-skill-source\"\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"remote-skill-name\">Skill Name (optional)</Label>\n <Input\n id=\"remote-skill-name\"\n placeholder=\"e.g. remotion-best-practices\"\n value={remoteSkillName}\n onChange={(e) => setRemoteSkillName(e.target.value)}\n data-testid=\"remote-skill-skill-name\"\n />\n </div>\n <DialogFooter>\n <Button\n onClick={handleAddRemote}\n disabled={isSubmitting || !remoteName.trim() || !remoteSource.trim()}\n data-testid=\"add-remote-skill-submit\"\n >\n Add Remote Skill\n </Button>\n </DialogFooter>\n </div>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40f3fe5bbe5d87571cfc707d79d6f5f3cf37edff01\":\"addInjectedSkill\"},\"src/presentation/web/app/actions/add-injected-skill.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40f3fe5bbe5d87571cfc707d79d6f5f3cf37edff01\",callServer,void 0,findSourceMapURL,\"addInjectedSkill\");export{$$RSC_SERVER_ACTION_0 as addInjectedSkill};"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[646442,a=>{"use strict";var b=a.i(289111);let c=(0,b.createServerReference)("40043d514e2ae74fecc73e6e73e249f7151efc24b7",b.callServer,void 0,b.findSourceMapURL,"createFeature");a.s(["createFeature",()=>c])},609803,382052,a=>{"use strict";var b=a.i(556365),c=a.i(944592);a.i(490370);var d=a.i(224640),e=a.i(945242),f=a.i(14177),g=a.i(110606),h=a.i(103942),i=a.i(346168),j=a.i(142527),k=a.i(488064),l=a.i(673708),m=a.i(162147),n=a.i(167424),o=a.i(428002),p=a.i(882014),q=a.i(69428),r=a.i(385536),s=a.i(219884);a.i(478454);var t=a.i(124255),u=a.i(302824),v=a.i(118948),w=a.i(390920),x=a.i(679620),y=a.i(758860),z=a.i(658339),A=a.i(680646),B=a.i(896867),C=a.i(182934),D=a.i(196213);a.i(200307);var E=a.i(730931),F=a.i(289111);let G=(0,F.createServerReference)("405848adede2dfc7e2c0da7655c7db7d8da5a5c7e4",F.callServer,void 0,F.findSourceMapURL,"getViewerPermission");var H=a.i(961781),I=a.i(513126),J=a.i(701377);a.i(421434);var K=a.i(234379),L=a.i(821333),M=a.i(801691),N=a.i(39116);let O=["application","fast","spec"],P={application:{icon:p.LayoutGrid,labelKey:"createDrawer.modeApplication"},fast:{icon:h.Zap,labelKey:"createDrawer.modeFast"},spec:{icon:q.ClipboardList,labelKey:"createDrawer.modeSpec"}},Q=new Set([".png",".jpg",".jpeg",".gif",".webp",".svg",".bmp",".ico",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".csv",".json",".yaml",".yml",".xml",".ts",".tsx",".js",".jsx",".py",".rb",".go",".rs",".java",".c",".cpp",".h",".hpp",".cs",".swift",".kt",".html",".css",".scss",".less",".sh",".bash",".zsh",".fish",".toml",".ini",".cfg",".conf",".env",".zip",".tar",".gz",".log"]),R={allowPrd:!1,allowPlan:!1,allowMerge:!1};function S({open:a,onClose:f,onSubmit:g,repositoryPath:h,isSubmitting:j=!1,workflowDefaults:k,features:p,repositories:q,initialParentId:w,currentAgentType:A,currentModel:F,initialDescription:I,canPushDirectly:J,initialMode:K}){let L=(0,s.useSoundAction)("create"),{t:M}=(0,d.useTranslation)("web"),S=h&&(!q||0===q.length||q.some(a=>a.path===h))?h:"",V=k?.approvalGates??R,W=k?.push??!1,X=k?.openPr??!1,Y=k?.ciWatchEnabled!==!1,Z=k?.enableEvidence??!1,$=k?.commitEvidence??!1,_=K||(k?.fast===!1?"application":"fast"),[aa,ab]=(0,c.useState)(I??"");(0,c.useEffect)(()=>{I&&ab(I)},[I]);let[ac,ad]=(0,c.useState)([]),[ae,af]=(0,c.useState)({...V}),[ag,ah]=(0,c.useState)(W),[ai,aj]=(0,c.useState)(X),[ak,al]=(0,c.useState)(k?.ciWatchEnabled!==!1),[am,an]=(0,c.useState)(Z),[ao,ap]=(0,c.useState)($),[aq,ar]=(0,c.useState)(void 0),[as,at]=(0,c.useState)(_),au="fast"===as,[av,aw]=(0,c.useState)(!1),[ax,ay]=(0,c.useState)(!1),[az,aA]=(0,c.useState)(!0),[aB,aC]=(0,c.useState)(!0),[aD,aE]=(0,c.useState)(k?.injectSkills??!1),[aF,aG]=(0,c.useState)(void 0),[aH,aI]=(0,c.useState)(void 0),[aJ,aK]=(0,c.useState)(S||void 0),[aL,aM]=(0,c.useState)(q??[]),[aN,aO]=(0,c.useState)(!1),[aP,aQ]=(0,c.useState)(null),[aR,aS]=(0,c.useState)(!1),aT=(0,c.useRef)(crypto.randomUUID()),aU=(0,c.useRef)(0),aV=(0,c.useRef)(null);(0,c.useEffect)(()=>{k&&(af({...k.approvalGates}),ah(k.push),aj(k.openPr),al(!1!==k.ciWatchEnabled),an(k.enableEvidence),ap(k.commitEvidence),K||at(!1!==k.fast?"fast":"application"),aE(k.injectSkills??!1))},[k,K]),(0,c.useEffect)(()=>{aM(q??[])},[q]),(0,c.useEffect)(()=>{a&&w&&ar(w)},[a,w]);let[aW,aX]=(0,c.useState)(J??!1);(0,c.useEffect)(()=>{aX(J??!1)},[J]);let aY=(0,c.useRef)(aJ);(0,c.useEffect)(()=>{aJ&&aJ!==aY.current&&(aY.current=aJ,G(aJ).then(a=>aX(a.canPushDirectly)).catch(()=>aX(!1)))},[aJ]),(0,c.useEffect)(()=>{aW&&(ay(!1),ah(W),aj(X),aA(!0))},[aW,W,X]);let aZ=(0,c.useCallback)(()=>{ab(""),ad([]),af({...V}),ah(W),aj(X),al(Y),an(Z),ap($),ar(void 0),aK(S||void 0),aM(q??[]),at(_),aw(!1),ay(!1),aA(!0),aC(!0),aG(void 0),aI(void 0),aQ(null),aU.current=0,aO(!1)},[V,W,X,Z,Y,$,_,S,q]),a$=""!==aa.trim()||ac.length>0,{attemptClose:a_}=(0,D.useGuardedDrawerClose)({open:a,isDirty:a$,onClose:f,onReset:aZ}),a0=(0,c.useCallback)(async a=>{for(let b of(aQ(null),a)){if(b.size>0xa00000)return void aQ(`"${b.name}" exceeds 10 MB limit`);let a=function(a){let b=a.lastIndexOf(".");return b>=0?a.slice(b).toLowerCase():""}(b.name);if(a&&!Q.has(a))return void aQ(`File type "${a}" is not allowed`)}for(let b of a){let a=crypto.randomUUID();ad(c=>[...c,{id:a,name:b.name,size:b.size,mimeType:b.type||"application/octet-stream",path:"",loading:!0}]);try{let c=new FormData;c.append("file",b),c.append("sessionId",aT.current);let d=await fetch("/api/attachments/upload",{method:"POST",body:c});if(!d.ok){let b=await d.json().catch(()=>({error:"Upload failed"}));ad(b=>b.filter(b=>b.id!==a)),aQ(b.error??"Upload failed");return}let e=await d.json();ad(b=>b.some(b=>b.id!==a&&b.path===e.path)?b.filter(b=>b.id!==a):b.map(b=>b.id===a?{...e,id:a,loading:!1}:b))}catch{ad(b=>b.filter(b=>b.id!==a)),aQ("Upload failed")}}},[]),a1=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current+=1,1===aU.current&&aO(!0)},[]),a2=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current-=1,0===aU.current&&aO(!1)},[]),a3=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation()},[]),a4=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current=0,aO(!1);let b=Array.from(a.dataTransfer.files);b.length>0&&a0(b)},[a0]),a5=(0,c.useCallback)(a=>{let b=a.clipboardData?.items;if(!b)return;let c=[];for(let a of Array.from(b))if("file"===a.kind){let b=a.getAsFile();b&&c.push(b)}c.length>0&&(a.preventDefault(),a0(c))},[a0]),a6=(0,c.useCallback)(a=>{if(a.preventDefault(),!aa.trim())return;let b=aJ??S;b&&(L.play(),g({description:aa.trim(),attachments:ac.filter(a=>!a.loading),repositoryPath:b,approvalGates:{allowPrd:ae.allowPrd??!1,allowPlan:ae.allowPlan??!1,allowMerge:ae.allowMerge??!1},push:!!ax||ag||ai,openPr:!!ax||ai,ciWatchEnabled:ak,enableEvidence:am,commitEvidence:ao,fast:au,forkAndPr:ax,commitSpecs:az,rebaseBeforeBranch:aB,injectSkills:aD,...av?{pending:av}:{},...aF?{agentType:aF}:{},...aH?{model:aH}:{},...aq?{parentId:aq}:{},sessionId:aT.current}),aZ())},[aa,ac,ae,aJ,S,g,ag,ai,am,ak,ao,au,ax,az,aB,aD,av,aF,aH,aq,L,aZ]),a7=(0,c.useCallback)(async()=>{try{let a=await (0,N.pickFiles)();if(!a)return;for(let b of a){let a=crypto.randomUUID();ad(c=>[...c,{id:a,name:b.name,size:b.size,mimeType:"application/octet-stream",path:"",loading:!0}]);try{let c=await fetch("/api/attachments/upload-from-path",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:b.path,sessionId:aT.current})});if(!c.ok){let b=await c.json().catch(()=>({error:"Upload failed"}));ad(b=>b.filter(b=>b.id!==a)),aQ(b.error??"Upload failed");return}let d=await c.json();ad(b=>b.some(b=>b.id!==a&&b.path===d.path)?b.filter(b=>b.id!==a):b.map(b=>b.id===a?{...d,id:a,loading:!1}:b))}catch{ad(b=>b.filter(b=>b.id!==a)),aQ("Upload failed")}}}catch{}},[]),a8=(0,c.useCallback)(a=>{ad(b=>b.filter(b=>b.id!==a))},[]),a9=(0,c.useCallback)((a,b)=>{ad(c=>c.map(c=>c.id===a?{...c,notes:b}:c))},[]),ba=(0,c.useRef)(null),bb=(0,c.useCallback)(a=>{(a.ctrlKey||a.metaKey)&&"Enter"===a.key&&(a.preventDefault(),ba.current?.requestSubmit())},[]),bc=(0,c.useCallback)(()=>{aS(!0)},[]),bd=(0,c.useCallback)(()=>{setTimeout(()=>{let a=aV.current?.contains(document.activeElement),b=aV.current?.querySelector('[aria-expanded="true"]')!==null;a||b||aS(!1)},0)},[]),be=p&&p.length>0,bf=!S&&!aJ,bg=!S&&void 0!==q,bh=[{id:"allowPrd",label:M("createDrawer.prd"),description:M("createDrawer.prdDescription")},{id:"allowPlan",label:M("createDrawer.plan"),description:M("createDrawer.planDescription")},{id:"allowMerge",label:M("createDrawer.merge"),description:M("createDrawer.mergeDescription")}];return(0,b.jsx)(t.BaseDrawer,{open:a,onClose:a_,size:"md",modal:!1,dismissOnOutsideClick:!0,"data-testid":"feature-create-drawer",header:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("div",{className:"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500"}),(0,b.jsx)(u.DrawerTitle,{children:M("createDrawer.title")})]}),j?(0,b.jsx)(u.DrawerDescription,{asChild:!0,children:(0,b.jsx)("div",{children:(0,b.jsx)(z.Badge,{variant:"secondary",children:M("createDrawer.creating")})})}):null]}),footer:(0,b.jsxs)("div",{className:"flex flex-row justify-end gap-2",children:[(0,b.jsx)(v.Button,{variant:"outline",onClick:a_,disabled:j,children:M("createDrawer.cancel")}),(0,b.jsx)(v.Button,{type:"submit",form:"create-feature-form",disabled:!aa.trim()||j||bf,children:j?M("createDrawer.creating"):M("createDrawer.createFeature")})]}),children:(0,b.jsx)("div",{className:"overflow-y-auto p-4",children:(0,b.jsx)(C.TooltipProvider,{delayDuration:400,children:(0,b.jsxs)("form",{ref:ba,id:"create-feature-form",onSubmit:a6,onKeyDown:bb,className:"flex flex-col gap-4",children:[bg?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5","data-testid":"repo-selector-section",children:[(0,b.jsx)(y.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.repository")}),(0,b.jsx)(U,{repositories:aL,value:aJ,onChange:aK,onAddRepository:a=>{aM(b=>[...b,a]),aK(a.path)},disabled:j})]}):S?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5","data-testid":"repo-readonly-section",children:[(0,b.jsx)(y.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.repository")}),(0,b.jsx)("p",{className:"text-sm","data-testid":"repo-readonly-label",children:q?.find(a=>a.path===S)?.name??S.split("/").pop()})]}):null,(0,b.jsxs)("div",{role:"region","aria-label":M("createDrawer.fileDropZone"),"data-drag-over":aN?"true":"false",onDragEnter:a1,onDragLeave:a2,onDragOver:a3,onDrop:a4,className:(0,r.cn)("flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors",aN&&"border-primary/50 bg-primary/5"),children:[(0,b.jsx)(y.Label,{htmlFor:"feature-description",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.describeFeature")}),(0,b.jsxs)("div",{ref:aV,onFocus:bc,onBlur:bd,className:(0,r.cn)("border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]",aR&&"ring-ring/50 border-ring ring-[3px]"),children:[(0,b.jsx)(x.Textarea,{id:"feature-description",placeholder:M("createDrawer.featurePlaceholder"),value:aa,onChange:a=>ab(a.target.value),onPaste:a5,required:!0,disabled:j,className:"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0"}),ac.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap items-center gap-1.5 px-3 py-2",children:ac.map(a=>(0,b.jsx)(E.AttachmentChip,{name:a.name,size:a.size,mimeType:a.mimeType,path:a.path,onRemove:()=>a8(a.id),disabled:j,loading:a.loading,notes:a.notes,onNotesChange:b=>a9(a.id,b)},a.id))}),aP?(0,b.jsx)("p",{className:"text-destructive px-3 pb-2 text-xs",children:aP}):null,(0,b.jsxs)("div",{className:"border-input flex items-center gap-3 border-t px-3 py-1.5",children:[(0,b.jsx)(H.AgentModelPicker,{initialAgentType:aF??A??"claude-code",initialModel:aH??F??"claude-sonnet-4-6",mode:"override",onAgentModelChange:(a,b)=>{aG(a),aI(b)},disabled:j,className:"w-55"}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"ml-auto flex cursor-pointer items-center gap-2",children:[(0,b.jsx)(B.Switch,{id:"pending-mode",checked:av,onCheckedChange:aw,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"pending-mode",className:"flex cursor-pointer items-center gap-1 text-sm font-medium",children:[(0,b.jsx)(i.Clock,{className:"h-3.5 w-3.5"}),M("createDrawer.pendingMode")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.pendingModeDescription")})]}),(0,b.jsx)("div",{role:"group","aria-label":M("createDrawer.modeGroupLabel"),className:"border-input flex items-center gap-0.5 rounded-md border p-0.5",children:O.map(a=>{let c=P[a],d=c.icon,e=as===a;return(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button","data-testid":`build-mode-${a}`,"aria-pressed":e,disabled:j,onClick:()=>at(a),className:(0,r.cn)("flex cursor-pointer items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium transition-colors",e?"bg-accent text-foreground":"text-muted-foreground hover:text-foreground","disabled:cursor-not-allowed disabled:opacity-50"),children:[(0,b.jsx)(d,{className:"h-3.5 w-3.5"}),M(c.labelKey)]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M(`${c.labelKey}Description`)})]},a)})}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:a7,disabled:j,"aria-label":M("chat.attachFiles"),className:"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors",children:(0,b.jsx)(e.PaperclipIcon,{className:"h-4 w-4"})})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("chat.attachFiles")})]})]})]})]}),be&&void 0!==w?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(y.Label,{htmlFor:"parent-feature",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.parentFeature")}),(0,b.jsx)(T,{features:p,value:aq,onChange:ar,disabled:j})]}):null,(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.approve")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.approveDescription")})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:bh.map(a=>(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:`approve-${a.id}`,size:"sm",checked:ae[a.id]??!1,onCheckedChange:b=>af(c=>({...c,[a.id]:b})),disabled:j||au&&("allowPrd"===a.id||"allowPlan"===a.id)}),(0,b.jsx)(y.Label,{htmlFor:`approve-${a.id}`,className:"cursor-pointer text-xs font-medium",children:a.label})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:au&&("allowPrd"===a.id||"allowPlan"===a.id)?M("createDrawer.skippedInFastMode"):a.description})]},a.id))}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:()=>{let a=bh.every(a=>ae[a.id]),b={};for(let c of bh)b[c.id]=!a;af(b)},disabled:j,className:(0,r.cn)("text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors",bh.every(a=>ae[a.id])&&"text-primary"),children:M("createDrawer.all")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.toggleAllApprovalGates")})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.evidence")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.evidenceDescription")})]}),(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-4",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"enable-evidence",size:"sm",checked:am,onCheckedChange:a=>{an(a),a||ap(!1)},disabled:j}),(0,b.jsx)(y.Label,{htmlFor:"enable-evidence",className:"cursor-pointer text-xs font-medium",children:M("createDrawer.collect")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.collectDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"commit-evidence",size:"sm",checked:ao,onCheckedChange:ap,disabled:j||!am||!ai&&!ax}),(0,b.jsx)(y.Label,{htmlFor:"commit-evidence",className:(0,r.cn)("cursor-pointer text-xs font-medium",(!am||!ai&&!ax)&&"opacity-50"),children:M("createDrawer.addToPr")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ai||ax?am?M("createDrawer.addToPrDescription"):M("createDrawer.requiresEvidence"):M("createDrawer.requiresPr")})]})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.skills")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.skillsDescription")})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"inject-skills",size:"sm",checked:aD,onCheckedChange:aE,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"inject-skills",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(n.Puzzle,{className:"h-3 w-3"}),M("createDrawer.injectSkills")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.injectSkillsDescription")})]})})]}),(0,b.jsxs)("div",{className:"border-input flex items-start gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider",children:M("createDrawer.git")}),(0,b.jsxs)("div",{className:"flex flex-1 flex-wrap items-center gap-4",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"push",size:"sm",checked:!!ax||ag||ai,onCheckedChange:a=>{ah(a),!a&&ai&&aj(!1)},disabled:j||ax}),(0,b.jsx)(y.Label,{htmlFor:"push",className:(0,r.cn)("cursor-pointer text-xs font-medium",ax&&"opacity-50"),children:M("createDrawer.push")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ax?"Enabled — contributing to upstream":M("createDrawer.pushDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"open-pr",size:"sm",checked:!!ax||ai,onCheckedChange:a=>{aj(a),a||ap(!1)},disabled:j||ax}),(0,b.jsx)(y.Label,{htmlFor:"open-pr",className:(0,r.cn)("cursor-pointer text-xs font-medium",ax&&"opacity-50"),children:M("createDrawer.pr")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ax?"Enabled — contributing to upstream":M("createDrawer.prDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"ci-watch",size:"sm",checked:ak,onCheckedChange:al,disabled:j}),(0,b.jsx)(y.Label,{htmlFor:"ci-watch",className:"cursor-pointer text-xs font-medium",children:M("createDrawer.watch")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.watchDescription")})]}),(0,b.jsx)("div",{className:"bg-border h-4 w-px shrink-0"}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"rebase-before-branch",size:"sm",checked:aB,onCheckedChange:aC,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"rebase-before-branch",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(o.RefreshCw,{className:"h-3 w-3"}),M("createDrawer.sync")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.syncDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"commit-specs",size:"sm",checked:az,onCheckedChange:aA,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"commit-specs",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(m.FileText,{className:"h-3 w-3"}),M("createDrawer.commitSpecs")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.commitSpecsDescription")})]}),!aW&&(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"fork-and-pr",size:"sm",checked:ax,onCheckedChange:a=>{ay(a),a&&aA(!1)},disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"fork-and-pr",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(l.GitFork,{className:"h-3 w-3"}),M("createDrawer.forkAndPr")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.forkAndPrDescription")})]})]})]})]})]})})})})}function T({features:a,value:e,onChange:h,disabled:i}){let{t:j}=(0,d.useTranslation)("web"),[k,l]=(0,c.useState)(!1),[m,n]=(0,c.useState)(""),o=(0,c.useRef)(null),p=a.find(a=>a.id===e),q=m.trim()?a.filter(a=>a.name.toLowerCase().includes(m.toLowerCase())||a.id.toLowerCase().includes(m.toLowerCase())):a,s=(0,c.useCallback)(a=>{h(a),l(!1),n("")},[h]);return(0,c.useEffect)(()=>{k?setTimeout(()=>o.current?.focus(),0):n("")},[k]),(0,b.jsxs)(A.Popover,{open:k,onOpenChange:l,children:[(0,b.jsx)(A.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{id:"parent-feature",type:"button",role:"combobox","aria-expanded":k,"aria-label":"Parent Feature",disabled:i,"data-testid":"parent-feature-combobox",className:(0,r.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!p&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:p?`${p.name} (${p.id.slice(0,8)})`:j("createDrawer.selectParent")}),(0,b.jsx)(f.ChevronsUpDown,{className:"ms-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(A.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"parent-feature-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(w.Input,{ref:o,placeholder:j("createDrawer.searchFeatures"),value:m,onChange:a=>n(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"parent-feature-search"})}),(0,b.jsxs)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Features",children:[(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":void 0===e,onClick:()=>s(void 0),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",void 0===e&&"bg-accent/50"),"data-testid":"parent-feature-option-none",children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",void 0!==e&&"invisible")}),(0,b.jsx)("span",{className:"text-muted-foreground italic",children:j("createDrawer.noParent")})]}),0===q.length&&m?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm",children:j("createDrawer.noFeaturesFound")}):q.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":e===a.id,onClick:()=>s(a.id),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",e===a.id&&"bg-accent/50"),"data-testid":`parent-feature-option-${a.id}`,children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",e!==a.id&&"invisible")}),(0,b.jsxs)("span",{className:"truncate",children:[a.name," ",(0,b.jsxs)("span",{className:"text-muted-foreground font-mono text-xs",children:["(",a.id.slice(0,8),")"]})]})]},a.id))]})]})})]})}function U({repositories:a,value:e,onChange:h,onAddRepository:i,disabled:m}){let[n,o]=(0,c.useState)(!1),[p,q]=(0,c.useState)(""),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(null),[x,y]=(0,c.useState)(!1),B=(0,c.useRef)(null),{reactFileManager:C}=(0,L.useFeatureFlags)(),{t:D}=(0,d.useTranslation)("web"),E=a.find(a=>a.path===e),F=p.trim()?a.filter(a=>a.name.toLowerCase().includes(p.toLowerCase())||a.path.toLowerCase().includes(p.toLowerCase())):a,G=(0,c.useCallback)(a=>{h(a),o(!1),q("")},[h]),H=(0,c.useCallback)(async a=>{let b=await (0,M.addRepository)({path:a});if(b.error){v(b.error),t(!1);return}if(b.repository){let a={id:b.repository.id,name:b.repository.name,path:b.repository.path};i?.(a),h(a.path),o(!1),q("")}},[i,h]),N=(0,c.useCallback)(async()=>{if(!s){if(C)return void y(!0);t(!0),v(null);try{let a=await (0,J.pickFolder)();if(!a)return void t(!1);await H(a)}catch{y(!0)}finally{t(!1)}}},[s,C,H]),O=(0,c.useCallback)(async a=>{if(y(!1),a){t(!0),v(null);try{await H(a)}catch(a){v(a instanceof Error?a.message:"Failed to add repository")}finally{t(!1)}}},[H]);return(0,c.useEffect)(()=>{n?setTimeout(()=>B.current?.focus(),0):q("")},[n]),(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(A.Popover,{open:n,onOpenChange:o,children:[(0,b.jsx)(A.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",role:"combobox","aria-expanded":n,"aria-label":"Repository",disabled:m,"data-testid":"repository-combobox",className:(0,r.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!E&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:E?E.name:"Select repository..."}),(0,b.jsx)(f.ChevronsUpDown,{className:"ms-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(A.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"repository-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(w.Input,{ref:B,placeholder:D("createDrawer.searchRepositories"),value:p,onChange:a=>q(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"repository-search"})}),(0,b.jsx)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Repositories",children:0===F.length?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm","data-testid":"repository-empty",children:"No repositories found."}):F.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":e===a.path,onClick:()=>G(a.path),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",e===a.path&&"bg-accent/50"),"data-testid":`repository-option-${a.id}`,children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",e!==a.path&&"invisible")}),(0,b.jsxs)("span",{className:"flex flex-col items-start truncate",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5 truncate",children:[a.name,a.isFork?(0,b.jsxs)(z.Badge,{variant:"outline",className:"h-4 shrink-0 px-1 text-[10px]",children:[(0,b.jsx)(l.GitFork,{className:"mr-0.5 h-2.5 w-2.5"}),"Fork"]}):null]}),(0,b.jsx)("span",{className:"text-muted-foreground truncate text-xs",children:a.path})]})]},a.id))}),(0,b.jsx)(I.Separator,{}),(0,b.jsxs)("button",{type:"button",onClick:N,disabled:s,className:"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm","data-testid":"add-repository-item",children:[s?(0,b.jsx)(k.Loader2,{className:"h-4 w-4 shrink-0 animate-spin"}):(0,b.jsx)(j.FolderPlus,{className:"h-4 w-4 shrink-0"}),(0,b.jsx)("span",{children:"Add new repository..."})]}),u?(0,b.jsx)("p",{className:"px-3 pb-2 text-xs text-red-500","data-testid":"add-repository-error",children:u}):null]})})]}),(0,b.jsx)(K.ReactFileManagerDialog,{open:x,onOpenChange:a=>{a||y(!1)},onSelect:O})]})}a.s(["FeatureCreateDrawer",()=>S],382052),a.s([],609803)}];
1
+ module.exports=[380861,a=>{"use strict";var b=a.i(289111);let c=(0,b.createServerReference)("40f9865a02f709d69b646d15b1095d80de20dd68e1",b.callServer,void 0,b.findSourceMapURL,"createFeature");a.s(["createFeature",()=>c])},609803,382052,a=>{"use strict";var b=a.i(556365),c=a.i(944592);a.i(490370);var d=a.i(224640),e=a.i(945242),f=a.i(14177),g=a.i(110606),h=a.i(103942),i=a.i(346168),j=a.i(142527),k=a.i(488064),l=a.i(673708),m=a.i(162147),n=a.i(167424),o=a.i(428002),p=a.i(882014),q=a.i(69428),r=a.i(385536),s=a.i(219884);a.i(478454);var t=a.i(124255),u=a.i(302824),v=a.i(118948),w=a.i(390920),x=a.i(679620),y=a.i(758860),z=a.i(658339),A=a.i(680646),B=a.i(896867),C=a.i(182934),D=a.i(196213);a.i(200307);var E=a.i(730931),F=a.i(289111);let G=(0,F.createServerReference)("40ea48d752291fdfcaad9784e39a575c4655808001",F.callServer,void 0,F.findSourceMapURL,"getViewerPermission");var H=a.i(961781),I=a.i(513126),J=a.i(701377);a.i(421434);var K=a.i(234379),L=a.i(821333),M=a.i(502553),N=a.i(39116);let O=["application","fast","spec"],P={application:{icon:p.LayoutGrid,labelKey:"createDrawer.modeApplication"},fast:{icon:h.Zap,labelKey:"createDrawer.modeFast"},spec:{icon:q.ClipboardList,labelKey:"createDrawer.modeSpec"}},Q=new Set([".png",".jpg",".jpeg",".gif",".webp",".svg",".bmp",".ico",".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".csv",".json",".yaml",".yml",".xml",".ts",".tsx",".js",".jsx",".py",".rb",".go",".rs",".java",".c",".cpp",".h",".hpp",".cs",".swift",".kt",".html",".css",".scss",".less",".sh",".bash",".zsh",".fish",".toml",".ini",".cfg",".conf",".env",".zip",".tar",".gz",".log"]),R={allowPrd:!1,allowPlan:!1,allowMerge:!1};function S({open:a,onClose:f,onSubmit:g,repositoryPath:h,isSubmitting:j=!1,workflowDefaults:k,features:p,repositories:q,initialParentId:w,currentAgentType:A,currentModel:F,initialDescription:I,canPushDirectly:J,initialMode:K}){let L=(0,s.useSoundAction)("create"),{t:M}=(0,d.useTranslation)("web"),S=h&&(!q||0===q.length||q.some(a=>a.path===h))?h:"",V=k?.approvalGates??R,W=k?.push??!1,X=k?.openPr??!1,Y=k?.ciWatchEnabled!==!1,Z=k?.enableEvidence??!1,$=k?.commitEvidence??!1,_=K||(k?.fast===!1?"application":"fast"),[aa,ab]=(0,c.useState)(I??"");(0,c.useEffect)(()=>{I&&ab(I)},[I]);let[ac,ad]=(0,c.useState)([]),[ae,af]=(0,c.useState)({...V}),[ag,ah]=(0,c.useState)(W),[ai,aj]=(0,c.useState)(X),[ak,al]=(0,c.useState)(k?.ciWatchEnabled!==!1),[am,an]=(0,c.useState)(Z),[ao,ap]=(0,c.useState)($),[aq,ar]=(0,c.useState)(void 0),[as,at]=(0,c.useState)(_),au="fast"===as,[av,aw]=(0,c.useState)(!1),[ax,ay]=(0,c.useState)(!1),[az,aA]=(0,c.useState)(!0),[aB,aC]=(0,c.useState)(!0),[aD,aE]=(0,c.useState)(k?.injectSkills??!1),[aF,aG]=(0,c.useState)(void 0),[aH,aI]=(0,c.useState)(void 0),[aJ,aK]=(0,c.useState)(S||void 0),[aL,aM]=(0,c.useState)(q??[]),[aN,aO]=(0,c.useState)(!1),[aP,aQ]=(0,c.useState)(null),[aR,aS]=(0,c.useState)(!1),aT=(0,c.useRef)(crypto.randomUUID()),aU=(0,c.useRef)(0),aV=(0,c.useRef)(null);(0,c.useEffect)(()=>{k&&(af({...k.approvalGates}),ah(k.push),aj(k.openPr),al(!1!==k.ciWatchEnabled),an(k.enableEvidence),ap(k.commitEvidence),K||at(!1!==k.fast?"fast":"application"),aE(k.injectSkills??!1))},[k,K]),(0,c.useEffect)(()=>{aM(q??[])},[q]),(0,c.useEffect)(()=>{a&&w&&ar(w)},[a,w]);let[aW,aX]=(0,c.useState)(J??!1);(0,c.useEffect)(()=>{aX(J??!1)},[J]);let aY=(0,c.useRef)(aJ);(0,c.useEffect)(()=>{aJ&&aJ!==aY.current&&(aY.current=aJ,G(aJ).then(a=>aX(a.canPushDirectly)).catch(()=>aX(!1)))},[aJ]),(0,c.useEffect)(()=>{aW&&(ay(!1),ah(W),aj(X),aA(!0))},[aW,W,X]);let aZ=(0,c.useCallback)(()=>{ab(""),ad([]),af({...V}),ah(W),aj(X),al(Y),an(Z),ap($),ar(void 0),aK(S||void 0),aM(q??[]),at(_),aw(!1),ay(!1),aA(!0),aC(!0),aG(void 0),aI(void 0),aQ(null),aU.current=0,aO(!1)},[V,W,X,Z,Y,$,_,S,q]),a$=""!==aa.trim()||ac.length>0,{attemptClose:a_}=(0,D.useGuardedDrawerClose)({open:a,isDirty:a$,onClose:f,onReset:aZ}),a0=(0,c.useCallback)(async a=>{for(let b of(aQ(null),a)){if(b.size>0xa00000)return void aQ(`"${b.name}" exceeds 10 MB limit`);let a=function(a){let b=a.lastIndexOf(".");return b>=0?a.slice(b).toLowerCase():""}(b.name);if(a&&!Q.has(a))return void aQ(`File type "${a}" is not allowed`)}for(let b of a){let a=crypto.randomUUID();ad(c=>[...c,{id:a,name:b.name,size:b.size,mimeType:b.type||"application/octet-stream",path:"",loading:!0}]);try{let c=new FormData;c.append("file",b),c.append("sessionId",aT.current);let d=await fetch("/api/attachments/upload",{method:"POST",body:c});if(!d.ok){let b=await d.json().catch(()=>({error:"Upload failed"}));ad(b=>b.filter(b=>b.id!==a)),aQ(b.error??"Upload failed");return}let e=await d.json();ad(b=>b.some(b=>b.id!==a&&b.path===e.path)?b.filter(b=>b.id!==a):b.map(b=>b.id===a?{...e,id:a,loading:!1}:b))}catch{ad(b=>b.filter(b=>b.id!==a)),aQ("Upload failed")}}},[]),a1=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current+=1,1===aU.current&&aO(!0)},[]),a2=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current-=1,0===aU.current&&aO(!1)},[]),a3=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation()},[]),a4=(0,c.useCallback)(a=>{a.preventDefault(),a.stopPropagation(),aU.current=0,aO(!1);let b=Array.from(a.dataTransfer.files);b.length>0&&a0(b)},[a0]),a5=(0,c.useCallback)(a=>{let b=a.clipboardData?.items;if(!b)return;let c=[];for(let a of Array.from(b))if("file"===a.kind){let b=a.getAsFile();b&&c.push(b)}c.length>0&&(a.preventDefault(),a0(c))},[a0]),a6=(0,c.useCallback)(a=>{if(a.preventDefault(),!aa.trim())return;let b=aJ??S;b&&(L.play(),g({description:aa.trim(),attachments:ac.filter(a=>!a.loading),repositoryPath:b,approvalGates:{allowPrd:ae.allowPrd??!1,allowPlan:ae.allowPlan??!1,allowMerge:ae.allowMerge??!1},push:!!ax||ag||ai,openPr:!!ax||ai,ciWatchEnabled:ak,enableEvidence:am,commitEvidence:ao,fast:au,forkAndPr:ax,commitSpecs:az,rebaseBeforeBranch:aB,injectSkills:aD,...av?{pending:av}:{},...aF?{agentType:aF}:{},...aH?{model:aH}:{},...aq?{parentId:aq}:{},sessionId:aT.current}),aZ())},[aa,ac,ae,aJ,S,g,ag,ai,am,ak,ao,au,ax,az,aB,aD,av,aF,aH,aq,L,aZ]),a7=(0,c.useCallback)(async()=>{try{let a=await (0,N.pickFiles)();if(!a)return;for(let b of a){let a=crypto.randomUUID();ad(c=>[...c,{id:a,name:b.name,size:b.size,mimeType:"application/octet-stream",path:"",loading:!0}]);try{let c=await fetch("/api/attachments/upload-from-path",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:b.path,sessionId:aT.current})});if(!c.ok){let b=await c.json().catch(()=>({error:"Upload failed"}));ad(b=>b.filter(b=>b.id!==a)),aQ(b.error??"Upload failed");return}let d=await c.json();ad(b=>b.some(b=>b.id!==a&&b.path===d.path)?b.filter(b=>b.id!==a):b.map(b=>b.id===a?{...d,id:a,loading:!1}:b))}catch{ad(b=>b.filter(b=>b.id!==a)),aQ("Upload failed")}}}catch{}},[]),a8=(0,c.useCallback)(a=>{ad(b=>b.filter(b=>b.id!==a))},[]),a9=(0,c.useCallback)((a,b)=>{ad(c=>c.map(c=>c.id===a?{...c,notes:b}:c))},[]),ba=(0,c.useRef)(null),bb=(0,c.useCallback)(a=>{(a.ctrlKey||a.metaKey)&&"Enter"===a.key&&(a.preventDefault(),ba.current?.requestSubmit())},[]),bc=(0,c.useCallback)(()=>{aS(!0)},[]),bd=(0,c.useCallback)(()=>{setTimeout(()=>{let a=aV.current?.contains(document.activeElement),b=aV.current?.querySelector('[aria-expanded="true"]')!==null;a||b||aS(!1)},0)},[]),be=p&&p.length>0,bf=!S&&!aJ,bg=!S&&void 0!==q,bh=[{id:"allowPrd",label:M("createDrawer.prd"),description:M("createDrawer.prdDescription")},{id:"allowPlan",label:M("createDrawer.plan"),description:M("createDrawer.planDescription")},{id:"allowMerge",label:M("createDrawer.merge"),description:M("createDrawer.mergeDescription")}];return(0,b.jsx)(t.BaseDrawer,{open:a,onClose:a_,size:"md",modal:!1,dismissOnOutsideClick:!0,"data-testid":"feature-create-drawer",header:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("div",{className:"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500"}),(0,b.jsx)(u.DrawerTitle,{children:M("createDrawer.title")})]}),j?(0,b.jsx)(u.DrawerDescription,{asChild:!0,children:(0,b.jsx)("div",{children:(0,b.jsx)(z.Badge,{variant:"secondary",children:M("createDrawer.creating")})})}):null]}),footer:(0,b.jsxs)("div",{className:"flex flex-row justify-end gap-2",children:[(0,b.jsx)(v.Button,{variant:"outline",onClick:a_,disabled:j,children:M("createDrawer.cancel")}),(0,b.jsx)(v.Button,{type:"submit",form:"create-feature-form",disabled:!aa.trim()||j||bf,children:j?M("createDrawer.creating"):M("createDrawer.createFeature")})]}),children:(0,b.jsx)("div",{className:"overflow-y-auto p-4",children:(0,b.jsx)(C.TooltipProvider,{delayDuration:400,children:(0,b.jsxs)("form",{ref:ba,id:"create-feature-form",onSubmit:a6,onKeyDown:bb,className:"flex flex-col gap-4",children:[bg?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5","data-testid":"repo-selector-section",children:[(0,b.jsx)(y.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.repository")}),(0,b.jsx)(U,{repositories:aL,value:aJ,onChange:aK,onAddRepository:a=>{aM(b=>[...b,a]),aK(a.path)},disabled:j})]}):S?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5","data-testid":"repo-readonly-section",children:[(0,b.jsx)(y.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.repository")}),(0,b.jsx)("p",{className:"text-sm","data-testid":"repo-readonly-label",children:q?.find(a=>a.path===S)?.name??S.split("/").pop()})]}):null,(0,b.jsxs)("div",{role:"region","aria-label":M("createDrawer.fileDropZone"),"data-drag-over":aN?"true":"false",onDragEnter:a1,onDragLeave:a2,onDragOver:a3,onDrop:a4,className:(0,r.cn)("flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors",aN&&"border-primary/50 bg-primary/5"),children:[(0,b.jsx)(y.Label,{htmlFor:"feature-description",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.describeFeature")}),(0,b.jsxs)("div",{ref:aV,onFocus:bc,onBlur:bd,className:(0,r.cn)("border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]",aR&&"ring-ring/50 border-ring ring-[3px]"),children:[(0,b.jsx)(x.Textarea,{id:"feature-description",placeholder:M("createDrawer.featurePlaceholder"),value:aa,onChange:a=>ab(a.target.value),onPaste:a5,required:!0,disabled:j,className:"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0"}),ac.length>0&&(0,b.jsx)("div",{className:"flex flex-wrap items-center gap-1.5 px-3 py-2",children:ac.map(a=>(0,b.jsx)(E.AttachmentChip,{name:a.name,size:a.size,mimeType:a.mimeType,path:a.path,onRemove:()=>a8(a.id),disabled:j,loading:a.loading,notes:a.notes,onNotesChange:b=>a9(a.id,b)},a.id))}),aP?(0,b.jsx)("p",{className:"text-destructive px-3 pb-2 text-xs",children:aP}):null,(0,b.jsxs)("div",{className:"border-input flex items-center gap-3 border-t px-3 py-1.5",children:[(0,b.jsx)(H.AgentModelPicker,{initialAgentType:aF??A??"claude-code",initialModel:aH??F??"claude-sonnet-4-6",mode:"override",onAgentModelChange:(a,b)=>{aG(a),aI(b)},disabled:j,className:"w-55"}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"ml-auto flex cursor-pointer items-center gap-2",children:[(0,b.jsx)(B.Switch,{id:"pending-mode",checked:av,onCheckedChange:aw,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"pending-mode",className:"flex cursor-pointer items-center gap-1 text-sm font-medium",children:[(0,b.jsx)(i.Clock,{className:"h-3.5 w-3.5"}),M("createDrawer.pendingMode")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.pendingModeDescription")})]}),(0,b.jsx)("div",{role:"group","aria-label":M("createDrawer.modeGroupLabel"),className:"border-input flex items-center gap-0.5 rounded-md border p-0.5",children:O.map(a=>{let c=P[a],d=c.icon,e=as===a;return(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button","data-testid":`build-mode-${a}`,"aria-pressed":e,disabled:j,onClick:()=>at(a),className:(0,r.cn)("flex cursor-pointer items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium transition-colors",e?"bg-accent text-foreground":"text-muted-foreground hover:text-foreground","disabled:cursor-not-allowed disabled:opacity-50"),children:[(0,b.jsx)(d,{className:"h-3.5 w-3.5"}),M(c.labelKey)]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M(`${c.labelKey}Description`)})]},a)})}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:a7,disabled:j,"aria-label":M("chat.attachFiles"),className:"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors",children:(0,b.jsx)(e.PaperclipIcon,{className:"h-4 w-4"})})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("chat.attachFiles")})]})]})]})]}),be&&void 0!==w?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(y.Label,{htmlFor:"parent-feature",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:M("createDrawer.parentFeature")}),(0,b.jsx)(T,{features:p,value:aq,onChange:ar,disabled:j})]}):null,(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.approve")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.approveDescription")})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:bh.map(a=>(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:`approve-${a.id}`,size:"sm",checked:ae[a.id]??!1,onCheckedChange:b=>af(c=>({...c,[a.id]:b})),disabled:j||au&&("allowPrd"===a.id||"allowPlan"===a.id)}),(0,b.jsx)(y.Label,{htmlFor:`approve-${a.id}`,className:"cursor-pointer text-xs font-medium",children:a.label})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:au&&("allowPrd"===a.id||"allowPlan"===a.id)?M("createDrawer.skippedInFastMode"):a.description})]},a.id))}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:()=>{let a=bh.every(a=>ae[a.id]),b={};for(let c of bh)b[c.id]=!a;af(b)},disabled:j,className:(0,r.cn)("text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors",bh.every(a=>ae[a.id])&&"text-primary"),children:M("createDrawer.all")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.toggleAllApprovalGates")})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.evidence")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.evidenceDescription")})]}),(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-4",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"enable-evidence",size:"sm",checked:am,onCheckedChange:a=>{an(a),a||ap(!1)},disabled:j}),(0,b.jsx)(y.Label,{htmlFor:"enable-evidence",className:"cursor-pointer text-xs font-medium",children:M("createDrawer.collect")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.collectDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"commit-evidence",size:"sm",checked:ao,onCheckedChange:ap,disabled:j||!am||!ai&&!ax}),(0,b.jsx)(y.Label,{htmlFor:"commit-evidence",className:(0,r.cn)("cursor-pointer text-xs font-medium",(!am||!ai&&!ax)&&"opacity-50"),children:M("createDrawer.addToPr")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ai||ax?am?M("createDrawer.addToPrDescription"):M("createDrawer.requiresEvidence"):M("createDrawer.requiresPr")})]})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:M("createDrawer.skills")})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.skillsDescription")})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"inject-skills",size:"sm",checked:aD,onCheckedChange:aE,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"inject-skills",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(n.Puzzle,{className:"h-3 w-3"}),M("createDrawer.injectSkills")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.injectSkillsDescription")})]})})]}),(0,b.jsxs)("div",{className:"border-input flex items-start gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider",children:M("createDrawer.git")}),(0,b.jsxs)("div",{className:"flex flex-1 flex-wrap items-center gap-4",children:[(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"push",size:"sm",checked:!!ax||ag||ai,onCheckedChange:a=>{ah(a),!a&&ai&&aj(!1)},disabled:j||ax}),(0,b.jsx)(y.Label,{htmlFor:"push",className:(0,r.cn)("cursor-pointer text-xs font-medium",ax&&"opacity-50"),children:M("createDrawer.push")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ax?"Enabled — contributing to upstream":M("createDrawer.pushDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"open-pr",size:"sm",checked:!!ax||ai,onCheckedChange:a=>{aj(a),a||ap(!1)},disabled:j||ax}),(0,b.jsx)(y.Label,{htmlFor:"open-pr",className:(0,r.cn)("cursor-pointer text-xs font-medium",ax&&"opacity-50"),children:M("createDrawer.pr")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:ax?"Enabled — contributing to upstream":M("createDrawer.prDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"ci-watch",size:"sm",checked:ak,onCheckedChange:al,disabled:j}),(0,b.jsx)(y.Label,{htmlFor:"ci-watch",className:"cursor-pointer text-xs font-medium",children:M("createDrawer.watch")})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.watchDescription")})]}),(0,b.jsx)("div",{className:"bg-border h-4 w-px shrink-0"}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"rebase-before-branch",size:"sm",checked:aB,onCheckedChange:aC,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"rebase-before-branch",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(o.RefreshCw,{className:"h-3 w-3"}),M("createDrawer.sync")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.syncDescription")})]}),(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"commit-specs",size:"sm",checked:az,onCheckedChange:aA,disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"commit-specs",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(m.FileText,{className:"h-3 w-3"}),M("createDrawer.commitSpecs")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.commitSpecsDescription")})]}),!aW&&(0,b.jsxs)(C.Tooltip,{children:[(0,b.jsx)(C.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(B.Switch,{id:"fork-and-pr",size:"sm",checked:ax,onCheckedChange:a=>{ay(a),a&&aA(!1)},disabled:j}),(0,b.jsxs)(y.Label,{htmlFor:"fork-and-pr",className:"flex cursor-pointer items-center gap-1 text-xs font-medium",children:[(0,b.jsx)(l.GitFork,{className:"h-3 w-3"}),M("createDrawer.forkAndPr")]})]})}),(0,b.jsx)(C.TooltipContent,{side:"bottom",children:M("createDrawer.forkAndPrDescription")})]})]})]})]})]})})})})}function T({features:a,value:e,onChange:h,disabled:i}){let{t:j}=(0,d.useTranslation)("web"),[k,l]=(0,c.useState)(!1),[m,n]=(0,c.useState)(""),o=(0,c.useRef)(null),p=a.find(a=>a.id===e),q=m.trim()?a.filter(a=>a.name.toLowerCase().includes(m.toLowerCase())||a.id.toLowerCase().includes(m.toLowerCase())):a,s=(0,c.useCallback)(a=>{h(a),l(!1),n("")},[h]);return(0,c.useEffect)(()=>{k?setTimeout(()=>o.current?.focus(),0):n("")},[k]),(0,b.jsxs)(A.Popover,{open:k,onOpenChange:l,children:[(0,b.jsx)(A.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{id:"parent-feature",type:"button",role:"combobox","aria-expanded":k,"aria-label":"Parent Feature",disabled:i,"data-testid":"parent-feature-combobox",className:(0,r.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!p&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:p?`${p.name} (${p.id.slice(0,8)})`:j("createDrawer.selectParent")}),(0,b.jsx)(f.ChevronsUpDown,{className:"ms-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(A.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"parent-feature-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(w.Input,{ref:o,placeholder:j("createDrawer.searchFeatures"),value:m,onChange:a=>n(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"parent-feature-search"})}),(0,b.jsxs)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Features",children:[(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":void 0===e,onClick:()=>s(void 0),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",void 0===e&&"bg-accent/50"),"data-testid":"parent-feature-option-none",children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",void 0!==e&&"invisible")}),(0,b.jsx)("span",{className:"text-muted-foreground italic",children:j("createDrawer.noParent")})]}),0===q.length&&m?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm",children:j("createDrawer.noFeaturesFound")}):q.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":e===a.id,onClick:()=>s(a.id),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",e===a.id&&"bg-accent/50"),"data-testid":`parent-feature-option-${a.id}`,children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",e!==a.id&&"invisible")}),(0,b.jsxs)("span",{className:"truncate",children:[a.name," ",(0,b.jsxs)("span",{className:"text-muted-foreground font-mono text-xs",children:["(",a.id.slice(0,8),")"]})]})]},a.id))]})]})})]})}function U({repositories:a,value:e,onChange:h,onAddRepository:i,disabled:m}){let[n,o]=(0,c.useState)(!1),[p,q]=(0,c.useState)(""),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(null),[x,y]=(0,c.useState)(!1),B=(0,c.useRef)(null),{reactFileManager:C}=(0,L.useFeatureFlags)(),{t:D}=(0,d.useTranslation)("web"),E=a.find(a=>a.path===e),F=p.trim()?a.filter(a=>a.name.toLowerCase().includes(p.toLowerCase())||a.path.toLowerCase().includes(p.toLowerCase())):a,G=(0,c.useCallback)(a=>{h(a),o(!1),q("")},[h]),H=(0,c.useCallback)(async a=>{let b=await (0,M.addRepository)({path:a});if(b.error){v(b.error),t(!1);return}if(b.repository){let a={id:b.repository.id,name:b.repository.name,path:b.repository.path};i?.(a),h(a.path),o(!1),q("")}},[i,h]),N=(0,c.useCallback)(async()=>{if(!s){if(C)return void y(!0);t(!0),v(null);try{let a=await (0,J.pickFolder)();if(!a)return void t(!1);await H(a)}catch{y(!0)}finally{t(!1)}}},[s,C,H]),O=(0,c.useCallback)(async a=>{if(y(!1),a){t(!0),v(null);try{await H(a)}catch(a){v(a instanceof Error?a.message:"Failed to add repository")}finally{t(!1)}}},[H]);return(0,c.useEffect)(()=>{n?setTimeout(()=>B.current?.focus(),0):q("")},[n]),(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(A.Popover,{open:n,onOpenChange:o,children:[(0,b.jsx)(A.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{type:"button",role:"combobox","aria-expanded":n,"aria-label":"Repository",disabled:m,"data-testid":"repository-combobox",className:(0,r.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!E&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:E?E.name:"Select repository..."}),(0,b.jsx)(f.ChevronsUpDown,{className:"ms-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(A.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"repository-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(w.Input,{ref:B,placeholder:D("createDrawer.searchRepositories"),value:p,onChange:a=>q(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"repository-search"})}),(0,b.jsx)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Repositories",children:0===F.length?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm","data-testid":"repository-empty",children:"No repositories found."}):F.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":e===a.path,onClick:()=>G(a.path),className:(0,r.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",e===a.path&&"bg-accent/50"),"data-testid":`repository-option-${a.id}`,children:[(0,b.jsx)(g.CheckIcon,{className:(0,r.cn)("h-4 w-4 shrink-0",e!==a.path&&"invisible")}),(0,b.jsxs)("span",{className:"flex flex-col items-start truncate",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5 truncate",children:[a.name,a.isFork?(0,b.jsxs)(z.Badge,{variant:"outline",className:"h-4 shrink-0 px-1 text-[10px]",children:[(0,b.jsx)(l.GitFork,{className:"mr-0.5 h-2.5 w-2.5"}),"Fork"]}):null]}),(0,b.jsx)("span",{className:"text-muted-foreground truncate text-xs",children:a.path})]})]},a.id))}),(0,b.jsx)(I.Separator,{}),(0,b.jsxs)("button",{type:"button",onClick:N,disabled:s,className:"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm","data-testid":"add-repository-item",children:[s?(0,b.jsx)(k.Loader2,{className:"h-4 w-4 shrink-0 animate-spin"}):(0,b.jsx)(j.FolderPlus,{className:"h-4 w-4 shrink-0"}),(0,b.jsx)("span",{children:"Add new repository..."})]}),u?(0,b.jsx)("p",{className:"px-3 pb-2 text-xs text-red-500","data-testid":"add-repository-error",children:u}):null]})})]}),(0,b.jsx)(K.ReactFileManagerDialog,{open:x,onOpenChange:a=>{a||y(!1)},onSelect:O})]})}a.s(["FeatureCreateDrawer",()=>S],382052),a.s([],609803)}];
2
2
 
3
- //# sourceMappingURL=src_presentation_web_dc5ba3cf._.js.map
3
+ //# sourceMappingURL=src_presentation_web_e596fda8._.js.map