@shepai/cli 1.55.3 → 1.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/apis/json-schema/NotificationEventConfig.yaml +20 -0
  2. package/apis/json-schema/NotificationEventType.yaml +4 -0
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +22 -0
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts +3 -1
  6. package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.d.ts +29 -0
  8. package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.js +60 -0
  10. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +31 -0
  11. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.js +70 -0
  13. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  14. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +4 -0
  15. package/dist/packages/core/src/domain/generated/output.d.ts +21 -1
  16. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  17. package/dist/packages/core/src/domain/generated/output.js +4 -0
  18. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/di/container.js +13 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +8 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +18 -0
  25. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +3 -1
  26. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +28 -0
  28. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts +3 -1
  29. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +11 -5
  31. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +4 -0
  33. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +61 -0
  34. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -0
  35. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +286 -0
  36. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +18 -7
  38. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +11 -1
  39. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +63 -0
  41. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/antigravity.json +3 -2
  42. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +5 -0
  43. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +6 -1
  44. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +1 -0
  45. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gemini-cli.json +27 -0
  46. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +18 -0
  47. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +18 -0
  48. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +1 -0
  49. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +1 -0
  50. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +1 -0
  51. package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
  52. package/dist/src/presentation/cli/commands/install.command.js +6 -13
  53. package/dist/src/presentation/cli/commands/tools.command.d.ts +14 -0
  54. package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -0
  55. package/dist/src/presentation/cli/commands/tools.command.js +36 -0
  56. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  57. package/dist/src/presentation/cli/commands/ui.command.js +6 -0
  58. package/dist/src/presentation/cli/index.js +2 -0
  59. package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts +7 -0
  60. package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts.map +1 -0
  61. package/dist/src/presentation/web/app/api/tools/[id]/install/route.js +18 -0
  62. package/dist/src/presentation/web/app/api/tools/[id]/launch/route.d.ts +7 -0
  63. package/dist/src/presentation/web/app/api/tools/[id]/launch/route.d.ts.map +1 -0
  64. package/dist/src/presentation/web/app/api/tools/[id]/launch/route.js +28 -0
  65. package/dist/src/presentation/web/app/api/tools/route.d.ts +3 -0
  66. package/dist/src/presentation/web/app/api/tools/route.d.ts.map +1 -0
  67. package/dist/src/presentation/web/app/api/tools/route.js +13 -0
  68. package/dist/src/presentation/web/app/tools/page.d.ts +4 -0
  69. package/dist/src/presentation/web/app/tools/page.d.ts.map +1 -0
  70. package/dist/src/presentation/web/app/tools/page.js +10 -0
  71. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
  73. package/dist/src/presentation/web/components/features/index.d.ts +3 -0
  74. package/dist/src/presentation/web/components/features/index.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/features/index.js +3 -0
  76. package/dist/src/presentation/web/components/features/tools/index.d.ts +4 -0
  77. package/dist/src/presentation/web/components/features/tools/index.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/features/tools/index.js +3 -0
  79. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts +9 -0
  80. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts.map +1 -0
  81. package/dist/src/presentation/web/components/features/tools/install-instructions.js +19 -0
  82. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts +12 -0
  83. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts.map +1 -0
  84. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.js +77 -0
  85. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts +8 -0
  86. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -0
  87. package/dist/src/presentation/web/components/features/tools/tool-card.js +39 -0
  88. package/dist/src/presentation/web/components/features/tools/tool-card.stories.d.ts +15 -0
  89. package/dist/src/presentation/web/components/features/tools/tool-card.stories.d.ts.map +1 -0
  90. package/dist/src/presentation/web/components/features/tools/tool-card.stories.js +136 -0
  91. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts +7 -0
  92. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -0
  93. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +31 -0
  94. package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.d.ts +13 -0
  95. package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.d.ts.map +1 -0
  96. package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.js +122 -0
  97. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  98. package/dist/src/presentation/web/dev-server.js +11 -0
  99. package/dist/tsconfig.build.tsbuildinfo +1 -1
  100. package/package.json +1 -1
  101. package/web/.next/BUILD_ID +1 -1
  102. package/web/.next/app-path-routes-manifest.json +4 -0
  103. package/web/.next/build-manifest.json +5 -5
  104. package/web/.next/cache/.previewinfo +1 -1
  105. package/web/.next/cache/.rscinfo +1 -1
  106. package/web/.next/cache/.tsbuildinfo +1 -1
  107. package/web/.next/cache/config.json +3 -3
  108. package/web/.next/fallback-build-manifest.json +2 -2
  109. package/web/.next/prerender-manifest.json +3 -3
  110. package/web/.next/required-server-files.js +1 -1
  111. package/web/.next/required-server-files.json +1 -1
  112. package/web/.next/routes-manifest.json +30 -1
  113. package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  114. package/web/.next/server/app/_global-error/page.js +1 -1
  115. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  116. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/_global-error.html +2 -2
  118. package/web/.next/server/app/_global-error.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  125. package/web/.next/server/app/_not-found/page.js +1 -1
  126. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  127. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  129. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  130. package/web/.next/server/app/api/tools/[id]/install/route/app-paths-manifest.json +3 -0
  131. package/web/.next/server/app/api/tools/[id]/install/route/build-manifest.json +11 -0
  132. package/web/.next/server/app/api/tools/[id]/install/route/server-reference-manifest.json +4 -0
  133. package/web/.next/server/app/api/tools/[id]/install/route.js +7 -0
  134. package/web/.next/server/app/api/tools/[id]/install/route.js.map +5 -0
  135. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -0
  136. package/web/.next/server/app/api/tools/[id]/install/route_client-reference-manifest.js +2 -0
  137. package/web/.next/server/app/api/tools/[id]/launch/route/app-paths-manifest.json +3 -0
  138. package/web/.next/server/app/api/tools/[id]/launch/route/build-manifest.json +11 -0
  139. package/web/.next/server/app/api/tools/[id]/launch/route/server-reference-manifest.json +4 -0
  140. package/web/.next/server/app/api/tools/[id]/launch/route.js +7 -0
  141. package/web/.next/server/app/api/tools/[id]/launch/route.js.map +5 -0
  142. package/web/.next/server/app/api/tools/[id]/launch/route.js.nft.json +1 -0
  143. package/web/.next/server/app/api/tools/[id]/launch/route_client-reference-manifest.js +2 -0
  144. package/web/.next/server/app/api/tools/route/app-paths-manifest.json +3 -0
  145. package/web/.next/server/app/api/tools/route/build-manifest.json +11 -0
  146. package/web/.next/server/app/api/tools/route/server-reference-manifest.json +4 -0
  147. package/web/.next/server/app/api/tools/route.js +7 -0
  148. package/web/.next/server/app/api/tools/route.js.map +5 -0
  149. package/web/.next/server/app/api/tools/route.js.nft.json +1 -0
  150. package/web/.next/server/app/api/tools/route_client-reference-manifest.js +2 -0
  151. package/web/.next/server/app/page/build-manifest.json +3 -3
  152. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  153. package/web/.next/server/app/page.js +2 -2
  154. package/web/.next/server/app/page.js.nft.json +1 -1
  155. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/tools/page/app-paths-manifest.json +3 -0
  157. package/web/.next/server/app/tools/page/build-manifest.json +17 -0
  158. package/web/.next/server/app/tools/page/next-font-manifest.json +6 -0
  159. package/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -0
  160. package/web/.next/server/app/tools/page/server-reference-manifest.json +4 -0
  161. package/web/.next/server/app/tools/page.js +15 -0
  162. package/web/.next/server/app/tools/page.js.map +5 -0
  163. package/web/.next/server/app/tools/page.js.nft.json +1 -0
  164. package/web/.next/server/app/tools/page_client-reference-manifest.js +2 -0
  165. package/web/.next/server/app/version/page/build-manifest.json +3 -3
  166. package/web/.next/server/app/version/page.js +2 -2
  167. package/web/.next/server/app/version/page.js.nft.json +1 -1
  168. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app-paths-manifest.json +4 -0
  170. package/web/.next/server/chunks/{403f9_next_435614de._.js → 403f9_next_567de315._.js} +6 -7
  171. package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
  172. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  173. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  174. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_install_route_actions_ad71fb5e.js +3 -0
  175. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_launch_route_actions_0501a9ac.js +3 -0
  176. package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +4 -0
  177. package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js.map +1 -0
  178. package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +3 -0
  179. package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js.map +1 -0
  180. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +3 -0
  181. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -0
  182. package/web/.next/server/chunks/[root-of-the-server]__bb619083._.js +3 -0
  183. package/web/.next/server/chunks/[root-of-the-server]__bb619083._.js.map +1 -0
  184. package/web/.next/server/chunks/src_presentation_web__next-internal_server_app_api_tools_route_actions_b8d6f9a0.js +3 -0
  185. package/web/.next/server/chunks/src_presentation_web__next-internal_server_app_api_tools_route_actions_b8d6f9a0.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +3 -0
  187. package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js +3 -0
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js.map +1 -0
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +12 -0
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/{[root-of-the-server]__32472b89._.js → [root-of-the-server]__685eaa45._.js} +2 -2
  194. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js → server/chunks/ssr/[root-of-the-server]__757c7912._.js} +2 -2
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js +3 -0
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js.map +1 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +3 -0
  198. package/web/.next/server/chunks/ssr/{[root-of-the-server]__d8fbe735._.js.map → [root-of-the-server]__950afd5e._.js.map} +1 -1
  199. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js → server/chunks/ssr/[root-of-the-server]__dbd220d2._.js} +2 -2
  200. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6e8b5181._.js → server/chunks/ssr/[root-of-the-server]__fbc89707._.js} +2 -2
  201. package/web/.next/server/chunks/ssr/_0e2c2b4f._.js +6 -0
  202. package/web/.next/server/chunks/ssr/_0e2c2b4f._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/_2900ed94._.js +3 -0
  204. package/web/.next/server/chunks/ssr/_2900ed94._.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/_ad8a094f._.js +4 -0
  206. package/web/.next/server/chunks/ssr/_ad8a094f._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/_e242b954._.js +3 -0
  208. package/web/.next/server/chunks/ssr/_e242b954._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +3 -0
  210. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js.map +1 -0
  211. package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js +7 -0
  212. package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js +3 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js.map +1 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +3 -0
  218. package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js.map +1 -0
  219. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  221. package/web/.next/server/middleware-build-manifest.js +3 -3
  222. package/web/.next/server/pages/500.html +2 -2
  223. package/web/.next/server/server-reference-manifest.js +1 -1
  224. package/web/.next/server/server-reference-manifest.json +15 -15
  225. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  226. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +4 -0
  227. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +5 -5
  228. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  229. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  230. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +30 -1
  231. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  232. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js +1 -1
  233. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  234. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  235. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  236. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  237. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  238. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  239. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  240. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  241. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  242. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  243. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js +1 -1
  244. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  245. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  246. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  247. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  248. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/app-paths-manifest.json +3 -0
  249. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/build-manifest.json +11 -0
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/server-reference-manifest.json +4 -0
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +7 -0
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.map +5 -0
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -0
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route_client-reference-manifest.js +2 -0
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/app-paths-manifest.json +3 -0
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/build-manifest.json +11 -0
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/server-reference-manifest.json +4 -0
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js +7 -0
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js.map +5 -0
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js.nft.json +1 -0
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route_client-reference-manifest.js +2 -0
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/app-paths-manifest.json +3 -0
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/build-manifest.json +11 -0
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/server-reference-manifest.json +4 -0
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js +7 -0
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js.map +5 -0
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js.nft.json +1 -0
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route_client-reference-manifest.js +2 -0
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +3 -3
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
  272. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/app-paths-manifest.json +3 -0
  275. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +17 -0
  276. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/next-font-manifest.json +6 -0
  277. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -0
  278. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +4 -0
  279. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js +15 -0
  280. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.map +5 -0
  281. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -0
  282. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +2 -0
  283. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +3 -3
  284. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +2 -2
  285. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  286. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  287. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +4 -0
  288. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{403f9_next_435614de._.js → 403f9_next_567de315._.js} +6 -7
  289. package/web/.next/standalone/src/presentation/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  290. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_install_route_actions_ad71fb5e.js +3 -0
  291. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_launch_route_actions_0501a9ac.js +3 -0
  292. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +4 -0
  293. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +3 -0
  294. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +3 -0
  295. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__bb619083._.js +3 -0
  296. package/web/.next/standalone/src/presentation/web/.next/server/chunks/src_presentation_web__next-internal_server_app_api_tools_route_actions_b8d6f9a0.js +3 -0
  297. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +3 -0
  298. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js +3 -0
  299. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
  300. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +12 -0
  301. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__32472b89._.js → [root-of-the-server]__685eaa45._.js} +2 -2
  302. package/web/.next/{server/chunks/ssr/[root-of-the-server]__f47a461b._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__757c7912._.js} +2 -2
  303. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js +3 -0
  304. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +3 -0
  305. package/web/.next/{server/chunks/ssr/[root-of-the-server]__e1c44885._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dbd220d2._.js} +2 -2
  306. package/web/.next/{server/chunks/ssr/[root-of-the-server]__6e8b5181._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js} +2 -2
  307. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e2c2b4f._.js +6 -0
  308. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_2900ed94._.js +3 -0
  309. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ad8a094f._.js +4 -0
  310. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e242b954._.js +3 -0
  311. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +3 -0
  312. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js +7 -0
  313. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js +3 -0
  314. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  315. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +3 -0
  316. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  317. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +3 -3
  318. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  319. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  320. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
  321. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/route.ts +24 -0
  322. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/launch/route.ts +38 -0
  323. package/web/.next/standalone/src/presentation/web/app/api/tools/route.ts +14 -0
  324. package/web/.next/standalone/src/presentation/web/app/tools/page.tsx +17 -0
  325. package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +6 -0
  326. package/web/.next/standalone/src/presentation/web/components/features/index.ts +3 -0
  327. package/web/.next/standalone/src/presentation/web/components/features/tools/index.ts +3 -0
  328. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.stories.tsx +89 -0
  329. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.tsx +109 -0
  330. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.stories.tsx +181 -0
  331. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +188 -0
  332. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.stories.tsx +141 -0
  333. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +100 -0
  334. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +5 -5
  335. package/web/.next/standalone/src/presentation/web/dev-server.ts +15 -0
  336. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  337. package/web/.next/static/chunks/0cd7c513169faee3.js +1 -0
  338. package/web/.next/static/chunks/1887af4ad3781531.js +2 -0
  339. package/web/.next/static/chunks/225de19e886a62ab.js +10 -0
  340. package/web/.next/static/chunks/35f41ba0a6d626d7.js +1 -0
  341. package/web/.next/static/chunks/3d4dcf0be654a331.js +5 -0
  342. package/web/.next/static/chunks/4651f20be1a3b7d7.css +2 -0
  343. package/web/.next/static/chunks/7138c478667158d0.js +1 -0
  344. package/web/.next/static/chunks/a1f2befd62b321c0.js +1 -0
  345. package/web/.next/static/chunks/a9c2b889c8749a94.js +1 -0
  346. package/web/.next/static/chunks/cda11a2491d519fc.js +1 -0
  347. package/web/.next/static/chunks/ef237b70209d9853.js +1 -0
  348. package/web/.next/static/chunks/{turbopack-35ff53de4dab1e56.js → turbopack-6a11f2f1634ff6e0.js} +1 -1
  349. package/web/.next/trace +1 -1
  350. package/web/.next/trace-build +1 -1
  351. package/web/.next/types/link.d.ts +5 -1
  352. package/web/.next/types/routes.d.ts +6 -2
  353. package/web/.next/types/validator.ts +36 -0
  354. package/web/.next/server/chunks/403f9_next_435614de._.js.map +0 -1
  355. package/web/.next/server/chunks/[externals]__ba6223e5._.js +0 -3
  356. package/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +0 -3
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +0 -12
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +0 -3
  360. package/web/.next/server/chunks/ssr/_1632a21f._.js +0 -10
  361. package/web/.next/server/chunks/ssr/_1632a21f._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/_a35f2870._.js +0 -3
  363. package/web/.next/server/chunks/ssr/_a35f2870._.js.map +0 -1
  364. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +0 -3
  365. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js.map +0 -1
  366. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +0 -3
  367. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js.map +0 -1
  368. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[externals]__ba6223e5._.js +0 -3
  369. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +0 -3
  370. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +0 -12
  371. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +0 -3
  372. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_1632a21f._.js +0 -10
  373. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a35f2870._.js +0 -3
  374. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +0 -3
  375. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +0 -3
  376. package/web/.next/static/chunks/00f6ac2dde225eb7.js +0 -1
  377. package/web/.next/static/chunks/084314470f2144d2.js +0 -2
  378. package/web/.next/static/chunks/1f13bc20e938335c.css +0 -2
  379. package/web/.next/static/chunks/8f4461aee9a05741.js +0 -5
  380. package/web/.next/static/chunks/958c51856b8d6ed7.js +0 -10
  381. package/web/.next/static/chunks/9a82d8c76f175235.js +0 -1
  382. package/web/.next/static/chunks/b13aa397579082e7.js +0 -1
  383. package/web/.next/static/chunks/e21d644e5a584136.js +0 -1
  384. package/web/.next/static/chunks/f023fd36b47a5baa.js +0 -1
  385. /package/web/.next/server/chunks/{[externals]__ba6223e5._.js.map → 744ca_web__next-internal_server_app_api_tools_[id]_install_route_actions_ad71fb5e.js.map} +0 -0
  386. /package/web/.next/server/chunks/{ssr/[externals]_node:path_d28a9bfe._.js.map → 744ca_web__next-internal_server_app_api_tools_[id]_launch_route_actions_0501a9ac.js.map} +0 -0
  387. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__32472b89._.js.map → [root-of-the-server]__685eaa45._.js.map} +0 -0
  388. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f47a461b._.js.map → [root-of-the-server]__757c7912._.js.map} +0 -0
  389. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__e1c44885._.js.map → [root-of-the-server]__dbd220d2._.js.map} +0 -0
  390. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__6e8b5181._.js.map → [root-of-the-server]__fbc89707._.js.map} +0 -0
  391. /package/web/.next/static/{cqDB25f0Vxmh-LBw_64mT → V2579MPjpJ_hqKjPsmMlR}/_buildManifest.js +0 -0
  392. /package/web/.next/static/{cqDB25f0Vxmh-LBw_64mT → V2579MPjpJ_hqKjPsmMlR}/_clientMiddlewareManifest.json +0 -0
  393. /package/web/.next/static/{cqDB25f0Vxmh-LBw_64mT → V2579MPjpJ_hqKjPsmMlR}/_ssgManifest.js +0 -0
@@ -0,0 +1,141 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ToolsPageClient } from './tools-page-client';
3
+ import type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
4
+
5
+ const mockTools: ToolItem[] = [
6
+ {
7
+ id: 'cursor',
8
+ name: 'Cursor',
9
+ summary: 'AI-powered code editor built on VS Code',
10
+ description:
11
+ 'Cursor is an AI-first code editor that integrates AI models deeply into the development workflow.',
12
+ tags: ['ide'],
13
+ iconUrl: 'https://cdn.simpleicons.org/cursor',
14
+ autoInstall: false,
15
+ required: false,
16
+ openDirectory: '/usr/bin/cursor',
17
+ documentationUrl: 'https://cursor.sh',
18
+ installCommand: 'brew install --cask cursor',
19
+ status: { status: 'available', toolName: 'cursor' },
20
+ },
21
+ {
22
+ id: 'vscode',
23
+ name: 'VS Code',
24
+ summary: 'Lightweight but powerful source code editor',
25
+ description:
26
+ 'Visual Studio Code is a lightweight but powerful source code editor from Microsoft with support for debugging, Git, syntax highlighting, and intelligent code completion.',
27
+ tags: ['ide'],
28
+ iconUrl: 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vscode/vscode-original.svg',
29
+ autoInstall: false,
30
+ required: false,
31
+ openDirectory: '/usr/bin/code',
32
+ documentationUrl: 'https://code.visualstudio.com',
33
+ installCommand: 'brew install --cask visual-studio-code',
34
+ status: { status: 'missing', toolName: 'vscode' },
35
+ },
36
+ {
37
+ id: 'claude-code',
38
+ name: 'Claude Code',
39
+ summary: 'Anthropic AI coding agent for the terminal',
40
+ description:
41
+ 'Claude Code is an agentic coding tool by Anthropic that lives in your terminal, understands your codebase, and helps you ship features faster.',
42
+ tags: ['cli-agent'],
43
+ iconUrl: 'https://cdn.simpleicons.org/claude',
44
+ autoInstall: true,
45
+ required: false,
46
+ openDirectory: undefined,
47
+ documentationUrl: 'https://claude.ai/code',
48
+ installCommand: 'npm install -g @anthropic-ai/claude-code',
49
+ status: { status: 'available', toolName: 'claude-code' },
50
+ },
51
+ {
52
+ id: 'aider',
53
+ name: 'Aider',
54
+ summary: 'AI pair programming in your terminal',
55
+ description:
56
+ 'Aider lets you pair program with LLMs to edit code in your local git repository. It works best with Claude 3.5 Sonnet and GPT-4o.',
57
+ tags: ['cli-agent'],
58
+ iconUrl: undefined,
59
+ autoInstall: true,
60
+ required: false,
61
+ openDirectory: undefined,
62
+ documentationUrl: 'https://aider.chat',
63
+ installCommand: 'pip install aider-chat',
64
+ status: { status: 'missing', toolName: 'aider' },
65
+ },
66
+ {
67
+ id: 'goose',
68
+ name: 'Goose',
69
+ summary: 'Open-source AI coding agent by Block',
70
+ description:
71
+ 'Goose is a developer agent by Block that autonomously handles complex engineering tasks through conversation and code execution.',
72
+ tags: ['cli-agent'],
73
+ iconUrl: undefined,
74
+ autoInstall: true,
75
+ required: false,
76
+ openDirectory: undefined,
77
+ documentationUrl: 'https://block.github.io/goose',
78
+ installCommand: 'pip install goose-ai',
79
+ status: { status: 'missing', toolName: 'goose' },
80
+ },
81
+ ];
82
+
83
+ const ideOnlyTools = mockTools.filter((t) => t.tags.includes('ide'));
84
+ const cliOnlyTools = mockTools.filter((t) => t.tags.includes('cli-agent'));
85
+
86
+ const meta: Meta<typeof ToolsPageClient> = {
87
+ title: 'Features/ToolsPageClient',
88
+ component: ToolsPageClient,
89
+ parameters: {
90
+ layout: 'padded',
91
+ },
92
+ tags: ['autodocs'],
93
+ };
94
+
95
+ export default meta;
96
+ type Story = StoryObj<typeof meta>;
97
+
98
+ export const Default: Story = {
99
+ args: {
100
+ tools: mockTools,
101
+ },
102
+ };
103
+
104
+ export const AllToolsMix: Story = {
105
+ args: {
106
+ tools: mockTools,
107
+ },
108
+ };
109
+
110
+ export const IDEsOnly: Story = {
111
+ args: {
112
+ tools: ideOnlyTools,
113
+ },
114
+ };
115
+
116
+ export const CLIAgentsOnly: Story = {
117
+ args: {
118
+ tools: cliOnlyTools,
119
+ },
120
+ };
121
+
122
+ export const EmptyList: Story = {
123
+ args: {
124
+ tools: [],
125
+ },
126
+ };
127
+
128
+ export const AllInstalled: Story = {
129
+ args: {
130
+ tools: mockTools.map((t) => ({
131
+ ...t,
132
+ status: { status: 'available' as const, toolName: t.id },
133
+ })),
134
+ },
135
+ };
136
+
137
+ export const NoneInstalled: Story = {
138
+ args: {
139
+ tools: mockTools.map((t) => ({ ...t, status: { status: 'missing' as const, toolName: t.id } })),
140
+ },
141
+ };
@@ -0,0 +1,100 @@
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { Wrench } from 'lucide-react';
5
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
6
+ import { cn } from '@/lib/utils';
7
+ import { ToolCard } from './tool-card';
8
+ import type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
9
+
10
+ export interface ToolsPageClientProps {
11
+ tools: ToolItem[];
12
+ className?: string;
13
+ }
14
+
15
+ type TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs';
16
+
17
+ const TAB_FILTER: Record<TabValue, (tool: ToolItem) => boolean> = {
18
+ all: () => true,
19
+ ide: (tool) => tool.tags.includes('ide'),
20
+ 'cli-agent': (tool) => tool.tags.includes('cli-agent'),
21
+ vcs: (tool) => tool.tags.includes('vcs'),
22
+ };
23
+
24
+ export function ToolsPageClient({ tools: initialTools, className }: ToolsPageClientProps) {
25
+ const [tools, setTools] = useState<ToolItem[]>(initialTools);
26
+ const [activeTab, setActiveTab] = useState<TabValue>('all');
27
+
28
+ async function refreshTools() {
29
+ try {
30
+ const res = await fetch('/api/tools');
31
+ if (res.ok) {
32
+ const updated = (await res.json()) as ToolItem[];
33
+ setTools(updated);
34
+ }
35
+ } catch {
36
+ // Silently ignore refresh errors; user can re-navigate to refresh
37
+ }
38
+ }
39
+
40
+ const filtered = tools.filter(TAB_FILTER[activeTab]);
41
+
42
+ return (
43
+ <div data-testid="tools-page-client" className={cn('space-y-4', className)}>
44
+ {/* Compact header */}
45
+ <div className="flex items-center gap-2">
46
+ <Wrench className="text-muted-foreground h-4 w-4" />
47
+ <h1 className="text-sm font-bold tracking-tight">Tools</h1>
48
+ <span className="text-muted-foreground text-[10px]">
49
+ {tools.filter((t) => t.status.status === 'available').length}/{tools.length} installed
50
+ </span>
51
+ </div>
52
+
53
+ <Tabs
54
+ value={activeTab}
55
+ onValueChange={(value) => setActiveTab(value as TabValue)}
56
+ data-testid="tools-page-tabs"
57
+ >
58
+ <TabsList className="h-7">
59
+ <TabsTrigger value="all" data-testid="tools-tab-all" className="px-2.5 text-xs">
60
+ All
61
+ </TabsTrigger>
62
+ <TabsTrigger value="ide" data-testid="tools-tab-ide" className="px-2.5 text-xs">
63
+ IDEs
64
+ </TabsTrigger>
65
+ <TabsTrigger
66
+ value="cli-agent"
67
+ data-testid="tools-tab-cli-agent"
68
+ className="px-2.5 text-xs"
69
+ >
70
+ CLI Agents
71
+ </TabsTrigger>
72
+ <TabsTrigger value="vcs" data-testid="tools-tab-vcs" className="px-2.5 text-xs">
73
+ Version Control
74
+ </TabsTrigger>
75
+ </TabsList>
76
+
77
+ <TabsContent value={activeTab} className="mt-3">
78
+ {filtered.length === 0 ? (
79
+ <div
80
+ data-testid="tools-page-empty"
81
+ className="text-muted-foreground flex flex-col items-center justify-center py-12 text-center"
82
+ >
83
+ <Wrench className="mb-2 h-6 w-6 opacity-20" />
84
+ <p className="text-xs">No tools in this category.</p>
85
+ </div>
86
+ ) : (
87
+ <div
88
+ data-testid="tools-page-grid"
89
+ className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
90
+ >
91
+ {filtered.map((tool) => (
92
+ <ToolCard key={tool.id} tool={tool} onRefresh={refreshTools} />
93
+ ))}
94
+ </div>
95
+ )}
96
+ </TabsContent>
97
+ </Tabs>
98
+ </div>
99
+ );
100
+ }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { usePathname } from 'next/navigation';
4
- import { Home, Brain, Plus } from 'lucide-react';
4
+ import { Home, Wrench, Plus } from 'lucide-react';
5
5
  import {
6
6
  Sidebar,
7
7
  SidebarHeader,
@@ -82,10 +82,10 @@ export function AppSidebar({
82
82
 
83
83
  <SidebarNavItem icon={Home} label="Control Center" href="/" active={pathname === '/'} />
84
84
  <SidebarNavItem
85
- icon={Brain}
86
- label="Memory"
87
- href="/memory"
88
- active={pathname === '/memory'}
85
+ icon={Wrench}
86
+ label="Tools"
87
+ href="/tools"
88
+ active={pathname === '/tools'}
89
89
  />
90
90
  </SidebarMenu>
91
91
  </SidebarHeader>
@@ -28,6 +28,11 @@ import {
28
28
  initializeNotificationWatcher,
29
29
  getNotificationWatcher,
30
30
  } from '@/infrastructure/services/notifications/notification-watcher.service.js';
31
+ import type { IGitPrService } from '@/application/ports/output/services/git-pr-service.interface.js';
32
+ import {
33
+ initializePrSyncWatcher,
34
+ getPrSyncWatcher,
35
+ } from '@/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
31
36
 
32
37
  const DEFAULT_PORT = 3000;
33
38
 
@@ -78,6 +83,11 @@ async function main() {
78
83
  const notificationService = container.resolve<INotificationService>('INotificationService');
79
84
  initializeNotificationWatcher(runRepo, phaseTimingRepo, featureRepo, notificationService);
80
85
  getNotificationWatcher().start();
86
+
87
+ // Start PR sync watcher to detect PR/CI status transitions on GitHub
88
+ const gitPrService = container.resolve<IGitPrService>('IGitPrService');
89
+ initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService);
90
+ getPrSyncWatcher().start();
81
91
  } catch (error) {
82
92
  console.warn('[dev-server] DI initialization failed — features will be empty:', error);
83
93
  }
@@ -125,6 +135,11 @@ async function main() {
125
135
  } catch {
126
136
  /* not initialized */
127
137
  }
138
+ try {
139
+ getPrSyncWatcher().stop();
140
+ } catch {
141
+ /* not initialized */
142
+ }
128
143
  server.closeAllConnections();
129
144
  await Promise.all([
130
145
  new Promise<void>((resolve) => server.close(() => resolve())),
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
15
15
  const hostname = process.env.HOSTNAME || '0.0.0.0'
16
16
 
17
17
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
18
- const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.55.2","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
18
+ const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.56.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
19
19
 
20
20
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
21
21
 
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,68304,e=>{"use strict";var t=e.i(20314),r=e.i(79054),s=e.i(91967),i=e.i(22528),n=e.i(51080),a=e.i(85995),l=e.i(87620),o=e.i(66033),c=e.i(36589),d=e.i(13123),u="Tabs",[f,h]=(0,i.createContextScope)(u,[n.createRovingFocusGroupScope]),p=(0,n.createRovingFocusGroupScope)(),[m,v]=f(u),x=r.forwardRef((e,r)=>{let{__scopeTabs:s,value:i,onValueChange:n,defaultValue:a,orientation:f="horizontal",dir:h,activationMode:p="automatic",...v}=e,x=(0,o.useDirection)(h),[g,y]=(0,c.useControllableState)({prop:i,onChange:n,defaultProp:a??"",caller:u});return(0,t.jsx)(m,{scope:s,baseId:(0,d.useId)(),value:g,onValueChange:y,orientation:f,dir:x,activationMode:p,children:(0,t.jsx)(l.Primitive.div,{dir:x,"data-orientation":f,...v,ref:r})})});x.displayName=u;var g="TabsList",y=r.forwardRef((e,r)=>{let{__scopeTabs:s,loop:i=!0,...a}=e,o=v(g,s),c=p(s);return(0,t.jsx)(n.Root,{asChild:!0,...c,orientation:o.orientation,dir:o.dir,loop:i,children:(0,t.jsx)(l.Primitive.div,{role:"tablist","aria-orientation":o.orientation,...a,ref:r})})});y.displayName=g;var b="TabsTrigger",j=r.forwardRef((e,r)=>{let{__scopeTabs:i,value:a,disabled:o=!1,...c}=e,d=v(b,i),u=p(i),f=C(d.baseId,a),h=N(d.baseId,a),m=a===d.value;return(0,t.jsx)(n.Item,{asChild:!0,...u,focusable:!o,active:m,children:(0,t.jsx)(l.Primitive.button,{type:"button",role:"tab","aria-selected":m,"aria-controls":h,"data-state":m?"active":"inactive","data-disabled":o?"":void 0,disabled:o,id:f,...c,ref:r,onMouseDown:(0,s.composeEventHandlers)(e.onMouseDown,e=>{o||0!==e.button||!1!==e.ctrlKey?e.preventDefault():d.onValueChange(a)}),onKeyDown:(0,s.composeEventHandlers)(e.onKeyDown,e=>{[" ","Enter"].includes(e.key)&&d.onValueChange(a)}),onFocus:(0,s.composeEventHandlers)(e.onFocus,()=>{let e="manual"!==d.activationMode;m||o||!e||d.onValueChange(a)})})})});j.displayName=b;var w="TabsContent",R=r.forwardRef((e,s)=>{let{__scopeTabs:i,value:n,forceMount:o,children:c,...d}=e,u=v(w,i),f=C(u.baseId,n),h=N(u.baseId,n),p=n===u.value,m=r.useRef(p);return r.useEffect(()=>{let e=requestAnimationFrame(()=>m.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,t.jsx)(a.Presence,{present:o||p,children:({present:r})=>(0,t.jsx)(l.Primitive.div,{"data-state":p?"active":"inactive","data-orientation":u.orientation,role:"tabpanel","aria-labelledby":f,hidden:!r,id:h,tabIndex:0,...d,ref:s,style:{...e.style,animationDuration:m.current?"0s":void 0},children:r&&c})})});function C(e,t){return`${e}-trigger-${t}`}function N(e,t){return`${e}-content-${t}`}R.displayName=w,e.s(["Content",()=>R,"List",()=>y,"Root",()=>x,"Tabs",()=>x,"TabsContent",()=>R,"TabsList",()=>y,"TabsTrigger",()=>j,"Trigger",()=>j,"createTabsScope",()=>h],43133);var T=e.i(43133),T=T,k=e.i(31777);let A=T.Root,I=r.forwardRef(({className:e,...r},s)=>(0,t.jsx)(T.List,{ref:s,className:(0,k.cn)("bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1",e),...r}));I.displayName=T.List.displayName;let S=r.forwardRef(({className:e,...r},s)=>(0,t.jsx)(T.Trigger,{ref:s,className:(0,k.cn)("ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center rounded-md px-3 py-1 text-sm font-medium whitespace-nowrap transition-all focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow",e),...r}));S.displayName=T.Trigger.displayName;let F=r.forwardRef(({className:e,...r},s)=>(0,t.jsx)(T.Content,{ref:s,className:(0,k.cn)("ring-offset-background focus-visible:ring-ring mt-2 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none",e),...r}));F.displayName=T.Content.displayName,e.s(["Tabs",()=>A,"TabsContent",()=>F,"TabsList",()=>I,"TabsTrigger",()=>S],68304)},51080,87342,e=>{"use strict";var t=e.i(79054),r=e.i(91967),s=e.i(22528),i=e.i(5978),n=e.i(86874),a=e.i(20314);function l(e){let r=e+"CollectionProvider",[l,o]=(0,s.createContextScope)(r),[c,d]=l(r,{collectionRef:{current:null},itemMap:new Map}),u=e=>{let{scope:r,children:s}=e,i=t.default.useRef(null),n=t.default.useRef(new Map).current;return(0,a.jsx)(c,{scope:r,itemMap:n,collectionRef:i,children:s})};u.displayName=r;let f=e+"CollectionSlot",h=(0,n.createSlot)(f),p=t.default.forwardRef((e,t)=>{let{scope:r,children:s}=e,n=d(f,r),l=(0,i.useComposedRefs)(t,n.collectionRef);return(0,a.jsx)(h,{ref:l,children:s})});p.displayName=f;let m=e+"CollectionItemSlot",v="data-radix-collection-item",x=(0,n.createSlot)(m),g=t.default.forwardRef((e,r)=>{let{scope:s,children:n,...l}=e,o=t.default.useRef(null),c=(0,i.useComposedRefs)(r,o),u=d(m,s);return t.default.useEffect(()=>(u.itemMap.set(o,{ref:o,...l}),()=>void u.itemMap.delete(o))),(0,a.jsx)(x,{...{[v]:""},ref:c,children:n})});return g.displayName=m,[{Provider:u,Slot:p,ItemSlot:g},function(r){let s=d(e+"CollectionConsumer",r);return t.default.useCallback(()=>{let e=s.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${v}]`));return Array.from(s.itemMap.values()).sort((e,r)=>t.indexOf(e.ref.current)-t.indexOf(r.ref.current))},[s.collectionRef,s.itemMap])},o]}var o=new WeakMap;function c(e,t){var r,s;let i,n,a;if("at"in Array.prototype)return Array.prototype.at.call(e,t);let l=(r=e,s=t,i=r.length,(a=(n=d(s))>=0?n:i+n)<0||a>=i?-1:a);return -1===l?void 0:e[l]}function d(e){return e!=e||0===e?0:Math.trunc(e)}(class e extends Map{#e;constructor(e){super(e),this.#e=[...super.keys()],o.set(this,!0)}set(e,t){return o.get(this)&&(this.has(e)?this.#e[this.#e.indexOf(e)]=e:this.#e.push(e)),super.set(e,t),this}insert(e,t,r){let s,i=this.has(t),n=this.#e.length,a=d(e),l=a>=0?a:n+a,o=l<0||l>=n?-1:l;if(o===this.size||i&&o===this.size-1||-1===o)return this.set(t,r),this;let c=this.size+ +!i;a<0&&l++;let u=[...this.#e],f=!1;for(let e=l;e<c;e++)if(l===e){let n=u[e];u[e]===t&&(n=u[e+1]),i&&this.delete(t),s=this.get(n),this.set(t,r)}else{f||u[e-1]!==t||(f=!0);let r=u[f?e:e-1],i=s;s=this.get(r),this.delete(r),this.set(r,i)}return this}with(t,r,s){let i=new e(this);return i.insert(t,r,s),i}before(e){let t=this.#e.indexOf(e)-1;if(!(t<0))return this.entryAt(t)}setBefore(e,t,r){let s=this.#e.indexOf(e);return -1===s?this:this.insert(s,t,r)}after(e){let t=this.#e.indexOf(e);if(-1!==(t=-1===t||t===this.size-1?-1:t+1))return this.entryAt(t)}setAfter(e,t,r){let s=this.#e.indexOf(e);return -1===s?this:this.insert(s+1,t,r)}first(){return this.entryAt(0)}last(){return this.entryAt(-1)}clear(){return this.#e=[],super.clear()}delete(e){let t=super.delete(e);return t&&this.#e.splice(this.#e.indexOf(e),1),t}deleteAt(e){let t=this.keyAt(e);return void 0!==t&&this.delete(t)}at(e){let t=c(this.#e,e);if(void 0!==t)return this.get(t)}entryAt(e){let t=c(this.#e,e);if(void 0!==t)return[t,this.get(t)]}indexOf(e){return this.#e.indexOf(e)}keyAt(e){return c(this.#e,e)}from(e,t){let r=this.indexOf(e);if(-1===r)return;let s=r+t;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.at(s)}keyFrom(e,t){let r=this.indexOf(e);if(-1===r)return;let s=r+t;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.keyAt(s)}find(e,t){let r=0;for(let s of this){if(Reflect.apply(e,t,[s,r,this]))return s;r++}}findIndex(e,t){let r=0;for(let s of this){if(Reflect.apply(e,t,[s,r,this]))return r;r++}return -1}filter(t,r){let s=[],i=0;for(let e of this)Reflect.apply(t,r,[e,i,this])&&s.push(e),i++;return new e(s)}map(t,r){let s=[],i=0;for(let e of this)s.push([e[0],Reflect.apply(t,r,[e,i,this])]),i++;return new e(s)}reduce(...e){let[t,r]=e,s=0,i=r??this.at(0);for(let r of this)i=0===s&&1===e.length?r:Reflect.apply(t,this,[i,r,s,this]),s++;return i}reduceRight(...e){let[t,r]=e,s=r??this.at(-1);for(let r=this.size-1;r>=0;r--){let i=this.at(r);s=r===this.size-1&&1===e.length?i:Reflect.apply(t,this,[s,i,r,this])}return s}toSorted(t){return new e([...this.entries()].sort(t))}toReversed(){let t=new e;for(let e=this.size-1;e>=0;e--){let r=this.keyAt(e),s=this.get(r);t.set(r,s)}return t}toSpliced(...t){let r=[...this.entries()];return r.splice(...t),new e(r)}slice(t,r){let s=new e,i=this.size-1;if(void 0===t)return s;t<0&&(t+=this.size),void 0!==r&&r>0&&(i=r-1);for(let e=t;e<=i;e++){let t=this.keyAt(e),r=this.get(t);s.set(t,r)}return s}every(e,t){let r=0;for(let s of this){if(!Reflect.apply(e,t,[s,r,this]))return!1;r++}return!0}some(e,t){let r=0;for(let s of this){if(Reflect.apply(e,t,[s,r,this]))return!0;r++}return!1}}),e.s(["createCollection",()=>l],87342);var u=e.i(13123),f=e.i(87620),h=e.i(29297),p=e.i(36589),m=e.i(66033),v="rovingFocusGroup.onEntryFocus",x={bubbles:!1,cancelable:!0},g="RovingFocusGroup",[y,b,j]=l(g),[w,R]=(0,s.createContextScope)(g,[j]),[C,N]=w(g),T=t.forwardRef((e,t)=>(0,a.jsx)(y.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,a.jsx)(y.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,a.jsx)(k,{...e,ref:t})})}));T.displayName=g;var k=t.forwardRef((e,s)=>{let{__scopeRovingFocusGroup:n,orientation:l,loop:o=!1,dir:c,currentTabStopId:d,defaultCurrentTabStopId:u,onCurrentTabStopIdChange:y,onEntryFocus:j,preventScrollOnEntryFocus:w=!1,...R}=e,N=t.useRef(null),T=(0,i.useComposedRefs)(s,N),k=(0,m.useDirection)(c),[A,I]=(0,p.useControllableState)({prop:d,defaultProp:u??null,onChange:y,caller:g}),[S,D]=t.useState(!1),E=(0,h.useCallbackRef)(j),P=b(n),M=t.useRef(!1),[L,B]=t.useState(0);return t.useEffect(()=>{let e=N.current;if(e)return e.addEventListener(v,E),()=>e.removeEventListener(v,E)},[E]),(0,a.jsx)(C,{scope:n,orientation:l,dir:k,loop:o,currentTabStopId:A,onItemFocus:t.useCallback(e=>I(e),[I]),onItemShiftTab:t.useCallback(()=>D(!0),[]),onFocusableItemAdd:t.useCallback(()=>B(e=>e+1),[]),onFocusableItemRemove:t.useCallback(()=>B(e=>e-1),[]),children:(0,a.jsx)(f.Primitive.div,{tabIndex:S||0===L?-1:0,"data-orientation":l,...R,ref:T,style:{outline:"none",...e.style},onMouseDown:(0,r.composeEventHandlers)(e.onMouseDown,()=>{M.current=!0}),onFocus:(0,r.composeEventHandlers)(e.onFocus,e=>{let t=!M.current;if(e.target===e.currentTarget&&t&&!S){let t=new CustomEvent(v,x);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=P().filter(e=>e.focusable);F([e.find(e=>e.active),e.find(e=>e.id===A),...e].filter(Boolean).map(e=>e.ref.current),w)}}M.current=!1}),onBlur:(0,r.composeEventHandlers)(e.onBlur,()=>D(!1))})})}),A="RovingFocusGroupItem",I=t.forwardRef((e,s)=>{let{__scopeRovingFocusGroup:i,focusable:n=!0,active:l=!1,tabStopId:o,children:c,...d}=e,h=(0,u.useId)(),p=o||h,m=N(A,i),v=m.currentTabStopId===p,x=b(i),{onFocusableItemAdd:g,onFocusableItemRemove:j,currentTabStopId:w}=m;return t.useEffect(()=>{if(n)return g(),()=>j()},[n,g,j]),(0,a.jsx)(y.ItemSlot,{scope:i,id:p,focusable:n,active:l,children:(0,a.jsx)(f.Primitive.span,{tabIndex:v?0:-1,"data-orientation":m.orientation,...d,ref:s,onMouseDown:(0,r.composeEventHandlers)(e.onMouseDown,e=>{n?m.onItemFocus(p):e.preventDefault()}),onFocus:(0,r.composeEventHandlers)(e.onFocus,()=>m.onItemFocus(p)),onKeyDown:(0,r.composeEventHandlers)(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey)return void m.onItemShiftTab();if(e.target!==e.currentTarget)return;let t=function(e,t,r){var s;let i=(s=e.key,"rtl"!==r?s:"ArrowLeft"===s?"ArrowRight":"ArrowRight"===s?"ArrowLeft":s);if(!("vertical"===t&&["ArrowLeft","ArrowRight"].includes(i))&&!("horizontal"===t&&["ArrowUp","ArrowDown"].includes(i)))return S[i]}(e,m.orientation,m.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let i=x().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)i.reverse();else if("prev"===t||"next"===t){var r,s;"prev"===t&&i.reverse();let n=i.indexOf(e.currentTarget);i=m.loop?(r=i,s=n+1,r.map((e,t)=>r[(s+t)%r.length])):i.slice(n+1)}setTimeout(()=>F(i))}}),children:"function"==typeof c?c({isCurrentTabStop:v,hasTabStop:null!=w}):c})})});I.displayName=A;var S={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function F(e,t=!1){let r=document.activeElement;for(let s of e)if(s===r||(s.focus({preventScroll:t}),document.activeElement!==r))return}e.s(["Item",()=>I,"Root",()=>T,"createRovingFocusGroupScope",()=>R],51080)},81846,e=>{"use strict";var t=e.i(20314),r=e.i(94237),s=e.i(31777);let i=(0,r.cva)("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-none",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function n({className:e,variant:r,...n}){return(0,t.jsx)("div",{className:(0,s.cn)(i({variant:r}),e),...n})}e.s(["Badge",()=>n])},1699,e=>{"use strict";var t=e.i(20314),r=e.i(24035),s=e.i(79054),i=e.i(31777);let n=s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("bg-card text-card-foreground rounded-xl border shadow",e),...r}));n.displayName="Card";let a=s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("flex flex-col space-y-1.5 p-6",e),...r}));a.displayName="CardHeader";let l=s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("leading-none font-semibold tracking-tight",e),...r}));l.displayName="CardTitle";let o=s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("text-muted-foreground text-sm",e),...r}));o.displayName="CardDescription";let c=s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("p-6 pt-0",e),...r}));c.displayName="CardContent",s.forwardRef(({className:e,...r},s)=>(0,t.jsx)("div",{ref:s,className:(0,i.cn)("flex items-center p-6 pt-0",e),...r})).displayName="CardFooter";var d=e.i(81846),u=e.i(35364),f=e.i(68304);function h({label:e,value:r,badge:s,badgeVariant:i="secondary"}){return(0,t.jsxs)("div",{className:"flex items-center justify-between py-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground text-sm",children:e}),s?(0,t.jsx)(d.Badge,{variant:i,children:r}):(0,t.jsx)("span",{className:"font-mono text-sm",children:r})]})}function p({versionInfo:e,systemInfo:s}){return(0,t.jsx)("div",{className:"flex flex-col items-center justify-center p-4",children:(0,t.jsxs)("div",{className:"w-full max-w-2xl space-y-6",children:[(0,t.jsxs)("div",{className:"text-center",children:[(0,t.jsx)("h1",{className:"text-3xl font-bold tracking-tight",children:e.name}),(0,t.jsx)("p",{className:"text-muted-foreground mt-2",children:e.description}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsxs)(d.Badge,{variant:"default","data-testid":"version-badge",children:["v",e.version]})})]}),(0,t.jsxs)(f.Tabs,{defaultValue:"overview",className:"w-full",children:[(0,t.jsxs)(f.TabsList,{className:"grid w-full grid-cols-3",children:[(0,t.jsx)(f.TabsTrigger,{value:"overview",children:"Overview"}),(0,t.jsx)(f.TabsTrigger,{value:"system",children:"System"}),(0,t.jsx)(f.TabsTrigger,{value:"features",children:"Features"})]}),(0,t.jsx)(f.TabsContent,{value:"overview",children:(0,t.jsxs)(n,{children:[(0,t.jsxs)(a,{children:[(0,t.jsx)(l,{children:"Package Information"}),(0,t.jsx)(o,{children:"Details about the Shep AI CLI package"})]}),(0,t.jsxs)(c,{className:"space-y-1",children:[(0,t.jsx)(h,{label:"Package",value:e.name}),(0,t.jsx)(h,{label:"Version",value:`v${e.version}`,badge:!0,badgeVariant:"default"}),(0,t.jsx)(h,{label:"License",value:"MIT",badge:!0,badgeVariant:"outline"}),(0,t.jsx)(h,{label:"Author",value:"Shep AI"})]})]})}),(0,t.jsx)(f.TabsContent,{value:"system",children:(0,t.jsxs)(n,{children:[(0,t.jsxs)(a,{children:[(0,t.jsx)(l,{children:"System Information"}),(0,t.jsx)(o,{children:"Runtime environment details"})]}),(0,t.jsxs)(c,{className:"space-y-1",children:[(0,t.jsx)(h,{label:"Node.js",value:s.nodeVersion,badge:!0,badgeVariant:"secondary"}),(0,t.jsx)(h,{label:"Platform",value:`${s.platform} ${s.arch}`})]})]})}),(0,t.jsx)(f.TabsContent,{value:"features",children:(0,t.jsxs)(n,{children:[(0,t.jsxs)(a,{children:[(0,t.jsx)(l,{children:"Key Features"}),(0,t.jsx)(o,{children:"What Shep AI can do for you"})]}),(0,t.jsx)(c,{children:(0,t.jsxs)("ul",{className:"space-y-2 text-sm",children:[(0,t.jsxs)("li",{className:"flex items-center gap-2",children:[(0,t.jsx)(d.Badge,{variant:"outline",children:"AI"}),(0,t.jsx)("span",{children:"Autonomous code generation"})]}),(0,t.jsxs)("li",{className:"flex items-center gap-2",children:[(0,t.jsx)(d.Badge,{variant:"outline",children:"SDLC"}),(0,t.jsx)("span",{children:"Full development lifecycle automation"})]}),(0,t.jsxs)("li",{className:"flex items-center gap-2",children:[(0,t.jsx)(d.Badge,{variant:"outline",children:"CLI"}),(0,t.jsx)("span",{children:"Powerful command-line interface"})]}),(0,t.jsxs)("li",{className:"flex items-center gap-2",children:[(0,t.jsx)(d.Badge,{variant:"outline",children:"Web"}),(0,t.jsx)("span",{children:"Modern web UI dashboard"})]})]})})]})})]}),(0,t.jsxs)("div",{className:"flex justify-center gap-4",children:[(0,t.jsx)(u.Button,{asChild:!0,variant:"outline",children:(0,t.jsx)(r.default,{href:"/",children:"Back to Home"})}),(0,t.jsx)(u.Button,{asChild:!0,children:(0,t.jsx)("a",{href:"https://github.com/shep-ai/cli",target:"_blank",rel:"noopener noreferrer",children:"View on GitHub"})})]})]})})}e.s(["default",()=>p],1699)}]);