@shepai/cli 1.37.2 → 1.38.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/README.md +1 -1
- package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts +19 -0
- package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.js +52 -0
- package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts +19 -0
- package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.js +52 -0
- package/dist/packages/core/src/domain/factories/spec-yaml-parser.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/spec-yaml-parser.js +3 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +84 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +14 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +27 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +14 -1
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +2 -17
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +3 -27
- package/dist/src/presentation/cli/commands/feat/show.command.js +2 -2
- package/dist/src/presentation/web/app/actions/approve-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/approve-feature.js +27 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +22 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/create-feature.js +41 -0
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/delete-feature.js +16 -0
- package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts +10 -0
- package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-artifact.js +43 -0
- package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts +14 -0
- package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-research-artifact.js +25 -0
- package/dist/src/presentation/web/app/actions/open-folder.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/open-folder.js +39 -0
- package/dist/src/presentation/web/app/actions/open-ide.d.ts +12 -0
- package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/open-ide.js +22 -0
- package/dist/src/presentation/web/app/actions/open-shell.d.ts +12 -0
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/open-shell.js +45 -0
- package/dist/src/presentation/web/app/actions/pick-folder.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/pick-folder.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/pick-folder.js +13 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +2 -9
- package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts +1 -9
- package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/dialog/pick-files/route.js +3 -6
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +1 -0
- package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts +1 -1
- package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.js +6 -7
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.js +6 -7
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +7 -7
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +52 -14
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +2 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +33 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +10 -0
- package/dist/src/presentation/web/components/common/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +3 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts +2 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/index.js +1 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts +2 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.js +33 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts +6 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.js +24 -0
- package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts +10 -0
- package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/config.js +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/index.js +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts +3 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +18 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +54 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +4 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +2 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +41 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.js +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +3 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +7 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts +3 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +42 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +26 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +267 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -2
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +3 -0
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +51 -14
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +24 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +3 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +17 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +33 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +4 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +2 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +3 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +7 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +39 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.js +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +3 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +39 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +22 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +108 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +133 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +28 -19
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +6 -1
- package/dist/src/presentation/web/components/ui/drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/ui/drawer.js +3 -1
- package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts +28 -0
- package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/dropdown-menu.js +33 -0
- package/dist/src/presentation/web/hooks/agent-events-provider.d.ts +13 -0
- package/dist/src/presentation/web/hooks/agent-events-provider.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/agent-events-provider.js +20 -0
- package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-agent-events.js +21 -1
- package/dist/src/presentation/web/hooks/use-notifications.d.ts +1 -5
- package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-notifications.js +5 -10
- package/dist/src/presentation/web/next.config.d.ts.map +1 -1
- package/dist/src/presentation/web/next.config.js +5 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +0 -5
- package/web/.next/build-manifest.json +6 -6
- 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 +4 -4
- package/web/.next/required-server-files.json +4 -4
- package/web/.next/routes-manifest.json +1 -34
- package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- 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 +7 -7
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
- 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/agent-events/route.js +1 -1
- package/web/.next/server/app/api/agent-events/route.js.nft.json +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/page/build-manifest.json +4 -4
- package/web/.next/server/app/page/server-reference-manifest.json +137 -1
- 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/version/page/build-manifest.json +4 -4
- package/web/.next/server/app/version/page.js +1 -1
- 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 +0 -5
- package/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
- package/web/.next/server/chunks/403f9_next_435614de._.js.map +1 -0
- package/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
- package/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
- package/web/.next/server/chunks/ssr/_285de9aa._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_94d22d37._.js → server/chunks/ssr/_b1f2507a._.js} +4 -4
- package/web/.next/server/chunks/ssr/_b1f2507a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js.map +1 -1
- 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_ui_badge_tsx_964c2a3b._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +4 -4
- 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 +138 -2
- 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 +0 -5
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +6 -6
- 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 +4 -4
- package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +1 -34
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- 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 +7 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- 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 +4 -4
- 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/agent-events/route.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/agent-events/route.js.nft.json +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/page/build-manifest.json +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +137 -1
- 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/version/page/build-manifest.json +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
- 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 +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
- package/web/.next/{server/chunks/ssr/_94d22d37._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_b1f2507a._.js} +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
- 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_ui_badge_tsx_964c2a3b._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +4 -4
- 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 +138 -2
- package/web/.next/standalone/src/presentation/web/app/actions/approve-feature.ts +38 -0
- package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +81 -0
- package/web/.next/standalone/src/presentation/web/app/actions/delete-feature.ts +22 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-artifact.ts +55 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-research-artifact.ts +42 -0
- package/web/.next/standalone/src/presentation/web/app/actions/open-folder.ts +44 -0
- package/web/.next/standalone/src/presentation/web/app/actions/open-ide.ts +37 -0
- package/web/.next/standalone/src/presentation/web/app/{api/shell/open/route.ts → actions/open-shell.ts} +19 -27
- package/web/.next/standalone/src/presentation/web/app/{api/dialog/pick-folder/route.ts → actions/pick-folder.ts} +5 -9
- package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +2 -14
- package/web/.next/standalone/src/presentation/web/app/api/dialog/pick-files/route.ts +8 -10
- package/web/.next/standalone/src/presentation/web/app/globals.css +10 -0
- package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/pick-folder.ts +7 -7
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/pick-files.ts +6 -7
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +15 -19
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/use-feature-actions.ts +61 -17
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.tsx +10 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +38 -7
- package/web/.next/standalone/src/presentation/web/components/common/index.ts +18 -0
- package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.tsx +52 -0
- package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.tsx +55 -0
- package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/config.ts +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx +64 -0
- package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.tsx +111 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/index.ts +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +48 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +34 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +384 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +216 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +20 -1
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/use-repository-actions.ts +83 -20
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts +24 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +85 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +139 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/index.ts +8 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.tsx +34 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +42 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +177 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +188 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +189 -2
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +28 -19
- package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +11 -1
- package/web/.next/standalone/src/presentation/web/components/ui/drawer.tsx +4 -2
- package/web/.next/standalone/src/presentation/web/components/ui/dropdown-menu.tsx +187 -0
- package/web/.next/standalone/src/presentation/web/hooks/agent-events-provider.tsx +32 -0
- package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +23 -1
- package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +5 -16
- package/web/.next/standalone/src/presentation/web/next.config.ts +6 -0
- package/web/.next/standalone/src/presentation/web/package.json +2 -1
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{70993ebedee7eab0.js → 084314470f2144d2.js} +1 -1
- package/web/.next/static/chunks/36bb03a0314fb990.css +2 -0
- package/web/.next/static/chunks/83ff3b6bbee54bce.js +1 -0
- package/web/.next/static/chunks/{fe5e04e707adb039.js → 8c0b96eb95dd31a9.js} +1 -1
- package/web/.next/static/chunks/{df7d29673e0ac11d.js → b13aa397579082e7.js} +1 -1
- package/web/.next/static/chunks/{f3b4460b1496ef52.js → cfe4dc9904fcfddb.js} +1 -1
- package/web/.next/static/chunks/e21d644e5a584136.js +1 -0
- package/web/.next/static/chunks/eca1959e083d0a45.js +10 -0
- package/web/.next/static/chunks/f9519a5c455143e6.js +1 -0
- package/web/.next/static/chunks/{c4b1e95eceaa36ca.js → fe6427c156bda6b0.js} +2 -2
- package/web/.next/static/chunks/{37bc3e283f734dca.js → fe70e73feb07bcfd.js} +1 -1
- package/web/.next/static/chunks/{turbopack-a5a88a85e7ac8e8d.js → turbopack-35ff53de4dab1e56.js} +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/link.d.ts +1 -6
- package/web/.next/types/routes.d.ts +1 -6
- package/web/.next/types/validator.ts +0 -45
- package/web/package.json +2 -1
- package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts +0 -11
- package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/dialog/pick-folder/route.js +0 -16
- package/dist/src/presentation/web/app/api/features/[id]/route.d.ts +0 -11
- package/dist/src/presentation/web/app/api/features/[id]/route.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/features/[id]/route.js +0 -17
- package/dist/src/presentation/web/app/api/features/create/route.d.ts +0 -5
- package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/features/create/route.js +0 -65
- package/dist/src/presentation/web/app/api/ide/open/route.d.ts +0 -9
- package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/ide/open/route.js +0 -36
- package/dist/src/presentation/web/app/api/shell/open/route.d.ts +0 -9
- package/dist/src/presentation/web/app/api/shell/open/route.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/shell/open/route.js +0 -57
- package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts +0 -18
- package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts.map +0 -1
- package/dist/src/presentation/web/app/api/validate-toolbar-input.js +0 -29
- package/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
- package/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
- package/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
- package/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
- package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
- package/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
- package/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
- package/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
- package/web/.next/server/app/api/features/[id]/route.js +0 -7
- package/web/.next/server/app/api/features/[id]/route.js.map +0 -5
- package/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
- package/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
- package/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
- package/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
- package/web/.next/server/app/api/features/create/route.js +0 -7
- package/web/.next/server/app/api/features/create/route.js.map +0 -5
- package/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
- package/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
- package/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
- package/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
- package/web/.next/server/app/api/ide/open/route.js +0 -7
- package/web/.next/server/app/api/ide/open/route.js.map +0 -5
- package/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
- package/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
- package/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
- package/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
- package/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
- package/web/.next/server/app/api/shell/open/route.js +0 -7
- package/web/.next/server/app/api/shell/open/route.js.map +0 -5
- package/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
- package/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
- package/web/.next/server/chunks/403f9_next_567de315._.js.map +0 -1
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js.map +0 -1
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
- package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
- package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js.map +0 -1
- package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
- package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a21ef212._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
- package/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
- package/web/.next/server/chunks/ssr/_09afa42a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
- package/web/.next/server/chunks/ssr/_4676cf52._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_94d22d37._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js +0 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.map +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js +0 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.map +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js +0 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.map +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js +0 -7
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.map +0 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
- package/web/.next/standalone/src/presentation/web/app/api/features/[id]/route.ts +0 -20
- package/web/.next/standalone/src/presentation/web/app/api/features/create/route.ts +0 -103
- package/web/.next/standalone/src/presentation/web/app/api/ide/open/route.ts +0 -44
- package/web/.next/standalone/src/presentation/web/app/api/validate-toolbar-input.ts +0 -46
- package/web/.next/static/chunks/54743561bbaa307a.js +0 -8
- package/web/.next/static/chunks/74f27128e5fbfe52.css +0 -2
- package/web/.next/static/chunks/9993505b2a26c454.js +0 -1
- package/web/.next/static/chunks/c95b4cf170b7f301.js +0 -1
- package/web/.next/static/chunks/e78d1b265b8110c3.js +0 -1
- /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js.map → [externals]__ba6223e5._.js.map} +0 -0
- /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js.map → ssr/[externals]_node:path_d28a9bfe._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__32472b89._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f285e474._.js.map → [root-of-the-server]__e1c44885._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__97377864._.js.map → [root-of-the-server]__f47a461b._.js.map} +0 -0
- /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_buildManifest.js +0 -0
- /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Send, Check, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
4
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
5
|
+
import { cn } from '@/lib/utils';
|
|
6
|
+
import { Button } from '@/components/ui/button';
|
|
7
|
+
import { Input } from '@/components/ui/input';
|
|
8
|
+
import { Badge } from '@/components/ui/badge';
|
|
9
|
+
import type { PrdQuestionnaireProps } from './prd-questionnaire-config';
|
|
10
|
+
|
|
11
|
+
export function PrdQuestionnaire({
|
|
12
|
+
data,
|
|
13
|
+
selections,
|
|
14
|
+
onSelect,
|
|
15
|
+
onRefine,
|
|
16
|
+
onApprove,
|
|
17
|
+
isProcessing = false,
|
|
18
|
+
showHeader = false,
|
|
19
|
+
}: PrdQuestionnaireProps) {
|
|
20
|
+
const { question, context, questions, finalAction } = data;
|
|
21
|
+
const [currentStep, setCurrentStep] = useState(0);
|
|
22
|
+
const [chatInput, setChatInput] = useState('');
|
|
23
|
+
|
|
24
|
+
const total = questions.length;
|
|
25
|
+
const isFirstStep = currentStep === 0;
|
|
26
|
+
const isLastStep = currentStep === total - 1;
|
|
27
|
+
const currentQuestion = questions[currentStep];
|
|
28
|
+
|
|
29
|
+
const answeredCount = useMemo(() => Object.keys(selections).length, [selections]);
|
|
30
|
+
|
|
31
|
+
const handleSelect = useCallback(
|
|
32
|
+
(questionId: string, optionId: string) => {
|
|
33
|
+
onSelect(questionId, optionId);
|
|
34
|
+
// Auto-advance to the next step after selection (unless last step)
|
|
35
|
+
if (!isLastStep) {
|
|
36
|
+
setTimeout(() => setCurrentStep((s) => s + 1), 250);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
[onSelect, isLastStep]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
function handleSubmit(e: { preventDefault: () => void }) {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
const text = chatInput.trim();
|
|
45
|
+
if (!text) return;
|
|
46
|
+
onRefine(text);
|
|
47
|
+
setChatInput('');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (total === 0) return null;
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div className="flex h-full flex-col">
|
|
54
|
+
<div className="flex-1 space-y-4 overflow-y-auto p-4">
|
|
55
|
+
{/* Header */}
|
|
56
|
+
{showHeader ? (
|
|
57
|
+
<div className="border-border flex items-start gap-3 border-b pb-3">
|
|
58
|
+
<div className="mt-1.5 h-2 w-2 shrink-0 rounded-full bg-amber-500" />
|
|
59
|
+
<div className="flex-1">
|
|
60
|
+
<h3 className="text-foreground mb-1.5 text-sm font-bold">{question}</h3>
|
|
61
|
+
<p className="text-muted-foreground text-xs leading-relaxed">{context}</p>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
) : null}
|
|
65
|
+
|
|
66
|
+
{/* Question + step indicator */}
|
|
67
|
+
<div className="space-y-3">
|
|
68
|
+
<div className="flex items-start gap-3">
|
|
69
|
+
<label className="text-foreground min-w-0 flex-1 text-sm font-semibold">
|
|
70
|
+
{currentQuestion.question}
|
|
71
|
+
</label>
|
|
72
|
+
<div className="mt-1.5 flex shrink-0 gap-1">
|
|
73
|
+
{questions.map((q, idx) => (
|
|
74
|
+
<button
|
|
75
|
+
key={q.id}
|
|
76
|
+
type="button"
|
|
77
|
+
aria-label={`Go to question ${idx + 1}`}
|
|
78
|
+
className={cn(
|
|
79
|
+
'h-1.5 rounded-full transition-all duration-200',
|
|
80
|
+
idx === currentStep ? 'bg-primary w-4' : 'w-1.5',
|
|
81
|
+
idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '',
|
|
82
|
+
idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''
|
|
83
|
+
)}
|
|
84
|
+
onClick={() => setCurrentStep(idx)}
|
|
85
|
+
/>
|
|
86
|
+
))}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div className="space-y-2">
|
|
90
|
+
{currentQuestion.options.map((opt, optIdx) => {
|
|
91
|
+
const selected = selections[currentQuestion.id] === opt.id;
|
|
92
|
+
const letter = String.fromCharCode(65 + optIdx);
|
|
93
|
+
return (
|
|
94
|
+
<button
|
|
95
|
+
key={opt.id}
|
|
96
|
+
type="button"
|
|
97
|
+
className={cn(
|
|
98
|
+
'border-border w-full rounded-md border px-3 py-3 text-left text-xs transition-all',
|
|
99
|
+
'hover:border-primary/70 hover:bg-primary/5 group',
|
|
100
|
+
selected && 'border-primary bg-primary/5',
|
|
101
|
+
opt.isNew && 'animate-option-highlight'
|
|
102
|
+
)}
|
|
103
|
+
disabled={isProcessing}
|
|
104
|
+
onClick={() => handleSelect(currentQuestion.id, opt.id)}
|
|
105
|
+
>
|
|
106
|
+
<div className="flex items-start gap-2">
|
|
107
|
+
<span className="text-muted-foreground mt-0.5 font-mono text-xs">
|
|
108
|
+
{letter}.
|
|
109
|
+
</span>
|
|
110
|
+
<div className="flex-1">
|
|
111
|
+
<div className="mb-0.5 flex items-center gap-2">
|
|
112
|
+
<span className="text-foreground text-xs font-semibold">{opt.label}</span>
|
|
113
|
+
{opt.recommended ? (
|
|
114
|
+
<Badge className="px-1.5 py-0 text-[10px]">AI Recommended</Badge>
|
|
115
|
+
) : null}
|
|
116
|
+
{opt.isNew ? (
|
|
117
|
+
<Badge className="border-transparent bg-emerald-600 px-1.5 py-0 text-[10px] text-white hover:bg-emerald-600/80">
|
|
118
|
+
New
|
|
119
|
+
</Badge>
|
|
120
|
+
) : null}
|
|
121
|
+
</div>
|
|
122
|
+
<div className="text-muted-foreground text-xs leading-snug">
|
|
123
|
+
{opt.rationale}
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</button>
|
|
128
|
+
);
|
|
129
|
+
})}
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
{/* Step navigation */}
|
|
134
|
+
<div className="flex items-center justify-between pt-2">
|
|
135
|
+
<Button
|
|
136
|
+
type="button"
|
|
137
|
+
variant="ghost"
|
|
138
|
+
size="sm"
|
|
139
|
+
disabled={isFirstStep || isProcessing}
|
|
140
|
+
onClick={() => setCurrentStep((s) => s - 1)}
|
|
141
|
+
>
|
|
142
|
+
<ChevronLeft className="mr-1 h-4 w-4" />
|
|
143
|
+
Previous
|
|
144
|
+
</Button>
|
|
145
|
+
|
|
146
|
+
{isLastStep ? (
|
|
147
|
+
<Button
|
|
148
|
+
type="button"
|
|
149
|
+
size="sm"
|
|
150
|
+
disabled={isProcessing || answeredCount < total}
|
|
151
|
+
onClick={() => onApprove(finalAction.id)}
|
|
152
|
+
>
|
|
153
|
+
<Check className="mr-1 h-4 w-4" />
|
|
154
|
+
{finalAction.label}
|
|
155
|
+
</Button>
|
|
156
|
+
) : (
|
|
157
|
+
<Button
|
|
158
|
+
type="button"
|
|
159
|
+
variant="ghost"
|
|
160
|
+
size="sm"
|
|
161
|
+
disabled={isProcessing}
|
|
162
|
+
onClick={() => setCurrentStep((s) => s + 1)}
|
|
163
|
+
>
|
|
164
|
+
{selections[currentQuestion.id] ? 'Next' : 'Skip'}
|
|
165
|
+
<ChevronRight className="ml-1 h-4 w-4" />
|
|
166
|
+
</Button>
|
|
167
|
+
)}
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
{/* Action Bar */}
|
|
172
|
+
<div className="border-border bg-background shrink-0 border-t">
|
|
173
|
+
<div
|
|
174
|
+
className={cn(
|
|
175
|
+
'bg-muted h-1.5 overflow-hidden',
|
|
176
|
+
(answeredCount > 0 && answeredCount < total) || isProcessing
|
|
177
|
+
? 'opacity-100'
|
|
178
|
+
: 'opacity-0',
|
|
179
|
+
'transition-opacity duration-200'
|
|
180
|
+
)}
|
|
181
|
+
data-testid="progress-bar-container"
|
|
182
|
+
>
|
|
183
|
+
{isProcessing ? (
|
|
184
|
+
<div className="bg-primary animate-indeterminate-progress h-full w-1/3" />
|
|
185
|
+
) : (
|
|
186
|
+
<div
|
|
187
|
+
className="bg-primary h-full transition-all duration-300"
|
|
188
|
+
style={{ width: `${total > 0 ? (answeredCount / total) * 100 : 0}%` }}
|
|
189
|
+
data-testid="progress-bar"
|
|
190
|
+
/>
|
|
191
|
+
)}
|
|
192
|
+
</div>
|
|
193
|
+
<form onSubmit={handleSubmit} className="flex items-center gap-2 p-4">
|
|
194
|
+
<Input
|
|
195
|
+
type="text"
|
|
196
|
+
placeholder="Ask AI to refine requirements..."
|
|
197
|
+
aria-label="Ask AI to refine requirements"
|
|
198
|
+
disabled={isProcessing}
|
|
199
|
+
value={chatInput}
|
|
200
|
+
onChange={(e) => setChatInput(e.target.value)}
|
|
201
|
+
className="flex-1"
|
|
202
|
+
/>
|
|
203
|
+
<Button
|
|
204
|
+
type="submit"
|
|
205
|
+
variant="secondary"
|
|
206
|
+
size="icon"
|
|
207
|
+
aria-label="Send"
|
|
208
|
+
disabled={isProcessing}
|
|
209
|
+
>
|
|
210
|
+
<Send />
|
|
211
|
+
</Button>
|
|
212
|
+
</form>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Handle, Position } from '@xyflow/react';
|
|
4
|
-
import { Github, Plus, Code2, Terminal } from 'lucide-react';
|
|
4
|
+
import { Github, Plus, Code2, Terminal, FolderOpen } from 'lucide-react';
|
|
5
5
|
import { cn } from '@/lib/utils';
|
|
6
6
|
import { ActionButton } from '@/components/common/action-button';
|
|
7
7
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
|
|
@@ -93,6 +93,25 @@ export function RepositoryNode({ data }: { data: RepositoryNodeData; [key: strin
|
|
|
93
93
|
<TooltipContent>Open in Shell</TooltipContent>
|
|
94
94
|
</Tooltip>
|
|
95
95
|
</TooltipProvider>
|
|
96
|
+
<TooltipProvider>
|
|
97
|
+
<Tooltip>
|
|
98
|
+
<TooltipTrigger asChild>
|
|
99
|
+
<span className="flex items-center">
|
|
100
|
+
<ActionButton
|
|
101
|
+
label="Open Folder"
|
|
102
|
+
onClick={actions.openFolder}
|
|
103
|
+
loading={actions.folderLoading}
|
|
104
|
+
error={!!actions.folderError}
|
|
105
|
+
icon={FolderOpen}
|
|
106
|
+
iconOnly
|
|
107
|
+
variant="ghost"
|
|
108
|
+
size="icon-xs"
|
|
109
|
+
/>
|
|
110
|
+
</span>
|
|
111
|
+
</TooltipTrigger>
|
|
112
|
+
<TooltipContent>Open Folder</TooltipContent>
|
|
113
|
+
</Tooltip>
|
|
114
|
+
</TooltipProvider>
|
|
96
115
|
</>
|
|
97
116
|
) : null}
|
|
98
117
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
4
|
+
import { openIde } from '@/app/actions/open-ide';
|
|
5
|
+
import { openShell } from '@/app/actions/open-shell';
|
|
6
|
+
import { openFolder } from '@/app/actions/open-folder';
|
|
4
7
|
|
|
5
8
|
export interface RepositoryActionsInput {
|
|
6
9
|
repositoryPath: string;
|
|
@@ -9,10 +12,13 @@ export interface RepositoryActionsInput {
|
|
|
9
12
|
export interface RepositoryActionsState {
|
|
10
13
|
openInIde: () => Promise<void>;
|
|
11
14
|
openInShell: () => Promise<void>;
|
|
15
|
+
openFolder: () => Promise<void>;
|
|
12
16
|
ideLoading: boolean;
|
|
13
17
|
shellLoading: boolean;
|
|
18
|
+
folderLoading: boolean;
|
|
14
19
|
ideError: string | null;
|
|
15
20
|
shellError: string | null;
|
|
21
|
+
folderError: string | null;
|
|
16
22
|
}
|
|
17
23
|
|
|
18
24
|
const ERROR_CLEAR_DELAY = 5000;
|
|
@@ -20,25 +26,33 @@ const ERROR_CLEAR_DELAY = 5000;
|
|
|
20
26
|
export function useRepositoryActions(input: RepositoryActionsInput | null): RepositoryActionsState {
|
|
21
27
|
const [ideLoading, setIdeLoading] = useState(false);
|
|
22
28
|
const [shellLoading, setShellLoading] = useState(false);
|
|
29
|
+
const [folderLoading, setFolderLoading] = useState(false);
|
|
23
30
|
const [ideError, setIdeError] = useState<string | null>(null);
|
|
24
31
|
const [shellError, setShellError] = useState<string | null>(null);
|
|
32
|
+
const [folderError, setFolderError] = useState<string | null>(null);
|
|
25
33
|
|
|
26
34
|
const ideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
27
35
|
const shellTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
36
|
+
const folderTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
28
37
|
|
|
29
38
|
// Clear timers on unmount
|
|
30
39
|
useEffect(() => {
|
|
31
40
|
const ideTimer = ideTimerRef.current;
|
|
32
41
|
const shellTimer = shellTimerRef.current;
|
|
42
|
+
const folderTimer = folderTimerRef.current;
|
|
33
43
|
return () => {
|
|
34
44
|
if (ideTimer) clearTimeout(ideTimer);
|
|
35
45
|
if (shellTimer) clearTimeout(shellTimer);
|
|
46
|
+
if (folderTimer) clearTimeout(folderTimer);
|
|
36
47
|
};
|
|
37
48
|
}, []);
|
|
38
49
|
|
|
39
|
-
const
|
|
50
|
+
const performToolbarAction = useCallback(
|
|
40
51
|
async (
|
|
41
|
-
|
|
52
|
+
action: (input: { repositoryPath: string }) => Promise<{
|
|
53
|
+
success: boolean;
|
|
54
|
+
error?: string;
|
|
55
|
+
}>,
|
|
42
56
|
setLoading: (v: boolean) => void,
|
|
43
57
|
setError: (v: string | null) => void,
|
|
44
58
|
timerRef: React.RefObject<ReturnType<typeof setTimeout> | null>,
|
|
@@ -53,17 +67,10 @@ export function useRepositoryActions(input: RepositoryActionsInput | null): Repo
|
|
|
53
67
|
setError(null);
|
|
54
68
|
|
|
55
69
|
try {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
repositoryPath: input.repositoryPath,
|
|
61
|
-
}),
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
if (!response.ok) {
|
|
65
|
-
const data = await response.json();
|
|
66
|
-
const errorMessage = data.error ?? 'An unexpected error occurred';
|
|
70
|
+
const result = await action({ repositoryPath: input.repositoryPath });
|
|
71
|
+
|
|
72
|
+
if (!result.success) {
|
|
73
|
+
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
67
74
|
setError(errorMessage);
|
|
68
75
|
timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
|
|
69
76
|
}
|
|
@@ -78,16 +85,72 @@ export function useRepositoryActions(input: RepositoryActionsInput | null): Repo
|
|
|
78
85
|
[input]
|
|
79
86
|
);
|
|
80
87
|
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
const performFolderAction = useCallback(
|
|
89
|
+
async (
|
|
90
|
+
action: (repositoryPath: string) => Promise<{ success: boolean; error?: string }>,
|
|
91
|
+
setLoading: (v: boolean) => void,
|
|
92
|
+
setError: (v: string | null) => void,
|
|
93
|
+
timerRef: React.RefObject<ReturnType<typeof setTimeout> | null>,
|
|
94
|
+
isLoading: boolean
|
|
95
|
+
) => {
|
|
96
|
+
if (!input || isLoading) return;
|
|
97
|
+
|
|
98
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
99
|
+
|
|
100
|
+
setLoading(true);
|
|
101
|
+
setError(null);
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const result = await action(input.repositoryPath);
|
|
105
|
+
|
|
106
|
+
if (!result.success) {
|
|
107
|
+
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
108
|
+
setError(errorMessage);
|
|
109
|
+
timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
|
|
110
|
+
}
|
|
111
|
+
} catch (err: unknown) {
|
|
112
|
+
const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
|
|
113
|
+
setError(errorMessage);
|
|
114
|
+
timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
|
|
115
|
+
} finally {
|
|
116
|
+
setLoading(false);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
[input]
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const handleOpenIde = useCallback(
|
|
123
|
+
() => performToolbarAction(openIde, setIdeLoading, setIdeError, ideTimerRef, ideLoading),
|
|
124
|
+
[performToolbarAction, ideLoading]
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const handleOpenShell = useCallback(
|
|
128
|
+
() =>
|
|
129
|
+
performToolbarAction(openShell, setShellLoading, setShellError, shellTimerRef, shellLoading),
|
|
130
|
+
[performToolbarAction, shellLoading]
|
|
84
131
|
);
|
|
85
132
|
|
|
86
|
-
const
|
|
133
|
+
const handleOpenFolder = useCallback(
|
|
87
134
|
() =>
|
|
88
|
-
|
|
89
|
-
|
|
135
|
+
performFolderAction(
|
|
136
|
+
openFolder,
|
|
137
|
+
setFolderLoading,
|
|
138
|
+
setFolderError,
|
|
139
|
+
folderTimerRef,
|
|
140
|
+
folderLoading
|
|
141
|
+
),
|
|
142
|
+
[performFolderAction, folderLoading]
|
|
90
143
|
);
|
|
91
144
|
|
|
92
|
-
return {
|
|
145
|
+
return {
|
|
146
|
+
openInIde: handleOpenIde,
|
|
147
|
+
openInShell: handleOpenShell,
|
|
148
|
+
openFolder: handleOpenFolder,
|
|
149
|
+
ideLoading,
|
|
150
|
+
shellLoading,
|
|
151
|
+
folderLoading,
|
|
152
|
+
ideError,
|
|
153
|
+
shellError,
|
|
154
|
+
folderError,
|
|
155
|
+
};
|
|
93
156
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface ReviewDrawerShellProps {
|
|
4
|
+
/** Whether the drawer is open */
|
|
5
|
+
open: boolean;
|
|
6
|
+
/** Callback when drawer should close */
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
/** Feature name shown in drawer header */
|
|
9
|
+
featureName: string;
|
|
10
|
+
/** Feature ID shown below the name (sr-only) */
|
|
11
|
+
featureId?: string;
|
|
12
|
+
/** Absolute path to the repository on disk */
|
|
13
|
+
repositoryPath?: string;
|
|
14
|
+
/** Git branch name for this feature */
|
|
15
|
+
branch?: string;
|
|
16
|
+
/** Absolute path to the specs folder on disk */
|
|
17
|
+
specPath?: string;
|
|
18
|
+
/** Callback to delete the feature — shows inline delete button when provided */
|
|
19
|
+
onDelete?: (featureId: string) => void;
|
|
20
|
+
/** Whether a delete operation is in progress */
|
|
21
|
+
isDeleting?: boolean;
|
|
22
|
+
/** Drawer body content */
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { ReviewDrawerShell } from './review-drawer-shell';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof ReviewDrawerShell> = {
|
|
7
|
+
title: 'Composed/ReviewDrawerShell',
|
|
8
|
+
component: ReviewDrawerShell,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'fullscreen',
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default meta;
|
|
16
|
+
type Story = StoryObj<typeof ReviewDrawerShell>;
|
|
17
|
+
|
|
18
|
+
function ShellTemplate(
|
|
19
|
+
props: Omit<React.ComponentProps<typeof ReviewDrawerShell>, 'open' | 'onClose' | 'children'>
|
|
20
|
+
) {
|
|
21
|
+
const [open, setOpen] = useState(true);
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div style={{ height: '100vh', background: '#f8fafc', padding: '2rem' }}>
|
|
25
|
+
<button
|
|
26
|
+
type="button"
|
|
27
|
+
onClick={() => setOpen(true)}
|
|
28
|
+
style={{ padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }}
|
|
29
|
+
>
|
|
30
|
+
Open Drawer
|
|
31
|
+
</button>
|
|
32
|
+
<ReviewDrawerShell {...props} open={open} onClose={() => setOpen(false)}>
|
|
33
|
+
<div className="flex flex-1 items-center justify-center p-8">
|
|
34
|
+
<p className="text-muted-foreground text-sm">Review content goes here</p>
|
|
35
|
+
</div>
|
|
36
|
+
</ReviewDrawerShell>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Default shell with action buttons. */
|
|
42
|
+
export const Default: Story = {
|
|
43
|
+
render: () => (
|
|
44
|
+
<ShellTemplate
|
|
45
|
+
featureName="User Authentication Flow"
|
|
46
|
+
featureId="FEAT-042"
|
|
47
|
+
repositoryPath="/Users/dev/my-project"
|
|
48
|
+
branch="feat/auth-flow"
|
|
49
|
+
specPath="/Users/dev/my-project/specs/042-auth-flow"
|
|
50
|
+
/>
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Shell with inline delete button. */
|
|
55
|
+
export const WithDelete: Story = {
|
|
56
|
+
render: () => (
|
|
57
|
+
<ShellTemplate
|
|
58
|
+
featureName="User Authentication Flow"
|
|
59
|
+
featureId="FEAT-042"
|
|
60
|
+
repositoryPath="/Users/dev/my-project"
|
|
61
|
+
branch="feat/auth-flow"
|
|
62
|
+
specPath="/Users/dev/my-project/specs/042-auth-flow"
|
|
63
|
+
onDelete={fn().mockName('onDelete')}
|
|
64
|
+
/>
|
|
65
|
+
),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/** Shell with delete in progress. */
|
|
69
|
+
export const DeletingState: Story = {
|
|
70
|
+
render: () => (
|
|
71
|
+
<ShellTemplate
|
|
72
|
+
featureName="User Authentication Flow"
|
|
73
|
+
featureId="FEAT-042"
|
|
74
|
+
repositoryPath="/Users/dev/my-project"
|
|
75
|
+
branch="feat/auth-flow"
|
|
76
|
+
onDelete={fn().mockName('onDelete')}
|
|
77
|
+
isDeleting
|
|
78
|
+
/>
|
|
79
|
+
),
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** Shell without action buttons (no repositoryPath). */
|
|
83
|
+
export const NoActions: Story = {
|
|
84
|
+
render: () => <ShellTemplate featureName="Standalone Feature" featureId="FEAT-001" />,
|
|
85
|
+
};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Loader2, Trash2, XIcon } from 'lucide-react';
|
|
4
|
+
import {
|
|
5
|
+
Drawer,
|
|
6
|
+
DrawerContent,
|
|
7
|
+
DrawerHeader,
|
|
8
|
+
DrawerTitle,
|
|
9
|
+
DrawerDescription,
|
|
10
|
+
} from '@/components/ui/drawer';
|
|
11
|
+
import { Button } from '@/components/ui/button';
|
|
12
|
+
import { Separator } from '@/components/ui/separator';
|
|
13
|
+
import {
|
|
14
|
+
AlertDialog,
|
|
15
|
+
AlertDialogAction,
|
|
16
|
+
AlertDialogCancel,
|
|
17
|
+
AlertDialogContent,
|
|
18
|
+
AlertDialogDescription,
|
|
19
|
+
AlertDialogFooter,
|
|
20
|
+
AlertDialogHeader,
|
|
21
|
+
AlertDialogTitle,
|
|
22
|
+
AlertDialogTrigger,
|
|
23
|
+
} from '@/components/ui/alert-dialog';
|
|
24
|
+
import { OpenActionMenu } from '@/components/common/open-action-menu';
|
|
25
|
+
import { useFeatureActions } from '@/components/common/feature-drawer/use-feature-actions';
|
|
26
|
+
import type { ReviewDrawerShellProps } from './review-drawer-shell-config';
|
|
27
|
+
|
|
28
|
+
export function ReviewDrawerShell({
|
|
29
|
+
open,
|
|
30
|
+
onClose,
|
|
31
|
+
featureName,
|
|
32
|
+
featureId,
|
|
33
|
+
repositoryPath,
|
|
34
|
+
branch,
|
|
35
|
+
specPath,
|
|
36
|
+
onDelete,
|
|
37
|
+
isDeleting,
|
|
38
|
+
children,
|
|
39
|
+
}: ReviewDrawerShellProps) {
|
|
40
|
+
const actionsInput = repositoryPath && branch ? { repositoryPath, branch, specPath } : null;
|
|
41
|
+
const actions = useFeatureActions(actionsInput);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<Drawer
|
|
45
|
+
direction="right"
|
|
46
|
+
modal={false}
|
|
47
|
+
handleOnly
|
|
48
|
+
open={open}
|
|
49
|
+
onOpenChange={(isOpen) => {
|
|
50
|
+
if (!isOpen) onClose();
|
|
51
|
+
}}
|
|
52
|
+
>
|
|
53
|
+
<DrawerContent direction="right" className="w-xl" showCloseButton={false}>
|
|
54
|
+
{/* Close button */}
|
|
55
|
+
<button
|
|
56
|
+
type="button"
|
|
57
|
+
aria-label="Close"
|
|
58
|
+
onClick={onClose}
|
|
59
|
+
className="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden"
|
|
60
|
+
>
|
|
61
|
+
<XIcon className="size-4" />
|
|
62
|
+
</button>
|
|
63
|
+
|
|
64
|
+
{/* Header */}
|
|
65
|
+
<DrawerHeader>
|
|
66
|
+
<DrawerTitle>{featureName}</DrawerTitle>
|
|
67
|
+
{featureId ? (
|
|
68
|
+
<DrawerDescription className="sr-only">{featureId}</DrawerDescription>
|
|
69
|
+
) : null}
|
|
70
|
+
</DrawerHeader>
|
|
71
|
+
|
|
72
|
+
{/* Action menu + inline delete */}
|
|
73
|
+
{actionsInput ? (
|
|
74
|
+
<div className="flex items-center gap-2 px-4 pb-3">
|
|
75
|
+
<OpenActionMenu
|
|
76
|
+
actions={actions}
|
|
77
|
+
repositoryPath={actionsInput.repositoryPath}
|
|
78
|
+
showSpecs={!!specPath}
|
|
79
|
+
/>
|
|
80
|
+
{onDelete && featureId ? (
|
|
81
|
+
<>
|
|
82
|
+
<div className="bg-border mx-1 h-4 w-px" />
|
|
83
|
+
<AlertDialog>
|
|
84
|
+
<AlertDialogTrigger asChild>
|
|
85
|
+
<Button
|
|
86
|
+
variant="ghost"
|
|
87
|
+
size="icon-sm"
|
|
88
|
+
aria-label="Delete feature"
|
|
89
|
+
disabled={isDeleting}
|
|
90
|
+
className="text-muted-foreground hover:text-destructive"
|
|
91
|
+
data-testid="review-drawer-delete"
|
|
92
|
+
>
|
|
93
|
+
{isDeleting ? (
|
|
94
|
+
<Loader2 className="size-4 animate-spin" />
|
|
95
|
+
) : (
|
|
96
|
+
<Trash2 className="size-4" />
|
|
97
|
+
)}
|
|
98
|
+
</Button>
|
|
99
|
+
</AlertDialogTrigger>
|
|
100
|
+
<AlertDialogContent>
|
|
101
|
+
<AlertDialogHeader>
|
|
102
|
+
<AlertDialogTitle>Delete feature?</AlertDialogTitle>
|
|
103
|
+
<AlertDialogDescription>
|
|
104
|
+
This will permanently delete <strong>{featureName}</strong> ({featureId}).
|
|
105
|
+
This action cannot be undone.
|
|
106
|
+
</AlertDialogDescription>
|
|
107
|
+
</AlertDialogHeader>
|
|
108
|
+
<AlertDialogFooter>
|
|
109
|
+
<AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>
|
|
110
|
+
<AlertDialogAction
|
|
111
|
+
variant="destructive"
|
|
112
|
+
disabled={isDeleting}
|
|
113
|
+
onClick={() => onDelete(featureId)}
|
|
114
|
+
>
|
|
115
|
+
{isDeleting ? (
|
|
116
|
+
<>
|
|
117
|
+
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
|
|
118
|
+
Deleting…
|
|
119
|
+
</>
|
|
120
|
+
) : (
|
|
121
|
+
'Delete'
|
|
122
|
+
)}
|
|
123
|
+
</AlertDialogAction>
|
|
124
|
+
</AlertDialogFooter>
|
|
125
|
+
</AlertDialogContent>
|
|
126
|
+
</AlertDialog>
|
|
127
|
+
</>
|
|
128
|
+
) : null}
|
|
129
|
+
</div>
|
|
130
|
+
) : null}
|
|
131
|
+
|
|
132
|
+
<Separator />
|
|
133
|
+
|
|
134
|
+
{/* Content slot */}
|
|
135
|
+
<div className="flex min-h-0 flex-1 flex-col">{children}</div>
|
|
136
|
+
</DrawerContent>
|
|
137
|
+
</Drawer>
|
|
138
|
+
);
|
|
139
|
+
}
|
package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/index.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { TechDecisionsReview } from './tech-decisions-review';
|
|
2
|
+
export { TechDecisionsDrawer } from './tech-decisions-drawer';
|
|
3
|
+
export type {
|
|
4
|
+
TechDecisionsReviewProps,
|
|
5
|
+
TechDecisionsDrawerProps,
|
|
6
|
+
TechDecisionsReviewData,
|
|
7
|
+
TechDecision,
|
|
8
|
+
} from './tech-decisions-review-config';
|