@shepai/cli 1.99.0-pr298.6507e9c → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +0 -11
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +0 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +1 -10
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +0 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +0 -18
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +0 -2
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +1 -19
- package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +0 -1
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +0 -16
- package/dist/src/presentation/web/app/api/npm-version/route.d.ts +3 -0
- package/dist/src/presentation/web/app/api/npm-version/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/npm-version/route.js +18 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +0 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +0 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +0 -16
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +0 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +0 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/version-badge/version-badge.js +5 -2
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts +6 -0
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.js +67 -0
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +0 -1
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +0 -2
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +1 -17
- package/dist/src/presentation/web/hooks/use-npm-version-check.d.ts +10 -0
- package/dist/src/presentation/web/hooks/use-npm-version-check.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-npm-version-check.js +34 -0
- package/dist/src/presentation/web/lib/compare-versions.d.ts +7 -0
- package/dist/src/presentation/web/lib/compare-versions.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/compare-versions.js +19 -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 +1 -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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- 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/server-reference-manifest.json +25 -25
- 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/server-reference-manifest.json +25 -25
- 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 +18 -18
- 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 +20 -20
- 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/server-reference-manifest.json +25 -25
- 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/server-reference-manifest.json +25 -25
- 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 +18 -18
- 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 +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/npm-version/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/npm-version/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/npm-version/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/npm-version/route.js +7 -0
- package/web/.next/server/app/api/npm-version/route.js.map +5 -0
- package/web/.next/server/app/api/npm-version/route.js.nft.json +1 -0
- package/web/.next/server/app/api/npm-version/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- 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.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_npm-version_route_actions_3acb9a87.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_npm-version_route_actions_3acb9a87.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__3b72e8b0._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__3b72e8b0._.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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.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]__19fb0bfe._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19fb0bfe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5edfc56b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- 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]__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/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_7dfd7471._.js → _3e44c3e3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_7dfd7471._.js.map → _3e44c3e3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_d3a39f02._.js → _4e8f836f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_d3a39f02._.js.map → _4e8f836f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_2fd738e0._.js → _5e02bbe2._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2fd738e0._.js.map → _5e02bbe2._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.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/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.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_3c53a23d._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.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)_get-graph-data_ts_b018483e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
- 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_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_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_ec8c7a4f._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.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 +30 -30
- package/web/.next/static/chunks/{a3401d59ccf80a23.js → 2c18e017bb6d9ff5.js} +1 -1
- package/web/.next/static/chunks/4345d35c3109f22e.js +1 -0
- package/web/.next/static/chunks/{4bb6d33fb60b985a.js → 4809dbfebf879dc6.js} +1 -1
- package/web/.next/static/chunks/{4570454c806dbb8d.js → 487d68ae2b90bb00.js} +1 -1
- package/web/.next/static/chunks/{730c6ad8fe30f445.js → 6af8daf39e3b9927.js} +1 -1
- package/web/.next/static/chunks/{b1614e633d8983ce.js → 6ff3297c1cab41fb.js} +1 -1
- package/web/.next/static/chunks/{2074fb11a41f98d9.js → 7da527b591d16043.js} +1 -1
- package/web/.next/static/chunks/{fbd1548307502a06.js → aaa4116784d11baf.js} +2 -2
- package/web/.next/static/chunks/{0102ce60a2a42fab.js → b31f2c82654437a6.js} +1 -1
- package/web/.next/static/chunks/cf63857c936b4ca1.css +1 -0
- package/web/.next/static/chunks/{e2180ae114179494.js → e56a63dfbb8721d2.js} +1 -1
- package/web/.next/static/chunks/{5cd520e217d7be36.js → e84968351a0c2f24.js} +1 -1
- package/web/.next/static/chunks/{694de09784a58ad6.js → f64b94a710c96ac2.js} +1 -1
- package/web/.next/static/chunks/35858310f852f7ea.js +0 -1
- package/web/.next/static/chunks/5e8e9941a996e3c6.css +0 -1
- /package/web/.next/static/{fE5cLyXKMRU3ifZoo7JR1 → ECDLMMv6xmDChEpeONYd6}/_buildManifest.js +0 -0
- /package/web/.next/static/{fE5cLyXKMRU3ifZoo7JR1 → ECDLMMv6xmDChEpeONYd6}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{fE5cLyXKMRU3ifZoo7JR1 → ECDLMMv6xmDChEpeONYd6}/_ssgManifest.js +0 -0
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
4
|
+
import { useNpmVersionCheck } from '../../../hooks/use-npm-version-check.js';
|
|
4
5
|
export function VersionBadge({ version, branch, commitHash, isDev = false, packageName = '@shepai/cli', description, instancePath, }) {
|
|
5
6
|
const shortHash = commitHash?.slice(0, 7);
|
|
7
|
+
const { latest, updateAvailable } = useNpmVersionCheck(version);
|
|
6
8
|
// In dev mode show "1.92.2-dev", in production show "v1.92.2"
|
|
7
9
|
const displayVersion = isDev ? `${version}-dev` : `v${version}`;
|
|
8
|
-
|
|
10
|
+
const npmUrl = `https://www.npmjs.com/package/${packageName}`;
|
|
11
|
+
return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: "text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors", "data-testid": "version-label", children: [displayVersion, updateAvailable ? (_jsx("span", { className: "absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400", "data-testid": "update-dot" })) : null] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-[280px] space-y-1 p-3 text-left", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold", children: packageName }), description ? (_jsx("div", { className: "text-[10px] leading-snug opacity-70", children: description })) : null, _jsxs("div", { className: "border-t border-white/10 pt-1.5", children: [_jsx(Row, { label: "Version", value: displayVersion }), isDev && branch ? _jsx(Row, { label: "Branch", value: branch }) : null, isDev && shortHash ? _jsx(Row, { label: "Commit", value: shortHash, mono: true }) : null, isDev && instancePath ? _jsx(Row, { label: "Path", value: instancePath, mono: true }) : null, latest ? (_jsx(Row, { label: "Latest", value: `v${latest}`, highlight: updateAvailable })) : null] }), updateAvailable ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsxs("a", { href: npmUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300", "data-testid": "upgrade-link", children: ["Upgrade to v", latest, " \u2192"] }) })) : null] })] }) }));
|
|
9
12
|
}
|
|
10
13
|
function Row({ label, value, highlight, mono, }) {
|
|
11
14
|
return (_jsxs("div", { className: "flex items-center justify-between gap-4 text-[10px]", children: [_jsx("span", { className: "opacity-60", children: label }), _jsx("span", { className: [
|
|
12
|
-
highlight ? 'font-medium text-
|
|
15
|
+
highlight ? 'font-medium text-emerald-400' : '',
|
|
13
16
|
mono || !highlight ? 'font-mono' : '',
|
|
14
17
|
]
|
|
15
18
|
.filter(Boolean)
|
package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts
CHANGED
|
@@ -11,4 +11,10 @@ export declare const Development: Story;
|
|
|
11
11
|
export declare const LongBranch: Story;
|
|
12
12
|
/** Minimal info — no optional fields. */
|
|
13
13
|
export declare const Minimal: Story;
|
|
14
|
+
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0" link. */
|
|
15
|
+
export declare const UpdateAvailable: Story;
|
|
16
|
+
/** Update available in dev mode — green dot + upgrade link alongside dev info. */
|
|
17
|
+
export declare const UpdateAvailableDev: Story;
|
|
18
|
+
/** Fetch error — no update info shown, badge behaves normally. */
|
|
19
|
+
export declare const FetchError: Story;
|
|
14
20
|
//# sourceMappingURL=version-badge.stories.d.ts.map
|
package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmC/C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAOnC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAO7B,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,KAWhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC"}
|
|
@@ -1,4 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
2
|
import { VersionBadge } from './version-badge.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decorator that mocks the /api/npm-version endpoint to return a specific latest version.
|
|
5
|
+
*/
|
|
6
|
+
function withNpmVersion(latest) {
|
|
7
|
+
return (Story) => {
|
|
8
|
+
const originalFetch = window.fetch;
|
|
9
|
+
window.fetch = (async (input, init) => {
|
|
10
|
+
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
11
|
+
if (url.includes('/api/npm-version')) {
|
|
12
|
+
return new Response(JSON.stringify({ latest }), {
|
|
13
|
+
status: 200,
|
|
14
|
+
headers: { 'Content-Type': 'application/json' },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return originalFetch(input, init);
|
|
18
|
+
});
|
|
19
|
+
return _jsx(Story, {});
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Decorator that mocks fetch to return an error for the npm version endpoint. */
|
|
23
|
+
const withNpmVersionError = (Story) => {
|
|
24
|
+
const originalFetch = window.fetch;
|
|
25
|
+
window.fetch = (async (input, init) => {
|
|
26
|
+
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
27
|
+
if (url.includes('/api/npm-version')) {
|
|
28
|
+
return new Response(JSON.stringify({ error: 'Not found' }), { status: 502 });
|
|
29
|
+
}
|
|
30
|
+
return originalFetch(input, init);
|
|
31
|
+
});
|
|
32
|
+
return _jsx(Story, {});
|
|
33
|
+
};
|
|
2
34
|
const meta = {
|
|
3
35
|
title: 'Common/VersionBadge',
|
|
4
36
|
component: VersionBadge,
|
|
@@ -10,6 +42,7 @@ const meta = {
|
|
|
10
42
|
export default meta;
|
|
11
43
|
/** Production mode — shows "v1.90.0" as dimmed text, no dev details in tooltip. */
|
|
12
44
|
export const Production = {
|
|
45
|
+
decorators: [withNpmVersion('1.90.0')],
|
|
13
46
|
args: {
|
|
14
47
|
version: '1.90.0',
|
|
15
48
|
packageName: '@shepai/cli',
|
|
@@ -18,6 +51,7 @@ export const Production = {
|
|
|
18
51
|
};
|
|
19
52
|
/** Development mode — shows "1.90.0-dev", tooltip includes branch, commit, and path. */
|
|
20
53
|
export const Development = {
|
|
54
|
+
decorators: [withNpmVersion('1.90.0')],
|
|
21
55
|
args: {
|
|
22
56
|
version: '1.90.0',
|
|
23
57
|
isDev: true,
|
|
@@ -30,6 +64,7 @@ export const Development = {
|
|
|
30
64
|
};
|
|
31
65
|
/** Development mode with a long branch name — shown in tooltip. */
|
|
32
66
|
export const LongBranch = {
|
|
67
|
+
decorators: [withNpmVersion('1.90.0')],
|
|
33
68
|
args: {
|
|
34
69
|
version: '1.90.0',
|
|
35
70
|
isDev: true,
|
|
@@ -42,7 +77,39 @@ export const LongBranch = {
|
|
|
42
77
|
};
|
|
43
78
|
/** Minimal info — no optional fields. */
|
|
44
79
|
export const Minimal = {
|
|
80
|
+
decorators: [withNpmVersion('1.0.0')],
|
|
45
81
|
args: {
|
|
46
82
|
version: '1.0.0',
|
|
47
83
|
},
|
|
48
84
|
};
|
|
85
|
+
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0" link. */
|
|
86
|
+
export const UpdateAvailable = {
|
|
87
|
+
decorators: [withNpmVersion('2.0.0')],
|
|
88
|
+
args: {
|
|
89
|
+
version: '1.90.0',
|
|
90
|
+
packageName: '@shepai/cli',
|
|
91
|
+
description: 'Autonomous AI Native SDLC Platform',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
/** Update available in dev mode — green dot + upgrade link alongside dev info. */
|
|
95
|
+
export const UpdateAvailableDev = {
|
|
96
|
+
decorators: [withNpmVersion('2.0.0')],
|
|
97
|
+
args: {
|
|
98
|
+
version: '1.90.0',
|
|
99
|
+
isDev: true,
|
|
100
|
+
branch: 'feat/npm-version-checker',
|
|
101
|
+
commitHash: '5a84c148b3e2f1a9c7d6e8b4a2f1c3d5e7f9a1b3',
|
|
102
|
+
packageName: '@shepai/cli',
|
|
103
|
+
description: 'Autonomous AI Native SDLC Platform',
|
|
104
|
+
instancePath: '/home/user/projects/shep',
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
/** Fetch error — no update info shown, badge behaves normally. */
|
|
108
|
+
export const FetchError = {
|
|
109
|
+
decorators: [withNpmVersionError],
|
|
110
|
+
args: {
|
|
111
|
+
version: '1.90.0',
|
|
112
|
+
packageName: '@shepai/cli',
|
|
113
|
+
description: 'Autonomous AI Native SDLC Platform',
|
|
114
|
+
},
|
|
115
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAiBpF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAkJ9F"}
|
package/dist/src/presentation/web/components/features/settings/notification-settings-section.js
CHANGED
|
@@ -20,7 +20,6 @@ const PR_EVENT_TOGGLES = [
|
|
|
20
20
|
{ key: 'prClosed', label: 'PR Closed' },
|
|
21
21
|
{ key: 'prChecksPassed', label: 'PR Checks Passed' },
|
|
22
22
|
{ key: 'prChecksFailed', label: 'PR Checks Failed' },
|
|
23
|
-
{ key: 'prBlocked', label: 'PR Blocked' },
|
|
24
23
|
];
|
|
25
24
|
export function NotificationSettingsSection({ notifications }) {
|
|
26
25
|
const [inApp, setInApp] = useState(notifications.inApp.enabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE9E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"notification-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE9E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0BnC,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KASxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC"}
|
|
@@ -18,7 +18,6 @@ const allEvents = {
|
|
|
18
18
|
prClosed: true,
|
|
19
19
|
prChecksPassed: true,
|
|
20
20
|
prChecksFailed: true,
|
|
21
|
-
prBlocked: true,
|
|
22
21
|
};
|
|
23
22
|
const noEvents = {
|
|
24
23
|
agentStarted: false,
|
|
@@ -30,7 +29,6 @@ const noEvents = {
|
|
|
30
29
|
prClosed: false,
|
|
31
30
|
prChecksPassed: false,
|
|
32
31
|
prChecksFailed: false,
|
|
33
|
-
prBlocked: false,
|
|
34
32
|
};
|
|
35
33
|
export const Default = {
|
|
36
34
|
args: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-graph-state.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-graph-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mDAAmD;IACnD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,kEAAkE;IAClE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClE,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtF,gEAAgE;IAChE,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,+EAA+E;IAC/E,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAuCD,KAAK,kBAAkB,GAAG,OAAO,CAC/B,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,CACtE,CAAC;AAWF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"use-graph-state.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-graph-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mDAAmD;IACnD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,kEAAkE;IAClE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClE,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtF,gEAAgE;IAChE,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,+EAA+E;IAC/E,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAuCD,KAAK,kBAAkB,GAAG,OAAO,CAC/B,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,CACtE,CAAC;AAWF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,mBAAmB,CAgTrB"}
|
|
@@ -165,23 +165,7 @@ export function useGraphState(initialNodes, initialEdges) {
|
|
|
165
165
|
}
|
|
166
166
|
return changed ? next : currentPendingMap;
|
|
167
167
|
});
|
|
168
|
-
|
|
169
|
-
// know about yet. Temp repos use IDs like "repo-temp-*". Without this,
|
|
170
|
-
// a polling reconcile that fires before the server action returns would
|
|
171
|
-
// wipe the optimistic entry, causing the repo to disappear and reappear.
|
|
172
|
-
setRepoMap((currentRepoMap) => {
|
|
173
|
-
// Start with everything the server returned
|
|
174
|
-
const merged = new Map(newRepoMap);
|
|
175
|
-
// Build a set of repositoryPaths present in server data for dedup
|
|
176
|
-
const serverPaths = new Set([...newRepoMap.values()].map((e) => e.data.repositoryPath));
|
|
177
|
-
// Keep optimistic entries whose path isn't in server data yet
|
|
178
|
-
for (const [id, entry] of currentRepoMap) {
|
|
179
|
-
if (id.startsWith('repo-temp-') && !serverPaths.has(entry.data.repositoryPath)) {
|
|
180
|
-
merged.set(id, entry);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return merged;
|
|
184
|
-
});
|
|
168
|
+
setRepoMap(newRepoMap);
|
|
185
169
|
}, []);
|
|
186
170
|
const updateFeature = useCallback((featureNodeId, updates) => {
|
|
187
171
|
setFeatureMap((prev) => {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface NpmVersionCheckResult {
|
|
2
|
+
/** Latest version on npm, or null if not yet fetched / error */
|
|
3
|
+
latest: string | null;
|
|
4
|
+
/** Whether a newer version is available on npm */
|
|
5
|
+
updateAvailable: boolean;
|
|
6
|
+
/** True while the fetch is in progress */
|
|
7
|
+
loading: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function useNpmVersionCheck(currentVersion: string): NpmVersionCheckResult;
|
|
10
|
+
//# sourceMappingURL=use-npm-version-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-npm-version-check.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-npm-version-check.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kDAAkD;IAClD,eAAe,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,qBAAqB,CA+BhF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { compareVersions } from '../lib/compare-versions.js';
|
|
4
|
+
export function useNpmVersionCheck(currentVersion) {
|
|
5
|
+
const [latest, setLatest] = useState(null);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
let cancelled = false;
|
|
9
|
+
async function check() {
|
|
10
|
+
try {
|
|
11
|
+
const res = await fetch('/api/npm-version');
|
|
12
|
+
if (!res.ok)
|
|
13
|
+
return;
|
|
14
|
+
const data = (await res.json());
|
|
15
|
+
if (!cancelled && data.latest) {
|
|
16
|
+
setLatest(data.latest);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Silently fail — version check is non-critical
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
if (!cancelled)
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
check();
|
|
28
|
+
return () => {
|
|
29
|
+
cancelled = true;
|
|
30
|
+
};
|
|
31
|
+
}, []);
|
|
32
|
+
const updateAvailable = latest !== null && compareVersions(latest, currentVersion) > 0;
|
|
33
|
+
return { latest, updateAvailable, loading };
|
|
34
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver version strings.
|
|
3
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal.
|
|
4
|
+
* Only compares major.minor.patch (ignores pre-release/build metadata).
|
|
5
|
+
*/
|
|
6
|
+
export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
|
|
7
|
+
//# sourceMappingURL=compare-versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-versions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/compare-versions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAWhE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver version strings.
|
|
3
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal.
|
|
4
|
+
* Only compares major.minor.patch (ignores pre-release/build metadata).
|
|
5
|
+
*/
|
|
6
|
+
export function compareVersions(a, b) {
|
|
7
|
+
const parse = (v) => v.split('-')[0].split('.').map(Number);
|
|
8
|
+
const pa = parse(a);
|
|
9
|
+
const pb = parse(b);
|
|
10
|
+
for (let i = 0; i < 3; i++) {
|
|
11
|
+
const na = pa[i] ?? 0;
|
|
12
|
+
const nb = pb[i] ?? 0;
|
|
13
|
+
if (na > nb)
|
|
14
|
+
return 1;
|
|
15
|
+
if (na < nb)
|
|
16
|
+
return -1;
|
|
17
|
+
}
|
|
18
|
+
return 0;
|
|
19
|
+
}
|