@shepai/cli 1.76.0-pr240.447630e → 1.76.0-pr241.9ff2c05
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts +15 -0
- package/dist/src/presentation/web/app/actions/get-feature-messages.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-messages.js +26 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +17 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +25 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +18 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.js +31 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +90 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +20 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +252 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +7 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +68 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +112 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.js +24 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.js +125 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +6 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +35 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +28 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +157 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +40 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +22 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +188 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +30 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +100 -0
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +1 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
- 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-state-config.js +0 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- 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/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_d8868bc0._.js → _30fd6f01._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_d8868bc0._.js.map → _30fd6f01._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- 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 +22 -22
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.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/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.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/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_d8868bc0._.js → _30fd6f01._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- 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 +22 -22
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-messages.ts +42 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-phase-timings.ts +42 -0
- package/web/.next/standalone/src/presentation/web/app/actions/get-feature-plan.ts +52 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx +272 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx +245 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.tsx +130 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx +136 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.tsx +149 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.tsx +92 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx +186 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx +142 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx +214 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx +121 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts +143 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +1 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +0 -3
- package/web/.next/static/chunks/{eba61cbc1ad20c1d.js → 2e2355741bd6a9a7.js} +1 -1
- package/web/.next/static/chunks/{ff6489e28cbf0b7b.js → 437a925303b28b53.js} +1 -1
- package/web/.next/static/chunks/{ba17181b8e8a3593.js → 45b6a69a50b9d9e8.js} +1 -1
- package/web/.next/static/chunks/{4484a8fa29865af9.js → 47b5d582b373816d.js} +3 -3
- package/web/.next/static/chunks/{90f17af918bf9d84.js → 4e6ecfe539924a71.js} +1 -1
- package/web/.next/static/chunks/84d2f2d55e5cf753.css +2 -0
- package/web/.next/static/chunks/90f36476e66cbace.js +1 -0
- package/web/.next/static/chunks/{1f91036a11c9dc01.js → b5078ac043e7335a.js} +1 -1
- package/web/.next/static/chunks/{2b2d40707c3526be.js → dcb8f73fb28b2a26.js} +1 -1
- package/web/.next/static/chunks/{ff708b9a4954c701.js → e37d7d4d215db8f5.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/static/chunks/23c4643c3c3d429c.js +0 -1
- package/web/.next/static/chunks/e12fff3b57456bc2.css +0 -2
- /package/web/.next/static/{8IW4pcSs1YMI4I3CN6S8X → TuKZpCcwG7RLlpnyasgpZ}/_buildManifest.js +0 -0
- /package/web/.next/static/{8IW4pcSs1YMI4I3CN6S8X → TuKZpCcwG7RLlpnyasgpZ}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{8IW4pcSs1YMI4I3CN6S8X → TuKZpCcwG7RLlpnyasgpZ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
3
|
+
import { FeatureDrawerTabs } from './feature-drawer-tabs.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Drawers/Feature/Tabs/FeatureDrawerTabs',
|
|
6
|
+
component: FeatureDrawerTabs,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'fullscreen',
|
|
10
|
+
},
|
|
11
|
+
decorators: [
|
|
12
|
+
(Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
/* ---------------------------------------------------------------------------
|
|
17
|
+
* Data fixtures
|
|
18
|
+
* ------------------------------------------------------------------------- */
|
|
19
|
+
const runningFeature = {
|
|
20
|
+
name: 'Auth Module',
|
|
21
|
+
description: 'Implement OAuth2 authentication flow with multiple providers',
|
|
22
|
+
featureId: '#f1',
|
|
23
|
+
lifecycle: 'implementation',
|
|
24
|
+
state: 'running',
|
|
25
|
+
progress: 65,
|
|
26
|
+
agentType: 'claude-code',
|
|
27
|
+
runtime: '2h 15m',
|
|
28
|
+
repositoryPath: '/home/user/my-repo',
|
|
29
|
+
branch: 'feat/auth-module',
|
|
30
|
+
pr: {
|
|
31
|
+
url: 'https://github.com/org/repo/pull/42',
|
|
32
|
+
number: 42,
|
|
33
|
+
status: PrStatus.Open,
|
|
34
|
+
ciStatus: CiStatus.Pending,
|
|
35
|
+
commitHash: 'abc1234567890def',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const doneFeature = {
|
|
39
|
+
name: 'Payment Gateway',
|
|
40
|
+
description: 'Stripe integration for subscriptions',
|
|
41
|
+
featureId: '#f3',
|
|
42
|
+
lifecycle: 'deploy',
|
|
43
|
+
state: 'done',
|
|
44
|
+
progress: 100,
|
|
45
|
+
runtime: '1h 42m',
|
|
46
|
+
repositoryPath: '/home/user/my-repo',
|
|
47
|
+
branch: 'feat/payment-gateway',
|
|
48
|
+
pr: {
|
|
49
|
+
url: 'https://github.com/org/repo/pull/55',
|
|
50
|
+
number: 55,
|
|
51
|
+
status: PrStatus.Merged,
|
|
52
|
+
ciStatus: CiStatus.Success,
|
|
53
|
+
commitHash: 'def4567890abc123',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const requirementsFeature = {
|
|
57
|
+
name: 'API Rate Limiting',
|
|
58
|
+
description: 'Implement sliding window rate limiting for public endpoints',
|
|
59
|
+
featureId: '#bi1',
|
|
60
|
+
lifecycle: 'requirements',
|
|
61
|
+
state: 'action-required',
|
|
62
|
+
progress: 0,
|
|
63
|
+
repositoryPath: '/home/user/my-repo',
|
|
64
|
+
branch: 'feat/api-rate-limiting',
|
|
65
|
+
};
|
|
66
|
+
const errorFeature = {
|
|
67
|
+
name: 'Email Service',
|
|
68
|
+
description: 'Transactional email with SendGrid',
|
|
69
|
+
featureId: '#f5',
|
|
70
|
+
lifecycle: 'review',
|
|
71
|
+
state: 'error',
|
|
72
|
+
progress: 30,
|
|
73
|
+
errorMessage: 'Build failed: type mismatch in EmailHandler',
|
|
74
|
+
repositoryPath: '/home/user/my-repo',
|
|
75
|
+
branch: 'feat/email-service',
|
|
76
|
+
};
|
|
77
|
+
/* ---------------------------------------------------------------------------
|
|
78
|
+
* Stories
|
|
79
|
+
*
|
|
80
|
+
* Note: In Storybook, server actions are mocked and return error states.
|
|
81
|
+
* The Overview tab renders fully since it uses FeatureNodeData (no server action).
|
|
82
|
+
* Activity, Messages, and Plan tabs show error states from the mocked actions.
|
|
83
|
+
* See individual tab stories (ActivityTab, MessagesTab, PlanTab) for populated states.
|
|
84
|
+
* ------------------------------------------------------------------------- */
|
|
85
|
+
/** Default — running feature with full data. Overview tab active. */
|
|
86
|
+
export const Default = {
|
|
87
|
+
args: {
|
|
88
|
+
featureNode: runningFeature,
|
|
89
|
+
featureId: '#f1',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/** Completed feature in deploy phase with merged PR. */
|
|
93
|
+
export const CompletedFeature = {
|
|
94
|
+
args: {
|
|
95
|
+
featureNode: doneFeature,
|
|
96
|
+
featureId: '#f3',
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
/** Early-stage feature in requirements phase, no progress. */
|
|
100
|
+
export const RequirementsPhase = {
|
|
101
|
+
args: {
|
|
102
|
+
featureNode: requirementsFeature,
|
|
103
|
+
featureId: '#bi1',
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
/** Feature in error state. */
|
|
107
|
+
export const ErrorState = {
|
|
108
|
+
args: {
|
|
109
|
+
featureNode: errorFeature,
|
|
110
|
+
featureId: '#f5',
|
|
111
|
+
},
|
|
112
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { FeatureDrawerTabs } from './feature-drawer-tabs.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MessageData } from '../../../app/actions/get-feature-messages.js';
|
|
2
|
+
export interface MessagesTabProps {
|
|
3
|
+
messages: MessageData[] | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function MessagesTab({ messages, loading, error }: MessagesTabProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=messages-tab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/messages-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CAmCzE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Loader2, AlertCircle, MessageSquare } from 'lucide-react';
|
|
4
|
+
export function MessagesTab({ messages, loading, error }) {
|
|
5
|
+
if (loading) {
|
|
6
|
+
return (_jsx("div", { "data-testid": "messages-tab-loading", className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
|
|
7
|
+
}
|
|
8
|
+
if (error) {
|
|
9
|
+
return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-sm text-red-600", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: error })] }));
|
|
10
|
+
}
|
|
11
|
+
if (!messages || messages.length === 0) {
|
|
12
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(MessageSquare, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No messages yet" })] }));
|
|
13
|
+
}
|
|
14
|
+
return (_jsx("div", { "data-testid": "messages-list", className: "flex flex-col gap-3 p-4", children: messages.map((msg, index) => (
|
|
15
|
+
// eslint-disable-next-line react/no-array-index-key -- messages are append-only, never reorder
|
|
16
|
+
_jsx(MessageItem, { message: msg }, `msg-${index}`))) }));
|
|
17
|
+
}
|
|
18
|
+
function MessageItem({ message }) {
|
|
19
|
+
const isAssistant = message.role === 'assistant';
|
|
20
|
+
return (_jsxs("div", { "data-testid": `message-${message.role}`, className: `flex flex-col gap-1.5 rounded-lg px-3 py-2 ${isAssistant ? 'bg-muted/50' : 'border-primary/20 border-l-2 pl-3'}`, children: [_jsx("span", { className: `text-xs font-medium ${isAssistant ? 'text-muted-foreground' : 'text-primary'}`, children: message.role }), _jsx("p", { className: "text-sm leading-relaxed whitespace-pre-wrap", children: message.content }), message.options && message.options.length > 0 ? (_jsxs("div", { className: "mt-1 flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Options:" }), _jsx("ul", { className: "flex flex-col gap-0.5", children: message.options.map((option, idx) => {
|
|
21
|
+
const isSelected = message.selectedOption === idx;
|
|
22
|
+
return (_jsxs("li", { className: `text-xs ${isSelected ? 'font-medium text-emerald-600' : 'text-muted-foreground'}`, children: [isSelected ? '✓ ' : '○ ', option] }, `option-${idx}`));
|
|
23
|
+
}) }), message.answer ? (_jsxs("span", { className: "mt-0.5 text-xs font-medium text-emerald-600", children: ["Answer: ", message.answer] })) : null] })) : null] }));
|
|
24
|
+
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { MessagesTab } from './messages-tab.js';
|
|
3
|
+
declare const meta: Meta<typeof MessagesTab>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MessagesTab>;
|
|
6
|
+
/** Default — mixed assistant and user messages. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Messages with options — shows options list with selected answers highlighted. */
|
|
9
|
+
export declare const WithOptions: Story;
|
|
10
|
+
/** Single message — minimal conversation. */
|
|
11
|
+
export declare const SingleMessage: Story;
|
|
12
|
+
/** Loading state — spinner displayed while data is being fetched. */
|
|
13
|
+
export declare const Loading: Story;
|
|
14
|
+
/** Empty state — no messages yet. */
|
|
15
|
+
export declare const Empty: Story;
|
|
16
|
+
/** Error state — inline error message. */
|
|
17
|
+
export declare const Error: Story;
|
|
18
|
+
//# sourceMappingURL=messages-tab.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA2E1C,mDAAmD;AACnD,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,aAAa,EAAE,KAM3B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/messages-tab.stories.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { MessagesTab } from './messages-tab.js';
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Drawers/Feature/Tabs/MessagesTab',
|
|
5
|
+
component: MessagesTab,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: 'fullscreen',
|
|
9
|
+
},
|
|
10
|
+
decorators: [
|
|
11
|
+
(Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
/* ---------------------------------------------------------------------------
|
|
16
|
+
* Data fixtures
|
|
17
|
+
* ------------------------------------------------------------------------- */
|
|
18
|
+
const mixedRoleMessages = [
|
|
19
|
+
{
|
|
20
|
+
role: 'assistant',
|
|
21
|
+
content: 'I will implement the OAuth2 authentication flow. Let me start by analyzing the existing codebase to understand the current auth patterns.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
role: 'user',
|
|
25
|
+
content: 'Please make sure to support Google and GitHub as identity providers.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
role: 'assistant',
|
|
29
|
+
content: 'Understood. I will implement support for both Google and GitHub OAuth providers. I have identified the following files that need to be modified:\n\n- src/auth/providers.ts\n- src/auth/callback-handler.ts\n- src/config/oauth.ts',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
role: 'user',
|
|
33
|
+
content: 'Looks good. Please also add refresh token support.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
content: 'I have completed the implementation with refresh token support. The changes include:\n\n1. Token refresh endpoint at /api/auth/refresh\n2. Automatic token rotation on expiry\n3. Secure httpOnly cookie storage for refresh tokens',
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
const messagesWithOptions = [
|
|
41
|
+
{
|
|
42
|
+
role: 'assistant',
|
|
43
|
+
content: 'Which authentication strategy should we use for the API endpoints?',
|
|
44
|
+
options: [
|
|
45
|
+
'JWT with refresh tokens',
|
|
46
|
+
'Session-based auth',
|
|
47
|
+
'API key authentication',
|
|
48
|
+
'OAuth2 bearer tokens',
|
|
49
|
+
],
|
|
50
|
+
selectedOption: 0,
|
|
51
|
+
answer: 'JWT with refresh tokens',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
role: 'user',
|
|
55
|
+
content: 'JWT with refresh tokens is the right choice for our use case.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
role: 'assistant',
|
|
59
|
+
content: 'How should we handle token expiration?',
|
|
60
|
+
options: ['Silent refresh', 'Redirect to login', 'Show warning before expiry'],
|
|
61
|
+
selectedOption: 2,
|
|
62
|
+
answer: 'Show warning before expiry',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
role: 'assistant',
|
|
66
|
+
content: 'I will implement the JWT authentication with silent refresh tokens and a warning notification shown 5 minutes before token expiry.',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
const singleMessage = [
|
|
70
|
+
{
|
|
71
|
+
role: 'assistant',
|
|
72
|
+
content: 'Starting feature analysis. I will review the codebase and propose an implementation plan.',
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
/* ---------------------------------------------------------------------------
|
|
76
|
+
* Stories
|
|
77
|
+
* ------------------------------------------------------------------------- */
|
|
78
|
+
/** Default — mixed assistant and user messages. */
|
|
79
|
+
export const Default = {
|
|
80
|
+
args: {
|
|
81
|
+
messages: mixedRoleMessages,
|
|
82
|
+
loading: false,
|
|
83
|
+
error: null,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
/** Messages with options — shows options list with selected answers highlighted. */
|
|
87
|
+
export const WithOptions = {
|
|
88
|
+
args: {
|
|
89
|
+
messages: messagesWithOptions,
|
|
90
|
+
loading: false,
|
|
91
|
+
error: null,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
/** Single message — minimal conversation. */
|
|
95
|
+
export const SingleMessage = {
|
|
96
|
+
args: {
|
|
97
|
+
messages: singleMessage,
|
|
98
|
+
loading: false,
|
|
99
|
+
error: null,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
/** Loading state — spinner displayed while data is being fetched. */
|
|
103
|
+
export const Loading = {
|
|
104
|
+
args: {
|
|
105
|
+
messages: null,
|
|
106
|
+
loading: true,
|
|
107
|
+
error: null,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
/** Empty state — no messages yet. */
|
|
111
|
+
export const Empty = {
|
|
112
|
+
args: {
|
|
113
|
+
messages: [],
|
|
114
|
+
loading: false,
|
|
115
|
+
error: null,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
/** Error state — inline error message. */
|
|
119
|
+
export const Error = {
|
|
120
|
+
args: {
|
|
121
|
+
messages: null,
|
|
122
|
+
loading: false,
|
|
123
|
+
error: 'Failed to load messages. Please try again.',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FeatureNodeData } from '../../common/feature-node/index.js';
|
|
2
|
+
export interface OverviewTabProps {
|
|
3
|
+
data: FeatureNodeData;
|
|
4
|
+
}
|
|
5
|
+
export declare function OverviewTab({ data }: OverviewTabProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=overview-tab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAmCrD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { ExternalLink, GitCommitHorizontal } from 'lucide-react';
|
|
4
|
+
import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
5
|
+
import { cn } from '../../../lib/utils.js';
|
|
6
|
+
import { Badge } from '../../ui/badge.js';
|
|
7
|
+
import { Separator } from '../../ui/separator.js';
|
|
8
|
+
import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
|
|
9
|
+
import { CometSpinner } from '../../ui/comet-spinner.js';
|
|
10
|
+
import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
|
|
11
|
+
export function OverviewTab({ data }) {
|
|
12
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsx(FeatureStateBadge, { data: data }), data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null] }), data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx(FeaturePrInfo, { pr: data.pr })] })) : null, _jsx(FeatureDetails, { data: data })] }));
|
|
13
|
+
}
|
|
14
|
+
function FeatureStateBadge({ data }) {
|
|
15
|
+
const config = featureNodeStateConfig[data.state];
|
|
16
|
+
const Icon = config.icon;
|
|
17
|
+
return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: config.label })] }));
|
|
18
|
+
}
|
|
19
|
+
const prStatusStyles = {
|
|
20
|
+
[PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
|
|
21
|
+
[PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',
|
|
22
|
+
[PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
|
|
23
|
+
};
|
|
24
|
+
function FeaturePrInfo({ pr }) {
|
|
25
|
+
return (_jsx("div", { "data-testid": "feature-drawer-pr", className: "border-border mx-4 rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
|
|
26
|
+
}
|
|
27
|
+
function FeatureDetails({ data }) {
|
|
28
|
+
const hasAnyDetail = data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
|
|
29
|
+
if (!hasAnyDetail)
|
|
30
|
+
return null;
|
|
31
|
+
return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-details", className: "flex flex-col gap-3 p-4", children: [data.agentType ? _jsx(DetailRow, { label: "Agent", value: data.agentType }) : null, data.runtime ? _jsx(DetailRow, { label: "Runtime", value: data.runtime }) : null, data.blockedBy ? _jsx(DetailRow, { label: "Blocked by", value: data.blockedBy }) : null, data.errorMessage ? _jsx(DetailRow, { label: "Error", value: data.errorMessage }) : null] })] }));
|
|
32
|
+
}
|
|
33
|
+
function DetailRow({ label, value }) {
|
|
34
|
+
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
|
|
35
|
+
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { OverviewTab } from './overview-tab.js';
|
|
3
|
+
declare const meta: Meta<typeof OverviewTab>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof OverviewTab>;
|
|
6
|
+
/** Default — full data with status, progress, PR card, and details. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Feature with no PR — PR card is hidden. */
|
|
9
|
+
export declare const NoPr: Story;
|
|
10
|
+
/** Feature with 0% progress — progress bar is hidden. */
|
|
11
|
+
export declare const NoProgress: Story;
|
|
12
|
+
/** Completed feature in deploy phase with merged PR. */
|
|
13
|
+
export declare const DoneWithMergedPr: Story;
|
|
14
|
+
/** Blocked feature showing blocked-by detail. */
|
|
15
|
+
export declare const Blocked: Story;
|
|
16
|
+
/** Error state showing error message detail. */
|
|
17
|
+
export declare const Error: Story;
|
|
18
|
+
/** Minimal data — only required fields, no optional details or PR. */
|
|
19
|
+
export declare const Minimal: Story;
|
|
20
|
+
/** Requirements phase. */
|
|
21
|
+
export declare const RequirementsPhase: Story;
|
|
22
|
+
/** Research phase. */
|
|
23
|
+
export declare const ResearchPhase: Story;
|
|
24
|
+
/** Review phase. */
|
|
25
|
+
export declare const ReviewPhase: Story;
|
|
26
|
+
/** Maintain phase. */
|
|
27
|
+
export declare const MaintainPhase: Story;
|
|
28
|
+
//# sourceMappingURL=overview-tab.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
3
|
+
import { OverviewTab } from './overview-tab.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Drawers/Feature/Tabs/OverviewTab',
|
|
6
|
+
component: OverviewTab,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'fullscreen',
|
|
10
|
+
},
|
|
11
|
+
decorators: [
|
|
12
|
+
(Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
/* ---------------------------------------------------------------------------
|
|
17
|
+
* Data fixtures
|
|
18
|
+
* ------------------------------------------------------------------------- */
|
|
19
|
+
const fullData = {
|
|
20
|
+
name: 'Auth Module',
|
|
21
|
+
description: 'Implement OAuth2 authentication flow with multiple providers',
|
|
22
|
+
featureId: '#f1',
|
|
23
|
+
lifecycle: 'implementation',
|
|
24
|
+
state: 'running',
|
|
25
|
+
progress: 65,
|
|
26
|
+
agentType: 'claude-code',
|
|
27
|
+
runtime: '2h 15m',
|
|
28
|
+
repositoryPath: '/home/user/my-repo',
|
|
29
|
+
branch: 'feat/auth-module',
|
|
30
|
+
pr: {
|
|
31
|
+
url: 'https://github.com/org/repo/pull/42',
|
|
32
|
+
number: 42,
|
|
33
|
+
status: PrStatus.Open,
|
|
34
|
+
ciStatus: CiStatus.Pending,
|
|
35
|
+
commitHash: 'abc1234567890def',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const noPrData = {
|
|
39
|
+
name: 'Search Index',
|
|
40
|
+
description: 'Elasticsearch full-text search setup',
|
|
41
|
+
featureId: '#f4',
|
|
42
|
+
lifecycle: 'implementation',
|
|
43
|
+
state: 'running',
|
|
44
|
+
progress: 40,
|
|
45
|
+
agentType: 'claude-code',
|
|
46
|
+
repositoryPath: '/home/user/my-repo',
|
|
47
|
+
branch: 'feat/search-index',
|
|
48
|
+
};
|
|
49
|
+
const noProgressData = {
|
|
50
|
+
name: 'API Rate Limiting',
|
|
51
|
+
description: 'Implement sliding window rate limiting for public endpoints',
|
|
52
|
+
featureId: '#bi1',
|
|
53
|
+
lifecycle: 'requirements',
|
|
54
|
+
state: 'action-required',
|
|
55
|
+
progress: 0,
|
|
56
|
+
repositoryPath: '/home/user/my-repo',
|
|
57
|
+
branch: 'feat/api-rate-limiting',
|
|
58
|
+
};
|
|
59
|
+
const doneData = {
|
|
60
|
+
name: 'Payment Gateway',
|
|
61
|
+
description: 'Stripe integration for subscriptions',
|
|
62
|
+
featureId: '#f3',
|
|
63
|
+
lifecycle: 'deploy',
|
|
64
|
+
state: 'done',
|
|
65
|
+
progress: 100,
|
|
66
|
+
runtime: '1h 42m',
|
|
67
|
+
repositoryPath: '/home/user/my-repo',
|
|
68
|
+
branch: 'feat/payment-gateway',
|
|
69
|
+
pr: {
|
|
70
|
+
url: 'https://github.com/org/repo/pull/55',
|
|
71
|
+
number: 55,
|
|
72
|
+
status: PrStatus.Merged,
|
|
73
|
+
ciStatus: CiStatus.Success,
|
|
74
|
+
commitHash: 'def4567890abc123',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
const blockedData = {
|
|
78
|
+
name: 'Email Service',
|
|
79
|
+
description: 'Transactional email with SendGrid',
|
|
80
|
+
featureId: '#f5',
|
|
81
|
+
lifecycle: 'implementation',
|
|
82
|
+
state: 'blocked',
|
|
83
|
+
progress: 20,
|
|
84
|
+
blockedBy: 'Auth Module',
|
|
85
|
+
repositoryPath: '/home/user/my-repo',
|
|
86
|
+
branch: 'feat/email-service',
|
|
87
|
+
};
|
|
88
|
+
const errorData = {
|
|
89
|
+
name: 'Notification System',
|
|
90
|
+
description: 'Real-time notifications via WebSockets',
|
|
91
|
+
featureId: '#f6',
|
|
92
|
+
lifecycle: 'review',
|
|
93
|
+
state: 'error',
|
|
94
|
+
progress: 30,
|
|
95
|
+
errorMessage: 'Build failed: type mismatch in NotificationHandler',
|
|
96
|
+
repositoryPath: '/home/user/my-repo',
|
|
97
|
+
branch: 'feat/notifications',
|
|
98
|
+
};
|
|
99
|
+
const minimalData = {
|
|
100
|
+
name: 'Minimal Feature',
|
|
101
|
+
featureId: '#f0',
|
|
102
|
+
lifecycle: 'requirements',
|
|
103
|
+
state: 'creating',
|
|
104
|
+
progress: 0,
|
|
105
|
+
repositoryPath: '/home/user/my-repo',
|
|
106
|
+
branch: '',
|
|
107
|
+
};
|
|
108
|
+
/* ---------------------------------------------------------------------------
|
|
109
|
+
* Stories
|
|
110
|
+
* ------------------------------------------------------------------------- */
|
|
111
|
+
/** Default — full data with status, progress, PR card, and details. */
|
|
112
|
+
export const Default = {
|
|
113
|
+
args: { data: fullData },
|
|
114
|
+
};
|
|
115
|
+
/** Feature with no PR — PR card is hidden. */
|
|
116
|
+
export const NoPr = {
|
|
117
|
+
args: { data: noPrData },
|
|
118
|
+
};
|
|
119
|
+
/** Feature with 0% progress — progress bar is hidden. */
|
|
120
|
+
export const NoProgress = {
|
|
121
|
+
args: { data: noProgressData },
|
|
122
|
+
};
|
|
123
|
+
/** Completed feature in deploy phase with merged PR. */
|
|
124
|
+
export const DoneWithMergedPr = {
|
|
125
|
+
args: { data: doneData },
|
|
126
|
+
};
|
|
127
|
+
/** Blocked feature showing blocked-by detail. */
|
|
128
|
+
export const Blocked = {
|
|
129
|
+
args: { data: blockedData },
|
|
130
|
+
};
|
|
131
|
+
/** Error state showing error message detail. */
|
|
132
|
+
export const Error = {
|
|
133
|
+
args: { data: errorData },
|
|
134
|
+
};
|
|
135
|
+
/** Minimal data — only required fields, no optional details or PR. */
|
|
136
|
+
export const Minimal = {
|
|
137
|
+
args: { data: minimalData },
|
|
138
|
+
};
|
|
139
|
+
/* ---------------------------------------------------------------------------
|
|
140
|
+
* Lifecycle phase stories
|
|
141
|
+
* ------------------------------------------------------------------------- */
|
|
142
|
+
/** Requirements phase. */
|
|
143
|
+
export const RequirementsPhase = {
|
|
144
|
+
args: { data: { ...noPrData, lifecycle: 'requirements' } },
|
|
145
|
+
};
|
|
146
|
+
/** Research phase. */
|
|
147
|
+
export const ResearchPhase = {
|
|
148
|
+
args: { data: { ...noPrData, lifecycle: 'research' } },
|
|
149
|
+
};
|
|
150
|
+
/** Review phase. */
|
|
151
|
+
export const ReviewPhase = {
|
|
152
|
+
args: { data: { ...noPrData, lifecycle: 'review' } },
|
|
153
|
+
};
|
|
154
|
+
/** Maintain phase. */
|
|
155
|
+
export const MaintainPhase = {
|
|
156
|
+
args: { data: { ...noPrData, lifecycle: 'maintain' } },
|
|
157
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PlanData } from '../../../app/actions/get-feature-plan.js';
|
|
2
|
+
export interface PlanTabProps {
|
|
3
|
+
plan: PlanData | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function PlanTab({ plan, loading, error }: PlanTabProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=plan-tab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,gCAAgC,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAoBD,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,YAAY,2CAgD7D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Loader2, Circle, Check, Eye } from 'lucide-react';
|
|
4
|
+
import { AlertCircle, ListTodo } from 'lucide-react';
|
|
5
|
+
import { Badge } from '../../ui/badge.js';
|
|
6
|
+
const planStateBadgeStyles = {
|
|
7
|
+
Requirements: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
|
|
8
|
+
ClarificationRequired: 'border-transparent bg-amber-50 text-amber-700 hover:bg-amber-50',
|
|
9
|
+
Ready: 'border-transparent bg-green-50 text-green-700 hover:bg-green-50',
|
|
10
|
+
};
|
|
11
|
+
const taskStateConfig = {
|
|
12
|
+
Todo: { icon: Circle, colorClass: 'text-muted-foreground' },
|
|
13
|
+
'Work in Progress': { icon: Loader2, colorClass: 'text-blue-600', spinning: true },
|
|
14
|
+
Done: { icon: Check, colorClass: 'text-emerald-600' },
|
|
15
|
+
Review: { icon: Eye, colorClass: 'text-amber-600' },
|
|
16
|
+
};
|
|
17
|
+
const defaultTaskConfig = { icon: Circle, colorClass: 'text-muted-foreground' };
|
|
18
|
+
export function PlanTab({ plan, loading, error }) {
|
|
19
|
+
if (loading) {
|
|
20
|
+
return (_jsx("div", { "data-testid": "plan-tab-loading", className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
|
|
21
|
+
}
|
|
22
|
+
if (error) {
|
|
23
|
+
return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-sm text-red-600", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: error })] }));
|
|
24
|
+
}
|
|
25
|
+
if (!plan) {
|
|
26
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(ListTodo, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No plan created yet" })] }));
|
|
27
|
+
}
|
|
28
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Plan State" }), _jsx(Badge, { className: planStateBadgeStyles[plan.state] ?? 'border-transparent bg-gray-50 text-gray-700', children: plan.state })] }), plan.overview ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Overview" }), _jsx("p", { className: "text-sm leading-relaxed", children: plan.overview })] })) : null, _jsx(TaskList, { tasks: plan.tasks })] }));
|
|
29
|
+
}
|
|
30
|
+
function TaskList({ tasks }) {
|
|
31
|
+
if (tasks.length === 0) {
|
|
32
|
+
return (_jsx("div", { className: "flex flex-col items-center justify-center gap-2 py-4", children: _jsx("p", { className: "text-muted-foreground text-sm", children: "No tasks defined yet" }) }));
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Tasks" }), _jsx("div", { "data-testid": "plan-task-list", className: "flex flex-col gap-2", children: tasks.map((task, index) => (_jsx(TaskItem, { task: task, index: index }, task.title || `task-${index}`))) })] }));
|
|
35
|
+
}
|
|
36
|
+
function TaskItem({ task, index }) {
|
|
37
|
+
const config = taskStateConfig[task.state] ?? defaultTaskConfig;
|
|
38
|
+
const Icon = config.icon;
|
|
39
|
+
return (_jsxs("div", { "data-testid": `plan-task-${index}`, className: `flex items-start gap-2 rounded-md border px-3 py-2 ${config.colorClass}`, children: [_jsx(Icon, { className: `mt-0.5 h-4 w-4 shrink-0 ${config.spinning ? 'animate-spin' : ''}` }), _jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "text-sm font-medium", children: task.title }), task.description ? (_jsx("span", { className: "text-muted-foreground text-xs", children: task.description })) : null] })] }));
|
|
40
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { PlanTab } from './plan-tab.js';
|
|
3
|
+
declare const meta: Meta<typeof PlanTab>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof PlanTab>;
|
|
6
|
+
/** Default — plan with tasks in various states (Todo, WIP, Done, Review). */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** All tasks completed. */
|
|
9
|
+
export declare const AllTasksDone: Story;
|
|
10
|
+
/** Draft plan in Requirements state. */
|
|
11
|
+
export declare const DraftPlan: Story;
|
|
12
|
+
/** Plan requiring clarification — ClarificationRequired state badge. */
|
|
13
|
+
export declare const ClarificationRequired: Story;
|
|
14
|
+
/** Plan with overview but no tasks defined yet. */
|
|
15
|
+
export declare const NoTasks: Story;
|
|
16
|
+
/** Loading state — spinner displayed while data is being fetched. */
|
|
17
|
+
export declare const Loading: Story;
|
|
18
|
+
/** Empty state — no plan created yet. */
|
|
19
|
+
export declare const Empty: Story;
|
|
20
|
+
/** Error state — inline error message. */
|
|
21
|
+
export declare const Error: Story;
|
|
22
|
+
//# sourceMappingURL=plan-tab.stories.d.ts.map
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,CAc9B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,OAAO,CAAC,CAAC;AA0HtC,6EAA6E;AAC7E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC"}
|