@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,136 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
4
|
+
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
|
|
5
|
+
import { getFeaturePhaseTimings } from '@/app/actions/get-feature-phase-timings';
|
|
6
|
+
import type { PhaseTimingData } from '@/app/actions/get-feature-phase-timings';
|
|
7
|
+
import { getFeatureMessages } from '@/app/actions/get-feature-messages';
|
|
8
|
+
import type { MessageData } from '@/app/actions/get-feature-messages';
|
|
9
|
+
import { getFeaturePlan } from '@/app/actions/get-feature-plan';
|
|
10
|
+
import type { PlanData } from '@/app/actions/get-feature-plan';
|
|
11
|
+
import type { FeatureNodeData } from '@/components/common/feature-node';
|
|
12
|
+
import { OverviewTab } from './overview-tab';
|
|
13
|
+
import { ActivityTab } from './activity-tab';
|
|
14
|
+
import { MessagesTab } from './messages-tab';
|
|
15
|
+
import { PlanTab } from './plan-tab';
|
|
16
|
+
import { useTabDataFetch } from './use-tab-data-fetch';
|
|
17
|
+
import type { TabFetchers } from './use-tab-data-fetch';
|
|
18
|
+
|
|
19
|
+
type TabKey = 'activity' | 'messages' | 'plan';
|
|
20
|
+
type ActiveTab = 'overview' | TabKey;
|
|
21
|
+
|
|
22
|
+
export interface FeatureDrawerTabsProps {
|
|
23
|
+
featureNode: FeatureNodeData;
|
|
24
|
+
featureId: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function fetchActivity(featureId: string): Promise<PhaseTimingData[]> {
|
|
28
|
+
const result = await getFeaturePhaseTimings(featureId);
|
|
29
|
+
if ('error' in result) throw new Error(result.error);
|
|
30
|
+
return result.timings;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function fetchMessages(featureId: string): Promise<MessageData[]> {
|
|
34
|
+
const result = await getFeatureMessages(featureId);
|
|
35
|
+
if ('error' in result) throw new Error(result.error);
|
|
36
|
+
return result.messages;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function fetchPlan(featureId: string): Promise<PlanData | undefined> {
|
|
40
|
+
const result = await getFeaturePlan(featureId);
|
|
41
|
+
if ('error' in result) throw new Error(result.error);
|
|
42
|
+
return result.plan;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const TAB_FETCHERS: TabFetchers<TabKey> = {
|
|
46
|
+
activity: fetchActivity,
|
|
47
|
+
messages: fetchMessages,
|
|
48
|
+
plan: fetchPlan,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export function FeatureDrawerTabs({ featureNode, featureId }: FeatureDrawerTabsProps) {
|
|
52
|
+
const [activeTab, setActiveTab] = useState<ActiveTab>('overview');
|
|
53
|
+
const { tabs, fetchTab, refreshTab } = useTabDataFetch<TabKey>(featureId, TAB_FETCHERS);
|
|
54
|
+
|
|
55
|
+
// Reset to overview when featureId changes
|
|
56
|
+
const prevFeatureIdRef = useRef(featureId);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (prevFeatureIdRef.current !== featureId) {
|
|
59
|
+
prevFeatureIdRef.current = featureId;
|
|
60
|
+
setActiveTab('overview');
|
|
61
|
+
}
|
|
62
|
+
}, [featureId]);
|
|
63
|
+
|
|
64
|
+
// SSE refresh: re-fetch active tab data when featureNode reference changes
|
|
65
|
+
const featureNodeRef = useRef(featureNode);
|
|
66
|
+
const activeTabRef = useRef(activeTab);
|
|
67
|
+
activeTabRef.current = activeTab;
|
|
68
|
+
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (featureNodeRef.current !== featureNode) {
|
|
71
|
+
featureNodeRef.current = featureNode;
|
|
72
|
+
const current = activeTabRef.current;
|
|
73
|
+
if (current !== 'overview') {
|
|
74
|
+
refreshTab(current);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}, [featureNode, refreshTab]);
|
|
78
|
+
|
|
79
|
+
const handleTabChange = useCallback(
|
|
80
|
+
(value: string) => {
|
|
81
|
+
const tab = value as ActiveTab;
|
|
82
|
+
setActiveTab(tab);
|
|
83
|
+
if (tab !== 'overview') {
|
|
84
|
+
fetchTab(tab);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
[fetchTab]
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
return (
|
|
91
|
+
<div className="flex min-h-0 flex-1 flex-col">
|
|
92
|
+
<Tabs
|
|
93
|
+
value={activeTab}
|
|
94
|
+
onValueChange={handleTabChange}
|
|
95
|
+
className="flex min-h-0 flex-1 flex-col"
|
|
96
|
+
>
|
|
97
|
+
<div className="shrink-0 px-4 pt-4">
|
|
98
|
+
<TabsList className="grid w-full grid-cols-4">
|
|
99
|
+
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
100
|
+
<TabsTrigger value="activity">Activity</TabsTrigger>
|
|
101
|
+
<TabsTrigger value="messages">Messages</TabsTrigger>
|
|
102
|
+
<TabsTrigger value="plan">Plan</TabsTrigger>
|
|
103
|
+
</TabsList>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<TabsContent value="overview" className="mt-0 flex-1 overflow-y-auto">
|
|
107
|
+
<OverviewTab data={featureNode} />
|
|
108
|
+
</TabsContent>
|
|
109
|
+
|
|
110
|
+
<TabsContent value="activity" className="mt-0 flex-1 overflow-y-auto">
|
|
111
|
+
<ActivityTab
|
|
112
|
+
timings={tabs.activity.data as PhaseTimingData[] | null}
|
|
113
|
+
loading={tabs.activity.loading}
|
|
114
|
+
error={tabs.activity.error}
|
|
115
|
+
/>
|
|
116
|
+
</TabsContent>
|
|
117
|
+
|
|
118
|
+
<TabsContent value="messages" className="mt-0 flex-1 overflow-y-auto">
|
|
119
|
+
<MessagesTab
|
|
120
|
+
messages={tabs.messages.data as MessageData[] | null}
|
|
121
|
+
loading={tabs.messages.loading}
|
|
122
|
+
error={tabs.messages.error}
|
|
123
|
+
/>
|
|
124
|
+
</TabsContent>
|
|
125
|
+
|
|
126
|
+
<TabsContent value="plan" className="mt-0 flex-1 overflow-y-auto">
|
|
127
|
+
<PlanTab
|
|
128
|
+
plan={tabs.plan.data as PlanData | null}
|
|
129
|
+
loading={tabs.plan.loading}
|
|
130
|
+
error={tabs.plan.error}
|
|
131
|
+
/>
|
|
132
|
+
</TabsContent>
|
|
133
|
+
</Tabs>
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { MessagesTab } from './messages-tab';
|
|
3
|
+
import type { MessageData } from '@/app/actions/get-feature-messages';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof MessagesTab> = {
|
|
6
|
+
title: 'Drawers/Feature/Tabs/MessagesTab',
|
|
7
|
+
component: MessagesTab,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'fullscreen',
|
|
11
|
+
},
|
|
12
|
+
decorators: [
|
|
13
|
+
(Story) => (
|
|
14
|
+
<div style={{ height: '600px', width: '400px', border: '1px solid var(--color-border)' }}>
|
|
15
|
+
<Story />
|
|
16
|
+
</div>
|
|
17
|
+
),
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default meta;
|
|
22
|
+
type Story = StoryObj<typeof MessagesTab>;
|
|
23
|
+
|
|
24
|
+
/* ---------------------------------------------------------------------------
|
|
25
|
+
* Data fixtures
|
|
26
|
+
* ------------------------------------------------------------------------- */
|
|
27
|
+
|
|
28
|
+
const mixedRoleMessages: MessageData[] = [
|
|
29
|
+
{
|
|
30
|
+
role: 'assistant',
|
|
31
|
+
content:
|
|
32
|
+
'I will implement the OAuth2 authentication flow. Let me start by analyzing the existing codebase to understand the current auth patterns.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
role: 'user',
|
|
36
|
+
content: 'Please make sure to support Google and GitHub as identity providers.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
role: 'assistant',
|
|
40
|
+
content:
|
|
41
|
+
'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',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
role: 'user',
|
|
45
|
+
content: 'Looks good. Please also add refresh token support.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
role: 'assistant',
|
|
49
|
+
content:
|
|
50
|
+
'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',
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
const messagesWithOptions: MessageData[] = [
|
|
55
|
+
{
|
|
56
|
+
role: 'assistant',
|
|
57
|
+
content: 'Which authentication strategy should we use for the API endpoints?',
|
|
58
|
+
options: [
|
|
59
|
+
'JWT with refresh tokens',
|
|
60
|
+
'Session-based auth',
|
|
61
|
+
'API key authentication',
|
|
62
|
+
'OAuth2 bearer tokens',
|
|
63
|
+
],
|
|
64
|
+
selectedOption: 0,
|
|
65
|
+
answer: 'JWT with refresh tokens',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
role: 'user',
|
|
69
|
+
content: 'JWT with refresh tokens is the right choice for our use case.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
role: 'assistant',
|
|
73
|
+
content: 'How should we handle token expiration?',
|
|
74
|
+
options: ['Silent refresh', 'Redirect to login', 'Show warning before expiry'],
|
|
75
|
+
selectedOption: 2,
|
|
76
|
+
answer: 'Show warning before expiry',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
role: 'assistant',
|
|
80
|
+
content:
|
|
81
|
+
'I will implement the JWT authentication with silent refresh tokens and a warning notification shown 5 minutes before token expiry.',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const singleMessage: MessageData[] = [
|
|
86
|
+
{
|
|
87
|
+
role: 'assistant',
|
|
88
|
+
content:
|
|
89
|
+
'Starting feature analysis. I will review the codebase and propose an implementation plan.',
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
/* ---------------------------------------------------------------------------
|
|
94
|
+
* Stories
|
|
95
|
+
* ------------------------------------------------------------------------- */
|
|
96
|
+
|
|
97
|
+
/** Default — mixed assistant and user messages. */
|
|
98
|
+
export const Default: Story = {
|
|
99
|
+
args: {
|
|
100
|
+
messages: mixedRoleMessages,
|
|
101
|
+
loading: false,
|
|
102
|
+
error: null,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** Messages with options — shows options list with selected answers highlighted. */
|
|
107
|
+
export const WithOptions: Story = {
|
|
108
|
+
args: {
|
|
109
|
+
messages: messagesWithOptions,
|
|
110
|
+
loading: false,
|
|
111
|
+
error: null,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/** Single message — minimal conversation. */
|
|
116
|
+
export const SingleMessage: Story = {
|
|
117
|
+
args: {
|
|
118
|
+
messages: singleMessage,
|
|
119
|
+
loading: false,
|
|
120
|
+
error: null,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/** Loading state — spinner displayed while data is being fetched. */
|
|
125
|
+
export const Loading: Story = {
|
|
126
|
+
args: {
|
|
127
|
+
messages: null,
|
|
128
|
+
loading: true,
|
|
129
|
+
error: null,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/** Empty state — no messages yet. */
|
|
134
|
+
export const Empty: Story = {
|
|
135
|
+
args: {
|
|
136
|
+
messages: [],
|
|
137
|
+
loading: false,
|
|
138
|
+
error: null,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/** Error state — inline error message. */
|
|
143
|
+
export const Error: Story = {
|
|
144
|
+
args: {
|
|
145
|
+
messages: null,
|
|
146
|
+
loading: false,
|
|
147
|
+
error: 'Failed to load messages. Please try again.',
|
|
148
|
+
},
|
|
149
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Loader2, AlertCircle, MessageSquare } from 'lucide-react';
|
|
4
|
+
import type { MessageData } from '@/app/actions/get-feature-messages';
|
|
5
|
+
|
|
6
|
+
export interface MessagesTabProps {
|
|
7
|
+
messages: MessageData[] | null;
|
|
8
|
+
loading: boolean;
|
|
9
|
+
error: string | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function MessagesTab({ messages, loading, error }: MessagesTabProps) {
|
|
13
|
+
if (loading) {
|
|
14
|
+
return (
|
|
15
|
+
<div data-testid="messages-tab-loading" className="flex items-center justify-center p-8">
|
|
16
|
+
<Loader2 className="text-muted-foreground h-6 w-6 animate-spin" />
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (error) {
|
|
22
|
+
return (
|
|
23
|
+
<div className="flex items-center gap-2 p-4 text-sm text-red-600">
|
|
24
|
+
<AlertCircle className="h-4 w-4 shrink-0" />
|
|
25
|
+
<span>{error}</span>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!messages || messages.length === 0) {
|
|
31
|
+
return (
|
|
32
|
+
<div className="flex flex-col items-center justify-center gap-2 p-8">
|
|
33
|
+
<MessageSquare className="text-muted-foreground h-8 w-8" />
|
|
34
|
+
<p className="text-muted-foreground text-sm">No messages yet</p>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div data-testid="messages-list" className="flex flex-col gap-3 p-4">
|
|
41
|
+
{messages.map((msg, index) => (
|
|
42
|
+
// eslint-disable-next-line react/no-array-index-key -- messages are append-only, never reorder
|
|
43
|
+
<MessageItem key={`msg-${index}`} message={msg} />
|
|
44
|
+
))}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function MessageItem({ message }: { message: MessageData }) {
|
|
50
|
+
const isAssistant = message.role === 'assistant';
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div
|
|
54
|
+
data-testid={`message-${message.role}`}
|
|
55
|
+
className={`flex flex-col gap-1.5 rounded-lg px-3 py-2 ${
|
|
56
|
+
isAssistant ? 'bg-muted/50' : 'border-primary/20 border-l-2 pl-3'
|
|
57
|
+
}`}
|
|
58
|
+
>
|
|
59
|
+
<span
|
|
60
|
+
className={`text-xs font-medium ${isAssistant ? 'text-muted-foreground' : 'text-primary'}`}
|
|
61
|
+
>
|
|
62
|
+
{message.role}
|
|
63
|
+
</span>
|
|
64
|
+
<p className="text-sm leading-relaxed whitespace-pre-wrap">{message.content}</p>
|
|
65
|
+
{message.options && message.options.length > 0 ? (
|
|
66
|
+
<div className="mt-1 flex flex-col gap-1">
|
|
67
|
+
<span className="text-muted-foreground text-xs font-medium">Options:</span>
|
|
68
|
+
<ul className="flex flex-col gap-0.5">
|
|
69
|
+
{message.options.map((option, idx) => {
|
|
70
|
+
const isSelected = message.selectedOption === idx;
|
|
71
|
+
return (
|
|
72
|
+
<li
|
|
73
|
+
// eslint-disable-next-line react/no-array-index-key -- options are static, never reorder
|
|
74
|
+
key={`option-${idx}`}
|
|
75
|
+
className={`text-xs ${isSelected ? 'font-medium text-emerald-600' : 'text-muted-foreground'}`}
|
|
76
|
+
>
|
|
77
|
+
{isSelected ? '✓ ' : '○ '}
|
|
78
|
+
{option}
|
|
79
|
+
</li>
|
|
80
|
+
);
|
|
81
|
+
})}
|
|
82
|
+
</ul>
|
|
83
|
+
{message.answer ? (
|
|
84
|
+
<span className="mt-0.5 text-xs font-medium text-emerald-600">
|
|
85
|
+
Answer: {message.answer}
|
|
86
|
+
</span>
|
|
87
|
+
) : null}
|
|
88
|
+
</div>
|
|
89
|
+
) : null}
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { PrStatus, CiStatus } from '@shepai/core/domain/generated/output';
|
|
3
|
+
import { OverviewTab } from './overview-tab';
|
|
4
|
+
import type { FeatureNodeData } from '@/components/common/feature-node';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof OverviewTab> = {
|
|
7
|
+
title: 'Drawers/Feature/Tabs/OverviewTab',
|
|
8
|
+
component: OverviewTab,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'fullscreen',
|
|
12
|
+
},
|
|
13
|
+
decorators: [
|
|
14
|
+
(Story) => (
|
|
15
|
+
<div style={{ height: '600px', width: '400px', border: '1px solid var(--color-border)' }}>
|
|
16
|
+
<Story />
|
|
17
|
+
</div>
|
|
18
|
+
),
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default meta;
|
|
23
|
+
type Story = StoryObj<typeof OverviewTab>;
|
|
24
|
+
|
|
25
|
+
/* ---------------------------------------------------------------------------
|
|
26
|
+
* Data fixtures
|
|
27
|
+
* ------------------------------------------------------------------------- */
|
|
28
|
+
|
|
29
|
+
const fullData: FeatureNodeData = {
|
|
30
|
+
name: 'Auth Module',
|
|
31
|
+
description: 'Implement OAuth2 authentication flow with multiple providers',
|
|
32
|
+
featureId: '#f1',
|
|
33
|
+
lifecycle: 'implementation',
|
|
34
|
+
state: 'running',
|
|
35
|
+
progress: 65,
|
|
36
|
+
agentType: 'claude-code',
|
|
37
|
+
runtime: '2h 15m',
|
|
38
|
+
repositoryPath: '/home/user/my-repo',
|
|
39
|
+
branch: 'feat/auth-module',
|
|
40
|
+
pr: {
|
|
41
|
+
url: 'https://github.com/org/repo/pull/42',
|
|
42
|
+
number: 42,
|
|
43
|
+
status: PrStatus.Open,
|
|
44
|
+
ciStatus: CiStatus.Pending,
|
|
45
|
+
commitHash: 'abc1234567890def',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const noPrData: FeatureNodeData = {
|
|
50
|
+
name: 'Search Index',
|
|
51
|
+
description: 'Elasticsearch full-text search setup',
|
|
52
|
+
featureId: '#f4',
|
|
53
|
+
lifecycle: 'implementation',
|
|
54
|
+
state: 'running',
|
|
55
|
+
progress: 40,
|
|
56
|
+
agentType: 'claude-code',
|
|
57
|
+
repositoryPath: '/home/user/my-repo',
|
|
58
|
+
branch: 'feat/search-index',
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const noProgressData: FeatureNodeData = {
|
|
62
|
+
name: 'API Rate Limiting',
|
|
63
|
+
description: 'Implement sliding window rate limiting for public endpoints',
|
|
64
|
+
featureId: '#bi1',
|
|
65
|
+
lifecycle: 'requirements',
|
|
66
|
+
state: 'action-required',
|
|
67
|
+
progress: 0,
|
|
68
|
+
repositoryPath: '/home/user/my-repo',
|
|
69
|
+
branch: 'feat/api-rate-limiting',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const doneData: FeatureNodeData = {
|
|
73
|
+
name: 'Payment Gateway',
|
|
74
|
+
description: 'Stripe integration for subscriptions',
|
|
75
|
+
featureId: '#f3',
|
|
76
|
+
lifecycle: 'deploy',
|
|
77
|
+
state: 'done',
|
|
78
|
+
progress: 100,
|
|
79
|
+
runtime: '1h 42m',
|
|
80
|
+
repositoryPath: '/home/user/my-repo',
|
|
81
|
+
branch: 'feat/payment-gateway',
|
|
82
|
+
pr: {
|
|
83
|
+
url: 'https://github.com/org/repo/pull/55',
|
|
84
|
+
number: 55,
|
|
85
|
+
status: PrStatus.Merged,
|
|
86
|
+
ciStatus: CiStatus.Success,
|
|
87
|
+
commitHash: 'def4567890abc123',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const blockedData: FeatureNodeData = {
|
|
92
|
+
name: 'Email Service',
|
|
93
|
+
description: 'Transactional email with SendGrid',
|
|
94
|
+
featureId: '#f5',
|
|
95
|
+
lifecycle: 'implementation',
|
|
96
|
+
state: 'blocked',
|
|
97
|
+
progress: 20,
|
|
98
|
+
blockedBy: 'Auth Module',
|
|
99
|
+
repositoryPath: '/home/user/my-repo',
|
|
100
|
+
branch: 'feat/email-service',
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const errorData: FeatureNodeData = {
|
|
104
|
+
name: 'Notification System',
|
|
105
|
+
description: 'Real-time notifications via WebSockets',
|
|
106
|
+
featureId: '#f6',
|
|
107
|
+
lifecycle: 'review',
|
|
108
|
+
state: 'error',
|
|
109
|
+
progress: 30,
|
|
110
|
+
errorMessage: 'Build failed: type mismatch in NotificationHandler',
|
|
111
|
+
repositoryPath: '/home/user/my-repo',
|
|
112
|
+
branch: 'feat/notifications',
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const minimalData: FeatureNodeData = {
|
|
116
|
+
name: 'Minimal Feature',
|
|
117
|
+
featureId: '#f0',
|
|
118
|
+
lifecycle: 'requirements',
|
|
119
|
+
state: 'creating',
|
|
120
|
+
progress: 0,
|
|
121
|
+
repositoryPath: '/home/user/my-repo',
|
|
122
|
+
branch: '',
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/* ---------------------------------------------------------------------------
|
|
126
|
+
* Stories
|
|
127
|
+
* ------------------------------------------------------------------------- */
|
|
128
|
+
|
|
129
|
+
/** Default — full data with status, progress, PR card, and details. */
|
|
130
|
+
export const Default: Story = {
|
|
131
|
+
args: { data: fullData },
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/** Feature with no PR — PR card is hidden. */
|
|
135
|
+
export const NoPr: Story = {
|
|
136
|
+
args: { data: noPrData },
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/** Feature with 0% progress — progress bar is hidden. */
|
|
140
|
+
export const NoProgress: Story = {
|
|
141
|
+
args: { data: noProgressData },
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/** Completed feature in deploy phase with merged PR. */
|
|
145
|
+
export const DoneWithMergedPr: Story = {
|
|
146
|
+
args: { data: doneData },
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/** Blocked feature showing blocked-by detail. */
|
|
150
|
+
export const Blocked: Story = {
|
|
151
|
+
args: { data: blockedData },
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/** Error state showing error message detail. */
|
|
155
|
+
export const Error: Story = {
|
|
156
|
+
args: { data: errorData },
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/** Minimal data — only required fields, no optional details or PR. */
|
|
160
|
+
export const Minimal: Story = {
|
|
161
|
+
args: { data: minimalData },
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/* ---------------------------------------------------------------------------
|
|
165
|
+
* Lifecycle phase stories
|
|
166
|
+
* ------------------------------------------------------------------------- */
|
|
167
|
+
|
|
168
|
+
/** Requirements phase. */
|
|
169
|
+
export const RequirementsPhase: Story = {
|
|
170
|
+
args: { data: { ...noPrData, lifecycle: 'requirements' as const } },
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/** Research phase. */
|
|
174
|
+
export const ResearchPhase: Story = {
|
|
175
|
+
args: { data: { ...noPrData, lifecycle: 'research' as const } },
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/** Review phase. */
|
|
179
|
+
export const ReviewPhase: Story = {
|
|
180
|
+
args: { data: { ...noPrData, lifecycle: 'review' as const } },
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
/** Maintain phase. */
|
|
184
|
+
export const MaintainPhase: Story = {
|
|
185
|
+
args: { data: { ...noPrData, lifecycle: 'maintain' as const } },
|
|
186
|
+
};
|