Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,5 +119,43 @@ module.exports = {
"Do not namespace-import lucide-react; use named imports or a finite typed icon registry so icons remain tree-shakeable.",
},
],

// Tripwire for dissolved global hook groups. src/hooks/ is for genuinely
// cross-cutting hooks; module-owned hooks live next to their consumers.
// Kept so in-flight branches get a pointer to the new homes on rebase.
"no-restricted-imports": [
"error",
{
patterns: [
{
group: ["@src/hooks/workStation", "@src/hooks/workStation/*"],
message:
"hooks/workStation was dissolved. Tab-host hooks: @src/hooks/tabHost/*; editor hooks: @src/modules/WorkStation/CodeEditor/hooks/*; browser hooks: @src/modules/WorkStation/Browser/hooks/*; session capture: @src/features/SessionSetup/hooks/*; context menu: @src/scaffold/ContextMenu/*.",
},
{
group: ["@src/hooks/dependencies", "@src/hooks/dependencies/*"],
message:
"Moved to @src/modules/MainApp/Integrations/hooks/* (usePostPaintGitProbe -> @src/app/root/usePostPaintGitProbe).",
},
{
group: [
"@src/hooks/git/sourceControl",
"@src/hooks/git/sourceControl/*",
],
message:
"Moved to @src/modules/WorkStation/CodeEditor/hooks/sourceControl/* (generateCommitMessage -> @src/api/tauri/git/commitMessage).",
},
{
group: ["@src/hooks/testRunner", "@src/hooks/testRunner/*"],
message:
"Moved to @src/modules/WorkStation/CodeEditor/hooks/useTestRunner.",
},
{
group: ["@src/hooks/benchmark", "@src/hooks/benchmark/*"],
message: "Moved to @src/features/BenchmarkPanel/hooks/*.",
},
],
},
],
},
};
2 changes: 1 addition & 1 deletion src/app/root/AppBootstrap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import {
MultiRepoGitStatusProvider,
} from "@src/contexts/git";
import { useDiagnosticsBootstrap } from "@src/diagnostics";
import { usePostPaintGitProbe } from "@src/hooks/dependencies/usePostPaintGitProbe";
import { useGlobalFlowTracker } from "@src/hooks/flowAwareness";
import { useModelAliasRegistry } from "@src/hooks/models";
import {
Expand All @@ -46,6 +45,7 @@ import { E2EBootstrap } from "./E2EBootstrap";
import { useAppDeferredInitialization } from "./useAppDeferredInitialization";
import { useAppShellEffects } from "./useAppShellEffects";
import { useFirstPaintSignal } from "./useFirstPaintSignal";
import { usePostPaintGitProbe } from "./usePostPaintGitProbe";

export const AppBootstrap: FC = () => {
const deferredComponentsReady = useAppDeferredInitialization();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from "vitest";

import { generateCommitMessage } from "@src/hooks/git/sourceControl/commitMessageGeneration";
import { generateCommitMessage } from "@src/api/tauri/git/commitMessage";

import {
GIT_DIFF_COMMIT_PROMPT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import React, { useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";

import { parseCloudOrgSelectorValue } from "@src/features/Org2Cloud/org2CloudOrgsAtom";
import { useWorkStationTabs } from "@src/hooks/workStation/tabs";
import { useWorkStationTabs } from "@src/hooks/tabHost/useWorkStationTabs";
import { activeStationChatVisibleAtom } from "@src/store/ui/chatPanelAtom";
import { stationModeAtom } from "@src/store/ui/simulatorAtom";
import { createWorkItemDetailTab } from "@src/store/workstation";
Expand Down
2 changes: 1 addition & 1 deletion src/engines/ChatPanel/hooks/useAiWorkItemCreator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
allocateCloudAwareStandaloneWorkItemId,
allocateCloudAwareWorkItemId,
} from "@src/features/Org2Cloud/cloudShortId";
import { useWorkStationTabs } from "@src/hooks/workStation";
import { useWorkStationTabs } from "@src/hooks/tabHost/useWorkStationTabs";
import i18n from "@src/i18n";
import type { AgentDefinition } from "@src/modules/MainApp/AgentOrgs/types";
import { openSessionInNewChatTabAtom } from "@src/store/chatPanel/chatPanelTabsAtom";
Expand Down
2 changes: 1 addition & 1 deletion src/engines/GitWorkflow/GitHubDiff/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ import React, {

import DiffStatsBadge from "@src/components/DiffStatsBadge";
import { getLanguageFromPath } from "@src/config/languageMap";
import { useDiff } from "@src/hooks/workStation/git/useDiff";

import { SplitDiffRowComponent, UnifiedDiffRow } from "./DiffRow";
import { DEFAULT_PROPS } from "./config";
import "./index.scss";
import type { DiffHunk, DiffLine, GitHubDiffProps } from "./types";
import { useDiff } from "./useDiff";

// ============================================
// Main Component
Expand Down
2 changes: 1 addition & 1 deletion src/engines/Simulator/apps/canvas/CanvasApp.share.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ vi.mock("../core/useSimulatorAppState", () => ({
}),
}));
vi.mock("./canvasConfig", () => ({ CANVAS_APP_CONFIG: {} }));
vi.mock("@src/hooks/workStation", () => ({
vi.mock("@src/hooks/tabHost/useWorkstationTabHeader", () => ({
usePublishWorkstationTabHeader: ({ content }: { content: ReactNode }) => {
testState.publishedHeader = content;
},
Expand Down
2 changes: 1 addition & 1 deletion src/engines/Simulator/apps/canvas/CanvasApp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ vi.mock("../core/useSimulatorAppState", () => ({
useSimulatorAppState: () => ({ appEvents: testState.appEvents }),
}));
vi.mock("./canvasConfig", () => ({ CANVAS_APP_CONFIG: {} }));
vi.mock("@src/hooks/workStation", () => ({
vi.mock("@src/hooks/tabHost/useWorkstationTabHeader", () => ({
usePublishWorkstationTabHeader: ({ content }: { content: ReactNode }) => {
testState.publishedHeader = content;
},
Expand Down
2 changes: 1 addition & 1 deletion src/engines/Simulator/apps/canvas/CanvasApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
getCanvasShareAvailability,
useCanvasShareDialog,
} from "@src/features/CanvasShare";
import { usePublishWorkstationTabHeader } from "@src/hooks/workStation";
import { usePublishWorkstationTabHeader } from "@src/hooks/tabHost/useWorkstationTabHeader";
import { SessionReplayCodeMirrorViewer } from "@src/modules/WorkStation/CodeEditor/SessionReplay/CodePanel/SessionReplayCodeMirrorViewer";
import {
PrimarySidebarLayoutWithSections,
Expand Down
7 changes: 4 additions & 3 deletions src/features/BenchmarkPanel/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ import TabPill from "@src/components/TabPill";
import { SURFACE_TOKENS } from "@src/config/surfaceTokens";
import BenchmarkTaskSelector from "@src/features/BenchmarkPanel/BenchmarkTaskSelector";
import { CodeMirrorEditor } from "@src/features/CodeMirror";
import { useBenchmarkAgentBatchRun } from "@src/hooks/benchmark/useBenchmarkAgentBatchRun";
import { useBenchmarkTasks } from "@src/hooks/benchmark/useBenchmarkTasks";
import { usePublishWorkstationTabHeader } from "@src/hooks/workStation";
import { usePublishWorkstationTabHeader } from "@src/hooks/tabHost/useWorkstationTabHeader";
import {
Placeholder,
SessionGroupPage,
Expand All @@ -50,6 +48,9 @@ import {
} from "@src/util/data/formatters/date";
import { formatModelNameFull } from "@src/util/formatModelName";

import { useBenchmarkAgentBatchRun } from "./hooks/useBenchmarkAgentBatchRun";
import { useBenchmarkTasks } from "./hooks/useBenchmarkTasks";

type BenchmarkPanelSurface = "taskInfo" | "runList";

interface BenchmarkPanelProps {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ import { useTranslation } from "react-i18next";
import Button from "@src/components/Button";
import InlineAlert from "@src/components/InlineAlert";
import { SPINNER_TOKENS } from "@src/config/spinnerTokens";
import {
useClaudeCodeOAuthCapture,
useWebviewPositionSync,
} from "@src/hooks/workStation/sessionCapture";
import { useClaudeCodeOAuthCapture } from "@src/features/SessionSetup/hooks/useClaudeCodeOAuthCapture";
import { useWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import {
SectionContainer,
SectionRow,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ import { useTranslation } from "react-i18next";
import Button from "@src/components/Button";
import InlineAlert from "@src/components/InlineAlert";
import { SPINNER_TOKENS } from "@src/config/spinnerTokens";
import {
useCodexOAuthCapture,
useWebviewPositionSync,
} from "@src/hooks/workStation/sessionCapture";
import { useCodexOAuthCapture } from "@src/features/SessionSetup/hooks/useCodexOAuthCapture";
import { useWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import {
SectionContainer,
SectionRow,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { v4 as uuidv4 } from "uuid";
import Button from "@src/components/Button";
import InlineAlert from "@src/components/InlineAlert";
import Input from "@src/components/Input";
import { useWebviewPositionSync } from "@src/hooks/workStation/sessionCapture/useWebviewPositionSync";
import { useWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import {
SectionContainer,
SectionRow,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import { useTranslation } from "react-i18next";

import Button from "@src/components/Button";
import { SPINNER_TOKENS } from "@src/config/spinnerTokens";
import { useCursorSessionCapture } from "@src/hooks/workStation/sessionCapture/useCursorSessionCapture";
import { useWebviewPositionSync } from "@src/hooks/workStation/sessionCapture/useWebviewPositionSync";
import { useCursorSessionCapture } from "@src/features/SessionSetup/hooks/useCursorSessionCapture";
import { useWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import {
SECTION_GAP_CLASSES,
SectionContainer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ import InlineAlert from "@src/components/InlineAlert";
import Input from "@src/components/Input";
import Select from "@src/components/Select";
import { SPINNER_TOKENS } from "@src/config/spinnerTokens";
import { useKiroSessionCapture } from "@src/hooks/workStation/sessionCapture/useKiroSessionCapture";
import { useWebviewPositionSync } from "@src/hooks/workStation/sessionCapture/useWebviewPositionSync";
import { useKiroSessionCapture } from "@src/features/SessionSetup/hooks/useKiroSessionCapture";
import { useWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import {
SECTION_CONTROL_STYLE,
SECTION_GAP_CLASSES,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
isOAuthE2EMockEnabled,
parseOAuthCallback,
shouldNavigateInWebview,
} from "../useOAuthCapture";
} from "@src/features/SessionSetup/hooks/useOAuthCapture";

// ---------------------------------------------------------------------------
// isOAuthE2EMockEnabled
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";

import type { PositionSyncHandlers } from "../useWebviewPositionSync";
import { attachWebviewPositionSync } from "../useWebviewPositionSync";
import type { PositionSyncHandlers } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";
import { attachWebviewPositionSync } from "@src/features/SessionSetup/hooks/useWebviewPositionSync";

// ---------------------------------------------------------------------------
// Fake RAF / timer environment
Expand Down
2 changes: 1 addition & 1 deletion src/features/TaskKanban/hooks/useTaskKanbanHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useMemo } from "react";

import type { KanbanTask } from "@src/features/KanbanBoard";
import { usePublishWorkstationTabHeader } from "@src/hooks/workStation";
import { usePublishWorkstationTabHeader } from "@src/hooks/tabHost/useWorkstationTabHeader";

import DiaryDateControls from "../components/DiaryDateControls";
import type { FactoryViewMode } from "../components/FactoryViewPill";
Expand Down
Loading
Loading