From 1f28ee50215005c59f33891bff00e67827138009 Mon Sep 17 00:00:00 2001 From: iliya Date: Mon, 30 Mar 2026 16:45:14 +0300 Subject: [PATCH] fix(ci): stabilize provisioning test and clear lint errors --- src/main/index.ts | 4 ++-- src/main/ipc/handlers.ts | 4 ++-- src/main/ipc/teams.ts | 6 +++--- src/main/services/team/BranchStatusService.ts | 3 +-- .../services/team/TeamProvisioningService.ts | 2 +- src/main/services/team/TeammateToolTracker.ts | 2 +- src/main/services/team/index.ts | 4 ++-- .../team/leadSessionMessageExtractor.ts | 5 ++--- src/preload/index.ts | 6 +++--- .../components/team/TeamDetailView.tsx | 6 +++--- .../components/team/ToolApprovalSheet.tsx | 3 +-- .../team/kanban/KanbanFilterPopover.tsx | 2 +- .../team/review/FileSectionDiff.tsx | 4 ++-- .../team/sidebar/TeamSidebarPortalSource.tsx | 2 +- .../team/useClaudeLogsController.ts | 2 +- .../agent-graph/adapters/TeamGraphAdapter.ts | 2 +- .../agent-graph/ui/GraphNodePopover.tsx | 20 +++++++++---------- .../agent-graph/ui/TeamGraphOverlay.tsx | 1 + .../features/agent-graph/ui/TeamGraphTab.tsx | 3 ++- src/renderer/store/index.ts | 2 +- .../TeamProvisioningServicePrepare.test.ts | 13 ++++++++++++ 21 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 885dbe4e..29d569db 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -95,11 +95,11 @@ import { } from './utils/safeWebContentsSend'; import { syncTelemetryFlag } from './sentry'; import { + BranchStatusService, CliInstallerService, configManager, LocalFileSystemProvider, MemberStatsComputer, - BranchStatusService, NotificationManager, PtyTerminalService, ServiceContext, @@ -108,8 +108,8 @@ import { TaskBoundaryParser, TeamDataService, TeamLogSourceTracker, - TeamMemberLogsFinder, TeammateToolTracker, + TeamMemberLogsFinder, TeamProvisioningService, UpdaterService, } from './services'; diff --git a/src/main/ipc/handlers.ts b/src/main/ipc/handlers.ts index 35fcaa8b..c959a381 100644 --- a/src/main/ipc/handlers.ts +++ b/src/main/ipc/handlers.ts @@ -88,8 +88,8 @@ import { registerValidationHandlers, removeValidationHandlers } from './validati import { registerWindowHandlers, removeWindowHandlers } from './window'; import type { - ChangeExtractorService, BranchStatusService, + ChangeExtractorService, CliInstallerService, FileContentResolver, GitDiffFallback, @@ -100,8 +100,8 @@ import type { ServiceContextRegistry, SshConnectionManager, TeamDataService, - TeamMemberLogsFinder, TeammateToolTracker, + TeamMemberLogsFinder, TeamProvisioningService, UpdaterService, } from '../services'; diff --git a/src/main/ipc/teams.ts b/src/main/ipc/teams.ts index e16fa94c..4848902b 100644 --- a/src/main/ipc/teams.ts +++ b/src/main/ipc/teams.ts @@ -49,8 +49,8 @@ import { TEAM_SEND_MESSAGE, TEAM_SET_CHANGE_PRESENCE_TRACKING, TEAM_SET_PROJECT_BRANCH_TRACKING, - TEAM_SET_TOOL_ACTIVITY_TRACKING, TEAM_SET_TASK_CLARIFICATION, + TEAM_SET_TOOL_ACTIVITY_TRACKING, TEAM_SHOW_MESSAGE_NOTIFICATION, TEAM_SOFT_DELETE_TASK, TEAM_START_TASK, @@ -113,8 +113,8 @@ import { import type { BranchStatusService, MemberStatsComputer, - TeammateToolTracker, TeamDataService, + TeammateToolTracker, TeamMemberLogsFinder, TeamProvisioningService, } from '../services'; @@ -2978,7 +2978,7 @@ async function handleToolApprovalSettings( try { getTeamProvisioningService().updateToolApprovalSettings( - teamName as string, + teamName, s as unknown as ToolApprovalSettings ); } catch (err) { diff --git a/src/main/services/team/BranchStatusService.ts b/src/main/services/team/BranchStatusService.ts index 3f7bc1f5..544ec4f2 100644 --- a/src/main/services/team/BranchStatusService.ts +++ b/src/main/services/team/BranchStatusService.ts @@ -1,6 +1,5 @@ -import * as path from 'path'; - import { createLogger } from '@shared/utils/logger'; +import * as path from 'path'; import { gitIdentityResolver } from '../parsing/GitIdentityResolver'; diff --git a/src/main/services/team/TeamProvisioningService.ts b/src/main/services/team/TeamProvisioningService.ts index be69f892..b1b29a90 100644 --- a/src/main/services/team/TeamProvisioningService.ts +++ b/src/main/services/team/TeamProvisioningService.ts @@ -34,8 +34,8 @@ import { resolveLanguageName } from '@shared/utils/agentLanguage'; import { parseCliArgs } from '@shared/utils/cliArgsParser'; import { isInboxNoiseMessage, - parsePermissionRequest, type ParsedPermissionRequest, + parsePermissionRequest, } from '@shared/utils/inboxNoise'; import { isLeadAgentType, isLeadMember } from '@shared/utils/leadDetection'; import { createLogger } from '@shared/utils/logger'; diff --git a/src/main/services/team/TeammateToolTracker.ts b/src/main/services/team/TeammateToolTracker.ts index d66ff457..5a4416b9 100644 --- a/src/main/services/team/TeammateToolTracker.ts +++ b/src/main/services/team/TeammateToolTracker.ts @@ -337,7 +337,7 @@ export class TeammateToolTracker { for (const block of content) { if (!block || typeof block !== 'object') continue; - const typedBlock = block as Record; + const typedBlock = block; if (typedBlock.type === 'tool_use') { const rawId = typeof typedBlock.id === 'string' ? typedBlock.id.trim() : ''; if (!rawId) continue; diff --git a/src/main/services/team/index.ts b/src/main/services/team/index.ts index 27a14f0d..ddc17421 100644 --- a/src/main/services/team/index.ts +++ b/src/main/services/team/index.ts @@ -1,5 +1,5 @@ -export { CascadeGuard } from './CascadeGuard'; export { BranchStatusService } from './BranchStatusService'; +export { CascadeGuard } from './CascadeGuard'; export { ChangeExtractorService } from './ChangeExtractorService'; export { ClaudeBinaryResolver } from './ClaudeBinaryResolver'; export { CrossTeamOutbox } from './CrossTeamOutbox'; @@ -18,10 +18,10 @@ export { TeamInboxReader } from './TeamInboxReader'; export { TeamInboxWriter } from './TeamInboxWriter'; export { TeamKanbanManager } from './TeamKanbanManager'; export { TeamLogSourceTracker } from './TeamLogSourceTracker'; +export { TeammateToolTracker } from './TeammateToolTracker'; export { TeamMemberLogsFinder } from './TeamMemberLogsFinder'; export { TeamMemberResolver } from './TeamMemberResolver'; export { TeamMembersMetaStore } from './TeamMembersMetaStore'; -export { TeammateToolTracker } from './TeammateToolTracker'; export { TeamProvisioningService } from './TeamProvisioningService'; export { TeamSentMessagesStore } from './TeamSentMessagesStore'; export { TeamTaskReader } from './TeamTaskReader'; diff --git a/src/main/services/team/leadSessionMessageExtractor.ts b/src/main/services/team/leadSessionMessageExtractor.ts index 6fd9c23f..0124f395 100644 --- a/src/main/services/team/leadSessionMessageExtractor.ts +++ b/src/main/services/team/leadSessionMessageExtractor.ts @@ -1,10 +1,9 @@ import { isParsedSystemChunkMessage, isParsedUserChunkMessage, isTextContent } from '@main/types'; import { parseJsonlLine } from '@main/utils/jsonl'; -import { createHash } from 'crypto'; -import * as fs from 'fs'; - import { extractCommandOutputInfo, extractSlashInfo } from '@shared/utils/contentSanitizer'; import { buildSlashCommandMeta } from '@shared/utils/slashCommands'; +import { createHash } from 'crypto'; +import * as fs from 'fs'; import type { ParsedMessage } from '@main/types'; import type { CommandOutputMeta, InboxMessage, SlashCommandMeta } from '@shared/types'; diff --git a/src/preload/index.ts b/src/preload/index.ts index a8542a5d..f5ab238a 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -126,7 +126,6 @@ import { TEAM_GET_MEMBER_LOGS, TEAM_GET_MEMBER_STATS, TEAM_GET_PROJECT_BRANCH, - TEAM_PROJECT_BRANCH_CHANGE, TEAM_GET_SAVED_REQUEST, TEAM_GET_TASK_ATTACHMENT, TEAM_GET_TASK_CHANGE_PRESENCE, @@ -140,6 +139,7 @@ import { TEAM_PREPARE_PROVISIONING, TEAM_PROCESS_ALIVE, TEAM_PROCESS_SEND, + TEAM_PROJECT_BRANCH_CHANGE, TEAM_PROVISIONING_PROGRESS, TEAM_PROVISIONING_STATUS, TEAM_REMOVE_MEMBER, @@ -152,8 +152,8 @@ import { TEAM_SEND_MESSAGE, TEAM_SET_CHANGE_PRESENCE_TRACKING, TEAM_SET_PROJECT_BRANCH_TRACKING, - TEAM_SET_TOOL_ACTIVITY_TRACKING, TEAM_SET_TASK_CLARIFICATION, + TEAM_SET_TOOL_ACTIVITY_TRACKING, TEAM_SHOW_MESSAGE_NOTIFICATION, TEAM_SOFT_DELETE_TASK, TEAM_START_TASK, @@ -250,6 +250,7 @@ import type { MemberLogSummary, MemberSpawnStatusesSnapshot, NotificationTrigger, + ProjectBranchChangeEvent, RejectResult, ReplaceMembersRequest, Schedule, @@ -268,7 +269,6 @@ import type { TaskChangePresenceState, TaskChangeSetV2, TaskComment, - ProjectBranchChangeEvent, TeamChangeEvent, TeamClaudeLogsQuery, TeamClaudeLogsResponse, diff --git a/src/renderer/components/team/TeamDetailView.tsx b/src/renderer/components/team/TeamDetailView.tsx index 7a015cc1..bf84bd5a 100644 --- a/src/renderer/components/team/TeamDetailView.tsx +++ b/src/renderer/components/team/TeamDetailView.tsx @@ -81,12 +81,12 @@ import { MemberList } from './members/MemberList'; import { MessagesPanel } from './messages/MessagesPanel'; import { ChangeReviewDialog } from './review/ChangeReviewDialog'; import { ScheduleSection } from './schedule/ScheduleSection'; -import { ClaudeLogsSection } from './ClaudeLogsSection'; -import { CollapsibleTeamSection } from './CollapsibleTeamSection'; -import { ProcessesSection } from './ProcessesSection'; import { TeamSidebarHost } from './sidebar/TeamSidebarHost'; import { TeamSidebarPortalSource } from './sidebar/TeamSidebarPortalSource'; import { TeamSidebarRail } from './sidebar/TeamSidebarRail'; +import { ClaudeLogsSection } from './ClaudeLogsSection'; +import { CollapsibleTeamSection } from './CollapsibleTeamSection'; +import { ProcessesSection } from './ProcessesSection'; import { TeamProvisioningBanner } from './TeamProvisioningBanner'; import { TeamSessionsSection } from './TeamSessionsSection'; diff --git a/src/renderer/components/team/ToolApprovalSheet.tsx b/src/renderer/components/team/ToolApprovalSheet.tsx index ac530c93..bfc7de63 100644 --- a/src/renderer/components/team/ToolApprovalSheet.tsx +++ b/src/renderer/components/team/ToolApprovalSheet.tsx @@ -7,13 +7,12 @@ import { shortenDisplayPath } from '@renderer/utils/pathDisplay'; import { highlightLines } from '@renderer/utils/syntaxHighlighter'; import { AlertTriangle, FileText, MessageCircleQuestion, Search, Terminal } from 'lucide-react'; -import { MemberBadge } from './MemberBadge'; - import { ToolApprovalSettingsContent, ToolApprovalSettingsToggle, } from './dialogs/ToolApprovalSettingsPanel'; import { FileIcon } from './editor/FileIcon'; +import { MemberBadge } from './MemberBadge'; import { ToolApprovalDiffPreview } from './ToolApprovalDiffPreview'; import type { ToolApprovalRequest } from '@shared/types'; diff --git a/src/renderer/components/team/kanban/KanbanFilterPopover.tsx b/src/renderer/components/team/kanban/KanbanFilterPopover.tsx index 579f6656..12ebdee3 100644 --- a/src/renderer/components/team/kanban/KanbanFilterPopover.tsx +++ b/src/renderer/components/team/kanban/KanbanFilterPopover.tsx @@ -3,9 +3,9 @@ import { useMemo } from 'react'; import { Button } from '@renderer/components/ui/button'; import { Checkbox } from '@renderer/components/ui/checkbox'; import { Popover, PopoverContent, PopoverTrigger } from '@renderer/components/ui/popover'; -import { formatSessionLabel } from '@renderer/utils/sessionTitleParser'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { displayMemberName } from '@renderer/utils/memberHelpers'; +import { formatSessionLabel } from '@renderer/utils/sessionTitleParser'; import { Crown, Filter } from 'lucide-react'; import type { Session } from '@renderer/types/data'; diff --git a/src/renderer/components/team/review/FileSectionDiff.tsx b/src/renderer/components/team/review/FileSectionDiff.tsx index a25a2dcc..596614f7 100644 --- a/src/renderer/components/team/review/FileSectionDiff.tsx +++ b/src/renderer/components/team/review/FileSectionDiff.tsx @@ -191,10 +191,10 @@ export const FileSectionDiff = ({ ); }; -function OversizedDiffNotice({ message }: { message: string }): React.ReactElement { +const OversizedDiffNotice = ({ message }: { message: string }): React.ReactElement => { return (
{message}
); -} +}; diff --git a/src/renderer/components/team/sidebar/TeamSidebarPortalSource.tsx b/src/renderer/components/team/sidebar/TeamSidebarPortalSource.tsx index c72eab36..a24da0e1 100644 --- a/src/renderer/components/team/sidebar/TeamSidebarPortalSource.tsx +++ b/src/renderer/components/team/sidebar/TeamSidebarPortalSource.tsx @@ -3,13 +3,13 @@ import { createPortal } from 'react-dom'; import { useStore } from '@renderer/store'; +import { useTeamSidebarHostId } from './TeamSidebarHost'; import { getTeamSidebarHostElement, removeTeamSidebarSource, upsertTeamSidebarSource, useTeamSidebarPortalSnapshot, } from './TeamSidebarPortalManager'; -import { useTeamSidebarHostId } from './TeamSidebarHost'; interface TeamSidebarPortalSourceProps { teamName: string; diff --git a/src/renderer/components/team/useClaudeLogsController.ts b/src/renderer/components/team/useClaudeLogsController.ts index bee14201..430ad446 100644 --- a/src/renderer/components/team/useClaudeLogsController.ts +++ b/src/renderer/components/team/useClaudeLogsController.ts @@ -13,12 +13,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { api } from '@renderer/api'; import { useStore } from '@renderer/store'; -import { DEFAULT_CLAUDE_LOGS_FILTER } from './ClaudeLogsFilterPopover'; import { createDefaultClaudeLogsSidebarUiState, getTeamClaudeLogsSidebarUiState, setTeamClaudeLogsSidebarUiState, } from './sidebar/teamSidebarUiState'; +import { DEFAULT_CLAUDE_LOGS_FILTER } from './ClaudeLogsFilterPopover'; import type { ClaudeLogsFilterState } from './ClaudeLogsFilterPopover'; import type { ClaudeLogsViewerState } from './CliLogsRichView'; diff --git a/src/renderer/features/agent-graph/adapters/TeamGraphAdapter.ts b/src/renderer/features/agent-graph/adapters/TeamGraphAdapter.ts index 724893b2..fb446754 100644 --- a/src/renderer/features/agent-graph/adapters/TeamGraphAdapter.ts +++ b/src/renderer/features/agent-graph/adapters/TeamGraphAdapter.ts @@ -7,8 +7,8 @@ * Class-based with ES #private fields, caching, and DI-ready constructor. */ -import { isLeadMember } from '@shared/utils/leadDetection'; import { agentAvatarUrl } from '@renderer/utils/memberHelpers'; +import { isLeadMember } from '@shared/utils/leadDetection'; import type { GraphDataPort, diff --git a/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx b/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx index 72d89ab1..e5a6e2b2 100644 --- a/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx +++ b/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx @@ -7,7 +7,7 @@ import { Badge } from '@renderer/components/ui/badge'; import { Button } from '@renderer/components/ui/button'; import { agentAvatarUrl } from '@renderer/utils/memberHelpers'; -import { Loader2, MessageSquare, ExternalLink, User, Plus } from 'lucide-react'; +import { ExternalLink, Loader2, MessageSquare, Plus, User } from 'lucide-react'; import type { GraphNode } from '@claude-teams/agent-graph'; @@ -20,14 +20,14 @@ interface GraphNodePopoverProps { onCreateTask?: (owner: string) => void; } -export function GraphNodePopover({ +export const GraphNodePopover = ({ node, onClose, onSendMessage, onOpenTaskDetail, onOpenMemberProfile, onCreateTask, -}: GraphNodePopoverProps): React.JSX.Element { +}: GraphNodePopoverProps): React.JSX.Element => { if (node.kind === 'member' || node.kind === 'lead') { return ( ); -} +}; // ─── Member Popover ───────────────────────────────────────────────────────── -function MemberPopoverContent({ +const MemberPopoverContent = ({ node, onClose, onSendMessage, @@ -79,7 +79,7 @@ function MemberPopoverContent({ onOpenProfile?: (name: string) => void; onCreateTask?: (owner: string) => void; onOpenTask?: (taskId: string) => void; -}): React.JSX.Element { +}): React.JSX.Element => { const memberName = node.domainRef.kind === 'member' || node.domainRef.kind === 'lead' ? node.domainRef.memberName @@ -303,11 +303,11 @@ function MemberPopoverContent({ ); -} +}; // ─── Task Popover ─────────────────────────────────────────────────────────── -function TaskPopoverContent({ +const TaskPopoverContent = ({ node, onClose, onOpenDetail, @@ -315,7 +315,7 @@ function TaskPopoverContent({ node: GraphNode; onClose: () => void; onOpenDetail?: (taskId: string) => void; -}): React.JSX.Element { +}): React.JSX.Element => { const taskId = node.domainRef.kind === 'task' ? node.domainRef.taskId : ''; const statusColor = @@ -379,4 +379,4 @@ function TaskPopoverContent({ ); -} +}; diff --git a/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx b/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx index 91219682..7f4e6d30 100644 --- a/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx +++ b/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx @@ -9,6 +9,7 @@ import { GraphView } from '@claude-teams/agent-graph'; import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost'; import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter'; + import { GraphNodePopover } from './GraphNodePopover'; import type { GraphDomainRef, GraphEventPort } from '@claude-teams/agent-graph'; diff --git a/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx b/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx index 22049c64..332cb785 100644 --- a/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx +++ b/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx @@ -3,12 +3,13 @@ * Provides Fullscreen button that opens the overlay. */ -import { useCallback, useState, lazy, Suspense } from 'react'; +import { lazy, Suspense, useCallback, useState } from 'react'; import { GraphView } from '@claude-teams/agent-graph'; import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost'; import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter'; + import { GraphNodePopover } from './GraphNodePopover'; import type { GraphDomainRef, GraphEventPort, GraphNode } from '@claude-teams/agent-graph'; diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index 399ad1b1..27ef20db 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -6,12 +6,12 @@ import { api } from '@renderer/api'; import { syncRendererTelemetry } from '@renderer/sentry'; import { cleanupStale as cleanupCommentReadState } from '@renderer/services/commentReadStorage'; import { normalizePath } from '@renderer/utils/pathNormalize'; -import { isVersionOlder, normalizeVersion } from '@shared/utils/version'; import { buildTaskChangePresenceKey, buildTaskChangeRequestOptions, canDisplayTaskChangesForOptions, } from '@renderer/utils/taskChangeRequest'; +import { isVersionOlder, normalizeVersion } from '@shared/utils/version'; import { create } from 'zustand'; import { createChangeReviewSlice } from './slices/changeReviewSlice'; diff --git a/test/main/services/team/TeamProvisioningServicePrepare.test.ts b/test/main/services/team/TeamProvisioningServicePrepare.test.ts index dfc8ca1e..41285f18 100644 --- a/test/main/services/team/TeamProvisioningServicePrepare.test.ts +++ b/test/main/services/team/TeamProvisioningServicePrepare.test.ts @@ -12,6 +12,15 @@ vi.mock('@main/utils/shellEnv', () => ({ resolveInteractiveShellEnv: vi.fn(), })); +const addTeamNotificationMock = vi.fn().mockResolvedValue(null); +vi.mock('@main/services/infrastructure/NotificationManager', () => ({ + NotificationManager: { + getInstance: () => ({ + addTeamNotification: addTeamNotificationMock, + }), + }, +})); + import { TeamProvisioningService } from '@main/services/team/TeamProvisioningService'; import { ClaudeBinaryResolver } from '@main/services/team/ClaudeBinaryResolver'; import { resolveInteractiveShellEnv } from '@main/utils/shellEnv'; @@ -21,6 +30,7 @@ describe('TeamProvisioningService prepare/auth behavior', () => { beforeEach(() => { vi.clearAllMocks(); + addTeamNotificationMock.mockResolvedValue(null); tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-team-prepare-')); vi.mocked(ClaudeBinaryResolver.resolve).mockResolvedValue('/fake/claude'); vi.mocked(resolveInteractiveShellEnv).mockResolvedValue({ @@ -228,6 +238,9 @@ describe('TeamProvisioningService prepare/auth behavior', () => { const svc = new TeamProvisioningService(); const emitter = vi.fn(); svc.setTeamChangeEmitter(emitter); + vi.spyOn(svc as any, 'updateConfigPostLaunch').mockResolvedValue(undefined); + vi.spyOn(svc as any, 'cleanupPrelaunchBackup').mockResolvedValue(undefined); + vi.spyOn(svc as any, 'relayLeadInboxMessages').mockResolvedValue(undefined); const run = { runId: 'run-3',