@shepai/cli 1.37.3 → 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/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/{O1yesm5Dga4m8eBi7EwM0 → yvV-GEMagQiZhZAF0YqQs}/_buildManifest.js +0 -0
- /package/web/.next/static/{O1yesm5Dga4m8eBi7EwM0 → yvV-GEMagQiZhZAF0YqQs}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{O1yesm5Dga4m8eBi7EwM0 → yvV-GEMagQiZhZAF0YqQs}/_ssgManifest.js +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import { pickFolder as pickFolderAction } from '@/app/actions/pick-folder';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
4
|
+
* Opens a native OS folder picker dialog via server action.
|
|
3
5
|
* Returns the selected absolute path, or null if the user cancelled.
|
|
4
6
|
*/
|
|
5
7
|
export async function pickFolder(): Promise<string | null> {
|
|
6
|
-
const
|
|
8
|
+
const result = await pickFolderAction();
|
|
7
9
|
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
throw new Error(body?.error ?? 'Failed to open folder dialog');
|
|
10
|
+
if (result.error) {
|
|
11
|
+
throw new Error(result.error);
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
return body.path;
|
|
14
|
+
return result.path;
|
|
15
15
|
}
|
|
@@ -129,7 +129,7 @@ export function FeatureCreateDrawer({
|
|
|
129
129
|
}, []);
|
|
130
130
|
|
|
131
131
|
return (
|
|
132
|
-
<Drawer direction="right" modal={false} open={open} onOpenChange={handleOpenChange}>
|
|
132
|
+
<Drawer direction="right" modal={false} handleOnly open={open} onOpenChange={handleOpenChange}>
|
|
133
133
|
<DrawerContent direction="right" className="w-96" showCloseButton={false}>
|
|
134
134
|
{/* Close button */}
|
|
135
135
|
<button
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Opens a native OS file picker dialog via API route.
|
|
5
5
|
* Returns the selected files with metadata, or null if the user cancelled.
|
|
6
6
|
*/
|
|
7
7
|
export async function pickFiles(): Promise<FileAttachment[] | null> {
|
|
8
|
-
const
|
|
8
|
+
const res = await fetch('/api/dialog/pick-files', { method: 'POST' });
|
|
9
9
|
|
|
10
|
-
if (!
|
|
11
|
-
|
|
12
|
-
throw new Error(body?.error ?? 'Failed to open file dialog');
|
|
10
|
+
if (!res.ok) {
|
|
11
|
+
throw new Error('Failed to open file dialog');
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
const
|
|
16
|
-
return
|
|
14
|
+
const data: { files: FileAttachment[] | null; cancelled: boolean } = await res.json();
|
|
15
|
+
return data.cancelled ? null : data.files;
|
|
17
16
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { XIcon,
|
|
3
|
+
import { XIcon, Loader2, Trash2 } from 'lucide-react';
|
|
4
4
|
import { cn } from '@/lib/utils';
|
|
5
|
-
import {
|
|
5
|
+
import { OpenActionMenu } from '@/components/common/open-action-menu';
|
|
6
6
|
import {
|
|
7
7
|
Drawer,
|
|
8
8
|
DrawerContent,
|
|
@@ -45,6 +45,7 @@ export function FeatureDrawer({
|
|
|
45
45
|
<Drawer
|
|
46
46
|
direction="right"
|
|
47
47
|
modal={false}
|
|
48
|
+
handleOnly
|
|
48
49
|
open={selectedNode !== null}
|
|
49
50
|
onOpenChange={(open) => {
|
|
50
51
|
if (!open) onClose();
|
|
@@ -74,6 +75,7 @@ export function FeatureDrawer({
|
|
|
74
75
|
<DrawerActions
|
|
75
76
|
repositoryPath={selectedNode.repositoryPath}
|
|
76
77
|
branch={selectedNode.branch}
|
|
78
|
+
specPath={selectedNode.specPath}
|
|
77
79
|
/>
|
|
78
80
|
) : null}
|
|
79
81
|
|
|
@@ -211,26 +213,20 @@ function DetailRow({ label, value }: { label: string; value: string }) {
|
|
|
211
213
|
);
|
|
212
214
|
}
|
|
213
215
|
|
|
214
|
-
function DrawerActions({
|
|
215
|
-
|
|
216
|
-
|
|
216
|
+
function DrawerActions({
|
|
217
|
+
repositoryPath,
|
|
218
|
+
branch,
|
|
219
|
+
specPath,
|
|
220
|
+
}: {
|
|
221
|
+
repositoryPath: string;
|
|
222
|
+
branch: string;
|
|
223
|
+
specPath?: string;
|
|
224
|
+
}) {
|
|
225
|
+
const actions = useFeatureActions({ repositoryPath, branch, specPath });
|
|
217
226
|
|
|
218
227
|
return (
|
|
219
228
|
<div className="flex gap-2 px-4 pb-3">
|
|
220
|
-
<
|
|
221
|
-
label="Open in IDE"
|
|
222
|
-
onClick={openInIde}
|
|
223
|
-
loading={ideLoading}
|
|
224
|
-
error={!!ideError}
|
|
225
|
-
icon={Code2}
|
|
226
|
-
/>
|
|
227
|
-
<ActionButton
|
|
228
|
-
label="Open in Shell"
|
|
229
|
-
onClick={openInShell}
|
|
230
|
-
loading={shellLoading}
|
|
231
|
-
error={!!shellError}
|
|
232
|
-
icon={Terminal}
|
|
233
|
-
/>
|
|
229
|
+
<OpenActionMenu actions={actions} repositoryPath={repositoryPath} showSpecs={!!specPath} />
|
|
234
230
|
</div>
|
|
235
231
|
);
|
|
236
232
|
}
|
|
@@ -1,19 +1,26 @@
|
|
|
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 FeatureActionsInput {
|
|
6
9
|
repositoryPath: string;
|
|
7
10
|
branch: string;
|
|
11
|
+
specPath?: string;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
14
|
export interface FeatureActionsState {
|
|
11
15
|
openInIde: () => Promise<void>;
|
|
12
16
|
openInShell: () => Promise<void>;
|
|
17
|
+
openSpecsFolder: () => Promise<void>;
|
|
13
18
|
ideLoading: boolean;
|
|
14
19
|
shellLoading: boolean;
|
|
20
|
+
specsLoading: boolean;
|
|
15
21
|
ideError: string | null;
|
|
16
22
|
shellError: string | null;
|
|
23
|
+
specsError: string | null;
|
|
17
24
|
}
|
|
18
25
|
|
|
19
26
|
const ERROR_CLEAR_DELAY = 5000;
|
|
@@ -21,25 +28,33 @@ const ERROR_CLEAR_DELAY = 5000;
|
|
|
21
28
|
export function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState {
|
|
22
29
|
const [ideLoading, setIdeLoading] = useState(false);
|
|
23
30
|
const [shellLoading, setShellLoading] = useState(false);
|
|
31
|
+
const [specsLoading, setSpecsLoading] = useState(false);
|
|
24
32
|
const [ideError, setIdeError] = useState<string | null>(null);
|
|
25
33
|
const [shellError, setShellError] = useState<string | null>(null);
|
|
34
|
+
const [specsError, setSpecsError] = useState<string | null>(null);
|
|
26
35
|
|
|
27
36
|
const ideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
28
37
|
const shellTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
38
|
+
const specsTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
29
39
|
|
|
30
40
|
// Clear timers on unmount
|
|
31
41
|
useEffect(() => {
|
|
32
42
|
const ideTimer = ideTimerRef.current;
|
|
33
43
|
const shellTimer = shellTimerRef.current;
|
|
44
|
+
const specsTimer = specsTimerRef.current;
|
|
34
45
|
return () => {
|
|
35
46
|
if (ideTimer) clearTimeout(ideTimer);
|
|
36
47
|
if (shellTimer) clearTimeout(shellTimer);
|
|
48
|
+
if (specsTimer) clearTimeout(specsTimer);
|
|
37
49
|
};
|
|
38
50
|
}, []);
|
|
39
51
|
|
|
40
52
|
const performAction = useCallback(
|
|
41
53
|
async (
|
|
42
|
-
|
|
54
|
+
action: (input: { repositoryPath: string; branch?: string }) => Promise<{
|
|
55
|
+
success: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
}>,
|
|
43
58
|
setLoading: (v: boolean) => void,
|
|
44
59
|
setError: (v: string | null) => void,
|
|
45
60
|
timerRef: React.RefObject<ReturnType<typeof setTimeout> | null>,
|
|
@@ -54,18 +69,13 @@ export function useFeatureActions(input: FeatureActionsInput | null): FeatureAct
|
|
|
54
69
|
setError(null);
|
|
55
70
|
|
|
56
71
|
try {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
body: JSON.stringify({
|
|
61
|
-
repositoryPath: input.repositoryPath,
|
|
62
|
-
branch: input.branch,
|
|
63
|
-
}),
|
|
72
|
+
const result = await action({
|
|
73
|
+
repositoryPath: input.repositoryPath,
|
|
74
|
+
branch: input.branch,
|
|
64
75
|
});
|
|
65
76
|
|
|
66
|
-
if (!
|
|
67
|
-
const
|
|
68
|
-
const errorMessage = data.error ?? 'An unexpected error occurred';
|
|
77
|
+
if (!result.success) {
|
|
78
|
+
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
69
79
|
setError(errorMessage);
|
|
70
80
|
timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
|
|
71
81
|
}
|
|
@@ -80,16 +90,50 @@ export function useFeatureActions(input: FeatureActionsInput | null): FeatureAct
|
|
|
80
90
|
[input]
|
|
81
91
|
);
|
|
82
92
|
|
|
83
|
-
const
|
|
84
|
-
() => performAction(
|
|
93
|
+
const handleOpenIde = useCallback(
|
|
94
|
+
() => performAction(openIde, setIdeLoading, setIdeError, ideTimerRef, ideLoading),
|
|
85
95
|
[performAction, ideLoading]
|
|
86
96
|
);
|
|
87
97
|
|
|
88
|
-
const
|
|
89
|
-
() =>
|
|
90
|
-
performAction('/api/shell/open', setShellLoading, setShellError, shellTimerRef, shellLoading),
|
|
98
|
+
const handleOpenShell = useCallback(
|
|
99
|
+
() => performAction(openShell, setShellLoading, setShellError, shellTimerRef, shellLoading),
|
|
91
100
|
[performAction, shellLoading]
|
|
92
101
|
);
|
|
93
102
|
|
|
94
|
-
|
|
103
|
+
const handleOpenSpecsFolder = useCallback(async () => {
|
|
104
|
+
if (!input?.specPath || specsLoading) return;
|
|
105
|
+
|
|
106
|
+
if (specsTimerRef.current) clearTimeout(specsTimerRef.current);
|
|
107
|
+
|
|
108
|
+
setSpecsLoading(true);
|
|
109
|
+
setSpecsError(null);
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
const result = await openFolder(input.specPath);
|
|
113
|
+
|
|
114
|
+
if (!result.success) {
|
|
115
|
+
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
116
|
+
setSpecsError(errorMessage);
|
|
117
|
+
specsTimerRef.current = setTimeout(() => setSpecsError(null), ERROR_CLEAR_DELAY);
|
|
118
|
+
}
|
|
119
|
+
} catch (err: unknown) {
|
|
120
|
+
const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
|
|
121
|
+
setSpecsError(errorMessage);
|
|
122
|
+
specsTimerRef.current = setTimeout(() => setSpecsError(null), ERROR_CLEAR_DELAY);
|
|
123
|
+
} finally {
|
|
124
|
+
setSpecsLoading(false);
|
|
125
|
+
}
|
|
126
|
+
}, [input, specsLoading]);
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
openInIde: handleOpenIde,
|
|
130
|
+
openInShell: handleOpenShell,
|
|
131
|
+
openSpecsFolder: handleOpenSpecsFolder,
|
|
132
|
+
ideLoading,
|
|
133
|
+
shellLoading,
|
|
134
|
+
specsLoading,
|
|
135
|
+
ideError,
|
|
136
|
+
shellError,
|
|
137
|
+
specsError,
|
|
138
|
+
};
|
|
95
139
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ComponentType, SVGProps } from 'react';
|
|
2
|
+
import Image from 'next/image';
|
|
2
3
|
import { cn } from '@/lib/utils';
|
|
3
4
|
|
|
4
5
|
/** Agent type values mirroring the TypeSpec AgentType enum. */
|
|
@@ -9,8 +10,15 @@ type IconProps = SVGProps<SVGSVGElement> & { className?: string };
|
|
|
9
10
|
/** Create a stable image-based icon component for a brand. */
|
|
10
11
|
function createBrandIcon(src: string, alt: string): ComponentType<IconProps> {
|
|
11
12
|
function BrandIcon({ className }: IconProps) {
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
return (
|
|
14
|
+
<Image
|
|
15
|
+
src={src}
|
|
16
|
+
alt={alt}
|
|
17
|
+
width={24}
|
|
18
|
+
height={24}
|
|
19
|
+
className={cn('rounded-sm object-contain', className)}
|
|
20
|
+
/>
|
|
21
|
+
);
|
|
14
22
|
}
|
|
15
23
|
BrandIcon.displayName = `BrandIcon(${alt})`;
|
|
16
24
|
return BrandIcon;
|
|
@@ -50,6 +50,8 @@ export interface FeatureNodeData {
|
|
|
50
50
|
repositoryPath: string;
|
|
51
51
|
/** Git branch name for this feature */
|
|
52
52
|
branch: string;
|
|
53
|
+
/** Absolute path to the specs folder on disk */
|
|
54
|
+
specPath?: string;
|
|
53
55
|
/** Human-readable runtime for done state (e.g. "2h 15m") */
|
|
54
56
|
runtime?: string;
|
|
55
57
|
/** Feature name this node is blocked by */
|
|
@@ -96,6 +96,16 @@ const allStatesData: FeatureNodeData[] = [
|
|
|
96
96
|
repositoryPath: '/home/user/my-repo',
|
|
97
97
|
branch: 'feat/api-rate-limiting',
|
|
98
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: 'Data Pipeline',
|
|
101
|
+
description: 'ETL pipeline for analytics dashboard',
|
|
102
|
+
featureId: '#bi2',
|
|
103
|
+
lifecycle: 'implementation' as FeatureLifecyclePhase,
|
|
104
|
+
state: 'action-required',
|
|
105
|
+
progress: 40,
|
|
106
|
+
repositoryPath: '/home/user/my-repo',
|
|
107
|
+
branch: 'feat/data-pipeline',
|
|
108
|
+
},
|
|
99
109
|
{
|
|
100
110
|
name: 'Payment Gateway',
|
|
101
111
|
description: 'Stripe integration for subscriptions',
|
package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Handle, Position } from '@xyflow/react';
|
|
4
|
-
import { Settings, Plus } from 'lucide-react';
|
|
4
|
+
import { Settings, Plus, FileText, Wrench, type LucideIcon } from 'lucide-react';
|
|
5
5
|
import { cn } from '@/lib/utils';
|
|
6
6
|
import {
|
|
7
7
|
featureNodeStateConfig,
|
|
@@ -16,6 +16,27 @@ function AgentIcon({ agentType, className }: { agentType?: string; className?: s
|
|
|
16
16
|
return <IconComponent className={className} />;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
function getBadgeIcon(data: FeatureNodeData): LucideIcon {
|
|
20
|
+
const config = featureNodeStateConfig[data.state];
|
|
21
|
+
if (data.state === 'action-required') {
|
|
22
|
+
if (data.lifecycle === 'requirements') return FileText;
|
|
23
|
+
if (data.lifecycle === 'implementation') return Wrench;
|
|
24
|
+
}
|
|
25
|
+
return config.icon;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Returns override badge classes for action-required based on lifecycle phase. */
|
|
29
|
+
function getActionRequiredBadgeClasses(data: FeatureNodeData): {
|
|
30
|
+
badgeClass: string;
|
|
31
|
+
badgeBgClass: string;
|
|
32
|
+
} | null {
|
|
33
|
+
if (data.state !== 'action-required') return null;
|
|
34
|
+
if (data.lifecycle === 'implementation') {
|
|
35
|
+
return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
|
|
36
|
+
}
|
|
37
|
+
return null; // requirements stays amber (default)
|
|
38
|
+
}
|
|
39
|
+
|
|
19
40
|
function getBadgeText(data: FeatureNodeData): string {
|
|
20
41
|
const config = featureNodeStateConfig[data.state];
|
|
21
42
|
switch (data.state) {
|
|
@@ -27,6 +48,10 @@ function getBadgeText(data: FeatureNodeData): string {
|
|
|
27
48
|
return data.runtime ? `Completed in ${data.runtime}` : 'Completed';
|
|
28
49
|
case 'blocked':
|
|
29
50
|
return data.blockedBy ? `Waiting on ${data.blockedBy}` : 'Blocked';
|
|
51
|
+
case 'action-required':
|
|
52
|
+
if (data.lifecycle === 'requirements') return 'Review Product Requirements';
|
|
53
|
+
if (data.lifecycle === 'implementation') return 'Review Technical Planning';
|
|
54
|
+
return config.label;
|
|
30
55
|
case 'error':
|
|
31
56
|
return data.errorMessage ?? 'Something went wrong';
|
|
32
57
|
default:
|
|
@@ -163,13 +188,19 @@ export function FeatureNode({
|
|
|
163
188
|
{/* State badge */}
|
|
164
189
|
<div
|
|
165
190
|
data-testid="feature-node-badge"
|
|
166
|
-
className={
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
191
|
+
className={(() => {
|
|
192
|
+
const override = getActionRequiredBadgeClasses(data);
|
|
193
|
+
return cn(
|
|
194
|
+
'mt-1.5 flex items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium',
|
|
195
|
+
override?.badgeBgClass ?? config.badgeBgClass,
|
|
196
|
+
override?.badgeClass ?? config.badgeClass
|
|
197
|
+
);
|
|
198
|
+
})()}
|
|
171
199
|
>
|
|
172
|
-
|
|
200
|
+
{(() => {
|
|
201
|
+
const BadgeIcon = getBadgeIcon(data);
|
|
202
|
+
return <BadgeIcon className="h-3.5 w-3.5 shrink-0" />;
|
|
203
|
+
})()}
|
|
173
204
|
<span className="truncate">{getBadgeText(data)}</span>
|
|
174
205
|
</div>
|
|
175
206
|
</>
|
|
@@ -29,13 +29,31 @@ export {
|
|
|
29
29
|
export { FeatureStatusBadges, type FeatureStatusBadgesProps } from './feature-status-badges';
|
|
30
30
|
export { FeatureStatusGroup, type FeatureStatusGroupProps } from './feature-status-group';
|
|
31
31
|
export { LoadingSkeleton } from './loading-skeleton';
|
|
32
|
+
export { NotificationPermissionBanner } from './notification-permission-banner';
|
|
32
33
|
export {
|
|
33
34
|
RepositoryNode,
|
|
34
35
|
type RepositoryNodeData,
|
|
35
36
|
type RepositoryNodeType,
|
|
36
37
|
} from './repository-node';
|
|
37
38
|
export { PageHeader } from './page-header';
|
|
39
|
+
export {
|
|
40
|
+
PrdQuestionnaire,
|
|
41
|
+
PrdQuestionnaireDrawer,
|
|
42
|
+
type PrdQuestionnaireProps,
|
|
43
|
+
type PrdQuestionnaireDrawerProps,
|
|
44
|
+
type PrdQuestion,
|
|
45
|
+
type PrdFinalAction,
|
|
46
|
+
type PrdOption,
|
|
47
|
+
type PrdQuestionnaireData,
|
|
48
|
+
} from './prd-questionnaire';
|
|
38
49
|
export { ShepLogo, type ShepLogoProps } from './shep-logo';
|
|
50
|
+
export {
|
|
51
|
+
TechDecisionsReview,
|
|
52
|
+
TechDecisionsDrawer,
|
|
53
|
+
type TechDecisionsReviewProps,
|
|
54
|
+
type TechDecisionsDrawerProps,
|
|
55
|
+
type TechDecisionsReviewData,
|
|
56
|
+
} from './tech-decisions-review';
|
|
39
57
|
export { SidebarCollapseToggle, type SidebarCollapseToggleProps } from './sidebar-collapse-toggle';
|
|
40
58
|
export { SidebarNavItem, type SidebarNavItemProps } from './sidebar-nav-item';
|
|
41
59
|
export { SidebarSectionHeader, type SidebarSectionHeaderProps } from './sidebar-section-header';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { NotificationPermissionBanner } from './notification-permission-banner';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Bell, X } from 'lucide-react';
|
|
3
|
+
import { Button } from '@/components/ui/button';
|
|
4
|
+
|
|
5
|
+
function noop() {
|
|
6
|
+
// story placeholder
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const meta: Meta = {
|
|
10
|
+
title: 'Composed/NotificationPermissionBanner',
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'padded',
|
|
13
|
+
},
|
|
14
|
+
tags: ['autodocs'],
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Static render of the banner since the real component depends on the
|
|
22
|
+
* browser Notification API which is unavailable in Storybook.
|
|
23
|
+
*/
|
|
24
|
+
function BannerPreview() {
|
|
25
|
+
return (
|
|
26
|
+
<div className="bg-muted/30 relative h-64 w-full rounded-lg border">
|
|
27
|
+
<div className="bg-background absolute bottom-4 left-4 z-50 flex max-w-sm items-center gap-3 rounded-lg border p-3 shadow-lg">
|
|
28
|
+
<Bell className="text-muted-foreground size-5 shrink-0" />
|
|
29
|
+
<p className="text-muted-foreground text-sm">
|
|
30
|
+
Enable desktop notifications to stay updated on feature progress.
|
|
31
|
+
</p>
|
|
32
|
+
<div className="flex shrink-0 items-center gap-1">
|
|
33
|
+
<Button size="sm" onClick={noop}>
|
|
34
|
+
Enable
|
|
35
|
+
</Button>
|
|
36
|
+
<Button
|
|
37
|
+
variant="ghost"
|
|
38
|
+
size="icon-xs"
|
|
39
|
+
onClick={noop}
|
|
40
|
+
aria-label="Dismiss notification banner"
|
|
41
|
+
>
|
|
42
|
+
<X />
|
|
43
|
+
</Button>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const Default: Story = {
|
|
51
|
+
render: () => <BannerPreview />,
|
|
52
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
import { Bell, X } from 'lucide-react';
|
|
5
|
+
import { Button } from '@/components/ui/button';
|
|
6
|
+
|
|
7
|
+
const DISMISSED_KEY = 'shep:notification-banner-dismissed';
|
|
8
|
+
|
|
9
|
+
export function NotificationPermissionBanner() {
|
|
10
|
+
const [visible, setVisible] = useState(false);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (typeof globalThis.Notification === 'undefined') return;
|
|
14
|
+
if (globalThis.Notification.permission !== 'default') return;
|
|
15
|
+
if (localStorage.getItem(DISMISSED_KEY) === 'true') return;
|
|
16
|
+
setVisible(true);
|
|
17
|
+
}, []);
|
|
18
|
+
|
|
19
|
+
const handleEnable = useCallback(async () => {
|
|
20
|
+
if (typeof globalThis.Notification === 'undefined') return;
|
|
21
|
+
const result = await globalThis.Notification.requestPermission();
|
|
22
|
+
if (result === 'granted' || result === 'denied') {
|
|
23
|
+
setVisible(false);
|
|
24
|
+
}
|
|
25
|
+
}, []);
|
|
26
|
+
|
|
27
|
+
const handleDismiss = useCallback(() => {
|
|
28
|
+
localStorage.setItem(DISMISSED_KEY, 'true');
|
|
29
|
+
setVisible(false);
|
|
30
|
+
}, []);
|
|
31
|
+
|
|
32
|
+
if (!visible) return null;
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div className="bg-background absolute bottom-4 left-4 z-50 flex max-w-sm items-center gap-3 rounded-lg border p-3 shadow-lg">
|
|
36
|
+
<Bell className="text-muted-foreground size-5 shrink-0" />
|
|
37
|
+
<p className="text-muted-foreground text-sm">
|
|
38
|
+
Enable desktop notifications to stay updated on feature progress.
|
|
39
|
+
</p>
|
|
40
|
+
<div className="flex shrink-0 items-center gap-1">
|
|
41
|
+
<Button size="sm" onClick={handleEnable}>
|
|
42
|
+
Enable
|
|
43
|
+
</Button>
|
|
44
|
+
<Button
|
|
45
|
+
variant="ghost"
|
|
46
|
+
size="icon-xs"
|
|
47
|
+
onClick={handleDismiss}
|
|
48
|
+
aria-label="Dismiss notification banner"
|
|
49
|
+
>
|
|
50
|
+
<X />
|
|
51
|
+
</Button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
}
|
package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/config.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FeatureActionsState } from '@/components/common/feature-drawer/use-feature-actions';
|
|
2
|
+
|
|
3
|
+
export interface OpenActionMenuProps {
|
|
4
|
+
/** Actions returned by useFeatureActions hook */
|
|
5
|
+
actions: FeatureActionsState;
|
|
6
|
+
/** Absolute path to copy (repository path or spec path) */
|
|
7
|
+
repositoryPath: string;
|
|
8
|
+
/** Whether to show the "Open Specs" item */
|
|
9
|
+
showSpecs?: boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { OpenActionMenu } from './open-action-menu';
|
|
4
|
+
import type { FeatureActionsState } from '@/components/common/feature-drawer/use-feature-actions';
|
|
5
|
+
|
|
6
|
+
const defaultActions: FeatureActionsState = {
|
|
7
|
+
openInIde: fn().mockName('openInIde'),
|
|
8
|
+
openInShell: fn().mockName('openInShell'),
|
|
9
|
+
openSpecsFolder: fn().mockName('openSpecsFolder'),
|
|
10
|
+
ideLoading: false,
|
|
11
|
+
shellLoading: false,
|
|
12
|
+
specsLoading: false,
|
|
13
|
+
ideError: null,
|
|
14
|
+
shellError: null,
|
|
15
|
+
specsError: null,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const meta: Meta<typeof OpenActionMenu> = {
|
|
19
|
+
title: 'Composed/OpenActionMenu',
|
|
20
|
+
component: OpenActionMenu,
|
|
21
|
+
tags: ['autodocs'],
|
|
22
|
+
parameters: {
|
|
23
|
+
layout: 'centered',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default meta;
|
|
28
|
+
type Story = StoryObj<typeof OpenActionMenu>;
|
|
29
|
+
|
|
30
|
+
/** Default menu with all actions including specs folder. */
|
|
31
|
+
export const Default: Story = {
|
|
32
|
+
args: {
|
|
33
|
+
actions: defaultActions,
|
|
34
|
+
repositoryPath: '/Users/dev/my-project',
|
|
35
|
+
showSpecs: true,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Menu without specs folder action. */
|
|
40
|
+
export const WithoutSpecs: Story = {
|
|
41
|
+
args: {
|
|
42
|
+
actions: defaultActions,
|
|
43
|
+
repositoryPath: '/Users/dev/my-project',
|
|
44
|
+
showSpecs: false,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Menu while IDE action is loading. */
|
|
49
|
+
export const Loading: Story = {
|
|
50
|
+
args: {
|
|
51
|
+
actions: { ...defaultActions, ideLoading: true },
|
|
52
|
+
repositoryPath: '/Users/dev/my-project',
|
|
53
|
+
showSpecs: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Menu with an error on the IDE action. */
|
|
58
|
+
export const WithError: Story = {
|
|
59
|
+
args: {
|
|
60
|
+
actions: { ...defaultActions, ideError: 'Editor not found' },
|
|
61
|
+
repositoryPath: '/Users/dev/my-project',
|
|
62
|
+
showSpecs: true,
|
|
63
|
+
},
|
|
64
|
+
};
|