@shepai/cli 1.173.0 → 1.174.0-pr530.be90793
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/eslint.config.mjs +2 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
- package/dist/src/presentation/cli/commands/ui.command.js +1 -2
- package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts +7 -1
- package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/app/features/feature-tree-page-client.js +142 -3
- package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/features/get-feature-tree-data.js +4 -1
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts +21 -5
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js +169 -87
- package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts +2 -2
- package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/feature-tree-table/index.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -2
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +4 -4
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
- 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]/[tab]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- 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)/chat/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- 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]/[tab]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- 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/features/page/build-manifest.json +2 -2
- package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/build-manifest.json +2 -2
- package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- 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/build-manifest.json +2 -2
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- 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/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +1 -1
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_ceb2fa1e._.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/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0c5452c3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__851f6adb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_073183f4._.js +3 -0
- package/web/.next/server/chunks/ssr/_073183f4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
- package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
- package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1b7dae9a._.js +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_5119a3df._.js → _295fffde._.js} +2 -2
- package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_301ec9cd._.js +3 -0
- package/web/.next/server/chunks/ssr/_301ec9cd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_43ba79e7._.js +1 -1
- package/web/.next/server/chunks/ssr/{_6f35fb9a._.js → _49b8d085._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_6f35fb9a._.js.map → _49b8d085._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js +3 -0
- package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7476c702._.js +3 -0
- package/web/.next/server/chunks/ssr/_7476c702._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7cb0396e._.js +3 -0
- package/web/.next/server/chunks/ssr/_7cb0396e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_bb09579b._.js +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0020fddd._.js → _d9c0a97a._.js} +3 -3
- package/web/.next/server/chunks/ssr/_d9c0a97a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_e680c57c._.js +9 -0
- package/web/.next/server/chunks/ssr/_e680c57c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_cd92091d._.js → _fa2b5770._.js} +3 -3
- package/web/.next/server/chunks/ssr/{_cd92091d._.js.map → _fa2b5770._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_817ddf8a._.js → _fcb371cf._.js} +3 -3
- package/web/.next/server/chunks/ssr/{_817ddf8a._.js.map → _fcb371cf._.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/f3a1f_components_common_control-center-drawer_global-chat-drawer-client_tsx_158c4b12._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +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_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
- package/web/.next/server/middleware-build-manifest.js +2 -2
- 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 +50 -50
- package/web/.next/static/chunks/0344938d662a2440.js +7 -0
- package/web/.next/static/chunks/{bb5400da64270df6.js → 1fbf99c66f70876a.js} +1 -1
- package/web/.next/static/chunks/{96b63a24ad83be21.js → 32cc9598462bc529.js} +1 -1
- package/web/.next/static/chunks/{641583aadf11b219.js → 3e6abcc7898927c4.js} +1 -1
- package/web/.next/static/chunks/46e2693dbc9262fd.js +5 -0
- package/web/.next/static/chunks/{453ad57269a1004f.js → 4e96a041339b3eea.js} +1 -1
- package/web/.next/static/chunks/{51bb2fb93740d2cb.js → 6444b4dbb7fc67b8.js} +3 -3
- package/web/.next/static/chunks/{ab5970241b29b648.js → 75ca9c3bb1f35926.js} +2 -2
- package/web/.next/static/chunks/8492d8e0b5f9a4e8.js +1 -0
- package/web/.next/static/chunks/84b480808bd74fa9.css +1 -0
- package/web/.next/static/chunks/98e3a7cf58fc912a.js +1 -0
- package/web/.next/static/chunks/{e5c06df7f30a05b9.js → a58034fbc0a805f5.js} +1 -1
- package/web/.next/static/chunks/{a1f976e9c8b07306.js → aa0c7fb5373222c5.js} +1 -1
- package/web/.next/static/chunks/b49ab0b290e9342d.js +1 -0
- package/web/.next/static/chunks/bb479c31b5b53bac.js +8 -0
- package/web/.next/static/chunks/{0658f5f58d5b60c5.js → bb74b02014e90cc2.js} +1 -1
- package/web/.next/static/chunks/c10c0d6d458453bc.js +1 -0
- package/web/.next/static/chunks/c4c2b76688bd4b5e.js +3 -0
- package/web/.next/static/chunks/d792e9886fad3e32.js +1 -0
- package/web/.next/static/chunks/{819d8097ac0ca319.js → e75bee22d11e18e7.js} +1 -1
- package/web/.next/static/chunks/{185e4f36cb6efb24.js → eb1ca1b0a34166f5.js} +1 -1
- package/web/.next/static/chunks/{4161d4663009140f.js → fb5e34b3b0dc3091.js} +1 -1
- package/web/.next/static/chunks/fc0232384ec2b48d.js +1 -0
- package/web/.next/static/chunks/{turbopack-b38a68b1b1c41a87.js → turbopack-fa58b7ea4a4b26e7.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0020fddd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_068492bf._.js +0 -3
- package/web/.next/server/chunks/ssr/_068492bf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5119a3df._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_560f2971._.js +0 -3
- package/web/.next/server/chunks/ssr/_560f2971._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a963dd3c._.js +0 -3
- package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_df737cce._.js +0 -3
- package/web/.next/server/chunks/ssr/_df737cce._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e3f14907._.js +0 -9
- package/web/.next/server/chunks/ssr/_e3f14907._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f535d854._.js +0 -3
- package/web/.next/server/chunks/ssr/_f535d854._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js.map +0 -1
- package/web/.next/static/chunks/3e393d6a78b2ade4.js +0 -1
- package/web/.next/static/chunks/4559a403ee40dd19.js +0 -7
- package/web/.next/static/chunks/4855528484f00bd6.js +0 -1
- package/web/.next/static/chunks/4bacc77e3952f063.js +0 -3
- package/web/.next/static/chunks/5ed47e998707b519.js +0 -8
- package/web/.next/static/chunks/9f59ea29d6034111.js +0 -1
- package/web/.next/static/chunks/cc5fe8d1d9e1e519.js +0 -5
- package/web/.next/static/chunks/d5366257d6b9f855.js +0 -1
- package/web/.next/static/chunks/dcf8bb4389557a76.css +0 -1
- package/web/.next/static/chunks/f37a5e031a5d0f75.js +0 -1
- package/web/.next/static/chunks/f998b42b5cddafd6.js +0 -1
- /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_buildManifest.js +0 -0
- /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_ssgManifest.js +0 -0
package/dist/eslint.config.mjs
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for opening URLs in the user's default browser.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
|
|
7
|
+
* - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Port interface for opening URLs in the user's browser or app window.
|
|
15
|
+
*
|
|
16
|
+
* Implementations must:
|
|
17
|
+
* - Handle errors gracefully (log, never throw)
|
|
18
|
+
* - Degrade gracefully in non-interactive environments (CI, piped I/O)
|
|
19
|
+
*/
|
|
20
|
+
export interface IBrowserOpener {
|
|
21
|
+
/**
|
|
22
|
+
* Open a URL in the user's default browser or application window.
|
|
23
|
+
*
|
|
24
|
+
* @param url - The URL to open
|
|
25
|
+
*/
|
|
26
|
+
open(url: string): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=i-browser-opener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i-browser-opener.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-browser-opener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for opening URLs in the user's default browser.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
|
|
7
|
+
* - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Notifier Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for sending native OS desktop notifications.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - DesktopNotifier (node-notifier) — default for CLI/web contexts
|
|
7
|
+
* - ElectronDesktopNotifier — used when running inside Electron
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Port interface for sending native OS desktop notifications.
|
|
15
|
+
*
|
|
16
|
+
* Implementations must:
|
|
17
|
+
* - Sanitize input to prevent injection (shell metacharacters, length limits)
|
|
18
|
+
* - Handle errors gracefully (log, never throw)
|
|
19
|
+
*/
|
|
20
|
+
export interface IDesktopNotifier {
|
|
21
|
+
/**
|
|
22
|
+
* Send a native OS desktop notification.
|
|
23
|
+
*
|
|
24
|
+
* @param title - Notification title
|
|
25
|
+
* @param body - Notification body text
|
|
26
|
+
*/
|
|
27
|
+
send(title: string, body: string): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=i-desktop-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i-desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Notifier Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for sending native OS desktop notifications.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - DesktopNotifier (node-notifier) — default for CLI/web contexts
|
|
7
|
+
* - ElectronDesktopNotifier — used when running inside Electron
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -21,4 +21,6 @@ export type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUser
|
|
|
21
21
|
export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
|
|
22
22
|
export type { IInteractiveSessionService, StreamChunk, UnsubscribeFn, ChatState, } from './interactive-session-service.interface.js';
|
|
23
23
|
export type { ISkillInjectorService, SkillInjectionResult } from './skill-injector.interface.js';
|
|
24
|
+
export type { IDesktopNotifier } from './i-desktop-notifier.js';
|
|
25
|
+
export type { IBrowserOpener } from './i-browser-opener.js';
|
|
24
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAyJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAocrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -30,6 +30,7 @@ import { DaemonPidService } from '../services/daemon/daemon-pid.service.js';
|
|
|
30
30
|
import { DeploymentService } from '../services/deployment/deployment.service.js';
|
|
31
31
|
import { AttachmentStorageService } from '../services/attachment-storage.service.js';
|
|
32
32
|
import { GitHubRepositoryService } from '../services/external/github-repository.service.js';
|
|
33
|
+
import { BrowserOpenerService } from '../services/browser-opener.service.js';
|
|
33
34
|
import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
|
|
34
35
|
import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
|
|
35
36
|
import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
|
|
@@ -285,6 +286,10 @@ export async function initializeContainer() {
|
|
|
285
286
|
return new NotificationService(bus, desktopNotif);
|
|
286
287
|
},
|
|
287
288
|
});
|
|
289
|
+
// Register browser opener service
|
|
290
|
+
container.register('IBrowserOpener', {
|
|
291
|
+
useFactory: () => new BrowserOpenerService(),
|
|
292
|
+
});
|
|
288
293
|
// Register use cases (singletons for performance)
|
|
289
294
|
container.registerSingleton(InitializeSettingsUseCase);
|
|
290
295
|
container.registerSingleton(LoadSettingsUseCase);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { IBrowserOpener } from '../../application/ports/output/services/i-browser-opener.js';
|
|
2
3
|
export interface BrowserOpenerDeps {
|
|
3
4
|
platform: NodeJS.Platform;
|
|
4
5
|
execFile: (cmd: string, args: readonly string[], callback: (error: Error | null) => void) => ChildProcess;
|
|
5
6
|
warn: (msg: string) => void;
|
|
6
7
|
isTTY: boolean;
|
|
7
8
|
}
|
|
8
|
-
export declare class BrowserOpenerService {
|
|
9
|
+
export declare class BrowserOpenerService implements IBrowserOpener {
|
|
9
10
|
private deps;
|
|
10
11
|
constructor(deps?: Partial<BrowserOpenerDeps>);
|
|
11
12
|
open(url: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-opener.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/browser-opener.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-opener.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/browser-opener.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAElG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACpC,YAAY,CAAC;IAClB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB;AAgBD,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAcxB"}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* - Title truncated to 100 chars, body to 500 chars
|
|
10
10
|
* - Errors are caught and logged (never thrown)
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
import type { IDesktopNotifier } from '../../../application/ports/output/services/i-desktop-notifier.js';
|
|
13
|
+
export declare class DesktopNotifier implements IDesktopNotifier {
|
|
13
14
|
/**
|
|
14
15
|
* Send a native OS desktop notification.
|
|
15
16
|
*
|
package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kEAAkE,CAAC;AAMzG,qBAAa,eAAgB,YAAW,gBAAgB;IACtD;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYvC,OAAO,CAAC,QAAQ;CAIjB"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 4. Wait briefly to confirm the child is alive; surface stderr on crash
|
|
15
15
|
* 5. Write daemon.json atomically via IDaemonService
|
|
16
16
|
* 6. Print formatted URL to stdout
|
|
17
|
-
* 7. Open browser via
|
|
17
|
+
* 7. Open browser via IBrowserOpener (resolved from DI container)
|
|
18
18
|
*/
|
|
19
19
|
export interface StartDaemonOptions {
|
|
20
20
|
port?: number;
|
|
@@ -14,14 +14,13 @@
|
|
|
14
14
|
* 4. Wait briefly to confirm the child is alive; surface stderr on crash
|
|
15
15
|
* 5. Write daemon.json atomically via IDaemonService
|
|
16
16
|
* 6. Print formatted URL to stdout
|
|
17
|
-
* 7. Open browser via
|
|
17
|
+
* 7. Open browser via IBrowserOpener (resolved from DI container)
|
|
18
18
|
*/
|
|
19
19
|
import { spawn } from 'node:child_process';
|
|
20
20
|
import { closeSync, openSync, renameSync, existsSync } from 'node:fs';
|
|
21
21
|
import http from 'node:http';
|
|
22
22
|
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
23
23
|
import { findAvailablePort, DEFAULT_PORT } from '../../../../../packages/core/src/infrastructure/services/port.service.js';
|
|
24
|
-
import { BrowserOpenerService } from '../../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
25
24
|
import { getDaemonLogPath } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
26
25
|
import { fmt, messages, spinner } from '../../ui/index.js';
|
|
27
26
|
import { getCliI18n } from '../../i18n.js';
|
|
@@ -116,7 +115,7 @@ export async function startDaemon(opts = {}) {
|
|
|
116
115
|
}
|
|
117
116
|
}
|
|
118
117
|
messages.newline();
|
|
119
|
-
const opener =
|
|
118
|
+
const opener = container.resolve('IBrowserOpener');
|
|
120
119
|
opener.open(url);
|
|
121
120
|
}
|
|
122
121
|
/**
|
|
@@ -23,7 +23,6 @@ import { initializeNotificationWatcher, getNotificationWatcher, } from '../../..
|
|
|
23
23
|
import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
|
|
24
24
|
import { initializeAutoArchiveWatcher, getAutoArchiveWatcher, } from '../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js';
|
|
25
25
|
import { getExistingConnection } from '../../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
|
|
26
|
-
import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
27
26
|
import { colors, fmt, messages } from '../ui/index.js';
|
|
28
27
|
import { getCliI18n } from '../i18n.js';
|
|
29
28
|
function parsePort(value) {
|
|
@@ -83,7 +82,7 @@ Examples:
|
|
|
83
82
|
messages.newline();
|
|
84
83
|
// Auto-open browser (unless --no-open)
|
|
85
84
|
if (options.open !== false) {
|
|
86
|
-
const opener =
|
|
85
|
+
const opener = container.resolve('IBrowserOpener');
|
|
87
86
|
opener.open(url);
|
|
88
87
|
}
|
|
89
88
|
// Handle graceful shutdown via SIGINT/SIGTERM
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type { FeatureTreeRow, InventoryRepo } from '../../components/features/feature-tree-table/index.js';
|
|
1
|
+
import type { FeatureTreeRow, InventoryRepo, GroupByField } from '../../components/features/feature-tree-table/index.js';
|
|
2
2
|
export interface FeatureTreePageClientProps {
|
|
3
3
|
features: FeatureTreeRow[];
|
|
4
4
|
repos: InventoryRepo[];
|
|
5
5
|
}
|
|
6
|
+
/** Item sort fields change based on groupBy — exclude the grouped field. */
|
|
7
|
+
export declare function getItemSortOptions(groupBy: GroupByField | null): {
|
|
8
|
+
value: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}[];
|
|
11
|
+
export declare function isArchived(feature: FeatureTreeRow): boolean;
|
|
6
12
|
export declare function FeatureTreePageClient({ features, repos }: FeatureTreePageClientProps): import("react/jsx-runtime").JSX.Element;
|
|
7
13
|
//# sourceMappingURL=feature-tree-page-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-tree-page-client.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/feature-tree-page-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-tree-page-client.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/feature-tree-page-client.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EAEb,MAAM,0CAA0C,CAAC;AAelD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAmCD,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;;;IAU9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAE3D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,0BAA0B,2CAuWpF"}
|
|
@@ -1,13 +1,152 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useRouter } from 'next/navigation';
|
|
4
|
-
import { useCallback } from 'react';
|
|
4
|
+
import { useCallback, useState, useMemo } from 'react';
|
|
5
|
+
import { Search, SlidersHorizontal, Archive, Inbox, X, ArrowDownAZ, ArrowUpAZ } from 'lucide-react';
|
|
5
6
|
import { FeatureTreeTable } from '../../components/features/feature-tree-table/index.js';
|
|
6
7
|
import { PageHeader } from '../../components/common/page-header/index.js';
|
|
8
|
+
import { EmptyState } from '../../components/common/empty-state/index.js';
|
|
9
|
+
import { Input } from '../../components/ui/input.js';
|
|
10
|
+
import { Button } from '../../components/ui/button.js';
|
|
11
|
+
import { Badge } from '../../components/ui/badge.js';
|
|
12
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../components/ui/select.js';
|
|
13
|
+
const STATUS_LABELS = {
|
|
14
|
+
'action-needed': 'Action Needed',
|
|
15
|
+
'in-progress': 'In Progress',
|
|
16
|
+
pending: 'Pending',
|
|
17
|
+
blocked: 'Blocked',
|
|
18
|
+
error: 'Error',
|
|
19
|
+
done: 'Done',
|
|
20
|
+
};
|
|
21
|
+
const STATUS_COLORS = {
|
|
22
|
+
'action-needed': 'bg-amber-500/15 text-amber-700 dark:text-amber-400 border-amber-500/20',
|
|
23
|
+
'in-progress': 'bg-blue-500/15 text-blue-700 dark:text-blue-400 border-blue-500/20',
|
|
24
|
+
pending: 'bg-slate-500/15 text-slate-700 dark:text-slate-400 border-slate-500/20',
|
|
25
|
+
blocked: 'bg-gray-500/15 text-gray-700 dark:text-gray-400 border-gray-500/20',
|
|
26
|
+
error: 'bg-red-500/15 text-red-700 dark:text-red-400 border-red-500/20',
|
|
27
|
+
done: 'bg-emerald-500/15 text-emerald-700 dark:text-emerald-400 border-emerald-500/20',
|
|
28
|
+
};
|
|
29
|
+
const GROUP_BY_LABELS = {
|
|
30
|
+
repositoryName: 'Repository',
|
|
31
|
+
status: 'Status',
|
|
32
|
+
lifecycle: 'Lifecycle',
|
|
33
|
+
};
|
|
34
|
+
const GROUP_BY_OPTIONS = [
|
|
35
|
+
{ value: '__none__', label: 'No grouping' },
|
|
36
|
+
{ value: 'repositoryName', label: 'Repository' },
|
|
37
|
+
{ value: 'status', label: 'Status' },
|
|
38
|
+
{ value: 'lifecycle', label: 'Lifecycle' },
|
|
39
|
+
];
|
|
40
|
+
/** Item sort fields change based on groupBy — exclude the grouped field. */
|
|
41
|
+
export function getItemSortOptions(groupBy) {
|
|
42
|
+
const all = [
|
|
43
|
+
{ value: 'name', label: 'Name' },
|
|
44
|
+
{ value: 'repositoryName', label: 'Repository' },
|
|
45
|
+
{ value: 'status', label: 'Status' },
|
|
46
|
+
{ value: 'lifecycle', label: 'Lifecycle' },
|
|
47
|
+
{ value: 'branch', label: 'Branch' },
|
|
48
|
+
];
|
|
49
|
+
if (!groupBy)
|
|
50
|
+
return all;
|
|
51
|
+
return all.filter((o) => o.value !== groupBy);
|
|
52
|
+
}
|
|
53
|
+
export function isArchived(feature) {
|
|
54
|
+
return feature.lifecycle === 'Archived';
|
|
55
|
+
}
|
|
7
56
|
export function FeatureTreePageClient({ features, repos }) {
|
|
8
57
|
const router = useRouter();
|
|
58
|
+
// Filter state
|
|
59
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
60
|
+
const [statusFilter, setStatusFilter] = useState(null);
|
|
61
|
+
const [archiveFilter, setArchiveFilter] = useState('active');
|
|
62
|
+
const [repoFilter, setRepoFilter] = useState(null);
|
|
63
|
+
const [showAdvanced, setShowAdvanced] = useState(false);
|
|
64
|
+
// Group + sort state
|
|
65
|
+
const [groupBy, setGroupBy] = useState('repositoryName');
|
|
66
|
+
const [groupSortDir, setGroupSortDir] = useState('asc');
|
|
67
|
+
const [itemSortField, setItemSortField] = useState('name');
|
|
68
|
+
const [itemSortDir, setItemSortDir] = useState('asc');
|
|
9
69
|
const handleFeatureClick = useCallback((featureId) => {
|
|
10
70
|
router.push(`/feature/${featureId}/overview`);
|
|
11
71
|
}, [router]);
|
|
12
|
-
|
|
72
|
+
const handleGroupByChange = (value) => {
|
|
73
|
+
const next = value === '__none__' ? null : value;
|
|
74
|
+
setGroupBy(next);
|
|
75
|
+
// Reset item sort if current field matches the new groupBy
|
|
76
|
+
if (next && itemSortField === next) {
|
|
77
|
+
setItemSortField('name');
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// Compute status counts for pills
|
|
81
|
+
const statusCounts = useMemo(() => {
|
|
82
|
+
const counts = {
|
|
83
|
+
'action-needed': 0,
|
|
84
|
+
'in-progress': 0,
|
|
85
|
+
pending: 0,
|
|
86
|
+
blocked: 0,
|
|
87
|
+
error: 0,
|
|
88
|
+
done: 0,
|
|
89
|
+
};
|
|
90
|
+
for (const f of features) {
|
|
91
|
+
counts[f.status]++;
|
|
92
|
+
}
|
|
93
|
+
return counts;
|
|
94
|
+
}, [features]);
|
|
95
|
+
// Unique repo names for advanced filter
|
|
96
|
+
const repoNames = useMemo(() => {
|
|
97
|
+
const names = new Set();
|
|
98
|
+
for (const f of features) {
|
|
99
|
+
names.add(f.repositoryName);
|
|
100
|
+
}
|
|
101
|
+
return Array.from(names).sort();
|
|
102
|
+
}, [features]);
|
|
103
|
+
// Filtered features (sorting handled by table)
|
|
104
|
+
const filteredFeatures = useMemo(() => {
|
|
105
|
+
const query = searchQuery.toLowerCase();
|
|
106
|
+
return features.filter((feature) => {
|
|
107
|
+
if (archiveFilter === 'active' && isArchived(feature))
|
|
108
|
+
return false;
|
|
109
|
+
if (archiveFilter === 'archived' && !isArchived(feature))
|
|
110
|
+
return false;
|
|
111
|
+
if (statusFilter && feature.status !== statusFilter)
|
|
112
|
+
return false;
|
|
113
|
+
if (repoFilter && feature.repositoryName !== repoFilter)
|
|
114
|
+
return false;
|
|
115
|
+
if (query) {
|
|
116
|
+
const matchesName = feature.name.toLowerCase().includes(query);
|
|
117
|
+
const matchesBranch = feature.branch.toLowerCase().includes(query);
|
|
118
|
+
const matchesRepo = feature.repositoryName.toLowerCase().includes(query);
|
|
119
|
+
if (!matchesName && !matchesBranch && !matchesRepo)
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
}, [features, searchQuery, statusFilter, archiveFilter, repoFilter]);
|
|
125
|
+
const hasActiveFilters = searchQuery !== '' ||
|
|
126
|
+
statusFilter !== null ||
|
|
127
|
+
archiveFilter !== 'active' ||
|
|
128
|
+
repoFilter !== null;
|
|
129
|
+
const clearFilters = () => {
|
|
130
|
+
setSearchQuery('');
|
|
131
|
+
setStatusFilter(null);
|
|
132
|
+
setArchiveFilter('active');
|
|
133
|
+
setRepoFilter(null);
|
|
134
|
+
};
|
|
135
|
+
const archivedCount = useMemo(() => features.filter(isArchived).length, [features]);
|
|
136
|
+
const activeCount = features.length - archivedCount;
|
|
137
|
+
const itemSortOptions = useMemo(() => getItemSortOptions(groupBy), [groupBy]);
|
|
138
|
+
return (_jsxs("div", { "data-testid": "feature-tree-page", className: "flex h-full flex-col gap-4", children: [_jsx(PageHeader, { title: "Inventory", description: "All repositories and features" }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "relative flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search by name, branch, or repository...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9" }), searchQuery ? (_jsx("button", { onClick: () => setSearchQuery(''), className: "text-muted-foreground hover:text-foreground absolute top-1/2 right-3 -translate-y-1/2", children: _jsx(X, { className: "size-4" }) })) : null] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium whitespace-nowrap", children: "Group by:" }), _jsxs(Select, { value: groupBy ?? '__none__', onValueChange: handleGroupByChange, children: [_jsx(SelectTrigger, { className: "w-[150px]", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: GROUP_BY_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs(Button, { variant: showAdvanced ? 'secondary' : 'outline', size: "sm", onClick: () => setShowAdvanced((v) => !v), className: "shrink-0", children: [_jsx(SlidersHorizontal, { className: "mr-1.5 size-3.5" }), "Filters"] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "border-input flex items-center rounded-md border", children: [_jsxs("button", { onClick: () => setArchiveFilter('active'), className: `flex items-center gap-1.5 rounded-l-md px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'active' ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'}`, children: [_jsx(Inbox, { className: "size-3.5" }), "Active", _jsxs("span", { className: "opacity-70", children: ["(", activeCount, ")"] })] }), _jsxs("button", { onClick: () => setArchiveFilter('archived'), className: `flex items-center gap-1.5 border-x px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'archived'
|
|
139
|
+
? 'bg-primary text-primary-foreground'
|
|
140
|
+
: 'hover:bg-muted'}`, children: [_jsx(Archive, { className: "size-3.5" }), "Archived", _jsxs("span", { className: "opacity-70", children: ["(", archivedCount, ")"] })] }), _jsx("button", { onClick: () => setArchiveFilter('all'), className: `rounded-r-md px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'all' ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'}`, children: "All" })] }), _jsx("div", { className: "bg-border h-6 w-px" }), _jsx("button", { onClick: () => setStatusFilter(null), className: `rounded-full px-2.5 py-1 text-xs font-medium transition-colors ${statusFilter === null
|
|
141
|
+
? 'bg-foreground text-background'
|
|
142
|
+
: 'bg-muted text-muted-foreground hover:bg-muted/80'}`, children: "All Status" }), Object.entries(STATUS_LABELS).map(([status, label]) => {
|
|
143
|
+
const count = statusCounts[status];
|
|
144
|
+
if (count === 0)
|
|
145
|
+
return null;
|
|
146
|
+
return (_jsxs("button", { onClick: () => setStatusFilter(statusFilter === status ? null : status), className: `rounded-full px-2.5 py-1 text-xs font-medium transition-colors ${statusFilter === status
|
|
147
|
+
? STATUS_COLORS[status]
|
|
148
|
+
: 'bg-muted text-muted-foreground hover:bg-muted/80'}`, children: [label, _jsx("span", { className: "ml-1 opacity-70", children: count })] }, status));
|
|
149
|
+
}), hasActiveFilters ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "bg-border h-6 w-px" }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: clearFilters, className: "h-7 text-xs", children: [_jsx(X, { className: "mr-1 size-3" }), "Clear"] })] })) : null] }), groupBy ? (_jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: GROUP_BY_LABELS[groupBy] }), _jsxs(Button, { variant: "outline", size: "sm", className: "h-7 gap-1 text-xs", onClick: () => setGroupSortDir((d) => (d === 'asc' ? 'desc' : 'asc')), children: [groupSortDir === 'asc' ? (_jsx(ArrowDownAZ, { className: "size-3.5" })) : (_jsx(ArrowUpAZ, { className: "size-3.5" })), groupSortDir === 'asc' ? 'A-Z' : 'Z-A'] })] }), _jsx("div", { className: "bg-border h-5 w-px" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Sort by" }), _jsxs(Select, { value: itemSortField, onValueChange: setItemSortField, children: [_jsx(SelectTrigger, { className: "h-7 w-[120px] text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: itemSortOptions.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }), _jsxs(Button, { variant: "outline", size: "sm", className: "h-7 gap-1 text-xs", onClick: () => setItemSortDir((d) => (d === 'asc' ? 'desc' : 'asc')), children: [itemSortDir === 'asc' ? (_jsx(ArrowDownAZ, { className: "size-3.5" })) : (_jsx(ArrowUpAZ, { className: "size-3.5" })), itemSortDir === 'asc' ? 'A-Z' : 'Z-A'] })] })] })) : null, showAdvanced ? (_jsx("div", { className: "bg-muted/50 flex flex-wrap items-center gap-3 rounded-lg border p-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Repository" }), _jsxs(Select, { value: repoFilter ?? '__all__', onValueChange: (v) => setRepoFilter(v === '__all__' ? null : v), children: [_jsx(SelectTrigger, { className: "h-8 w-[200px] text-xs", children: _jsx(SelectValue, { placeholder: "All repositories" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "__all__", children: "All repositories" }), repoNames.map((name) => (_jsx(SelectItem, { value: name, children: name }, name)))] })] })] }) })) : null] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsxs("span", { children: [filteredFeatures.length, " feature", filteredFeatures.length !== 1 ? 's' : ''] }), hasActiveFilters ? (_jsx(Badge, { variant: "secondary", className: "text-xs", children: "filtered" })) : null] }), _jsx("div", { className: "min-h-0 flex-1", children: filteredFeatures.length > 0 ? (_jsx(FeatureTreeTable, { data: filteredFeatures, repos: repos, onFeatureClick: handleFeatureClick, groupBy: groupBy, groupSortDir: groupSortDir, itemSortField: itemSortField, itemSortDir: itemSortDir })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching features", description: hasActiveFilters
|
|
150
|
+
? 'No features match your current filters. Try adjusting your search or filters.'
|
|
151
|
+
: 'No features found in any repository.', action: hasActiveFilters ? (_jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear all filters" })) : undefined })) })] }));
|
|
13
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feature-tree-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/get-feature-tree-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC,
|
|
1
|
+
{"version":3,"file":"get-feature-tree-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/get-feature-tree-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC,CAmCD"}
|
|
@@ -21,7 +21,10 @@ function lifecycleToStatus(lifecycle) {
|
|
|
21
21
|
export async function getFeatureTreeData() {
|
|
22
22
|
const listFeatures = resolve('ListFeaturesUseCase');
|
|
23
23
|
const listRepos = resolve('ListRepositoriesUseCase');
|
|
24
|
-
const [features, repositories] = await Promise.all([
|
|
24
|
+
const [features, repositories] = await Promise.all([
|
|
25
|
+
listFeatures.execute({ includeArchived: true }),
|
|
26
|
+
listRepos.execute(),
|
|
27
|
+
]);
|
|
25
28
|
const repoByPath = new Map();
|
|
26
29
|
for (const repo of repositories) {
|
|
27
30
|
repoByPath.set(repo.path, { name: repo.name, remoteUrl: repo.remoteUrl });
|
package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts
CHANGED
|
@@ -9,28 +9,44 @@ export interface FeatureTreeRow {
|
|
|
9
9
|
repositoryName: string;
|
|
10
10
|
remoteUrl?: string;
|
|
11
11
|
parentId?: string;
|
|
12
|
-
/**
|
|
12
|
+
/** Internal: child rows for tree hierarchy */
|
|
13
13
|
_children?: FeatureTreeRow[];
|
|
14
|
-
/**
|
|
14
|
+
/** Internal: whether this row is a group header */
|
|
15
|
+
_isGroupHeader?: boolean;
|
|
16
|
+
/** Internal: number of features in this group */
|
|
17
|
+
_groupCount?: number;
|
|
18
|
+
/** Internal: whether this row is a repository group header (legacy tree) */
|
|
15
19
|
_isRepoGroup?: boolean;
|
|
16
|
-
/**
|
|
20
|
+
/** Internal: number of features in this repo group (legacy tree) */
|
|
17
21
|
_featureCount?: number;
|
|
18
22
|
}
|
|
19
23
|
export interface InventoryRepo {
|
|
20
24
|
name: string;
|
|
21
25
|
remoteUrl?: string;
|
|
22
26
|
}
|
|
27
|
+
export type GroupByField = 'repositoryName' | 'status' | 'lifecycle';
|
|
28
|
+
export type SortDir = 'asc' | 'desc';
|
|
23
29
|
export interface FeatureTreeTableProps {
|
|
24
30
|
data: FeatureTreeRow[];
|
|
25
31
|
repos?: InventoryRepo[];
|
|
26
32
|
className?: string;
|
|
27
33
|
onFeatureClick?: (featureId: string) => void;
|
|
34
|
+
/** When set, features are grouped into a tree by this field. */
|
|
35
|
+
groupBy?: GroupByField | null;
|
|
36
|
+
/** Sort direction for group headers. */
|
|
37
|
+
groupSortDir?: SortDir;
|
|
38
|
+
/** Field to sort items within each group (or globally in flat mode). */
|
|
39
|
+
itemSortField?: string;
|
|
40
|
+
/** Sort direction for items. */
|
|
41
|
+
itemSortDir?: SortDir;
|
|
28
42
|
}
|
|
43
|
+
export declare function displayLabel(groupBy: GroupByField, value: string): string;
|
|
29
44
|
/**
|
|
30
|
-
* Build tree-structured data grouped by repository.
|
|
45
|
+
* Build tree-structured data grouped by repository (legacy format).
|
|
31
46
|
* Each repository becomes a parent node with its features as children.
|
|
32
47
|
* Repos without features are included as empty groups.
|
|
33
48
|
*/
|
|
34
49
|
export declare function buildTreeData(flatData: FeatureTreeRow[], repos?: InventoryRepo[]): FeatureTreeRow[];
|
|
35
|
-
export declare function
|
|
50
|
+
export declare function buildGroupedTree(flatData: FeatureTreeRow[], groupBy: GroupByField, groupSortDir: SortDir, itemSortField: string, itemSortDir: SortDir): FeatureTreeRow[];
|
|
51
|
+
export declare function FeatureTreeTable({ data, className, onFeatureClick, groupBy, groupSortDir, itemSortField, itemSortDir, }: FeatureTreeTableProps): import("react/jsx-runtime").JSX.Element;
|
|
36
52
|
//# sourceMappingURL=feature-tree-table.d.ts.map
|
package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-tree-table.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,0BAA0B,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"feature-tree-table.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,0BAA0B,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW,CAAC;AACrE,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gEAAgE;IAChE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiJD,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,CAAC,EAAE,aAAa,EAAE,GACtB,cAAc,EAAE,CAkDlB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,OAAO,GACnB,cAAc,EAAE,CA8ClB;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,SAAS,EACT,cAAc,EACd,OAAc,EACd,YAAoB,EACpB,aAAsB,EACtB,WAAmB,GACpB,EAAE,qBAAqB,2CAyDvB"}
|