@shepai/cli 1.86.1 → 1.87.0-pr257.29a5ad6
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/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts +11 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +49 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts +3 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +10 -0
- package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-plan.js +8 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +4 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +17 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts +4 -2
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +3 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +65 -3
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +3 -20
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +74 -0
- package/dist/src/presentation/web/components/common/task-progress-view/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/task-progress-view/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/task-progress-view/index.js +1 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts +6 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +84 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.stories.js +194 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +2 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +9 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- 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]/[tab]/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +20 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.map +5 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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 +1 -1
- 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 +18 -18
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- 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]/[tab]/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +20 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.map +5 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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 +1 -1
- 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 +1 -1
- 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/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/feature-logs/route.js +1 -1
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/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 +2 -2
- 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 +2 -2
- 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.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +2 -0
- package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js → [root-of-the-server]__52c318d1._.js} +2 -2
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js +4 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js.map +1 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js +4 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js.map +1 -0
- 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/7f428_lucide-react_dist_esm_icons_e56b3bd6._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_e56b3bd6._.js.map +1 -0
- 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]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5b00ed0b._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5b00ed0b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f0d8d054._.js → [root-of-the-server]__89e8a5cc._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js → [root-of-the-server]__8d9536c4._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.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/[root-of-the-server]__b65f78cf._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3a4cef4._.js → [root-of-the-server]__e630cc47._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js → [root-of-the-server]__f1a05100._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__f8210f45._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_050a0a7c._.js +3 -0
- package/web/.next/server/chunks/ssr/_050a0a7c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1b58e8b4._.js +3 -0
- package/web/.next/server/chunks/ssr/_1b58e8b4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_21c75883._.js +3 -0
- package/web/.next/server/chunks/ssr/{_752e01fd._.js.map → _21c75883._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_922aa39f._.js +3 -0
- package/web/.next/server/chunks/ssr/_922aa39f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_61480424._.js → _e30a1619._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_61480424._.js.map → _e30a1619._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.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__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.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/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.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 +322 -28
- package/web/.next/static/chunks/{dd6c69087923da49.js → 183ebd80757fd64c.js} +2 -2
- package/web/.next/static/chunks/{177579b39fd0f63a.js → 67e5d7847fd698f3.js} +1 -1
- package/web/.next/static/chunks/{f46a0078f2ee9c44.js → 728d12889cb99f50.js} +1 -1
- package/web/.next/static/chunks/8ce8f561822f9884.js +1 -0
- package/web/.next/static/chunks/8d4efb009d9c65d5.js +1 -0
- package/web/.next/static/chunks/91d63f8e429f5900.css +2 -0
- package/web/.next/static/chunks/{8d82ff1402dcf377.js → 931d71d2fd12dda7.js} +1 -1
- package/web/.next/static/chunks/{866566643c6aaecf.js → 9923c5f5b7c0c3b1.js} +1 -1
- package/web/.next/static/chunks/{e1edce9ef55b5824.js → afb05da12a4d3f75.js} +1 -1
- package/web/.next/static/chunks/c717ad9c046a21a7.js +1 -0
- package/web/.next/static/chunks/{dd6cd59c8f439583.js → d2a0d5c9408f2bec.js} +1 -1
- package/web/.next/static/chunks/{c7a4303d3cf08477.js → d60dfab8a7c7c0d8.js} +1 -1
- package/web/.next/static/chunks/e6e4f1c2b5868bda.js +11 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5860e4e2._.js +0 -3
- package/web/.next/server/chunks/ssr/_5860e4e2._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_752e01fd._.js +0 -3
- package/web/.next/server/chunks/ssr/_887258d0._.js +0 -3
- package/web/.next/server/chunks/ssr/_887258d0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cf366ac8._.js +0 -3
- package/web/.next/server/chunks/ssr/_cf366ac8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f38b49fe._.js +0 -3
- package/web/.next/server/chunks/ssr/_f38b49fe._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_07f6911c._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_07f6911c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js.map +0 -1
- package/web/.next/static/chunks/0b3852464455cb56.js +0 -11
- package/web/.next/static/chunks/30c827a88342741e.js +0 -1
- package/web/.next/static/chunks/50f89c3112f6dd23.css +0 -2
- package/web/.next/static/chunks/9d59d178a1e154b2.js +0 -1
- package/web/.next/static/chunks/a1c2ecb710b44081.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js.map → [root-of-the-server]__52c318d1._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js.map → [root-of-the-server]__8d9536c4._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__b65f78cf._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js.map → [root-of-the-server]__f1a05100._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__f8210f45._.js.map} +0 -0
- /package/web/.next/static/{T8HBuz_VR2eZQbNRNSohp → CZ_pvgAQvNcqahRvqx3fv}/_buildManifest.js +0 -0
- /package/web/.next/static/{T8HBuz_VR2eZQbNRNSohp → CZ_pvgAQvNcqahRvqx3fv}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{T8HBuz_VR2eZQbNRNSohp → CZ_pvgAQvNcqahRvqx3fv}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Skip static pre-rendering since we need runtime DI container. */
|
|
2
|
+
export declare const dynamic = "force-dynamic";
|
|
3
|
+
interface FeatureDrawerTabPageProps {
|
|
4
|
+
params: Promise<{
|
|
5
|
+
featureId: string;
|
|
6
|
+
tab: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export default function FeatureDrawerTabPage({ params }: FeatureDrawerTabPageProps): Promise<import("react/jsx-runtime").JSX.Element | null>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=page.d.ts.map
|
package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB,2DA8CvF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { resolve } from '../../../../../../lib/server-container.js';
|
|
3
|
+
import { buildFeatureNodeData } from '../../../../../build-feature-node-data.js';
|
|
4
|
+
import { computeDrawerView, parseTabKey, } from '../../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
|
+
import { FeatureDrawerClient } from '../../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
|
+
/** Skip static pre-rendering since we need runtime DI container. */
|
|
7
|
+
export const dynamic = 'force-dynamic';
|
|
8
|
+
export default async function FeatureDrawerTabPage({ params }) {
|
|
9
|
+
const { featureId, tab } = await params;
|
|
10
|
+
const urlTab = parseTabKey(tab);
|
|
11
|
+
try {
|
|
12
|
+
const featureRepo = resolve('IFeatureRepository');
|
|
13
|
+
const agentRunRepo = resolve('IAgentRunRepository');
|
|
14
|
+
const repoRepo = resolve('IRepositoryRepository');
|
|
15
|
+
const gitPrService = resolve('IGitPrService');
|
|
16
|
+
const feature = await featureRepo.findById(featureId);
|
|
17
|
+
if (!feature)
|
|
18
|
+
return null;
|
|
19
|
+
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
20
|
+
const getArtifact = resolve('GetFeatureArtifactUseCase');
|
|
21
|
+
const [repo, baseBranch, artifact, remoteUrl] = await Promise.all([
|
|
22
|
+
repoRepo.findByPath(feature.repositoryPath).catch(() => null),
|
|
23
|
+
gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
|
|
24
|
+
getArtifact.execute(featureId).catch(() => null),
|
|
25
|
+
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
26
|
+
]);
|
|
27
|
+
const nodeData = buildFeatureNodeData(feature, run, {
|
|
28
|
+
repositoryName: repo?.name,
|
|
29
|
+
baseBranch,
|
|
30
|
+
oneLiner: artifact?.oneLiner,
|
|
31
|
+
remoteUrl: remoteUrl ?? undefined,
|
|
32
|
+
});
|
|
33
|
+
const view = computeDrawerView({
|
|
34
|
+
selectedNode: nodeData,
|
|
35
|
+
isCreateDrawerOpen: false,
|
|
36
|
+
pendingRepositoryPath: '',
|
|
37
|
+
pendingParentFeatureId: undefined,
|
|
38
|
+
selectedRepoNode: null,
|
|
39
|
+
features: [],
|
|
40
|
+
workflowDefaults: undefined,
|
|
41
|
+
});
|
|
42
|
+
if (!view)
|
|
43
|
+
return null;
|
|
44
|
+
return _jsx(FeatureDrawerClient, { view: view, urlTab: urlTab });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,OAAO,UAAU,cAAc,SAErC"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
export interface AcceptanceCriterionData {
|
|
2
|
+
description: string;
|
|
3
|
+
verified: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ActionItemData {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
acceptanceCriteria: AcceptanceCriterionData[];
|
|
9
|
+
}
|
|
1
10
|
export interface PlanTaskData {
|
|
2
11
|
title: string;
|
|
3
12
|
description: string;
|
|
4
13
|
state: string;
|
|
14
|
+
actionItems: ActionItemData[];
|
|
5
15
|
}
|
|
6
16
|
export interface PlanData {
|
|
7
17
|
state: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwC9E"}
|
|
@@ -20,6 +20,14 @@ export async function getFeaturePlan(featureId) {
|
|
|
20
20
|
title: t.title ?? '',
|
|
21
21
|
description: t.description ?? '',
|
|
22
22
|
state: t.state,
|
|
23
|
+
actionItems: (t.actionItems ?? []).map((ai) => ({
|
|
24
|
+
name: ai.name,
|
|
25
|
+
description: ai.description,
|
|
26
|
+
acceptanceCriteria: (ai.acceptanceCriteria ?? []).map((ac) => ({
|
|
27
|
+
description: ac.description,
|
|
28
|
+
verified: ac.verified,
|
|
29
|
+
})),
|
|
30
|
+
})),
|
|
23
31
|
})),
|
|
24
32
|
};
|
|
25
33
|
return { plan };
|
|
@@ -4,6 +4,10 @@ import type { ParentFeatureOption } from '../../common/feature-create-drawer/fea
|
|
|
4
4
|
import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
|
|
5
5
|
/** Tab key matching FeatureDrawerTabs */
|
|
6
6
|
export type FeatureTabKey = 'overview' | 'activity' | 'log' | 'plan' | 'prd-review' | 'tech-decisions' | 'product-decisions' | 'merge-review';
|
|
7
|
+
/** All valid tab key values — used for URL param validation. */
|
|
8
|
+
export declare const VALID_TAB_KEYS: ReadonlySet<string>;
|
|
9
|
+
/** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
|
|
10
|
+
export declare function parseTabKey(value: string | null | undefined): FeatureTabKey | undefined;
|
|
7
11
|
/**
|
|
8
12
|
* Discriminated union representing every possible drawer state in the control center.
|
|
9
13
|
* Only one view can be active at a time.
|
package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
|
|
1
|
+
{"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAS7C,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAGvF;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/** All valid tab key values — used for URL param validation. */
|
|
2
|
+
export const VALID_TAB_KEYS = new Set([
|
|
3
|
+
'overview',
|
|
4
|
+
'activity',
|
|
5
|
+
'log',
|
|
6
|
+
'plan',
|
|
7
|
+
'prd-review',
|
|
8
|
+
'tech-decisions',
|
|
9
|
+
'product-decisions',
|
|
10
|
+
'merge-review',
|
|
11
|
+
]);
|
|
12
|
+
/** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
|
|
13
|
+
export function parseTabKey(value) {
|
|
14
|
+
if (value && VALID_TAB_KEYS.has(value))
|
|
15
|
+
return value;
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
1
18
|
/** Derives the initial tab from node lifecycle + state. */
|
|
2
19
|
export function deriveInitialTab(node) {
|
|
3
20
|
if (node.lifecycle === 'requirements' && node.state === 'action-required')
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { DrawerView } from './drawer-view.js';
|
|
1
|
+
import type { DrawerView, FeatureTabKey } from './drawer-view.js';
|
|
2
2
|
export interface FeatureDrawerClientProps {
|
|
3
3
|
view: DrawerView;
|
|
4
|
+
/** Tab key extracted from the URL path segment (e.g. /feature/[id]/activity → 'activity'). */
|
|
5
|
+
urlTab?: FeatureTabKey;
|
|
4
6
|
}
|
|
5
|
-
export declare function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function FeatureDrawerClient({ view: initialView, urlTab }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
//# sourceMappingURL=feature-drawer-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA8hB1F"}
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js
CHANGED
|
@@ -28,7 +28,7 @@ import { useFeatureActions } from '../../common/feature-drawer/use-feature-actio
|
|
|
28
28
|
import { resolveSseEventUpdates } from '../../common/feature-node/derive-feature-state.js';
|
|
29
29
|
import { deriveInitialTab } from './drawer-view.js';
|
|
30
30
|
import { useArtifactFetch } from './use-artifact-fetch.js';
|
|
31
|
-
export function FeatureDrawerClient({ view: initialView }) {
|
|
31
|
+
export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
32
32
|
const featureFlags = useFeatureFlags();
|
|
33
33
|
const router = useRouter();
|
|
34
34
|
const deleteSound = useSoundAction('delete');
|
|
@@ -323,7 +323,7 @@ export function FeatureDrawerClient({ view: initialView }) {
|
|
|
323
323
|
// ── Body ──────────────────────────────────────────────────────────────
|
|
324
324
|
let body = null;
|
|
325
325
|
if (view.type === 'feature' && featureNode) {
|
|
326
|
-
body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
326
|
+
body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
327
327
|
}
|
|
328
328
|
return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
|
|
329
329
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface FeatureDrawerTabsProps {
|
|
|
8
8
|
featureNode: FeatureNodeData;
|
|
9
9
|
featureId: string;
|
|
10
10
|
initialTab?: FeatureTabKey;
|
|
11
|
+
/** Tab key from URL path segment (e.g. /feature/[id]/activity → 'activity'). */
|
|
12
|
+
urlTab?: FeatureTabKey;
|
|
11
13
|
prdData?: PrdQuestionnaireData | null;
|
|
12
14
|
prdSelections?: Record<string, string>;
|
|
13
15
|
onPrdSelect?: (questionId: string, optionId: string) => void;
|
|
@@ -27,5 +29,5 @@ export interface FeatureDrawerTabsProps {
|
|
|
27
29
|
chatInput?: string;
|
|
28
30
|
onChatInputChange?: (value: string) => void;
|
|
29
31
|
}
|
|
30
|
-
export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
31
33
|
//# sourceMappingURL=feature-drawer-tabs.d.ts.map
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAaxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAiD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IAGvB,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,EAAE,sBAAsB,2CAwQxB"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
|
|
4
|
+
import { usePathname } from 'next/navigation';
|
|
4
5
|
import { Loader2, Check } from 'lucide-react';
|
|
5
6
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../../ui/tabs.js';
|
|
6
7
|
import { getFeaturePhaseTimings } from '../../../app/actions/get-feature-phase-timings.js';
|
|
@@ -63,14 +64,74 @@ const TAB_FETCHERS = {
|
|
|
63
64
|
activity: fetchActivity,
|
|
64
65
|
plan: fetchPlan,
|
|
65
66
|
};
|
|
66
|
-
export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
|
|
67
|
+
export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
|
|
68
|
+
const pathname = usePathname();
|
|
67
69
|
const featureLogs = useFeatureLogs(featureId);
|
|
68
70
|
const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);
|
|
69
71
|
const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)), [visibleTabs]);
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
+
// Derive the base path (without tab segment) from the current pathname.
|
|
73
|
+
// e.g. /feature/abc123/activity → /feature/abc123
|
|
74
|
+
const basePath = useMemo(() => {
|
|
75
|
+
const match = pathname.match(/^(\/feature\/[^/]+)/);
|
|
76
|
+
return match ? match[1] : pathname;
|
|
77
|
+
}, [pathname]);
|
|
78
|
+
// Resolve the effective initial tab: URL path tab > initialTab prop > 'overview'
|
|
79
|
+
const effectiveInitial = useMemo(() => {
|
|
80
|
+
if (urlTab && visibleTabs.includes(urlTab))
|
|
81
|
+
return urlTab;
|
|
82
|
+
if (initialTab && visibleTabs.includes(initialTab))
|
|
83
|
+
return initialTab;
|
|
84
|
+
return 'overview';
|
|
85
|
+
// Only compute on mount — subsequent changes are handled by effects below
|
|
86
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
87
|
+
}, []);
|
|
72
88
|
const [activeTab, setActiveTab] = useState(effectiveInitial);
|
|
73
89
|
const { tabs, fetchTab, refreshTab } = useTabDataFetch(featureId, TAB_FETCHERS);
|
|
90
|
+
// Sync URL when active tab changes via user interaction.
|
|
91
|
+
// Use window.history.pushState instead of router.push to avoid triggering a
|
|
92
|
+
// server component re-render (which would remount the drawer).
|
|
93
|
+
const isUserInteraction = useRef(false);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (!isUserInteraction.current)
|
|
96
|
+
return;
|
|
97
|
+
isUserInteraction.current = false;
|
|
98
|
+
// Build the target URL from the base path + tab segment
|
|
99
|
+
const targetUrl = activeTab === 'overview' ? basePath : `${basePath}/${activeTab}`;
|
|
100
|
+
// Only update URL if it actually changed
|
|
101
|
+
if (targetUrl !== pathname) {
|
|
102
|
+
window.history.pushState(null, '', targetUrl);
|
|
103
|
+
}
|
|
104
|
+
}, [activeTab, basePath, pathname]);
|
|
105
|
+
// Sync active tab from URL when pathname changes (e.g. browser back/forward).
|
|
106
|
+
// Skip on initial mount — the effectiveInitial handles that via urlTab prop.
|
|
107
|
+
const prevPathnameRef = useRef(pathname);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (prevPathnameRef.current === pathname)
|
|
110
|
+
return; // Skip initial mount
|
|
111
|
+
prevPathnameRef.current = pathname;
|
|
112
|
+
if (isUserInteraction.current)
|
|
113
|
+
return; // Skip — this is our own navigation
|
|
114
|
+
const segments = pathname.split('/');
|
|
115
|
+
// pathname is /feature/[id] or /feature/[id]/[tab]
|
|
116
|
+
const pathTab = segments.length >= 4 ? segments[3] : undefined;
|
|
117
|
+
const resolved = pathTab && visibleTabs.includes(pathTab) ? pathTab : 'overview';
|
|
118
|
+
if (resolved !== activeTab) {
|
|
119
|
+
setActiveTab(resolved);
|
|
120
|
+
if (resolved === 'activity' || resolved === 'plan') {
|
|
121
|
+
fetchTab(resolved);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}, [pathname]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
125
|
+
// Trigger lazy fetch for URL-driven initial tab
|
|
126
|
+
const initialFetchDone = useRef(false);
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (initialFetchDone.current)
|
|
129
|
+
return;
|
|
130
|
+
initialFetchDone.current = true;
|
|
131
|
+
if (activeTab === 'activity' || activeTab === 'plan') {
|
|
132
|
+
fetchTab(activeTab);
|
|
133
|
+
}
|
|
134
|
+
}, [activeTab, fetchTab]);
|
|
74
135
|
// Reset tab when featureId changes
|
|
75
136
|
const prevFeatureIdRef = useRef(featureId);
|
|
76
137
|
useEffect(() => {
|
|
@@ -110,6 +171,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
|
|
|
110
171
|
}, [featureNode, refreshTab]);
|
|
111
172
|
const handleTabChange = useCallback((value) => {
|
|
112
173
|
const tab = value;
|
|
174
|
+
isUserInteraction.current = true;
|
|
113
175
|
setActiveTab(tab);
|
|
114
176
|
if (tab === 'activity' || tab === 'plan') {
|
|
115
177
|
fetchTab(tab);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/plan-tab.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAQD,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,YAAY,2CAgD7D"}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Loader2
|
|
3
|
+
import { Loader2 } from 'lucide-react';
|
|
4
4
|
import { AlertCircle, ListTodo } from 'lucide-react';
|
|
5
5
|
import { Badge } from '../../ui/badge.js';
|
|
6
|
+
import { TaskProgressView } from '../../common/task-progress-view/index.js';
|
|
6
7
|
const planStateBadgeStyles = {
|
|
7
8
|
Requirements: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
|
|
8
9
|
ClarificationRequired: 'border-transparent bg-amber-50 text-amber-700 hover:bg-amber-50',
|
|
9
10
|
Ready: 'border-transparent bg-green-50 text-green-700 hover:bg-green-50',
|
|
10
11
|
};
|
|
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
12
|
export function PlanTab({ plan, loading, error }) {
|
|
19
13
|
if (loading) {
|
|
20
14
|
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" }) }));
|
|
@@ -25,16 +19,5 @@ export function PlanTab({ plan, loading, error }) {
|
|
|
25
19
|
if (!plan) {
|
|
26
20
|
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
21
|
}
|
|
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(
|
|
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] })] }));
|
|
22
|
+
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(TaskProgressView, { tasks: plan.tasks })] }));
|
|
40
23
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAoMtC,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"}
|
|
@@ -23,31 +23,96 @@ const mixedTasksPlan = {
|
|
|
23
23
|
title: 'Set up OAuth provider configuration',
|
|
24
24
|
description: 'Configure Google and GitHub OAuth apps with client IDs and secrets',
|
|
25
25
|
state: 'Done',
|
|
26
|
+
actionItems: [
|
|
27
|
+
{
|
|
28
|
+
name: 'Create OAuth config module',
|
|
29
|
+
description: 'Define provider configuration schema and load from env',
|
|
30
|
+
acceptanceCriteria: [
|
|
31
|
+
{ description: 'Config loads from environment variables', verified: true },
|
|
32
|
+
{ description: 'Validation rejects missing client ID or secret', verified: true },
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'Register OAuth apps',
|
|
37
|
+
description: 'Register apps with Google and GitHub developer consoles',
|
|
38
|
+
acceptanceCriteria: [
|
|
39
|
+
{ description: 'Google OAuth app created with correct scopes', verified: true },
|
|
40
|
+
{ description: 'GitHub OAuth app created with correct callback URL', verified: true },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
],
|
|
26
44
|
},
|
|
27
45
|
{
|
|
28
46
|
title: 'Implement callback handler',
|
|
29
47
|
description: 'Handle OAuth callback with authorization code exchange',
|
|
30
48
|
state: 'Done',
|
|
49
|
+
actionItems: [
|
|
50
|
+
{
|
|
51
|
+
name: 'Build callback endpoint',
|
|
52
|
+
description: 'GET /auth/callback with code exchange logic',
|
|
53
|
+
acceptanceCriteria: [
|
|
54
|
+
{ description: 'Exchanges authorization code for tokens', verified: true },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
31
58
|
},
|
|
32
59
|
{
|
|
33
60
|
title: 'Add token refresh logic',
|
|
34
61
|
description: 'Implement silent token refresh using refresh tokens stored in httpOnly cookies',
|
|
35
62
|
state: 'Work in Progress',
|
|
63
|
+
actionItems: [
|
|
64
|
+
{
|
|
65
|
+
name: 'Implement refresh endpoint',
|
|
66
|
+
description: 'POST /auth/refresh to issue new access token',
|
|
67
|
+
acceptanceCriteria: [
|
|
68
|
+
{ description: 'Returns new access token when refresh token is valid', verified: true },
|
|
69
|
+
{ description: 'Returns 401 when refresh token is expired', verified: false },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'Add httpOnly cookie handling',
|
|
74
|
+
description: 'Store refresh tokens in secure httpOnly cookies',
|
|
75
|
+
acceptanceCriteria: [
|
|
76
|
+
{ description: 'Cookies are set with Secure and HttpOnly flags', verified: false },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
36
80
|
},
|
|
37
81
|
{
|
|
38
82
|
title: 'Create user profile sync',
|
|
39
83
|
description: 'Sync user profile data from identity providers on login',
|
|
40
84
|
state: 'Todo',
|
|
85
|
+
actionItems: [
|
|
86
|
+
{
|
|
87
|
+
name: 'Fetch profile from provider',
|
|
88
|
+
description: 'Use access token to retrieve user profile from Google/GitHub',
|
|
89
|
+
acceptanceCriteria: [
|
|
90
|
+
{ description: 'Retrieves name, email, and avatar from Google', verified: false },
|
|
91
|
+
{ description: 'Retrieves name, email, and avatar from GitHub', verified: false },
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
41
95
|
},
|
|
42
96
|
{
|
|
43
97
|
title: 'Write integration tests',
|
|
44
98
|
description: 'Test the full OAuth flow with mocked providers',
|
|
45
99
|
state: 'Todo',
|
|
100
|
+
actionItems: [],
|
|
46
101
|
},
|
|
47
102
|
{
|
|
48
103
|
title: 'Update API documentation',
|
|
49
104
|
description: 'Document new authentication endpoints and flows',
|
|
50
105
|
state: 'Review',
|
|
106
|
+
actionItems: [
|
|
107
|
+
{
|
|
108
|
+
name: 'Document auth endpoints',
|
|
109
|
+
description: 'Add OpenAPI specs for all auth routes',
|
|
110
|
+
acceptanceCriteria: [
|
|
111
|
+
{ description: 'All endpoints have OpenAPI documentation', verified: true },
|
|
112
|
+
{ description: 'Examples included for each endpoint', verified: true },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
51
116
|
},
|
|
52
117
|
],
|
|
53
118
|
};
|
|
@@ -59,21 +124,25 @@ const allDonePlan = {
|
|
|
59
124
|
title: 'Design sliding window algorithm',
|
|
60
125
|
description: 'Implement Redis-backed sliding window counter',
|
|
61
126
|
state: 'Done',
|
|
127
|
+
actionItems: [],
|
|
62
128
|
},
|
|
63
129
|
{
|
|
64
130
|
title: 'Add rate limit middleware',
|
|
65
131
|
description: 'Express middleware that checks rate limits per IP',
|
|
66
132
|
state: 'Done',
|
|
133
|
+
actionItems: [],
|
|
67
134
|
},
|
|
68
135
|
{
|
|
69
136
|
title: 'Configure limits per endpoint',
|
|
70
137
|
description: 'Set different rate limits for public vs authenticated endpoints',
|
|
71
138
|
state: 'Done',
|
|
139
|
+
actionItems: [],
|
|
72
140
|
},
|
|
73
141
|
{
|
|
74
142
|
title: 'Add rate limit headers',
|
|
75
143
|
description: 'Include X-RateLimit-* headers in responses',
|
|
76
144
|
state: 'Done',
|
|
145
|
+
actionItems: [],
|
|
77
146
|
},
|
|
78
147
|
],
|
|
79
148
|
};
|
|
@@ -85,16 +154,19 @@ const draftPlan = {
|
|
|
85
154
|
title: 'Define notification types',
|
|
86
155
|
description: 'Enumerate all notification events and their payloads',
|
|
87
156
|
state: 'Todo',
|
|
157
|
+
actionItems: [],
|
|
88
158
|
},
|
|
89
159
|
{
|
|
90
160
|
title: 'Set up WebSocket server',
|
|
91
161
|
description: 'Configure Socket.io with Redis adapter for horizontal scaling',
|
|
92
162
|
state: 'Todo',
|
|
163
|
+
actionItems: [],
|
|
93
164
|
},
|
|
94
165
|
{
|
|
95
166
|
title: 'Implement notification store',
|
|
96
167
|
description: 'Persist notifications in database with read/unread tracking',
|
|
97
168
|
state: 'Todo',
|
|
169
|
+
actionItems: [],
|
|
98
170
|
},
|
|
99
171
|
],
|
|
100
172
|
};
|
|
@@ -106,11 +178,13 @@ const clarificationPlan = {
|
|
|
106
178
|
title: 'Set up email provider',
|
|
107
179
|
description: 'Configure SendGrid API integration',
|
|
108
180
|
state: 'Done',
|
|
181
|
+
actionItems: [],
|
|
109
182
|
},
|
|
110
183
|
{
|
|
111
184
|
title: 'Create template engine',
|
|
112
185
|
description: 'Implement Handlebars-based email template rendering',
|
|
113
186
|
state: 'Todo',
|
|
187
|
+
actionItems: [],
|
|
114
188
|
},
|
|
115
189
|
],
|
|
116
190
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/task-progress-view/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TaskProgressView } from './task-progress-view.js';
|
package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PlanTaskData } from '../../../app/actions/get-feature-plan.js';
|
|
2
|
+
export interface TaskProgressViewProps {
|
|
3
|
+
tasks: PlanTaskData[];
|
|
4
|
+
}
|
|
5
|
+
export declare function TaskProgressView({ tasks }: TaskProgressViewProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=task-progress-view.d.ts.map
|
package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-progress-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/task-progress-view/task-progress-view.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,gCAAgC,CAAC;AAEnF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AA8CD,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,qBAAqB,2CAmBhE"}
|