@nightkatana/kronosys-app 1.0.0-beta.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/README.md +81 -0
- package/app/api/action/route.ts +16 -0
- package/app/api/backup/route.ts +84 -0
- package/app/api/health/route.ts +22 -0
- package/app/api/state/route.ts +27 -0
- package/app/apple-icon.png +0 -0
- package/app/changelog/page.tsx +122 -0
- package/app/globals.css +210 -0
- package/app/guide/layout.tsx +11 -0
- package/app/guide/page.tsx +278 -0
- package/app/icon.png +0 -0
- package/app/layout.tsx +77 -0
- package/app/licenses/layout.tsx +11 -0
- package/app/licenses/page.tsx +246 -0
- package/app/manifest.ts +32 -0
- package/app/page.tsx +1610 -0
- package/app/reporting/page.tsx +2943 -0
- package/app/settings/layout.tsx +10 -0
- package/app/settings/page.tsx +3518 -0
- package/bin/kronosys.mjs +46 -0
- package/components/KronosysPackageVersionProvider.tsx +19 -0
- package/components/KronosysPayloadProvider.tsx +109 -0
- package/components/PwaRegister.tsx +25 -0
- package/components/SiteLegalFooter.tsx +21 -0
- package/components/ThemeProvider.tsx +78 -0
- package/components/dashboard/AppShellLiveSessionDrawer.tsx +394 -0
- package/components/dashboard/AppShellRouteNav.tsx +131 -0
- package/components/dashboard/AppVersionStamp.tsx +16 -0
- package/components/dashboard/DashboardCollapsibleSection.tsx +57 -0
- package/components/dashboard/DashboardColumnHintsBanner.tsx +159 -0
- package/components/dashboard/DashboardCommandCenter.tsx +470 -0
- package/components/dashboard/DashboardLangGateModal.tsx +118 -0
- package/components/dashboard/DashboardLoadingOverlay.tsx +42 -0
- package/components/dashboard/DashboardSimpleModal.tsx +337 -0
- package/components/dashboard/DashboardSuspenseFallback.tsx +52 -0
- package/components/dashboard/DashboardToastProvider.tsx +64 -0
- package/components/dashboard/DashboardTour.tsx +435 -0
- package/components/dashboard/DeferredDescriptionPopoverWrap.tsx +39 -0
- package/components/dashboard/DeleteSessionModal.tsx +130 -0
- package/components/dashboard/DescriptionTooltipPortaled.tsx +31 -0
- package/components/dashboard/GitIdentityQuickSetupModal.tsx +211 -0
- package/components/dashboard/HeaderIntegrationBadges.tsx +69 -0
- package/components/dashboard/InlineMetricHelpTrigger.tsx +102 -0
- package/components/dashboard/IssuePickerModal.tsx +168 -0
- package/components/dashboard/KronoFocusPanel.tsx +834 -0
- package/components/dashboard/KronosysDatetimePopoverField.tsx +357 -0
- package/components/dashboard/KronosysTimePopoverField.tsx +233 -0
- package/components/dashboard/LanguageMenu.tsx +123 -0
- package/components/dashboard/MongoMirrorSyncLine.tsx +57 -0
- package/components/dashboard/NewSessionScopeModal.tsx +410 -0
- package/components/dashboard/PageRefreshButton.tsx +130 -0
- package/components/dashboard/PlainHelpPopover.tsx +97 -0
- package/components/dashboard/ReportingPageToc.tsx +68 -0
- package/components/dashboard/ReportingTour.tsx +342 -0
- package/components/dashboard/SavedProjectPicker.tsx +92 -0
- package/components/dashboard/SavedTagPicker.tsx +115 -0
- package/components/dashboard/ScrollToTopFab.tsx +41 -0
- package/components/dashboard/SelectedSessionSidebarBlock.tsx +630 -0
- package/components/dashboard/SessionEndReasonEditor.tsx +114 -0
- package/components/dashboard/SessionListPanel.tsx +320 -0
- package/components/dashboard/SessionLocMetricsSection.tsx +128 -0
- package/components/dashboard/SettingsTagsProjectsSection.tsx +993 -0
- package/components/dashboard/SettingsTour.tsx +332 -0
- package/components/dashboard/TagPills.tsx +149 -0
- package/components/dashboard/TagsHelpTrigger.tsx +84 -0
- package/components/dashboard/TaskFocusPanel.tsx +1261 -0
- package/components/dashboard/TaskSessionLiveCard.tsx +832 -0
- package/components/dashboard/TaskSubtasksBlock.tsx +748 -0
- package/components/dashboard/ThemeToggle.test.tsx +26 -0
- package/components/dashboard/ThemeToggle.tsx +36 -0
- package/components/dashboard/UserGuideBodyText.tsx +62 -0
- package/components/dashboard/WorkspaceGitRepoCard.tsx +191 -0
- package/components/dashboard/taskFieldStyles.ts +139 -0
- package/components/dashboard/useAnchoredFloatingPortalStyle.ts +71 -0
- package/components/dashboard/useDescriptionPopoverAfterMs.ts +220 -0
- package/components/dashboard/useKronoFocusLiveSeconds.ts +36 -0
- package/components/dashboard/useSmoothStopwatchMs.ts +25 -0
- package/lib/appShellHeaderClasses.ts +12 -0
- package/lib/backupCsvExport.test.ts +149 -0
- package/lib/backupCsvExport.ts +392 -0
- package/lib/changelogCopy.ts +34 -0
- package/lib/concurrentTaskStartPreference.ts +29 -0
- package/lib/dashboardClockFormat.ts +13 -0
- package/lib/dashboardColumnChrome.ts +3 -0
- package/lib/dashboardColumnHintsStorage.ts +57 -0
- package/lib/dashboardCopy.ts +1831 -0
- package/lib/dashboardDetachedUrlHintStorage.ts +24 -0
- package/lib/dashboardGitIdentityBannerStorage.ts +36 -0
- package/lib/dashboardLangStorage.ts +72 -0
- package/lib/dashboardQuickSearch.ts +476 -0
- package/lib/dashboardQuickSearchQuery.test.ts +63 -0
- package/lib/dashboardQuickSearchQuery.ts +179 -0
- package/lib/dashboardSessionNav.ts +33 -0
- package/lib/dashboardShortcuts.ts +268 -0
- package/lib/dashboardTimeZone.ts +91 -0
- package/lib/dashboardTourStorage.ts +68 -0
- package/lib/dataDir.test.ts +87 -0
- package/lib/dataDir.ts +83 -0
- package/lib/devDataPreferenceFile.ts +55 -0
- package/lib/devDataRuntimeInfo.ts +34 -0
- package/lib/formatIsoShort.test.ts +46 -0
- package/lib/formatIsoShort.ts +29 -0
- package/lib/generatedUserChangelog.ts +34 -0
- package/lib/gitlabIssueSearch.ts +8 -0
- package/lib/kronoFocusDurationHistory.ts +71 -0
- package/lib/kronoFocusRhythm.test.ts +130 -0
- package/lib/kronoFocusRhythm.ts +46 -0
- package/lib/kronoFocusTimerUrgency.test.ts +74 -0
- package/lib/kronoFocusTimerUrgency.ts +24 -0
- package/lib/kronosysApi.ts +143 -0
- package/lib/legacyEditorPayloadKeys.ts +52 -0
- package/lib/legacyKronoFocusStorageKeys.test.ts +29 -0
- package/lib/legacyKronoFocusStorageKeys.ts +32 -0
- package/lib/licensesCopy.ts +128 -0
- package/lib/openPlainTextInNewTab.ts +49 -0
- package/lib/readKronosysPackageVersion.ts +10 -0
- package/lib/reportingAggregate.test.ts +325 -0
- package/lib/reportingAggregate.ts +819 -0
- package/lib/reportingDatePresets.ts +41 -0
- package/lib/reportingMetricHelp.ts +430 -0
- package/lib/reportingNonFinalIndicators.test.ts +157 -0
- package/lib/reportingNonFinalIndicators.ts +102 -0
- package/lib/reportingStrings.ts +491 -0
- package/lib/reportingTagWeekBreakdown.test.ts +141 -0
- package/lib/reportingTagWeekBreakdown.ts +181 -0
- package/lib/reportingWeekLayout.test.ts +239 -0
- package/lib/reportingWeekLayout.ts +313 -0
- package/lib/sessionAssiduity.test.ts +25 -0
- package/lib/sessionAssiduity.ts +33 -0
- package/lib/sessionEndReason.ts +55 -0
- package/lib/sessionEndWarnings.test.ts +200 -0
- package/lib/sessionEndWarnings.ts +125 -0
- package/lib/sessionListMerge.test.ts +101 -0
- package/lib/sessionListMerge.ts +70 -0
- package/lib/sessionTaskSidebarStats.test.ts +24 -0
- package/lib/sessionTaskSidebarStats.ts +54 -0
- package/lib/settingsCopy.ts +1276 -0
- package/lib/taskParsing.test.ts +153 -0
- package/lib/taskParsing.ts +737 -0
- package/lib/theme.ts +15 -0
- package/lib/translucentButtonClasses.ts +34 -0
- package/lib/usageProfile.test.ts +84 -0
- package/lib/usageProfile.ts +52 -0
- package/lib/userGuideCopy.ts +464 -0
- package/lib/workspaceLocDefaults.ts +21 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +15 -0
- package/package.json +87 -0
- package/postcss.config.mjs +12 -0
- package/public/apple-icon.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/icon.png +0 -0
- package/public/next.svg +1 -0
- package/public/sw.js +13 -0
- package/public/traceback.png +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/server/actionDispatch.test.ts +723 -0
- package/server/actionDispatch.ts +1476 -0
- package/server/actionTaskSession.test.ts +713 -0
- package/server/actionTaskSession.ts +717 -0
- package/server/db.ts +42 -0
- package/server/defaultCfg.ts +87 -0
- package/server/gitlabTokenStore.ts +34 -0
- package/server/kronoFocusHydrate.test.ts +142 -0
- package/server/kronoFocusHydrate.ts +69 -0
- package/server/kronoFocusMigrate.test.ts +53 -0
- package/server/kronoFocusMigrate.ts +78 -0
- package/server/mainTimerHydrate.test.ts +65 -0
- package/server/mainTimerHydrate.ts +53 -0
- package/server/payloadStore.test.ts +78 -0
- package/server/payloadStore.ts +83 -0
- package/server/sessionWallHydrate.test.ts +46 -0
- package/server/sessionWallHydrate.ts +88 -0
- package/tsconfig.json +41 -0
package/lib/theme.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type KronosysTheme = "light" | "dark";
|
|
2
|
+
|
|
3
|
+
export const THEME_STORAGE_KEY = "kronosys-dashboard-theme";
|
|
4
|
+
|
|
5
|
+
export function getThemeBootstrapScript(): string {
|
|
6
|
+
return `try {
|
|
7
|
+
var key = ${JSON.stringify(THEME_STORAGE_KEY)};
|
|
8
|
+
var stored = localStorage.getItem(key);
|
|
9
|
+
var theme = stored === "light" || stored === "dark"
|
|
10
|
+
? stored
|
|
11
|
+
: (window.matchMedia && window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark");
|
|
12
|
+
document.documentElement.classList.toggle("dark", theme === "dark");
|
|
13
|
+
} catch (_) {}
|
|
14
|
+
`;
|
|
15
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styles de boutons « pastille » : bordure + fond coloré léger (clair / sombre),
|
|
3
|
+
* alignés sur le thème du tableau de bord (pas de aplats type bg-violet-600).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const focusPage =
|
|
7
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-zinc-900";
|
|
8
|
+
|
|
9
|
+
const disabledIcon = "disabled:cursor-not-allowed disabled:opacity-40";
|
|
10
|
+
|
|
11
|
+
/** Carré 40×40 — barre d’actions tâche, lanceur, etc. */
|
|
12
|
+
export const tbIconSquareBase = `inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg transition-colors ${focusPage} ${disabledIcon}`;
|
|
13
|
+
|
|
14
|
+
/** Primaire violet (icône seule). */
|
|
15
|
+
export const tbVioletIcon = `${tbIconSquareBase} border border-violet-500/50 bg-violet-500/10 text-violet-800 hover:border-violet-500/75 hover:bg-violet-500/18 dark:border-violet-400/45 dark:bg-violet-600/20 dark:text-violet-100 dark:hover:border-violet-400/60 dark:hover:bg-violet-600/30 focus-visible:ring-violet-500/45 [&_svg]:shrink-0`;
|
|
16
|
+
|
|
17
|
+
/** Violet — bouton texte (ex. « Ajouter à la session »). */
|
|
18
|
+
export const tbVioletTextSm = `inline-flex h-10 shrink-0 items-center justify-center rounded-lg border border-violet-500/50 bg-violet-500/10 px-3 text-sm font-medium text-violet-800 transition hover:border-violet-500/75 hover:bg-violet-500/18 dark:border-violet-400/45 dark:bg-violet-600/20 dark:text-violet-100 dark:hover:border-violet-400/60 dark:hover:bg-violet-600/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-violet-500/45 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-zinc-900 ${disabledIcon}`;
|
|
19
|
+
|
|
20
|
+
/** Succès / terminer (icône). */
|
|
21
|
+
export const tbEmeraldIcon = `${tbIconSquareBase} border border-emerald-500/50 bg-emerald-500/10 text-emerald-800 hover:border-emerald-500/75 hover:bg-emerald-500/18 dark:border-emerald-500/40 dark:bg-emerald-950/35 dark:text-emerald-200 dark:hover:border-emerald-400/55 dark:hover:bg-emerald-950/50 focus-visible:ring-emerald-500/40 [&_svg]:shrink-0`;
|
|
22
|
+
|
|
23
|
+
/** Bascule « sélectionnée » (temps réel / passé). */
|
|
24
|
+
export const tbVioletToggleOn = `${tbIconSquareBase} border border-violet-500/55 bg-violet-500/12 text-violet-800 shadow-none hover:border-violet-500/75 hover:bg-violet-500/20 dark:border-violet-400/50 dark:bg-violet-600/22 dark:text-violet-100 dark:hover:border-violet-400/65 dark:hover:bg-violet-600/32 focus-visible:ring-violet-500/45 [&_svg]:shrink-0`;
|
|
25
|
+
|
|
26
|
+
export const tbVioletToggleOff = `${tbIconSquareBase} border border-zinc-300 bg-white/80 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-800 dark:border-zinc-700 dark:bg-zinc-950/50 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200 [&_svg]:shrink-0 focus-visible:ring-zinc-500/30`;
|
|
27
|
+
|
|
28
|
+
/** Modales : coquille claire (`bg-white`) ou sombre (`dark:bg-zinc-900`). */
|
|
29
|
+
const focusModal =
|
|
30
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-white focus-visible:ring-violet-500/45 dark:focus-visible:ring-offset-zinc-900 dark:focus-visible:ring-violet-500/40";
|
|
31
|
+
|
|
32
|
+
export const tbModalPrimary = `rounded-lg border border-violet-600/35 bg-violet-600 px-4 py-2 text-sm font-medium text-white shadow-none transition hover:border-violet-700 hover:bg-violet-700 dark:border-violet-400/45 dark:bg-violet-600/20 dark:text-violet-100 dark:hover:border-violet-400/60 dark:hover:bg-violet-600/32 ${focusModal}`;
|
|
33
|
+
|
|
34
|
+
export const tbModalDanger = `rounded-lg border border-red-600/40 bg-red-50 px-4 py-2 text-sm font-medium text-red-800 shadow-none transition hover:border-red-700/50 hover:bg-red-100 hover:text-red-900 dark:border-red-500/45 dark:bg-red-950/35 dark:text-red-200 dark:hover:border-red-400/55 dark:hover:bg-red-950/50 dark:hover:text-red-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-white focus-visible:ring-red-500/40 dark:focus-visible:ring-offset-zinc-900 dark:focus-visible:ring-red-500/35 disabled:cursor-not-allowed disabled:opacity-40`;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import type { KronosysUpdatePayload } from "./kronosysApi";
|
|
4
|
+
import {
|
|
5
|
+
extensionLinkedDeveloperMetrics,
|
|
6
|
+
showIdeLinkedCodeTimingMetrics,
|
|
7
|
+
showWorkspaceFoldersEmptyMessage,
|
|
8
|
+
trackCodeMetricsFromCfg,
|
|
9
|
+
workspaceCodeMetricsEnabled,
|
|
10
|
+
} from "./usageProfile";
|
|
11
|
+
|
|
12
|
+
describe("trackCodeMetricsFromCfg", () => {
|
|
13
|
+
it("gestionnaire : pas de métriques code", () => {
|
|
14
|
+
expect(trackCodeMetricsFromCfg({ usageProfile: "manager" })).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("défaut (vide) : pas de métriques code", () => {
|
|
18
|
+
expect(trackCodeMetricsFromCfg({})).toBe(false);
|
|
19
|
+
expect(trackCodeMetricsFromCfg(undefined)).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("développeur : métriques code", () => {
|
|
23
|
+
expect(trackCodeMetricsFromCfg({ usageProfile: "developer" })).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe("showWorkspaceFoldersEmptyMessage", () => {
|
|
28
|
+
const devPayload = (origin: KronosysUpdatePayload["dashboardDataOrigin"]): KronosysUpdatePayload =>
|
|
29
|
+
({
|
|
30
|
+
viewType: "dashboard",
|
|
31
|
+
cfg: { usageProfile: "developer" },
|
|
32
|
+
dashboardDataOrigin: origin,
|
|
33
|
+
}) as KronosysUpdatePayload;
|
|
34
|
+
|
|
35
|
+
it("affiche en développeur + local_next + aucun chemin", () => {
|
|
36
|
+
expect(showWorkspaceFoldersEmptyMessage(devPayload("local_next"), 0)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("masque en profil gestionnaire même avec origine héritée", () => {
|
|
40
|
+
const p = {
|
|
41
|
+
viewType: "dashboard",
|
|
42
|
+
cfg: { usageProfile: "manager" },
|
|
43
|
+
dashboardDataOrigin: "legacy_external" as const,
|
|
44
|
+
} as KronosysUpdatePayload;
|
|
45
|
+
expect(showWorkspaceFoldersEmptyMessage(p, 0)).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("affiche en développeur + legacy_external + aucun chemin", () => {
|
|
49
|
+
expect(showWorkspaceFoldersEmptyMessage(devPayload("legacy_external"), 0)).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("masque dès qu’au moins un chemin est résolu", () => {
|
|
53
|
+
expect(showWorkspaceFoldersEmptyMessage(devPayload("legacy_external"), 1)).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("workspaceCodeMetricsEnabled / showIdeLinkedCodeTimingMetrics", () => {
|
|
58
|
+
const dev = {
|
|
59
|
+
viewType: "dashboard",
|
|
60
|
+
cfg: { usageProfile: "developer" },
|
|
61
|
+
dashboardDataOrigin: "local_next" as const,
|
|
62
|
+
} as KronosysUpdatePayload;
|
|
63
|
+
|
|
64
|
+
it("workspaceCodeMetricsEnabled est vrai en profil développeur", () => {
|
|
65
|
+
expect(workspaceCodeMetricsEnabled(dev, dev.cfg as Record<string, unknown>)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("extensionLinkedDeveloperMetrics reste aligné (alias)", () => {
|
|
69
|
+
expect(extensionLinkedDeveloperMetrics(dev, dev.cfg as Record<string, unknown>)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("showIdeLinkedCodeTimingMetrics suit la même règle", () => {
|
|
73
|
+
expect(showIdeLinkedCodeTimingMetrics(dev, dev.cfg as Record<string, unknown>)).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("faux en profil gestionnaire", () => {
|
|
77
|
+
const p = {
|
|
78
|
+
viewType: "dashboard",
|
|
79
|
+
cfg: { usageProfile: "manager" },
|
|
80
|
+
dashboardDataOrigin: "local_next" as const,
|
|
81
|
+
} as KronosysUpdatePayload;
|
|
82
|
+
expect(showIdeLinkedCodeTimingMetrics(p, p.cfg as Record<string, unknown>)).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { KronosysUpdatePayload } from "./kronosysApi";
|
|
2
|
+
|
|
3
|
+
export type UsageProfile = "developer" | "manager";
|
|
4
|
+
|
|
5
|
+
/** Vrai si le profil « développeur » affiche les métriques liées au code (lignes, langages, instantané LOC, carte Git). */
|
|
6
|
+
export function trackCodeMetricsFromCfg(cfg: Record<string, unknown> | undefined): boolean {
|
|
7
|
+
return cfg?.usageProfile === "developer";
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Métriques dépendant du contexte workspace (chemins, temps de codage / actif, etc.) :
|
|
12
|
+
* réservé au profil développeur.
|
|
13
|
+
*/
|
|
14
|
+
export function workspaceCodeMetricsEnabled(
|
|
15
|
+
_payload: KronosysUpdatePayload | null | undefined,
|
|
16
|
+
cfg: Record<string, unknown> | undefined
|
|
17
|
+
): boolean {
|
|
18
|
+
return trackCodeMetricsFromCfg(cfg);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Temps de codage et temps actif : uniquement avec {@link workspaceCodeMetricsEnabled}.
|
|
23
|
+
*/
|
|
24
|
+
export function showIdeLinkedCodeTimingMetrics(
|
|
25
|
+
payload: KronosysUpdatePayload | null | undefined,
|
|
26
|
+
cfg: Record<string, unknown> | undefined
|
|
27
|
+
): boolean {
|
|
28
|
+
return workspaceCodeMetricsEnabled(payload, cfg);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Message « aucun dossier de workspace » : profil développeur et aucun chemin résolu.
|
|
33
|
+
*/
|
|
34
|
+
export function showWorkspaceFoldersEmptyMessage(
|
|
35
|
+
payload: KronosysUpdatePayload | null | undefined,
|
|
36
|
+
workspacePathsLength: number
|
|
37
|
+
): boolean {
|
|
38
|
+
if (workspacePathsLength > 0) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const cfg = payload?.cfg as Record<string, unknown> | undefined;
|
|
42
|
+
return workspaceCodeMetricsEnabled(payload, cfg);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** @deprecated Utiliser {@link workspaceCodeMetricsEnabled}. */
|
|
46
|
+
export function extensionLinkedDeveloperMetrics(
|
|
47
|
+
payload: KronosysUpdatePayload | null | undefined,
|
|
48
|
+
cfg: Record<string, unknown> | undefined
|
|
49
|
+
): boolean {
|
|
50
|
+
return workspaceCodeMetricsEnabled(payload, cfg);
|
|
51
|
+
}
|
|
52
|
+
|