@shepai/cli 1.55.2 → 1.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts +3 -1
- package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.d.ts +29 -0
- package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/tools/launch-tool.use-case.js +60 -0
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +31 -0
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.js +70 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +13 -0
- package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts +3 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +11 -5
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +18 -7
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +11 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +63 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/antigravity.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +5 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +6 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +1 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gemini-cli.json +27 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +1 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +1 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +1 -0
- package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/install.command.js +6 -13
- package/dist/src/presentation/cli/commands/tools.command.d.ts +14 -0
- package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/tools.command.js +36 -0
- package/dist/src/presentation/cli/index.js +2 -0
- package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-folder.js +17 -17
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-shell.js +17 -17
- package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts +7 -0
- package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/tools/[id]/install/route.js +18 -0
- package/dist/src/presentation/web/app/api/tools/[id]/launch/route.d.ts +7 -0
- package/dist/src/presentation/web/app/api/tools/[id]/launch/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/tools/[id]/launch/route.js +28 -0
- package/dist/src/presentation/web/app/api/tools/route.d.ts +3 -0
- package/dist/src/presentation/web/app/api/tools/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/tools/route.js +13 -0
- package/dist/src/presentation/web/app/tools/page.d.ts +4 -0
- package/dist/src/presentation/web/app/tools/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/tools/page.js +10 -0
- package/dist/src/presentation/web/components/features/index.d.ts +3 -0
- package/dist/src/presentation/web/components/features/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/index.js +3 -0
- package/dist/src/presentation/web/components/features/tools/index.d.ts +4 -0
- package/dist/src/presentation/web/components/features/tools/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/index.js +3 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts +9 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.js +19 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/install-instructions.stories.js +77 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.d.ts +8 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.js +39 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.stories.d.ts +15 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.stories.js +136 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts +7 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.js +31 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.d.ts +13 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.js +122 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +4 -0
- package/web/.next/build-manifest.json +5 -5
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +30 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
- package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/server/app/api/tools/[id]/install/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/tools/[id]/install/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/tools/[id]/install/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/tools/[id]/install/route.js +7 -0
- package/web/.next/server/app/api/tools/[id]/install/route.js.map +5 -0
- package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -0
- package/web/.next/server/app/api/tools/[id]/install/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/tools/[id]/launch/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/tools/[id]/launch/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/tools/[id]/launch/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/tools/[id]/launch/route.js +7 -0
- package/web/.next/server/app/api/tools/[id]/launch/route.js.map +5 -0
- package/web/.next/server/app/api/tools/[id]/launch/route.js.nft.json +1 -0
- package/web/.next/server/app/api/tools/[id]/launch/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/tools/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/tools/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/tools/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/tools/route.js +7 -0
- package/web/.next/server/app/api/tools/route.js.map +5 -0
- package/web/.next/server/app/api/tools/route.js.nft.json +1 -0
- package/web/.next/server/app/api/tools/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/page/build-manifest.json +3 -3
- package/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/page.js +2 -2
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/tools/page/build-manifest.json +17 -0
- package/web/.next/server/app/tools/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/tools/page/server-reference-manifest.json +4 -0
- package/web/.next/server/app/tools/page.js +15 -0
- package/web/.next/server/app/tools/page.js.map +5 -0
- package/web/.next/server/app/tools/page.js.nft.json +1 -0
- package/web/.next/server/app/tools/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/server/app/version/page.js +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +4 -0
- package/web/.next/server/chunks/{403f9_next_435614de._.js → 403f9_next_567de315._.js} +6 -7
- package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_install_route_actions_ad71fb5e.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_tools_[id]_launch_route_actions_0501a9ac.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +4 -0
- package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__bb619083._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__bb619083._.js.map +1 -0
- package/web/.next/server/chunks/src_presentation_web__next-internal_server_app_api_tools_route_actions_b8d6f9a0.js +3 -0
- package/web/.next/server/chunks/src_presentation_web__next-internal_server_app_api_tools_route_actions_b8d6f9a0.js.map +1 -0
- package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +3 -0
- package/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +12 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__32472b89._.js → [root-of-the-server]__685eaa45._.js} +2 -2
- 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
- package/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__d8fbe735._.js.map → [root-of-the-server]__950afd5e._.js.map} +1 -1
- 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
- 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
- package/web/.next/server/chunks/ssr/_0e2c2b4f._.js +6 -0
- package/web/.next/server/chunks/ssr/_0e2c2b4f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_2900ed94._.js +3 -0
- package/web/.next/server/chunks/ssr/_2900ed94._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ad8a094f._.js +4 -0
- package/web/.next/server/chunks/ssr/_ad8a094f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_e242b954._.js +3 -0
- package/web/.next/server/chunks/ssr/_e242b954._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js +7 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +30 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/build-manifest.json +11 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +7 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/build-manifest.json +11 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js +7 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/launch/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/build-manifest.json +11 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js +7 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +17 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/next-font-manifest.json +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js +15 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.map +5 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/{403f9_next_435614de._.js → 403f9_next_567de315._.js} +6 -7
- 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
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__bb619083._.js +3 -0
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/6769f_@radix-ui_react-roving-focus_dist_index_mjs_b3be3d8e._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1efeb0eb._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +12 -0
- 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
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +3 -0
- 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
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e2c2b4f._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_2900ed94._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ad8a094f._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e242b954._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_d26a7485._.js +7 -0
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ec3b0a65._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/app/actions/open-folder.ts +19 -16
- package/web/.next/standalone/src/presentation/web/app/actions/open-shell.ts +19 -16
- package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/route.ts +24 -0
- package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/launch/route.ts +38 -0
- package/web/.next/standalone/src/presentation/web/app/api/tools/route.ts +14 -0
- package/web/.next/standalone/src/presentation/web/app/tools/page.tsx +17 -0
- package/web/.next/standalone/src/presentation/web/components/features/index.ts +3 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/index.ts +3 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.stories.tsx +89 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.tsx +109 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.stories.tsx +181 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +188 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.stories.tsx +141 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +100 -0
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +5 -5
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/0cd7c513169faee3.js +1 -0
- package/web/.next/static/chunks/1887af4ad3781531.js +2 -0
- package/web/.next/static/chunks/35f41ba0a6d626d7.js +1 -0
- package/web/.next/static/chunks/3d4dcf0be654a331.js +5 -0
- package/web/.next/static/chunks/4651f20be1a3b7d7.css +2 -0
- package/web/.next/static/chunks/{bf551f1aa44c2133.js → 62eba5d9a5e28761.js} +5 -5
- package/web/.next/static/chunks/7138c478667158d0.js +1 -0
- package/web/.next/static/chunks/a9c2b889c8749a94.js +1 -0
- package/web/.next/static/chunks/ca4bb930b4a3f3a9.js +1 -0
- package/web/.next/static/chunks/cda11a2491d519fc.js +1 -0
- package/web/.next/static/chunks/ef237b70209d9853.js +1 -0
- package/web/.next/static/chunks/{turbopack-35ff53de4dab1e56.js → turbopack-6a11f2f1634ff6e0.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/link.d.ts +5 -1
- package/web/.next/types/routes.d.ts +6 -2
- package/web/.next/types/validator.ts +36 -0
- package/web/.next/server/chunks/403f9_next_435614de._.js.map +0 -1
- package/web/.next/server/chunks/[externals]__ba6223e5._.js +0 -3
- package/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +0 -12
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +0 -3
- package/web/.next/server/chunks/ssr/_1632a21f._.js +0 -10
- package/web/.next/server/chunks/ssr/_1632a21f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a35f2870._.js +0 -3
- package/web/.next/server/chunks/ssr/_a35f2870._.js.map +0 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +0 -3
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[externals]__ba6223e5._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +0 -12
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_1632a21f._.js +0 -10
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a35f2870._.js +0 -3
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +0 -3
- package/web/.next/static/chunks/00f6ac2dde225eb7.js +0 -1
- package/web/.next/static/chunks/084314470f2144d2.js +0 -2
- package/web/.next/static/chunks/1f13bc20e938335c.css +0 -2
- package/web/.next/static/chunks/8f4461aee9a05741.js +0 -5
- package/web/.next/static/chunks/9a82d8c76f175235.js +0 -1
- package/web/.next/static/chunks/b13aa397579082e7.js +0 -1
- package/web/.next/static/chunks/e21d644e5a584136.js +0 -1
- package/web/.next/static/chunks/f9519a5c455143e6.js +0 -1
- /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
- /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
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__32472b89._.js.map → [root-of-the-server]__685eaa45._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f47a461b._.js.map → [root-of-the-server]__757c7912._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__e1c44885._.js.map → [root-of-the-server]__dbd220d2._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__6e8b5181._.js.map → [root-of-the-server]__fbc89707._.js.map} +0 -0
- /package/web/.next/static/{YfN7Hg9rumm97Ou6lHF9d → TNUev4cyuW_BghWxcCTOD}/_buildManifest.js +0 -0
- /package/web/.next/static/{YfN7Hg9rumm97Ou6lHF9d → TNUev4cyuW_BghWxcCTOD}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{YfN7Hg9rumm97Ou6lHF9d → TNUev4cyuW_BghWxcCTOD}/_ssgManifest.js +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><!--TNUev4cyuW_BghWxcCTOD--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/a9c2b889c8749a94.js"/><script src="/_next/static/chunks/07f00e2e73d322d2.js" async=""></script><script src="/_next/static/chunks/1887af4ad3781531.js" async=""></script><script src="/_next/static/chunks/cfe4dc9904fcfddb.js" async=""></script><script src="/_next/static/chunks/turbopack-6a11f2f1634ff6e0.js" async=""></script><script src="/_next/static/chunks/ab02eec995295bef.js" async=""></script><script src="/_next/static/chunks/fe70e73feb07bcfd.js" async=""></script><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/a9c2b889c8749a94.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40799,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n3:I[73006,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n4:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"ViewportBoundary\"]\n9:I[66658,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"MetadataBoundary\"]\nb:I[42726,[\"/_next/static/chunks/ab02eec995295bef.js\",\"/_next/static/chunks/fe70e73feb07bcfd.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"TNUev4cyuW_BghWxcCTOD\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ab02eec995295bef.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/fe70e73feb07bcfd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"6039a26719feb136848cb19791fe924e9974f1e005\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"approveFeature\",\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/approve-feature.ts\",\n \"exportedName\": \"approveFeature\"\n },\n \"6026adcb45d2f52111ca0637414689733163060139\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"rejectFeature\",\n \"filename\": \"src/presentation/web/app/actions/reject-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/reject-feature.ts\",\n \"exportedName\": \"rejectFeature\"\n },\n \"40f0e986e1794e275ad66356eb76b0bef4c15a40d6\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"getFeatureArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-feature-artifact.ts\",\n \"exportedName\": \"getFeatureArtifact\"\n },\n \"40e61a7dc4f95980e9c107dc2750398665780d2586\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"getResearchArtifact\",\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-research-artifact.ts\",\n \"exportedName\": \"getResearchArtifact\"\n },\n \"00f70b3275e62ddb97cd6c0b19f2d18357acbf5bd3\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"getWorkflowDefaults\",\n \"filename\": \"src/presentation/web/app/actions/get-workflow-defaults.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-workflow-defaults.ts\",\n \"exportedName\": \"getWorkflowDefaults\"\n },\n \"40f43857fb5c94734c717ce6f9220b7f4664c5c8c0\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"getMergeReviewData\",\n \"filename\": \"src/presentation/web/app/actions/get-merge-review-data.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/get-merge-review-data.ts\",\n \"exportedName\": \"getMergeReviewData\"\n },\n \"401f634f6c6fa8a927a2b4eaefb017db965372d263\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"openIde\",\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-ide.ts\",\n \"exportedName\": \"openIde\"\n },\n \"4000fa208afe64f355a8f82ae25038e7d289aaaa69\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"openShell\",\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-shell.ts\",\n \"exportedName\": \"openShell\"\n },\n \"401adaf73b319bfb8677acea48fceebefb549e44d3\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"openFolder\",\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/open-folder.ts\",\n \"exportedName\": \"openFolder\"\n },\n \"00325cc39a715f7275993d8a6b3263756000c09d1d\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"pickFolder\",\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/pick-folder.ts\",\n \"exportedName\": \"pickFolder\"\n },\n \"40e71b9d1d46a22da64eff55ebc2b7c02aa7851117\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"createFeature\",\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/create-feature.ts\",\n \"exportedName\": \"createFeature\"\n },\n \"40d782104c6fc4f3fca711667a2e4f3cde2681e49f\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"deleteFeature\",\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/delete-feature.ts\",\n \"exportedName\": \"deleteFeature\"\n },\n \"40b42ba11d4e20fb32981a4feff2d328b5914a61b6\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"addRepository\",\n \"filename\": \"src/presentation/web/app/actions/add-repository.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/add-repository.ts\",\n \"exportedName\": \"addRepository\"\n },\n \"40cb11a806cf8a4faa963fbe90ba19ed30b03f5c1a\": {\n \"workers\": {\n \"app/page\": {\n \"moduleId\": 4510,\n \"async\": false,\n \"exportedName\": \"deleteRepository\",\n \"filename\": \"src/presentation/web/app/actions/delete-repository.ts\"\n }\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n },\n \"filename\": \"src/presentation/web/app/actions/delete-repository.ts\",\n \"exportedName\": \"deleteRepository\"\n }\n },\n \"edge\": {},\n \"encryptionKey\": \"D3ebwBbPNPjahjaeqHK8SD7WI1/k1kqk6URDh5+Jf74=\"\n}"
|
package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"6039a26719feb136848cb19791fe924e9974f1e005": {
|
|
4
4
|
"workers": {
|
|
5
5
|
"app/page": {
|
|
6
6
|
"moduleId": 4510,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"filename": "src/presentation/web/app/actions/approve-feature.ts",
|
|
16
16
|
"exportedName": "approveFeature"
|
|
17
17
|
},
|
|
18
|
-
"
|
|
18
|
+
"6026adcb45d2f52111ca0637414689733163060139": {
|
|
19
19
|
"workers": {
|
|
20
20
|
"app/page": {
|
|
21
21
|
"moduleId": 4510,
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"filename": "src/presentation/web/app/actions/reject-feature.ts",
|
|
31
31
|
"exportedName": "rejectFeature"
|
|
32
32
|
},
|
|
33
|
-
"
|
|
33
|
+
"40f0e986e1794e275ad66356eb76b0bef4c15a40d6": {
|
|
34
34
|
"workers": {
|
|
35
35
|
"app/page": {
|
|
36
36
|
"moduleId": 4510,
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
|
|
46
46
|
"exportedName": "getFeatureArtifact"
|
|
47
47
|
},
|
|
48
|
-
"
|
|
48
|
+
"40e61a7dc4f95980e9c107dc2750398665780d2586": {
|
|
49
49
|
"workers": {
|
|
50
50
|
"app/page": {
|
|
51
51
|
"moduleId": 4510,
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"filename": "src/presentation/web/app/actions/get-research-artifact.ts",
|
|
61
61
|
"exportedName": "getResearchArtifact"
|
|
62
62
|
},
|
|
63
|
-
"
|
|
63
|
+
"00f70b3275e62ddb97cd6c0b19f2d18357acbf5bd3": {
|
|
64
64
|
"workers": {
|
|
65
65
|
"app/page": {
|
|
66
66
|
"moduleId": 4510,
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
|
|
76
76
|
"exportedName": "getWorkflowDefaults"
|
|
77
77
|
},
|
|
78
|
-
"
|
|
78
|
+
"40f43857fb5c94734c717ce6f9220b7f4664c5c8c0": {
|
|
79
79
|
"workers": {
|
|
80
80
|
"app/page": {
|
|
81
81
|
"moduleId": 4510,
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
|
|
91
91
|
"exportedName": "getMergeReviewData"
|
|
92
92
|
},
|
|
93
|
-
"
|
|
93
|
+
"401f634f6c6fa8a927a2b4eaefb017db965372d263": {
|
|
94
94
|
"workers": {
|
|
95
95
|
"app/page": {
|
|
96
96
|
"moduleId": 4510,
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"filename": "src/presentation/web/app/actions/open-ide.ts",
|
|
106
106
|
"exportedName": "openIde"
|
|
107
107
|
},
|
|
108
|
-
"
|
|
108
|
+
"4000fa208afe64f355a8f82ae25038e7d289aaaa69": {
|
|
109
109
|
"workers": {
|
|
110
110
|
"app/page": {
|
|
111
111
|
"moduleId": 4510,
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"filename": "src/presentation/web/app/actions/open-shell.ts",
|
|
121
121
|
"exportedName": "openShell"
|
|
122
122
|
},
|
|
123
|
-
"
|
|
123
|
+
"401adaf73b319bfb8677acea48fceebefb549e44d3": {
|
|
124
124
|
"workers": {
|
|
125
125
|
"app/page": {
|
|
126
126
|
"moduleId": 4510,
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
"filename": "src/presentation/web/app/actions/open-folder.ts",
|
|
136
136
|
"exportedName": "openFolder"
|
|
137
137
|
},
|
|
138
|
-
"
|
|
138
|
+
"00325cc39a715f7275993d8a6b3263756000c09d1d": {
|
|
139
139
|
"workers": {
|
|
140
140
|
"app/page": {
|
|
141
141
|
"moduleId": 4510,
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"filename": "src/presentation/web/app/actions/pick-folder.ts",
|
|
151
151
|
"exportedName": "pickFolder"
|
|
152
152
|
},
|
|
153
|
-
"
|
|
153
|
+
"40e71b9d1d46a22da64eff55ebc2b7c02aa7851117": {
|
|
154
154
|
"workers": {
|
|
155
155
|
"app/page": {
|
|
156
156
|
"moduleId": 4510,
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
"filename": "src/presentation/web/app/actions/create-feature.ts",
|
|
166
166
|
"exportedName": "createFeature"
|
|
167
167
|
},
|
|
168
|
-
"
|
|
168
|
+
"40d782104c6fc4f3fca711667a2e4f3cde2681e49f": {
|
|
169
169
|
"workers": {
|
|
170
170
|
"app/page": {
|
|
171
171
|
"moduleId": 4510,
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
"filename": "src/presentation/web/app/actions/delete-feature.ts",
|
|
181
181
|
"exportedName": "deleteFeature"
|
|
182
182
|
},
|
|
183
|
-
"
|
|
183
|
+
"40b42ba11d4e20fb32981a4feff2d328b5914a61b6": {
|
|
184
184
|
"workers": {
|
|
185
185
|
"app/page": {
|
|
186
186
|
"moduleId": 4510,
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
"filename": "src/presentation/web/app/actions/add-repository.ts",
|
|
196
196
|
"exportedName": "addRepository"
|
|
197
197
|
},
|
|
198
|
-
"
|
|
198
|
+
"40cb11a806cf8a4faa963fbe90ba19ed30b03f5c1a": {
|
|
199
199
|
"workers": {
|
|
200
200
|
"app/page": {
|
|
201
201
|
"moduleId": 4510,
|
|
@@ -212,5 +212,5 @@
|
|
|
212
212
|
}
|
|
213
213
|
},
|
|
214
214
|
"edge": {},
|
|
215
|
-
"encryptionKey": "
|
|
215
|
+
"encryptionKey": "D3ebwBbPNPjahjaeqHK8SD7WI1/k1kqk6URDh5+Jf74="
|
|
216
216
|
}
|
|
@@ -4,6 +4,15 @@ import { existsSync } from 'node:fs';
|
|
|
4
4
|
import { platform } from 'node:os';
|
|
5
5
|
import { spawn } from 'node:child_process';
|
|
6
6
|
|
|
7
|
+
// Use a record lookup instead of if/else to prevent the bundler from
|
|
8
|
+
// tree-shaking platform branches at build time. Turbopack evaluates
|
|
9
|
+
// os.platform() during the build and dead-code-eliminates unused branches,
|
|
10
|
+
// baking in the CI platform (linux) and breaking macOS/Windows installs.
|
|
11
|
+
const FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {
|
|
12
|
+
darwin: { cmd: 'open', args: (p) => [p] },
|
|
13
|
+
linux: { cmd: 'xdg-open', args: (p) => [p] },
|
|
14
|
+
};
|
|
15
|
+
|
|
7
16
|
export async function openFolder(
|
|
8
17
|
repositoryPath: string
|
|
9
18
|
): Promise<{ success: boolean; error?: string; path?: string }> {
|
|
@@ -16,27 +25,21 @@ export async function openFolder(
|
|
|
16
25
|
return { success: false, error: 'Directory not found' };
|
|
17
26
|
}
|
|
18
27
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
if (currentPlatform === 'darwin') {
|
|
22
|
-
const child = spawn('open', [repositoryPath], {
|
|
23
|
-
detached: true,
|
|
24
|
-
stdio: 'ignore',
|
|
25
|
-
});
|
|
26
|
-
child.unref();
|
|
27
|
-
} else if (currentPlatform === 'linux') {
|
|
28
|
-
const child = spawn('xdg-open', [repositoryPath], {
|
|
29
|
-
detached: true,
|
|
30
|
-
stdio: 'ignore',
|
|
31
|
-
});
|
|
32
|
-
child.unref();
|
|
33
|
-
} else {
|
|
28
|
+
const entry = FOLDER_COMMANDS[platform()];
|
|
29
|
+
if (!entry) {
|
|
34
30
|
return {
|
|
35
31
|
success: false,
|
|
36
|
-
error: `Unsupported platform: ${
|
|
32
|
+
error: `Unsupported platform: ${platform()}. Folder open is supported on macOS and Linux only.`,
|
|
37
33
|
};
|
|
38
34
|
}
|
|
39
35
|
|
|
36
|
+
const child = spawn(entry.cmd, entry.args(repositoryPath), {
|
|
37
|
+
detached: true,
|
|
38
|
+
stdio: 'ignore',
|
|
39
|
+
});
|
|
40
|
+
child.on('error', () => undefined); // Prevent uncaught exception on spawn failure
|
|
41
|
+
child.unref();
|
|
42
|
+
|
|
40
43
|
return { success: true, path: repositoryPath };
|
|
41
44
|
} catch (error: unknown) {
|
|
42
45
|
const message = error instanceof Error ? error.message : 'Failed to open folder';
|
|
@@ -6,6 +6,15 @@ import { spawn } from 'node:child_process';
|
|
|
6
6
|
import { getSettings } from '@shepai/core/infrastructure/services/settings.service';
|
|
7
7
|
import { computeWorktreePath } from '@shepai/core/infrastructure/services/ide-launchers/compute-worktree-path';
|
|
8
8
|
|
|
9
|
+
// Use a record lookup instead of if/else to prevent the bundler from
|
|
10
|
+
// tree-shaking platform branches at build time. Turbopack evaluates
|
|
11
|
+
// os.platform() during the build and dead-code-eliminates unused branches,
|
|
12
|
+
// baking in the CI platform (linux) and breaking macOS/Windows installs.
|
|
13
|
+
const SHELL_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {
|
|
14
|
+
darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },
|
|
15
|
+
linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },
|
|
16
|
+
};
|
|
17
|
+
|
|
9
18
|
interface OpenShellInput {
|
|
10
19
|
repositoryPath: string;
|
|
11
20
|
branch?: string;
|
|
@@ -29,27 +38,21 @@ export async function openShell(
|
|
|
29
38
|
return { success: false, error: `Path does not exist: ${targetPath}` };
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
if (currentPlatform === 'darwin') {
|
|
35
|
-
const child = spawn('open', ['-a', 'Terminal', targetPath], {
|
|
36
|
-
detached: true,
|
|
37
|
-
stdio: 'ignore',
|
|
38
|
-
});
|
|
39
|
-
child.unref();
|
|
40
|
-
} else if (currentPlatform === 'linux') {
|
|
41
|
-
const child = spawn('x-terminal-emulator', [`--working-directory=${targetPath}`], {
|
|
42
|
-
detached: true,
|
|
43
|
-
stdio: 'ignore',
|
|
44
|
-
});
|
|
45
|
-
child.unref();
|
|
46
|
-
} else {
|
|
41
|
+
const entry = SHELL_COMMANDS[platform()];
|
|
42
|
+
if (!entry) {
|
|
47
43
|
return {
|
|
48
44
|
success: false,
|
|
49
|
-
error: `Unsupported platform: ${
|
|
45
|
+
error: `Unsupported platform: ${platform()}. Shell launch is supported on macOS and Linux only.`,
|
|
50
46
|
};
|
|
51
47
|
}
|
|
52
48
|
|
|
49
|
+
const child = spawn(entry.cmd, entry.args(targetPath), {
|
|
50
|
+
detached: true,
|
|
51
|
+
stdio: 'ignore',
|
|
52
|
+
});
|
|
53
|
+
child.on('error', () => undefined); // Prevent uncaught exception on spawn failure
|
|
54
|
+
child.unref();
|
|
55
|
+
|
|
53
56
|
return { success: true, path: targetPath, shell };
|
|
54
57
|
} catch (error: unknown) {
|
|
55
58
|
const message = error instanceof Error ? error.message : 'Failed to open shell';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { resolve } from '@/lib/server-container';
|
|
3
|
+
import type { InstallToolUseCase } from '@shepai/core/application/use-cases/tools/install-tool.use-case';
|
|
4
|
+
import { TOOL_METADATA } from '@shepai/core/infrastructure/services/tool-installer/tool-metadata';
|
|
5
|
+
|
|
6
|
+
export async function POST(
|
|
7
|
+
_request: Request,
|
|
8
|
+
{ params }: { params: Promise<{ id: string }> }
|
|
9
|
+
): Promise<NextResponse> {
|
|
10
|
+
const { id } = await params;
|
|
11
|
+
|
|
12
|
+
if (!TOOL_METADATA[id]) {
|
|
13
|
+
return NextResponse.json({ error: 'Tool not found' }, { status: 404 });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const useCase = resolve<InstallToolUseCase>('InstallToolUseCase');
|
|
18
|
+
const status = await useCase.execute(id);
|
|
19
|
+
return NextResponse.json({ status });
|
|
20
|
+
} catch (error: unknown) {
|
|
21
|
+
const message = error instanceof Error ? error.message : 'Failed to install tool';
|
|
22
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { resolve } from '@/lib/server-container';
|
|
3
|
+
import type {
|
|
4
|
+
LaunchToolUseCase,
|
|
5
|
+
LaunchToolResult,
|
|
6
|
+
} from '@shepai/core/application/use-cases/tools/launch-tool.use-case';
|
|
7
|
+
|
|
8
|
+
export async function POST(
|
|
9
|
+
_request: Request,
|
|
10
|
+
{ params }: { params: Promise<{ id: string }> }
|
|
11
|
+
): Promise<NextResponse> {
|
|
12
|
+
const { id } = await params;
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const useCase = resolve<LaunchToolUseCase>('LaunchToolUseCase');
|
|
16
|
+
const result: LaunchToolResult = await useCase.execute({
|
|
17
|
+
toolId: id,
|
|
18
|
+
directoryPath: process.cwd(),
|
|
19
|
+
headless: true,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
if (result.ok) {
|
|
23
|
+
return NextResponse.json({ editorName: result.editorName, path: result.path });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
switch (result.code) {
|
|
27
|
+
case 'tool_not_found':
|
|
28
|
+
return NextResponse.json({ error: 'Tool not found' }, { status: 404 });
|
|
29
|
+
case 'not_launchable':
|
|
30
|
+
return NextResponse.json({ error: 'Tool has no openDirectory command' }, { status: 422 });
|
|
31
|
+
case 'launch_failed':
|
|
32
|
+
return NextResponse.json({ error: result.message }, { status: 500 });
|
|
33
|
+
}
|
|
34
|
+
} catch (error: unknown) {
|
|
35
|
+
const message = error instanceof Error ? error.message : 'Failed to launch tool';
|
|
36
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { resolve } from '@/lib/server-container';
|
|
3
|
+
import type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
|
|
4
|
+
|
|
5
|
+
export async function GET(): Promise<NextResponse> {
|
|
6
|
+
try {
|
|
7
|
+
const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');
|
|
8
|
+
const tools = await useCase.execute();
|
|
9
|
+
return NextResponse.json(tools);
|
|
10
|
+
} catch (error: unknown) {
|
|
11
|
+
const message = error instanceof Error ? error.message : 'Failed to list tools';
|
|
12
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { resolve } from '@/lib/server-container';
|
|
2
|
+
import type { ListToolsUseCase } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
|
|
3
|
+
import { ToolsPageClient } from '@/components/features/tools/tools-page-client';
|
|
4
|
+
|
|
5
|
+
/** Skip static pre-rendering since we need runtime DI container and server context. */
|
|
6
|
+
export const dynamic = 'force-dynamic';
|
|
7
|
+
|
|
8
|
+
export default async function ToolsPage() {
|
|
9
|
+
const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');
|
|
10
|
+
const tools = await useCase.execute();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<div className="flex h-full flex-col p-6">
|
|
14
|
+
<ToolsPageClient tools={tools} />
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -1 +1,4 @@
|
|
|
1
1
|
export { FeaturesCanvas, type FeaturesCanvasProps } from './features-canvas';
|
|
2
|
+
export { ToolsPageClient, type ToolsPageClientProps } from './tools';
|
|
3
|
+
export { ToolCard, type ToolCardProps } from './tools';
|
|
4
|
+
export { InstallInstructions, type InstallInstructionsProps } from './tools';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { InstallInstructions } from './install-instructions';
|
|
3
|
+
import type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
|
|
4
|
+
|
|
5
|
+
const baseTool: ToolItem = {
|
|
6
|
+
id: 'cursor',
|
|
7
|
+
name: 'Cursor',
|
|
8
|
+
summary: 'AI-powered code editor',
|
|
9
|
+
description: 'Cursor is an AI-first code editor built on VS Code.',
|
|
10
|
+
tags: ['ide'],
|
|
11
|
+
iconUrl: 'https://cdn.simpleicons.org/cursor',
|
|
12
|
+
autoInstall: false,
|
|
13
|
+
required: false,
|
|
14
|
+
openDirectory: '/usr/bin/cursor',
|
|
15
|
+
documentationUrl: 'https://cursor.sh',
|
|
16
|
+
installCommand: 'brew install --cask cursor',
|
|
17
|
+
status: { status: 'missing', toolName: 'cursor' },
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const meta: Meta<typeof InstallInstructions> = {
|
|
21
|
+
title: 'Features/InstallInstructions',
|
|
22
|
+
component: InstallInstructions,
|
|
23
|
+
parameters: {
|
|
24
|
+
layout: 'centered',
|
|
25
|
+
},
|
|
26
|
+
tags: ['autodocs'],
|
|
27
|
+
args: {
|
|
28
|
+
tool: baseTool,
|
|
29
|
+
open: true,
|
|
30
|
+
onOpenChange: () => undefined,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default meta;
|
|
35
|
+
type Story = StoryObj<typeof meta>;
|
|
36
|
+
|
|
37
|
+
export const Default: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
tool: baseTool,
|
|
40
|
+
open: true,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const WithInstallCommand: Story = {
|
|
45
|
+
args: {
|
|
46
|
+
tool: {
|
|
47
|
+
...baseTool,
|
|
48
|
+
installCommand: 'brew install --cask cursor',
|
|
49
|
+
},
|
|
50
|
+
open: true,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const WithoutInstallCommand: Story = {
|
|
55
|
+
args: {
|
|
56
|
+
tool: {
|
|
57
|
+
...baseTool,
|
|
58
|
+
installCommand: undefined,
|
|
59
|
+
},
|
|
60
|
+
open: true,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const WithDocumentationUrl: Story = {
|
|
65
|
+
args: {
|
|
66
|
+
tool: {
|
|
67
|
+
...baseTool,
|
|
68
|
+
documentationUrl: 'https://cursor.sh/docs',
|
|
69
|
+
},
|
|
70
|
+
open: true,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const WithoutDocumentationUrl: Story = {
|
|
75
|
+
args: {
|
|
76
|
+
tool: {
|
|
77
|
+
...baseTool,
|
|
78
|
+
documentationUrl: '',
|
|
79
|
+
},
|
|
80
|
+
open: true,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const Closed: Story = {
|
|
85
|
+
args: {
|
|
86
|
+
tool: baseTool,
|
|
87
|
+
open: false,
|
|
88
|
+
},
|
|
89
|
+
};
|
package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.tsx
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Copy, Check, ExternalLink } from 'lucide-react';
|
|
5
|
+
import { Button } from '@/components/ui/button';
|
|
6
|
+
import {
|
|
7
|
+
Dialog,
|
|
8
|
+
DialogContent,
|
|
9
|
+
DialogHeader,
|
|
10
|
+
DialogTitle,
|
|
11
|
+
DialogDescription,
|
|
12
|
+
} from '@/components/ui/dialog';
|
|
13
|
+
import { cn } from '@/lib/utils';
|
|
14
|
+
import type { ToolItem } from '@shepai/core/application/use-cases/tools/list-tools.use-case';
|
|
15
|
+
|
|
16
|
+
export interface InstallInstructionsProps {
|
|
17
|
+
tool: ToolItem;
|
|
18
|
+
open: boolean;
|
|
19
|
+
onOpenChange: (open: boolean) => void;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function InstallInstructions({
|
|
24
|
+
tool,
|
|
25
|
+
open,
|
|
26
|
+
onOpenChange,
|
|
27
|
+
className,
|
|
28
|
+
}: InstallInstructionsProps) {
|
|
29
|
+
const [copied, setCopied] = useState(false);
|
|
30
|
+
|
|
31
|
+
function handleCopy() {
|
|
32
|
+
if (!tool.installCommand) return;
|
|
33
|
+
void navigator.clipboard.writeText(tool.installCommand).then(() => {
|
|
34
|
+
setCopied(true);
|
|
35
|
+
setTimeout(() => setCopied(false), 2000);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
41
|
+
<DialogContent data-testid="install-instructions" className={cn('sm:max-w-2xl', className)}>
|
|
42
|
+
<DialogHeader>
|
|
43
|
+
<DialogTitle data-testid="install-instructions-title">Install {tool.name}</DialogTitle>
|
|
44
|
+
<DialogDescription data-testid="install-instructions-description">
|
|
45
|
+
{tool.summary}
|
|
46
|
+
</DialogDescription>
|
|
47
|
+
</DialogHeader>
|
|
48
|
+
|
|
49
|
+
<div className="flex flex-col gap-4">
|
|
50
|
+
{tool.installCommand && tool.autoInstall ? (
|
|
51
|
+
<div className="flex flex-col gap-1.5">
|
|
52
|
+
<span className="text-muted-foreground text-xs font-medium">
|
|
53
|
+
Installation command
|
|
54
|
+
</span>
|
|
55
|
+
<div className="bg-muted relative rounded-md">
|
|
56
|
+
<pre
|
|
57
|
+
data-testid="install-instructions-command"
|
|
58
|
+
className="overflow-x-auto px-3 py-2.5 pr-20 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap"
|
|
59
|
+
>
|
|
60
|
+
<code>{tool.installCommand}</code>
|
|
61
|
+
</pre>
|
|
62
|
+
<Button
|
|
63
|
+
variant="ghost"
|
|
64
|
+
size="sm"
|
|
65
|
+
className="absolute top-1.5 right-1.5 h-7 cursor-pointer px-2"
|
|
66
|
+
onClick={handleCopy}
|
|
67
|
+
aria-label={copied ? 'Copied!' : 'Copy install command'}
|
|
68
|
+
data-testid="install-instructions-copy-button"
|
|
69
|
+
>
|
|
70
|
+
{copied ? (
|
|
71
|
+
<Check className="h-3.5 w-3.5 text-emerald-500" />
|
|
72
|
+
) : (
|
|
73
|
+
<Copy className="h-3.5 w-3.5" />
|
|
74
|
+
)}
|
|
75
|
+
<span className="ml-1 text-[10px]">{copied ? 'Copied!' : 'Copy'}</span>
|
|
76
|
+
</Button>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
) : tool.installCommand ? (
|
|
80
|
+
<p data-testid="install-instructions-command" className="text-muted-foreground text-sm">
|
|
81
|
+
{tool.installCommand}
|
|
82
|
+
</p>
|
|
83
|
+
) : (
|
|
84
|
+
<p
|
|
85
|
+
data-testid="install-instructions-no-command"
|
|
86
|
+
className="text-muted-foreground text-sm"
|
|
87
|
+
>
|
|
88
|
+
Please refer to the documentation for installation instructions.
|
|
89
|
+
</p>
|
|
90
|
+
)}
|
|
91
|
+
|
|
92
|
+
{tool.documentationUrl ? (
|
|
93
|
+
<Button variant="outline" size="sm" className="w-fit cursor-pointer" asChild>
|
|
94
|
+
<a
|
|
95
|
+
data-testid="install-instructions-doc-link"
|
|
96
|
+
href={tool.documentationUrl}
|
|
97
|
+
target="_blank"
|
|
98
|
+
rel="noopener noreferrer"
|
|
99
|
+
>
|
|
100
|
+
View documentation
|
|
101
|
+
<ExternalLink className="ml-1.5 h-3.5 w-3.5" />
|
|
102
|
+
</a>
|
|
103
|
+
</Button>
|
|
104
|
+
) : null}
|
|
105
|
+
</div>
|
|
106
|
+
</DialogContent>
|
|
107
|
+
</Dialog>
|
|
108
|
+
);
|
|
109
|
+
}
|