From c745824dbeee5095ccdee15f30ad8e81f3a937d1 Mon Sep 17 00:00:00 2001 From: d-kimsuon Date: Fri, 17 Oct 2025 20:18:28 +0900 Subject: [PATCH] refactor: move directories --- e2e/config.ts | 2 +- src/app/api/[[...route]]/route.ts | 20 ++-- src/app/hooks/useConfig.ts | 2 +- .../services/firstCommandToTitle.ts | 2 +- .../conversationList/ConversationList.tsx | 2 +- .../conversationList/UserTextContent.tsx | 2 +- .../components/sessionSidebar/SessionsTab.tsx | 2 +- src/lib/api/queries.ts | 4 +- .../computeClaudeProjectFilePath.test.ts | 2 +- .../computeClaudeProjectFilePath.ts | 2 +- .../functions/createMessageGenerator.ts} | 2 +- .../functions}/parseCommandXml.test.ts | 0 .../claude-code/functions}/parseCommandXml.ts | 0 .../claude-code/functions}/parseJsonl.test.ts | 2 +- .../claude-code/functions}/parseJsonl.ts | 4 +- .../claude-code/models/CCSessionProcess.ts | 4 +- .../claude-code/models}/ClaudeCode.test.ts | 0 .../claude-code/models}/ClaudeCode.ts | 4 +- .../claude-code/models/ClaudeCodeTask.ts | 0 .../models/ClaudeCodeVersion.test.ts | 0 .../claude-code/models/ClaudeCodeVersion.ts | 0 .../services}/ClaudeCodeLifeCycleService.ts | 20 ++-- .../services}/ClaudeCodePermissionService.ts | 10 +- .../ClaudeCodeSessionProcessService.test.ts | 10 +- .../ClaudeCodeSessionProcessService.ts | 10 +- src/server/core/claude-code/types.ts | 5 + .../functions}/getDirectoryListing.test.ts | 0 .../functions}/getDirectoryListing.ts | 0 .../functions}/adaptInternalEventToSSE.ts | 0 .../events/functions}/typeSafeSSE.test.ts | 8 +- .../events/functions}/typeSafeSSE.ts | 2 +- .../events/services}/EventBus.test.ts | 8 +- .../events/services}/EventBus.ts | 2 +- .../events/services}/fileWatcher.test.ts | 2 +- .../events/services}/fileWatcher.ts | 4 +- .../events/types}/InternalEventDeclaration.ts | 6 +- .../functions}/getFileCompletion.ts | 0 .../git/functions}/getBranches.test.ts | 0 .../git => core/git/functions}/getBranches.ts | 4 +- .../git/functions}/getCommits.test.ts | 0 .../git => core/git/functions}/getCommits.ts | 4 +- .../git/functions}/getDiff.test.ts | 0 .../git => core/git/functions}/getDiff.ts | 8 +- .../git/functions}/getStatus.test.ts | 0 .../git => core/git/functions}/getStatus.ts | 4 +- .../git => core/git/functions}/utils.ts | 2 +- src/server/{service => core}/git/types.ts | 0 .../mcp => core/mcp/functions}/getMcpList.ts | 2 +- .../project/functions}/id.test.ts | 0 .../project => core/project/functions}/id.ts | 0 .../infrastructure}/ProjectRepository.test.ts | 6 +- .../infrastructure}/ProjectRepository.ts | 10 +- src/server/core/project/schema.ts | 7 ++ .../services}/ProjectMetaService.test.ts | 4 +- .../project/services}/ProjectMetaService.ts | 10 +- .../session/functions}/id.test.ts | 0 .../session => core/session/functions}/id.ts | 2 +- .../infrastructure}/SessionRepository.test.ts | 14 +-- .../infrastructure}/SessionRepository.ts | 14 +-- .../VirtualConversationDatabase.test.ts | 4 +- .../VirtualConversationDatabase.ts | 4 +- src/server/core/session/schema.ts | 7 ++ .../services}/SessionMetaService.test.ts | 4 +- .../session/services}/SessionMetaService.ts | 12 +-- src/server/{service => core}/types.ts | 3 +- src/server/hono/app.ts | 2 +- src/server/hono/initialize.test.ts | 16 ++-- src/server/hono/initialize.ts | 16 ++-- .../hono/middleware/config.middleware.ts | 2 +- src/server/hono/route.ts | 42 ++++---- src/server/{ => lib}/config/config.ts | 0 src/server/{service => lib/config}/paths.ts | 2 +- ...sistantService.ts => PersistentService.ts} | 2 +- .../storage/FileCacheStorage/index.test.ts | 2 +- .../lib/storage/FileCacheStorage/index.ts | 2 +- .../claude-code/createMessageGenerator.ts | 95 ------------------- src/server/service/git/index.ts | 32 ------- src/server/service/schema.ts | 13 --- 78 files changed, 189 insertions(+), 305 deletions(-) rename src/server/{service/claude-code => core/claude-code/functions}/computeClaudeProjectFilePath.test.ts (96%) rename src/server/{service/claude-code => core/claude-code/functions}/computeClaudeProjectFilePath.ts (76%) rename src/server/{service/claude-code/MessageGenerator.ts => core/claude-code/functions/createMessageGenerator.ts} (96%) rename src/server/{service => core/claude-code/functions}/parseCommandXml.test.ts (100%) rename src/server/{service => core/claude-code/functions}/parseCommandXml.ts (100%) rename src/server/{service => core/claude-code/functions}/parseJsonl.test.ts (99%) rename src/server/{service => core/claude-code/functions}/parseJsonl.ts (79%) rename src/server/{service => core}/claude-code/models/CCSessionProcess.ts (96%) rename src/server/{service/claude-code => core/claude-code/models}/ClaudeCode.test.ts (100%) rename src/server/{service/claude-code => core/claude-code/models}/ClaudeCode.ts (95%) rename src/server/{service => core}/claude-code/models/ClaudeCodeTask.ts (100%) rename src/server/{service => core}/claude-code/models/ClaudeCodeVersion.test.ts (100%) rename src/server/{service => core}/claude-code/models/ClaudeCodeVersion.ts (100%) rename src/server/{service/claude-code => core/claude-code/services}/ClaudeCodeLifeCycleService.ts (94%) rename src/server/{service/claude-code => core/claude-code/services}/ClaudeCodePermissionService.ts (94%) rename src/server/{service/claude-code => core/claude-code/services}/ClaudeCodeSessionProcessService.test.ts (98%) rename src/server/{service/claude-code => core/claude-code/services}/ClaudeCodeSessionProcessService.ts (97%) create mode 100644 src/server/core/claude-code/types.ts rename src/server/{service/directory-browser => core/directory-browser/functions}/getDirectoryListing.test.ts (100%) rename src/server/{service/directory-browser => core/directory-browser/functions}/getDirectoryListing.ts (100%) rename src/server/{service/events => core/events/functions}/adaptInternalEventToSSE.ts (100%) rename src/server/{service/events => core/events/functions}/typeSafeSSE.test.ts (96%) rename src/server/{service/events => core/events/functions}/typeSafeSSE.ts (95%) rename src/server/{service/events => core/events/services}/EventBus.test.ts (96%) rename src/server/{service/events => core/events/services}/EventBus.ts (96%) rename src/server/{service/events => core/events/services}/fileWatcher.test.ts (98%) rename src/server/{service/events => core/events/services}/fileWatcher.ts (97%) rename src/server/{service/events => core/events/types}/InternalEventDeclaration.ts (65%) rename src/server/{service/file-completion => core/file-completion/functions}/getFileCompletion.ts (100%) rename src/server/{service/git => core/git/functions}/getBranches.test.ts (100%) rename src/server/{service/git => core/git/functions}/getBranches.ts (96%) rename src/server/{service/git => core/git/functions}/getCommits.test.ts (100%) rename src/server/{service/git => core/git/functions}/getCommits.ts (90%) rename src/server/{service/git => core/git/functions}/getDiff.test.ts (100%) rename src/server/{service/git => core/git/functions}/getDiff.ts (98%) rename src/server/{service/git => core/git/functions}/getStatus.test.ts (100%) rename src/server/{service/git => core/git/functions}/getStatus.ts (97%) rename src/server/{service/git => core/git/functions}/utils.ts (98%) rename src/server/{service => core}/git/types.ts (100%) rename src/server/{service/mcp => core/mcp/functions}/getMcpList.ts (95%) rename src/server/{service/project => core/project/functions}/id.test.ts (100%) rename src/server/{service/project => core/project/functions}/id.ts (100%) rename src/server/{service/project => core/project/infrastructure}/ProjectRepository.test.ts (98%) rename src/server/{service/project => core/project/infrastructure}/ProjectRepository.ts (91%) create mode 100644 src/server/core/project/schema.ts rename src/server/{service/project => core/project/services}/ProjectMetaService.test.ts (97%) rename src/server/{service/project => core/project/services}/ProjectMetaService.ts (93%) rename src/server/{service/session => core/session/functions}/id.test.ts (100%) rename src/server/{service/session => core/session/functions}/id.ts (85%) rename src/server/{service/session => core/session/infrastructure}/SessionRepository.test.ts (97%) rename src/server/{service/session => core/session/infrastructure}/SessionRepository.ts (94%) rename src/server/{service/session => core/session/infrastructure}/VirtualConversationDatabase.test.ts (98%) rename src/server/{service/session => core/session/infrastructure}/VirtualConversationDatabase.ts (96%) create mode 100644 src/server/core/session/schema.ts rename src/server/{service/session => core/session/services}/SessionMetaService.test.ts (98%) rename src/server/{service/session => core/session/services}/SessionMetaService.ts (93%) rename src/server/{service => core}/types.ts (84%) rename src/server/{ => lib}/config/config.ts (100%) rename src/server/{service => lib/config}/paths.ts (94%) rename src/server/lib/storage/FileCacheStorage/{PersistantService.ts => PersistentService.ts} (95%) delete mode 100644 src/server/service/claude-code/createMessageGenerator.ts delete mode 100644 src/server/service/git/index.ts delete mode 100644 src/server/service/schema.ts diff --git a/e2e/config.ts b/e2e/config.ts index 17f75f4..48c7e67 100644 --- a/e2e/config.ts +++ b/e2e/config.ts @@ -1,6 +1,6 @@ import { homedir } from "node:os"; import { resolve } from "node:path"; -import { encodeProjectId } from "../src/server/service/project/id"; +import { encodeProjectId } from "../src/server/core/project/functions/id"; // biome-ignore lint/complexity/useLiteralKeys: env var export const globalClaudeDirectoryPath = process.env["GLOBAL_CLAUDE_DIR"] diff --git a/src/app/api/[[...route]]/route.ts b/src/app/api/[[...route]]/route.ts index 2485c85..db0eed5 100644 --- a/src/app/api/[[...route]]/route.ts +++ b/src/app/api/[[...route]]/route.ts @@ -1,19 +1,19 @@ import { NodeContext } from "@effect/platform-node"; import { Effect } from "effect"; import { handle } from "hono/vercel"; +import { ClaudeCodeLifeCycleService } from "../../../server/core/claude-code/services/ClaudeCodeLifeCycleService"; +import { ClaudeCodePermissionService } from "../../../server/core/claude-code/services/ClaudeCodePermissionService"; +import { ClaudeCodeSessionProcessService } from "../../../server/core/claude-code/services/ClaudeCodeSessionProcessService"; +import { EventBus } from "../../../server/core/events/services/EventBus"; +import { FileWatcherService } from "../../../server/core/events/services/fileWatcher"; +import { ProjectRepository } from "../../../server/core/project/infrastructure/ProjectRepository"; +import { ProjectMetaService } from "../../../server/core/project/services/ProjectMetaService"; +import { SessionRepository } from "../../../server/core/session/infrastructure/SessionRepository"; +import { VirtualConversationDatabase } from "../../../server/core/session/infrastructure/VirtualConversationDatabase"; +import { SessionMetaService } from "../../../server/core/session/services/SessionMetaService"; import { honoApp } from "../../../server/hono/app"; import { InitializeService } from "../../../server/hono/initialize"; import { routes } from "../../../server/hono/route"; -import { ClaudeCodeLifeCycleService } from "../../../server/service/claude-code/ClaudeCodeLifeCycleService"; -import { ClaudeCodePermissionService } from "../../../server/service/claude-code/ClaudeCodePermissionService"; -import { ClaudeCodeSessionProcessService } from "../../../server/service/claude-code/ClaudeCodeSessionProcessService"; -import { EventBus } from "../../../server/service/events/EventBus"; -import { FileWatcherService } from "../../../server/service/events/fileWatcher"; -import { ProjectMetaService } from "../../../server/service/project/ProjectMetaService"; -import { ProjectRepository } from "../../../server/service/project/ProjectRepository"; -import { SessionMetaService } from "../../../server/service/session/SessionMetaService"; -import { SessionRepository } from "../../../server/service/session/SessionRepository"; -import { VirtualConversationDatabase } from "../../../server/service/session/VirtualConversationDatabase"; const program = routes(honoApp); diff --git a/src/app/hooks/useConfig.ts b/src/app/hooks/useConfig.ts index 72b535a..63de9c7 100644 --- a/src/app/hooks/useConfig.ts +++ b/src/app/hooks/useConfig.ts @@ -6,7 +6,7 @@ import { import { useCallback } from "react"; import { honoClient } from "../../lib/api/client"; import { configQuery } from "../../lib/api/queries"; -import type { Config } from "../../server/config/config"; +import type { Config } from "../../server/lib/config/config"; export const useConfig = () => { const queryClient = useQueryClient(); diff --git a/src/app/projects/[projectId]/services/firstCommandToTitle.ts b/src/app/projects/[projectId]/services/firstCommandToTitle.ts index fe14263..246a5e7 100644 --- a/src/app/projects/[projectId]/services/firstCommandToTitle.ts +++ b/src/app/projects/[projectId]/services/firstCommandToTitle.ts @@ -1,4 +1,4 @@ -import type { ParsedCommand } from "../../../../server/service/parseCommandXml"; +import type { ParsedCommand } from "../../../../server/core/claude-code/functions/parseCommandXml"; export const firstCommandToTitle = (firstCommand: ParsedCommand) => { switch (firstCommand.kind) { diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx index 74e32bb..2fd3a44 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx @@ -10,7 +10,7 @@ import { } from "@/components/ui/collapsible"; import type { Conversation } from "@/lib/conversation-schema"; import type { ToolResultContent } from "@/lib/conversation-schema/content/ToolResultContentSchema"; -import type { ErrorJsonl } from "../../../../../../../server/service/types"; +import type { ErrorJsonl } from "../../../../../../../server/core/types"; import { useSidechain } from "../../hooks/useSidechain"; import { ConversationItem } from "./ConversationItem"; diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/UserTextContent.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/UserTextContent.tsx index be68500..c2d1531 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/UserTextContent.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/UserTextContent.tsx @@ -3,7 +3,7 @@ import type { FC } from "react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { parseCommandXml } from "../../../../../../../server/service/parseCommandXml"; +import { parseCommandXml } from "../../../../../../../server/core/claude-code/functions/parseCommandXml"; import { MarkdownContent } from "../../../../../../components/MarkdownContent"; export const UserTextContent: FC<{ text: string; id?: string }> = ({ diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/SessionsTab.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/SessionsTab.tsx index 47dd1be..eb57b7c 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/SessionsTab.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/SessionsTab.tsx @@ -7,7 +7,7 @@ import type { FC } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; -import type { Session } from "../../../../../../../server/service/types"; +import type { Session } from "../../../../../../../server/core/types"; import { NewChatModal } from "../../../../components/newChat/NewChatModal"; import { firstCommandToTitle } from "../../../../services/firstCommandToTitle"; import { sessionProcessesAtom } from "../../store/sessionProcessesAtom"; diff --git a/src/lib/api/queries.ts b/src/lib/api/queries.ts index c1b0adf..4d5ef0c 100644 --- a/src/lib/api/queries.ts +++ b/src/lib/api/queries.ts @@ -1,5 +1,5 @@ -import type { DirectoryListingResult } from "../../server/service/directory-browser/getDirectoryListing"; -import type { FileCompletionResult } from "../../server/service/file-completion/getFileCompletion"; +import type { DirectoryListingResult } from "../../server/core/directory-browser/functions/getDirectoryListing"; +import type { FileCompletionResult } from "../../server/core/file-completion/functions/getFileCompletion"; import { honoClient } from "./client"; export const projectListQuery = { diff --git a/src/server/service/claude-code/computeClaudeProjectFilePath.test.ts b/src/server/core/claude-code/functions/computeClaudeProjectFilePath.test.ts similarity index 96% rename from src/server/service/claude-code/computeClaudeProjectFilePath.test.ts rename to src/server/core/claude-code/functions/computeClaudeProjectFilePath.test.ts index e7b8ddc..72ecb1f 100644 --- a/src/server/service/claude-code/computeClaudeProjectFilePath.test.ts +++ b/src/server/core/claude-code/functions/computeClaudeProjectFilePath.test.ts @@ -7,7 +7,7 @@ describe("computeClaudeProjectFilePath", () => { beforeEach(async () => { vi.resetModules(); - vi.doMock("../../lib/env", () => ({ + vi.doMock("../../../lib/env", () => ({ env: { get: (key: string) => { if (key === "GLOBAL_CLAUDE_DIR") { diff --git a/src/server/service/claude-code/computeClaudeProjectFilePath.ts b/src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts similarity index 76% rename from src/server/service/claude-code/computeClaudeProjectFilePath.ts rename to src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts index e36fd9c..567e44e 100644 --- a/src/server/service/claude-code/computeClaudeProjectFilePath.ts +++ b/src/server/core/claude-code/functions/computeClaudeProjectFilePath.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import { claudeProjectsDirPath } from "../paths"; +import { claudeProjectsDirPath } from "../../../lib/config/paths"; export function computeClaudeProjectFilePath(projectPath: string): string { return path.join( diff --git a/src/server/service/claude-code/MessageGenerator.ts b/src/server/core/claude-code/functions/createMessageGenerator.ts similarity index 96% rename from src/server/service/claude-code/MessageGenerator.ts rename to src/server/core/claude-code/functions/createMessageGenerator.ts index 80562ce..036d21d 100644 --- a/src/server/service/claude-code/MessageGenerator.ts +++ b/src/server/core/claude-code/functions/createMessageGenerator.ts @@ -1,5 +1,5 @@ import type { SDKMessage, SDKUserMessage } from "@anthropic-ai/claude-code"; -import { controllablePromise } from "../../../lib/controllablePromise"; +import { controllablePromise } from "../../../../lib/controllablePromise"; export type OnMessage = (message: SDKMessage) => void | Promise; diff --git a/src/server/service/parseCommandXml.test.ts b/src/server/core/claude-code/functions/parseCommandXml.test.ts similarity index 100% rename from src/server/service/parseCommandXml.test.ts rename to src/server/core/claude-code/functions/parseCommandXml.test.ts diff --git a/src/server/service/parseCommandXml.ts b/src/server/core/claude-code/functions/parseCommandXml.ts similarity index 100% rename from src/server/service/parseCommandXml.ts rename to src/server/core/claude-code/functions/parseCommandXml.ts diff --git a/src/server/service/parseJsonl.test.ts b/src/server/core/claude-code/functions/parseJsonl.test.ts similarity index 99% rename from src/server/service/parseJsonl.test.ts rename to src/server/core/claude-code/functions/parseJsonl.test.ts index 492505b..32364ea 100644 --- a/src/server/service/parseJsonl.test.ts +++ b/src/server/core/claude-code/functions/parseJsonl.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; +import type { ErrorJsonl } from "../../types"; import { parseJsonl } from "./parseJsonl"; -import type { ErrorJsonl } from "./types"; describe("parseJsonl", () => { describe("正常系: 有効なJSONLをパースできる", () => { diff --git a/src/server/service/parseJsonl.ts b/src/server/core/claude-code/functions/parseJsonl.ts similarity index 79% rename from src/server/service/parseJsonl.ts rename to src/server/core/claude-code/functions/parseJsonl.ts index 0808e7e..fcc1c37 100644 --- a/src/server/service/parseJsonl.ts +++ b/src/server/core/claude-code/functions/parseJsonl.ts @@ -1,5 +1,5 @@ -import { ConversationSchema } from "../../lib/conversation-schema"; -import type { ErrorJsonl } from "./types"; +import { ConversationSchema } from "../../../../lib/conversation-schema"; +import type { ErrorJsonl } from "../../types"; export const parseJsonl = (content: string) => { const lines = content diff --git a/src/server/service/claude-code/models/CCSessionProcess.ts b/src/server/core/claude-code/models/CCSessionProcess.ts similarity index 96% rename from src/server/service/claude-code/models/CCSessionProcess.ts rename to src/server/core/claude-code/models/CCSessionProcess.ts index cbdf04e..6843ae8 100644 --- a/src/server/service/claude-code/models/CCSessionProcess.ts +++ b/src/server/core/claude-code/models/CCSessionProcess.ts @@ -1,7 +1,7 @@ import { Effect } from "effect"; import type { UserEntry } from "../../../../lib/conversation-schema/entry/UserEntrySchema"; -import * as ClaudeCode from "../ClaudeCode"; -import type { InitMessageContext } from "../createMessageGenerator"; +import type { InitMessageContext } from "../types"; +import * as ClaudeCode from "./ClaudeCode"; import type * as CCTask from "./ClaudeCodeTask"; import * as ClaudeCodeVersion from "./ClaudeCodeVersion"; diff --git a/src/server/service/claude-code/ClaudeCode.test.ts b/src/server/core/claude-code/models/ClaudeCode.test.ts similarity index 100% rename from src/server/service/claude-code/ClaudeCode.test.ts rename to src/server/core/claude-code/models/ClaudeCode.test.ts diff --git a/src/server/service/claude-code/ClaudeCode.ts b/src/server/core/claude-code/models/ClaudeCode.ts similarity index 95% rename from src/server/service/claude-code/ClaudeCode.ts rename to src/server/core/claude-code/models/ClaudeCode.ts index cd6fecd..7344786 100644 --- a/src/server/service/claude-code/ClaudeCode.ts +++ b/src/server/core/claude-code/models/ClaudeCode.ts @@ -1,8 +1,8 @@ import { query as originalQuery } from "@anthropic-ai/claude-code"; import { Command, Path } from "@effect/platform"; import { Effect } from "effect"; -import { env } from "../../lib/env"; -import * as ClaudeCodeVersion from "./models/ClaudeCodeVersion"; +import { env } from "../../../lib/env"; +import * as ClaudeCodeVersion from "./ClaudeCodeVersion"; type CCQuery = typeof originalQuery; type CCQueryPrompt = Parameters[0]["prompt"]; diff --git a/src/server/service/claude-code/models/ClaudeCodeTask.ts b/src/server/core/claude-code/models/ClaudeCodeTask.ts similarity index 100% rename from src/server/service/claude-code/models/ClaudeCodeTask.ts rename to src/server/core/claude-code/models/ClaudeCodeTask.ts diff --git a/src/server/service/claude-code/models/ClaudeCodeVersion.test.ts b/src/server/core/claude-code/models/ClaudeCodeVersion.test.ts similarity index 100% rename from src/server/service/claude-code/models/ClaudeCodeVersion.test.ts rename to src/server/core/claude-code/models/ClaudeCodeVersion.test.ts diff --git a/src/server/service/claude-code/models/ClaudeCodeVersion.ts b/src/server/core/claude-code/models/ClaudeCodeVersion.ts similarity index 100% rename from src/server/service/claude-code/models/ClaudeCodeVersion.ts rename to src/server/core/claude-code/models/ClaudeCodeVersion.ts diff --git a/src/server/service/claude-code/ClaudeCodeLifeCycleService.ts b/src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts similarity index 94% rename from src/server/service/claude-code/ClaudeCodeLifeCycleService.ts rename to src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts index 5a82f1b..d52c58e 100644 --- a/src/server/service/claude-code/ClaudeCodeLifeCycleService.ts +++ b/src/server/core/claude-code/services/ClaudeCodeLifeCycleService.ts @@ -3,18 +3,18 @@ import type { FileSystem, Path } from "@effect/platform"; import type { CommandExecutor } from "@effect/platform/CommandExecutor"; import { Context, Effect, Layer, Runtime } from "effect"; import { ulid } from "ulid"; -import { controllablePromise } from "../../../lib/controllablePromise"; -import type { Config } from "../../config/config"; -import type { InferEffect } from "../../lib/effect/types"; -import { EventBus } from "../events/EventBus"; -import type { SessionMetaService } from "../session/SessionMetaService"; -import { SessionRepository } from "../session/SessionRepository"; -import { VirtualConversationDatabase } from "../session/VirtualConversationDatabase"; -import * as ClaudeCode from "./ClaudeCode"; +import { controllablePromise } from "../../../../lib/controllablePromise"; +import type { Config } from "../../../lib/config/config"; +import type { InferEffect } from "../../../lib/effect/types"; +import { EventBus } from "../../events/services/EventBus"; +import { SessionRepository } from "../../session/infrastructure/SessionRepository"; +import { VirtualConversationDatabase } from "../../session/infrastructure/VirtualConversationDatabase"; +import type { SessionMetaService } from "../../session/services/SessionMetaService"; +import { createMessageGenerator } from "../functions/createMessageGenerator"; +import * as CCSessionProcess from "../models/CCSessionProcess"; +import * as ClaudeCode from "../models/ClaudeCode"; import { ClaudeCodePermissionService } from "./ClaudeCodePermissionService"; import { ClaudeCodeSessionProcessService } from "./ClaudeCodeSessionProcessService"; -import { createMessageGenerator } from "./MessageGenerator"; -import * as CCSessionProcess from "./models/CCSessionProcess"; export type MessageGenerator = () => AsyncGenerator< SDKUserMessage, diff --git a/src/server/service/claude-code/ClaudeCodePermissionService.ts b/src/server/core/claude-code/services/ClaudeCodePermissionService.ts similarity index 94% rename from src/server/service/claude-code/ClaudeCodePermissionService.ts rename to src/server/core/claude-code/services/ClaudeCodePermissionService.ts index 7cee416..c94f7e9 100644 --- a/src/server/service/claude-code/ClaudeCodePermissionService.ts +++ b/src/server/core/claude-code/services/ClaudeCodePermissionService.ts @@ -4,11 +4,11 @@ import { ulid } from "ulid"; import type { PermissionRequest, PermissionResponse, -} from "../../../types/permissions"; -import type { Config } from "../../config/config"; -import type { InferEffect } from "../../lib/effect/types"; -import { EventBus } from "../events/EventBus"; -import * as ClaudeCode from "./ClaudeCode"; +} from "../../../../types/permissions"; +import type { Config } from "../../../lib/config/config"; +import type { InferEffect } from "../../../lib/effect/types"; +import { EventBus } from "../../events/services/EventBus"; +import * as ClaudeCode from "../models/ClaudeCode"; const LayerImpl = Effect.gen(function* () { const pendingPermissionRequestsRef = yield* Ref.make< diff --git a/src/server/service/claude-code/ClaudeCodeSessionProcessService.test.ts b/src/server/core/claude-code/services/ClaudeCodeSessionProcessService.test.ts similarity index 98% rename from src/server/service/claude-code/ClaudeCodeSessionProcessService.test.ts rename to src/server/core/claude-code/services/ClaudeCodeSessionProcessService.test.ts index 123ee0a..67ec699 100644 --- a/src/server/service/claude-code/ClaudeCodeSessionProcessService.test.ts +++ b/src/server/core/claude-code/services/ClaudeCodeSessionProcessService.test.ts @@ -4,12 +4,12 @@ import type { } from "@anthropic-ai/claude-code"; import { Effect, Layer } from "effect"; import { describe, expect, it } from "vitest"; -import { EventBus } from "../events/EventBus"; -import type { InternalEventDeclaration } from "../events/InternalEventDeclaration"; +import { EventBus } from "../../events/services/EventBus"; +import type { InternalEventDeclaration } from "../../events/types/InternalEventDeclaration"; +import type * as CCSessionProcess from "../models/CCSessionProcess"; +import type * as CCTask from "../models/ClaudeCodeTask"; +import type { InitMessageContext } from "../types"; import { ClaudeCodeSessionProcessService } from "./ClaudeCodeSessionProcessService"; -import type { InitMessageContext } from "./createMessageGenerator"; -import type * as CCSessionProcess from "./models/CCSessionProcess"; -import type * as CCTask from "./models/ClaudeCodeTask"; // Helper function to create mock session process definition const createMockSessionProcessDef = ( diff --git a/src/server/service/claude-code/ClaudeCodeSessionProcessService.ts b/src/server/core/claude-code/services/ClaudeCodeSessionProcessService.ts similarity index 97% rename from src/server/service/claude-code/ClaudeCodeSessionProcessService.ts rename to src/server/core/claude-code/services/ClaudeCodeSessionProcessService.ts index ca5fe6b..c38bb3b 100644 --- a/src/server/service/claude-code/ClaudeCodeSessionProcessService.ts +++ b/src/server/core/claude-code/services/ClaudeCodeSessionProcessService.ts @@ -1,10 +1,10 @@ import type { SDKResultMessage } from "@anthropic-ai/claude-code"; import { Context, Data, Effect, Layer, Ref } from "effect"; -import type { InferEffect } from "../../lib/effect/types"; -import { EventBus } from "../events/EventBus"; -import type { InitMessageContext } from "./createMessageGenerator"; -import * as CCSessionProcess from "./models/CCSessionProcess"; -import type * as CCTask from "./models/ClaudeCodeTask"; +import type { InferEffect } from "../../../lib/effect/types"; +import { EventBus } from "../../events/services/EventBus"; +import * as CCSessionProcess from "../models/CCSessionProcess"; +import type * as CCTask from "../models/ClaudeCodeTask"; +import type { InitMessageContext } from "../types"; class SessionProcessNotFoundError extends Data.TaggedError( "SessionProcessNotFoundError", diff --git a/src/server/core/claude-code/types.ts b/src/server/core/claude-code/types.ts new file mode 100644 index 0000000..77586fc --- /dev/null +++ b/src/server/core/claude-code/types.ts @@ -0,0 +1,5 @@ +import type { SDKSystemMessage } from "@anthropic-ai/claude-code"; + +export type InitMessageContext = { + initMessage: SDKSystemMessage; +}; diff --git a/src/server/service/directory-browser/getDirectoryListing.test.ts b/src/server/core/directory-browser/functions/getDirectoryListing.test.ts similarity index 100% rename from src/server/service/directory-browser/getDirectoryListing.test.ts rename to src/server/core/directory-browser/functions/getDirectoryListing.test.ts diff --git a/src/server/service/directory-browser/getDirectoryListing.ts b/src/server/core/directory-browser/functions/getDirectoryListing.ts similarity index 100% rename from src/server/service/directory-browser/getDirectoryListing.ts rename to src/server/core/directory-browser/functions/getDirectoryListing.ts diff --git a/src/server/service/events/adaptInternalEventToSSE.ts b/src/server/core/events/functions/adaptInternalEventToSSE.ts similarity index 100% rename from src/server/service/events/adaptInternalEventToSSE.ts rename to src/server/core/events/functions/adaptInternalEventToSSE.ts diff --git a/src/server/service/events/typeSafeSSE.test.ts b/src/server/core/events/functions/typeSafeSSE.test.ts similarity index 96% rename from src/server/service/events/typeSafeSSE.test.ts rename to src/server/core/events/functions/typeSafeSSE.test.ts index ddd4a00..bee9ca9 100644 --- a/src/server/service/events/typeSafeSSE.test.ts +++ b/src/server/core/events/functions/typeSafeSSE.test.ts @@ -1,7 +1,7 @@ import { Effect } from "effect"; import type { SSEStreamingApi } from "hono/streaming"; import { describe, expect, it, vi } from "vitest"; -import type { PermissionRequest } from "../../../types/permissions"; +import type { PermissionRequest } from "../../../../types/permissions"; import { TypeSafeSSE } from "./typeSafeSSE"; describe("typeSafeSSE", () => { @@ -153,7 +153,7 @@ describe("typeSafeSSE", () => { const program = Effect.gen(function* () { const typeSafeSSE = yield* TypeSafeSSE; - yield* typeSafeSSE.writeSSE("permission_requested", { + yield* typeSafeSSE.writeSSE("permissionRequested", { permissionRequest: mockPermissionRequest, }); @@ -170,10 +170,10 @@ describe("typeSafeSSE", () => { if (!item) { throw new Error("item is undefined"); } - expect(item.event).toBe("permission_requested"); + expect(item.event).toBe("permissionRequested"); const data = JSON.parse(item.data); - expect(data.kind).toBe("permission_requested"); + expect(data.kind).toBe("permissionRequested"); expect(data.permissionRequest.id).toBe("permission-1"); expect(data.timestamp).toBeDefined(); }); diff --git a/src/server/service/events/typeSafeSSE.ts b/src/server/core/events/functions/typeSafeSSE.ts similarity index 95% rename from src/server/service/events/typeSafeSSE.ts rename to src/server/core/events/functions/typeSafeSSE.ts index 75d40fb..4a26465 100644 --- a/src/server/service/events/typeSafeSSE.ts +++ b/src/server/core/events/functions/typeSafeSSE.ts @@ -1,7 +1,7 @@ import { Context, Effect, Layer } from "effect"; import type { SSEStreamingApi } from "hono/streaming"; import { ulid } from "ulid"; -import type { SSEEventDeclaration } from "../../../types/sse"; +import type { SSEEventDeclaration } from "../../../../types/sse"; interface TypeSafeSSEService { readonly writeSSE: ( diff --git a/src/server/service/events/EventBus.test.ts b/src/server/core/events/services/EventBus.test.ts similarity index 96% rename from src/server/service/events/EventBus.test.ts rename to src/server/core/events/services/EventBus.test.ts index 21e5793..be3dd83 100644 --- a/src/server/service/events/EventBus.test.ts +++ b/src/server/core/events/services/EventBus.test.ts @@ -1,10 +1,10 @@ import { Effect } from "effect"; import { describe, expect, it } from "vitest"; -import type { PermissionRequest } from "../../../types/permissions"; -import type { PublicSessionProcess } from "../../../types/session-process"; -import type { CCSessionProcessState } from "../claude-code/models/CCSessionProcess"; +import type { PermissionRequest } from "../../../../types/permissions"; +import type { PublicSessionProcess } from "../../../../types/session-process"; +import type { CCSessionProcessState } from "../../claude-code/models/CCSessionProcess"; +import type { InternalEventDeclaration } from "../types/InternalEventDeclaration"; import { EventBus } from "./EventBus"; -import type { InternalEventDeclaration } from "./InternalEventDeclaration"; describe("EventBus", () => { describe("basic event processing", () => { diff --git a/src/server/service/events/EventBus.ts b/src/server/core/events/services/EventBus.ts similarity index 96% rename from src/server/service/events/EventBus.ts rename to src/server/core/events/services/EventBus.ts index 902b7b2..2d5c2ff 100644 --- a/src/server/service/events/EventBus.ts +++ b/src/server/core/events/services/EventBus.ts @@ -1,5 +1,5 @@ import { Context, Effect, Layer } from "effect"; -import type { InternalEventDeclaration } from "./InternalEventDeclaration"; +import type { InternalEventDeclaration } from "../types/InternalEventDeclaration"; type Listener = (data: T) => void | Promise; diff --git a/src/server/service/events/fileWatcher.test.ts b/src/server/core/events/services/fileWatcher.test.ts similarity index 98% rename from src/server/service/events/fileWatcher.test.ts rename to src/server/core/events/services/fileWatcher.test.ts index 7069085..3226902 100644 --- a/src/server/service/events/fileWatcher.test.ts +++ b/src/server/core/events/services/fileWatcher.test.ts @@ -1,8 +1,8 @@ import { Effect } from "effect"; import { describe, expect, it } from "vitest"; +import type { InternalEventDeclaration } from "../types/InternalEventDeclaration"; import { EventBus } from "./EventBus"; import { FileWatcherService } from "./fileWatcher"; -import type { InternalEventDeclaration } from "./InternalEventDeclaration"; describe("FileWatcherService", () => { describe("startWatching", () => { diff --git a/src/server/service/events/fileWatcher.ts b/src/server/core/events/services/fileWatcher.ts similarity index 97% rename from src/server/service/events/fileWatcher.ts rename to src/server/core/events/services/fileWatcher.ts index ac7d045..3b43780 100644 --- a/src/server/service/events/fileWatcher.ts +++ b/src/server/core/events/services/fileWatcher.ts @@ -2,8 +2,8 @@ import { type FSWatcher, watch } from "node:fs"; import { join } from "node:path"; import { Context, Effect, Layer, Ref } from "effect"; import z from "zod"; -import { claudeProjectsDirPath } from "../paths"; -import { encodeProjectIdFromSessionFilePath } from "../project/id"; +import { claudeProjectsDirPath } from "../../../lib/config/paths"; +import { encodeProjectIdFromSessionFilePath } from "../../project/functions/id"; import { EventBus } from "./EventBus"; const fileRegExp = /(?.*?)\/(?.*?)\.jsonl/; diff --git a/src/server/service/events/InternalEventDeclaration.ts b/src/server/core/events/types/InternalEventDeclaration.ts similarity index 65% rename from src/server/service/events/InternalEventDeclaration.ts rename to src/server/core/events/types/InternalEventDeclaration.ts index b120ef6..7d36783 100644 --- a/src/server/service/events/InternalEventDeclaration.ts +++ b/src/server/core/events/types/InternalEventDeclaration.ts @@ -1,6 +1,6 @@ -import type { PermissionRequest } from "../../../types/permissions"; -import type { PublicSessionProcess } from "../../../types/session-process"; -import type * as CCSessionProcess from "../claude-code/models/CCSessionProcess"; +import type { PermissionRequest } from "../../../../types/permissions"; +import type { PublicSessionProcess } from "../../../../types/session-process"; +import type * as CCSessionProcess from "../../claude-code/models/CCSessionProcess"; export type InternalEventDeclaration = { // biome-ignore lint/complexity/noBannedTypes: correct type diff --git a/src/server/service/file-completion/getFileCompletion.ts b/src/server/core/file-completion/functions/getFileCompletion.ts similarity index 100% rename from src/server/service/file-completion/getFileCompletion.ts rename to src/server/core/file-completion/functions/getFileCompletion.ts diff --git a/src/server/service/git/getBranches.test.ts b/src/server/core/git/functions/getBranches.test.ts similarity index 100% rename from src/server/service/git/getBranches.test.ts rename to src/server/core/git/functions/getBranches.test.ts diff --git a/src/server/service/git/getBranches.ts b/src/server/core/git/functions/getBranches.ts similarity index 96% rename from src/server/service/git/getBranches.ts rename to src/server/core/git/functions/getBranches.ts index 688ed25..2d10c89 100644 --- a/src/server/service/git/getBranches.ts +++ b/src/server/core/git/functions/getBranches.ts @@ -1,5 +1,5 @@ -import type { GitBranch, GitResult } from "./types"; -import { executeGitCommand, parseLines } from "./utils"; +import { executeGitCommand, parseLines } from "../functions/utils"; +import type { GitBranch, GitResult } from "../types"; /** * Get all branches (local and remote) in the repository diff --git a/src/server/service/git/getCommits.test.ts b/src/server/core/git/functions/getCommits.test.ts similarity index 100% rename from src/server/service/git/getCommits.test.ts rename to src/server/core/git/functions/getCommits.test.ts diff --git a/src/server/service/git/getCommits.ts b/src/server/core/git/functions/getCommits.ts similarity index 90% rename from src/server/service/git/getCommits.ts rename to src/server/core/git/functions/getCommits.ts index b430d01..ef381f3 100644 --- a/src/server/service/git/getCommits.ts +++ b/src/server/core/git/functions/getCommits.ts @@ -1,5 +1,5 @@ -import type { GitCommit, GitResult } from "./types"; -import { executeGitCommand, parseLines } from "./utils"; +import { executeGitCommand, parseLines } from "../functions/utils"; +import type { GitCommit, GitResult } from "../types"; /** * Get the last 20 commits from the current branch diff --git a/src/server/service/git/getDiff.test.ts b/src/server/core/git/functions/getDiff.test.ts similarity index 100% rename from src/server/service/git/getDiff.test.ts rename to src/server/core/git/functions/getDiff.test.ts diff --git a/src/server/service/git/getDiff.ts b/src/server/core/git/functions/getDiff.ts similarity index 98% rename from src/server/service/git/getDiff.ts rename to src/server/core/git/functions/getDiff.ts index d7cf1ee..44116a8 100644 --- a/src/server/service/git/getDiff.ts +++ b/src/server/core/git/functions/getDiff.ts @@ -4,6 +4,11 @@ import parseGitDiff, { type AnyChunk, type AnyFileChange, } from "parse-git-diff"; +import { + executeGitCommand, + parseLines, + stripAnsiColors, +} from "../functions/utils"; import type { GitComparisonResult, GitDiff, @@ -11,8 +16,7 @@ import type { GitDiffHunk, GitDiffLine, GitResult, -} from "./types"; -import { executeGitCommand, parseLines, stripAnsiColors } from "./utils"; +} from "../types"; /** * Convert parse-git-diff file change to GitDiffFile diff --git a/src/server/service/git/getStatus.test.ts b/src/server/core/git/functions/getStatus.test.ts similarity index 100% rename from src/server/service/git/getStatus.test.ts rename to src/server/core/git/functions/getStatus.test.ts diff --git a/src/server/service/git/getStatus.ts b/src/server/core/git/functions/getStatus.ts similarity index 97% rename from src/server/service/git/getStatus.ts rename to src/server/core/git/functions/getStatus.ts index 6c79d3b..eef7376 100644 --- a/src/server/service/git/getStatus.ts +++ b/src/server/core/git/functions/getStatus.ts @@ -1,10 +1,10 @@ -import type { GitDiffFile, GitResult, GitStatus } from "./types"; import { executeGitCommand, getFileStatus, parseLines, parseStatusLine, -} from "./utils"; +} from "../functions/utils"; +import type { GitDiffFile, GitResult, GitStatus } from "../types"; /** * Get git status information including staged, unstaged, and untracked files diff --git a/src/server/service/git/utils.ts b/src/server/core/git/functions/utils.ts similarity index 98% rename from src/server/service/git/utils.ts rename to src/server/core/git/functions/utils.ts index 57516f8..e090564 100644 --- a/src/server/service/git/utils.ts +++ b/src/server/core/git/functions/utils.ts @@ -3,7 +3,7 @@ import { existsSync } from "node:fs"; import { resolve } from "node:path"; import { promisify } from "node:util"; -import type { GitError, GitResult } from "./types"; +import type { GitError, GitResult } from "../types"; const execFileAsync = promisify(execFile); diff --git a/src/server/service/git/types.ts b/src/server/core/git/types.ts similarity index 100% rename from src/server/service/git/types.ts rename to src/server/core/git/types.ts diff --git a/src/server/service/mcp/getMcpList.ts b/src/server/core/mcp/functions/getMcpList.ts similarity index 95% rename from src/server/service/mcp/getMcpList.ts rename to src/server/core/mcp/functions/getMcpList.ts index ea45520..79705f1 100644 --- a/src/server/service/mcp/getMcpList.ts +++ b/src/server/core/mcp/functions/getMcpList.ts @@ -1,5 +1,5 @@ import { execSync } from "node:child_process"; -import { decodeProjectId } from "../project/id"; +import { decodeProjectId } from "../../project/functions/id"; export interface McpServer { name: string; diff --git a/src/server/service/project/id.test.ts b/src/server/core/project/functions/id.test.ts similarity index 100% rename from src/server/service/project/id.test.ts rename to src/server/core/project/functions/id.test.ts diff --git a/src/server/service/project/id.ts b/src/server/core/project/functions/id.ts similarity index 100% rename from src/server/service/project/id.ts rename to src/server/core/project/functions/id.ts diff --git a/src/server/service/project/ProjectRepository.test.ts b/src/server/core/project/infrastructure/ProjectRepository.test.ts similarity index 98% rename from src/server/service/project/ProjectRepository.test.ts rename to src/server/core/project/infrastructure/ProjectRepository.test.ts index be87f2b..e4ecf86 100644 --- a/src/server/service/project/ProjectRepository.test.ts +++ b/src/server/core/project/infrastructure/ProjectRepository.test.ts @@ -1,9 +1,9 @@ import { FileSystem, Path } from "@effect/platform"; import { SystemError } from "@effect/platform/Error"; import { Effect, Layer, Option } from "effect"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; -import type { ProjectMeta } from "../types"; -import { ProjectMetaService } from "./ProjectMetaService"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; +import type { ProjectMeta } from "../../types"; +import { ProjectMetaService } from "../services/ProjectMetaService"; import { ProjectRepository } from "./ProjectRepository"; /** diff --git a/src/server/service/project/ProjectRepository.ts b/src/server/core/project/infrastructure/ProjectRepository.ts similarity index 91% rename from src/server/service/project/ProjectRepository.ts rename to src/server/core/project/infrastructure/ProjectRepository.ts index 024b0df..eeb592a 100644 --- a/src/server/service/project/ProjectRepository.ts +++ b/src/server/core/project/infrastructure/ProjectRepository.ts @@ -1,11 +1,11 @@ import { resolve } from "node:path"; import { FileSystem } from "@effect/platform"; import { Context, Effect, Layer, Option } from "effect"; -import type { InferEffect } from "../../lib/effect/types"; -import { claudeProjectsDirPath } from "../paths"; -import type { Project } from "../types"; -import { decodeProjectId, encodeProjectId } from "./id"; -import { ProjectMetaService } from "./ProjectMetaService"; +import { claudeProjectsDirPath } from "../../../lib/config/paths"; +import type { InferEffect } from "../../../lib/effect/types"; +import type { Project } from "../../types"; +import { decodeProjectId, encodeProjectId } from "../functions/id"; +import { ProjectMetaService } from "../services/ProjectMetaService"; const LayerImpl = Effect.gen(function* () { const fs = yield* FileSystem.FileSystem; diff --git a/src/server/core/project/schema.ts b/src/server/core/project/schema.ts new file mode 100644 index 0000000..d231795 --- /dev/null +++ b/src/server/core/project/schema.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +export const projectMetaSchema = z.object({ + projectName: z.string().nullable(), + projectPath: z.string().nullable(), + sessionCount: z.number(), +}); diff --git a/src/server/service/project/ProjectMetaService.test.ts b/src/server/core/project/services/ProjectMetaService.test.ts similarity index 97% rename from src/server/service/project/ProjectMetaService.test.ts rename to src/server/core/project/services/ProjectMetaService.test.ts index cf3b247..5628cac 100644 --- a/src/server/service/project/ProjectMetaService.test.ts +++ b/src/server/core/project/services/ProjectMetaService.test.ts @@ -1,7 +1,7 @@ import { FileSystem, Path } from "@effect/platform"; import { Effect, Layer, Option } from "effect"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; -import { ProjectMetaService } from "./ProjectMetaService"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; +import { ProjectMetaService } from "../services/ProjectMetaService"; /** * Helper function to create a FileSystem mock layer diff --git a/src/server/service/project/ProjectMetaService.ts b/src/server/core/project/services/ProjectMetaService.ts similarity index 93% rename from src/server/service/project/ProjectMetaService.ts rename to src/server/core/project/services/ProjectMetaService.ts index 2f08697..f85c013 100644 --- a/src/server/service/project/ProjectMetaService.ts +++ b/src/server/core/project/services/ProjectMetaService.ts @@ -5,11 +5,11 @@ import { z } from "zod"; import { FileCacheStorage, makeFileCacheStorageLayer, -} from "../../lib/storage/FileCacheStorage"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; -import { parseJsonl } from "../parseJsonl"; -import type { ProjectMeta } from "../types"; -import { decodeProjectId } from "./id"; +} from "../../../lib/storage/FileCacheStorage"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; +import { parseJsonl } from "../../claude-code/functions/parseJsonl"; +import type { ProjectMeta } from "../../types"; +import { decodeProjectId } from "../functions/id"; const ProjectPathSchema = z.string().nullable(); diff --git a/src/server/service/session/id.test.ts b/src/server/core/session/functions/id.test.ts similarity index 100% rename from src/server/service/session/id.test.ts rename to src/server/core/session/functions/id.test.ts diff --git a/src/server/service/session/id.ts b/src/server/core/session/functions/id.ts similarity index 85% rename from src/server/service/session/id.ts rename to src/server/core/session/functions/id.ts index 203fdfe..010d305 100644 --- a/src/server/service/session/id.ts +++ b/src/server/core/session/functions/id.ts @@ -1,5 +1,5 @@ import { basename, extname, resolve } from "node:path"; -import { decodeProjectId } from "../project/id"; +import { decodeProjectId } from "../../project/functions/id"; export const encodeSessionId = (jsonlFilePath: string) => { return basename(jsonlFilePath, extname(jsonlFilePath)); diff --git a/src/server/service/session/SessionRepository.test.ts b/src/server/core/session/infrastructure/SessionRepository.test.ts similarity index 97% rename from src/server/service/session/SessionRepository.test.ts rename to src/server/core/session/infrastructure/SessionRepository.test.ts index ca7401a..a72a4d2 100644 --- a/src/server/service/session/SessionRepository.test.ts +++ b/src/server/core/session/infrastructure/SessionRepository.test.ts @@ -1,13 +1,13 @@ import { FileSystem, Path } from "@effect/platform"; import { SystemError } from "@effect/platform/Error"; import { Effect, Layer, Option } from "effect"; -import type { Conversation } from "../../../lib/conversation-schema"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; -import { decodeProjectId } from "../project/id"; -import type { ErrorJsonl, SessionDetail, SessionMeta } from "../types"; -import { SessionMetaService } from "./SessionMetaService"; -import { SessionRepository } from "./SessionRepository"; -import { VirtualConversationDatabase } from "./VirtualConversationDatabase"; +import type { Conversation } from "../../../../lib/conversation-schema"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; +import { decodeProjectId } from "../../project/functions/id"; +import type { ErrorJsonl, SessionDetail, SessionMeta } from "../../types"; +import { SessionRepository } from "../infrastructure/SessionRepository"; +import { VirtualConversationDatabase } from "../infrastructure/VirtualConversationDatabase"; +import { SessionMetaService } from "../services/SessionMetaService"; /** * Helper function to create a FileSystem mock layer diff --git a/src/server/service/session/SessionRepository.ts b/src/server/core/session/infrastructure/SessionRepository.ts similarity index 94% rename from src/server/service/session/SessionRepository.ts rename to src/server/core/session/infrastructure/SessionRepository.ts index 3a495b4..bedae8a 100644 --- a/src/server/service/session/SessionRepository.ts +++ b/src/server/core/session/infrastructure/SessionRepository.ts @@ -1,13 +1,13 @@ import { resolve } from "node:path"; import { FileSystem } from "@effect/platform"; import { Context, Effect, Layer, Option } from "effect"; -import { parseCommandXml } from "../parseCommandXml"; -import { parseJsonl } from "../parseJsonl"; -import { decodeProjectId } from "../project/id"; -import type { Session, SessionDetail } from "../types"; -import { decodeSessionId, encodeSessionId } from "./id"; -import { SessionMetaService } from "./SessionMetaService"; -import { VirtualConversationDatabase } from "./VirtualConversationDatabase"; +import { parseCommandXml } from "../../claude-code/functions/parseCommandXml"; +import { parseJsonl } from "../../claude-code/functions/parseJsonl"; +import { decodeProjectId } from "../../project/functions/id"; +import type { Session, SessionDetail } from "../../types"; +import { decodeSessionId, encodeSessionId } from "../functions/id"; +import { VirtualConversationDatabase } from "../infrastructure/VirtualConversationDatabase"; +import { SessionMetaService } from "../services/SessionMetaService"; const getSession = (projectId: string, sessionId: string) => Effect.gen(function* () { diff --git a/src/server/service/session/VirtualConversationDatabase.test.ts b/src/server/core/session/infrastructure/VirtualConversationDatabase.test.ts similarity index 98% rename from src/server/service/session/VirtualConversationDatabase.test.ts rename to src/server/core/session/infrastructure/VirtualConversationDatabase.test.ts index 77204f2..90df22a 100644 --- a/src/server/service/session/VirtualConversationDatabase.test.ts +++ b/src/server/core/session/infrastructure/VirtualConversationDatabase.test.ts @@ -1,6 +1,6 @@ import { Effect } from "effect"; -import type { Conversation } from "../../../lib/conversation-schema"; -import type { ErrorJsonl } from "../types"; +import type { Conversation } from "../../../../lib/conversation-schema"; +import type { ErrorJsonl } from "../../types"; import { VirtualConversationDatabase } from "./VirtualConversationDatabase"; describe("VirtualConversationDatabase", () => { diff --git a/src/server/service/session/VirtualConversationDatabase.ts b/src/server/core/session/infrastructure/VirtualConversationDatabase.ts similarity index 96% rename from src/server/service/session/VirtualConversationDatabase.ts rename to src/server/core/session/infrastructure/VirtualConversationDatabase.ts index 3b7a8eb..e418a51 100644 --- a/src/server/service/session/VirtualConversationDatabase.ts +++ b/src/server/core/session/infrastructure/VirtualConversationDatabase.ts @@ -1,6 +1,6 @@ import { Context, Effect, Layer, Ref } from "effect"; -import type { Conversation } from "../../../lib/conversation-schema"; -import type { ErrorJsonl } from "../types"; +import type { Conversation } from "../../../../lib/conversation-schema"; +import type { ErrorJsonl } from "../../types"; /** * For interactively experience, handle sessions not already persisted to the filesystem. diff --git a/src/server/core/session/schema.ts b/src/server/core/session/schema.ts new file mode 100644 index 0000000..f92a85a --- /dev/null +++ b/src/server/core/session/schema.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; +import { parsedCommandSchema } from "../claude-code/functions/parseCommandXml"; + +export const sessionMetaSchema = z.object({ + messageCount: z.number(), + firstCommand: parsedCommandSchema.nullable(), +}); diff --git a/src/server/service/session/SessionMetaService.test.ts b/src/server/core/session/services/SessionMetaService.test.ts similarity index 98% rename from src/server/service/session/SessionMetaService.test.ts rename to src/server/core/session/services/SessionMetaService.test.ts index a8be0f2..5856086 100644 --- a/src/server/service/session/SessionMetaService.test.ts +++ b/src/server/core/session/services/SessionMetaService.test.ts @@ -1,7 +1,7 @@ import { FileSystem, Path } from "@effect/platform"; import { Effect, Layer } from "effect"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; -import { SessionMetaService } from "./SessionMetaService"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; +import { SessionMetaService } from "../services/SessionMetaService"; /** * Helper function to create a FileSystem mock layer diff --git a/src/server/service/session/SessionMetaService.ts b/src/server/core/session/services/SessionMetaService.ts similarity index 93% rename from src/server/service/session/SessionMetaService.ts rename to src/server/core/session/services/SessionMetaService.ts index bf669d7..38f47b3 100644 --- a/src/server/service/session/SessionMetaService.ts +++ b/src/server/core/session/services/SessionMetaService.ts @@ -3,16 +3,16 @@ import { Context, Effect, Layer, Ref } from "effect"; import { FileCacheStorage, makeFileCacheStorageLayer, -} from "../../lib/storage/FileCacheStorage"; -import { PersistentService } from "../../lib/storage/FileCacheStorage/PersistantService"; +} from "../../../lib/storage/FileCacheStorage"; +import { PersistentService } from "../../../lib/storage/FileCacheStorage/PersistentService"; import { type ParsedCommand, parseCommandXml, parsedCommandSchema, -} from "../parseCommandXml"; -import { parseJsonl } from "../parseJsonl"; -import type { SessionMeta } from "../types"; -import { decodeSessionId } from "./id"; +} from "../../claude-code/functions/parseCommandXml"; +import { parseJsonl } from "../../claude-code/functions/parseJsonl"; +import type { SessionMeta } from "../../types"; +import { decodeSessionId } from "../functions/id"; const ignoreCommands = [ "/clear", diff --git a/src/server/service/types.ts b/src/server/core/types.ts similarity index 84% rename from src/server/service/types.ts rename to src/server/core/types.ts index e95c463..7e3b400 100644 --- a/src/server/service/types.ts +++ b/src/server/core/types.ts @@ -1,6 +1,7 @@ import type { z } from "zod"; import type { Conversation } from "../../lib/conversation-schema"; -import type { projectMetaSchema, sessionMetaSchema } from "./schema"; +import type { projectMetaSchema } from "./project/schema"; +import type { sessionMetaSchema } from "./session/schema"; export type Project = { id: string; diff --git a/src/server/hono/app.ts b/src/server/hono/app.ts index 4534757..caeec71 100644 --- a/src/server/hono/app.ts +++ b/src/server/hono/app.ts @@ -1,5 +1,5 @@ import { Hono } from "hono"; -import type { Config } from "../config/config"; +import type { Config } from "../lib/config/config"; export type HonoContext = { Variables: { diff --git a/src/server/hono/initialize.test.ts b/src/server/hono/initialize.test.ts index 9f7c2c5..f3ca36a 100644 --- a/src/server/hono/initialize.test.ts +++ b/src/server/hono/initialize.test.ts @@ -1,13 +1,13 @@ import { Effect, Layer, Ref } from "effect"; import { describe, expect, it, vi } from "vitest"; -import { EventBus } from "../service/events/EventBus"; -import { FileWatcherService } from "../service/events/fileWatcher"; -import type { InternalEventDeclaration } from "../service/events/InternalEventDeclaration"; -import { ProjectMetaService } from "../service/project/ProjectMetaService"; -import { ProjectRepository } from "../service/project/ProjectRepository"; -import { SessionMetaService } from "../service/session/SessionMetaService"; -import { SessionRepository } from "../service/session/SessionRepository"; -import { VirtualConversationDatabase } from "../service/session/VirtualConversationDatabase"; +import { EventBus } from "../core/events/services/EventBus"; +import { FileWatcherService } from "../core/events/services/fileWatcher"; +import type { InternalEventDeclaration } from "../core/events/types/InternalEventDeclaration"; +import { ProjectRepository } from "../core/project/infrastructure/ProjectRepository"; +import { ProjectMetaService } from "../core/project/services/ProjectMetaService"; +import { SessionRepository } from "../core/session/infrastructure/SessionRepository"; +import { VirtualConversationDatabase } from "../core/session/infrastructure/VirtualConversationDatabase"; +import { SessionMetaService } from "../core/session/services/SessionMetaService"; import { InitializeService } from "./initialize"; describe("InitializeService", () => { diff --git a/src/server/hono/initialize.ts b/src/server/hono/initialize.ts index 56d6074..795907c 100644 --- a/src/server/hono/initialize.ts +++ b/src/server/hono/initialize.ts @@ -1,12 +1,12 @@ import { Context, Effect, Layer, Ref, Schedule } from "effect"; -import { EventBus } from "../service/events/EventBus"; -import { FileWatcherService } from "../service/events/fileWatcher"; -import type { InternalEventDeclaration } from "../service/events/InternalEventDeclaration"; -import { ProjectMetaService } from "../service/project/ProjectMetaService"; -import { ProjectRepository } from "../service/project/ProjectRepository"; -import { SessionMetaService } from "../service/session/SessionMetaService"; -import { SessionRepository } from "../service/session/SessionRepository"; -import { VirtualConversationDatabase } from "../service/session/VirtualConversationDatabase"; +import { EventBus } from "../core/events/services/EventBus"; +import { FileWatcherService } from "../core/events/services/fileWatcher"; +import type { InternalEventDeclaration } from "../core/events/types/InternalEventDeclaration"; +import { ProjectRepository } from "../core/project/infrastructure/ProjectRepository"; +import { ProjectMetaService } from "../core/project/services/ProjectMetaService"; +import { SessionRepository } from "../core/session/infrastructure/SessionRepository"; +import { VirtualConversationDatabase } from "../core/session/infrastructure/VirtualConversationDatabase"; +import { SessionMetaService } from "../core/session/services/SessionMetaService"; interface InitializeServiceInterface { readonly startInitialization: () => Effect.Effect; diff --git a/src/server/hono/middleware/config.middleware.ts b/src/server/hono/middleware/config.middleware.ts index ed099db..ec566fa 100644 --- a/src/server/hono/middleware/config.middleware.ts +++ b/src/server/hono/middleware/config.middleware.ts @@ -1,6 +1,6 @@ import { getCookie, setCookie } from "hono/cookie"; import { createMiddleware } from "hono/factory"; -import { configSchema } from "../../config/config"; +import { configSchema } from "../../lib/config/config"; import type { HonoContext } from "../app"; export const configMiddleware = createMiddleware( diff --git a/src/server/hono/route.ts b/src/server/hono/route.ts index 6dd0909..4139b0f 100644 --- a/src/server/hono/route.ts +++ b/src/server/hono/route.ts @@ -9,28 +9,28 @@ import { streamSSE } from "hono/streaming"; import prexit from "prexit"; import { z } from "zod"; import type { PublicSessionProcess } from "../../types/session-process"; -import { configSchema } from "../config/config"; +import { computeClaudeProjectFilePath } from "../core/claude-code/functions/computeClaudeProjectFilePath"; +import { ClaudeCodeLifeCycleService } from "../core/claude-code/services/ClaudeCodeLifeCycleService"; +import { ClaudeCodePermissionService } from "../core/claude-code/services/ClaudeCodePermissionService"; +import { getDirectoryListing } from "../core/directory-browser/functions/getDirectoryListing"; +import { adaptInternalEventToSSE } from "../core/events/functions/adaptInternalEventToSSE"; +import { TypeSafeSSE } from "../core/events/functions/typeSafeSSE"; +import { EventBus } from "../core/events/services/EventBus"; +import type { InternalEventDeclaration } from "../core/events/types/InternalEventDeclaration"; +import { getFileCompletion } from "../core/file-completion/functions/getFileCompletion"; +import { getBranches } from "../core/git/functions/getBranches"; +import { getCommits } from "../core/git/functions/getCommits"; +import { getDiff } from "../core/git/functions/getDiff"; +import { getMcpList } from "../core/mcp/functions/getMcpList"; +import { encodeProjectId } from "../core/project/functions/id"; +import { ProjectRepository } from "../core/project/infrastructure/ProjectRepository"; +import type { ProjectMetaService } from "../core/project/services/ProjectMetaService"; +import { SessionRepository } from "../core/session/infrastructure/SessionRepository"; +import type { VirtualConversationDatabase } from "../core/session/infrastructure/VirtualConversationDatabase"; +import type { SessionMetaService } from "../core/session/services/SessionMetaService"; +import { configSchema } from "../lib/config/config"; +import { claudeCommandsDirPath } from "../lib/config/paths"; import { env } from "../lib/env"; -import { ClaudeCodeLifeCycleService } from "../service/claude-code/ClaudeCodeLifeCycleService"; -import { ClaudeCodePermissionService } from "../service/claude-code/ClaudeCodePermissionService"; -import { computeClaudeProjectFilePath } from "../service/claude-code/computeClaudeProjectFilePath"; -import { getDirectoryListing } from "../service/directory-browser/getDirectoryListing"; -import { adaptInternalEventToSSE } from "../service/events/adaptInternalEventToSSE"; -import { EventBus } from "../service/events/EventBus"; -import type { InternalEventDeclaration } from "../service/events/InternalEventDeclaration"; -import { TypeSafeSSE } from "../service/events/typeSafeSSE"; -import { getFileCompletion } from "../service/file-completion/getFileCompletion"; -import { getBranches } from "../service/git/getBranches"; -import { getCommits } from "../service/git/getCommits"; -import { getDiff } from "../service/git/getDiff"; -import { getMcpList } from "../service/mcp/getMcpList"; -import { claudeCommandsDirPath } from "../service/paths"; -import { encodeProjectId } from "../service/project/id"; -import type { ProjectMetaService } from "../service/project/ProjectMetaService"; -import { ProjectRepository } from "../service/project/ProjectRepository"; -import type { SessionMetaService } from "../service/session/SessionMetaService"; -import { SessionRepository } from "../service/session/SessionRepository"; -import type { VirtualConversationDatabase } from "../service/session/VirtualConversationDatabase"; import type { HonoAppType } from "./app"; import { InitializeService } from "./initialize"; import { configMiddleware } from "./middleware/config.middleware"; diff --git a/src/server/config/config.ts b/src/server/lib/config/config.ts similarity index 100% rename from src/server/config/config.ts rename to src/server/lib/config/config.ts diff --git a/src/server/service/paths.ts b/src/server/lib/config/paths.ts similarity index 94% rename from src/server/service/paths.ts rename to src/server/lib/config/paths.ts index 4a89509..9215825 100644 --- a/src/server/service/paths.ts +++ b/src/server/lib/config/paths.ts @@ -1,6 +1,6 @@ import { homedir } from "node:os"; import { resolve } from "node:path"; -import { env } from "../lib/env"; +import { env } from "../env"; const GLOBAL_CLAUDE_DIR = env.get("GLOBAL_CLAUDE_DIR"); diff --git a/src/server/lib/storage/FileCacheStorage/PersistantService.ts b/src/server/lib/storage/FileCacheStorage/PersistentService.ts similarity index 95% rename from src/server/lib/storage/FileCacheStorage/PersistantService.ts rename to src/server/lib/storage/FileCacheStorage/PersistentService.ts index f59445c..1dc1a32 100644 --- a/src/server/lib/storage/FileCacheStorage/PersistantService.ts +++ b/src/server/lib/storage/FileCacheStorage/PersistentService.ts @@ -2,7 +2,7 @@ import { resolve } from "node:path"; import { FileSystem } from "@effect/platform"; import { Context, Effect, Layer } from "effect"; import { z } from "zod"; -import { claudeCodeViewerCacheDirPath } from "../../../service/paths"; +import { claudeCodeViewerCacheDirPath } from "../../config/paths"; const saveSchema = z.array(z.tuple([z.string(), z.unknown()])); diff --git a/src/server/lib/storage/FileCacheStorage/index.test.ts b/src/server/lib/storage/FileCacheStorage/index.test.ts index 9f289f2..94de540 100644 --- a/src/server/lib/storage/FileCacheStorage/index.test.ts +++ b/src/server/lib/storage/FileCacheStorage/index.test.ts @@ -2,7 +2,7 @@ import { FileSystem } from "@effect/platform"; import { Effect, Layer, Ref } from "effect"; import { z } from "zod"; import { FileCacheStorage, makeFileCacheStorageLayer } from "./index"; -import { PersistentService } from "./PersistantService"; +import { PersistentService } from "./PersistentService"; // Schema for testing const UserSchema = z.object({ diff --git a/src/server/lib/storage/FileCacheStorage/index.ts b/src/server/lib/storage/FileCacheStorage/index.ts index 71656ae..63663fe 100644 --- a/src/server/lib/storage/FileCacheStorage/index.ts +++ b/src/server/lib/storage/FileCacheStorage/index.ts @@ -1,7 +1,7 @@ import type { FileSystem } from "@effect/platform"; import { Context, Effect, Layer, Ref, Runtime } from "effect"; import type { z } from "zod"; -import { PersistentService } from "./PersistantService"; +import { PersistentService } from "./PersistentService"; export interface FileCacheStorageService { readonly get: (key: string) => Effect.Effect; diff --git a/src/server/service/claude-code/createMessageGenerator.ts b/src/server/service/claude-code/createMessageGenerator.ts deleted file mode 100644 index 541b123..0000000 --- a/src/server/service/claude-code/createMessageGenerator.ts +++ /dev/null @@ -1,95 +0,0 @@ -import type { - SDKMessage, - SDKSystemMessage, - SDKUserMessage, -} from "@anthropic-ai/claude-code"; - -export type OnMessage = (message: SDKMessage) => void | Promise; - -export type MessageGenerator = () => AsyncGenerator< - SDKUserMessage, - void, - unknown ->; - -const createPromise = () => { - let promiseResolve: ((value: T) => void) | undefined; - let promiseReject: ((reason?: unknown) => void) | undefined; - - const promise = new Promise((resolve, reject) => { - promiseResolve = resolve; - promiseReject = reject; - }); - - if (!promiseResolve || !promiseReject) { - throw new Error("Illegal state: Promise not created"); - } - - return { - promise, - resolve: promiseResolve, - reject: promiseReject, - } as const; -}; - -export type InitMessageContext = { - initMessage: SDKSystemMessage; -}; - -export const createMessageGenerator = ( - firstMessage: string, -): { - generateMessages: MessageGenerator; - setNextMessage: (message: string) => void; - setInitMessagePromise: () => void; - resolveInitMessage: (context: InitMessageContext) => void; - awaitInitMessage: (ctx: InitMessageContext) => Promise; -} => { - let sendMessagePromise = createPromise(); - let receivedInitMessagePromise = createPromise(); - - const createMessage = (message: string): SDKUserMessage => { - return { - type: "user", - message: { - role: "user", - content: message, - }, - } as SDKUserMessage; - }; - - async function* generateMessages(): ReturnType { - yield createMessage(firstMessage); - - while (true) { - const message = await sendMessagePromise.promise; - sendMessagePromise = createPromise(); - - yield createMessage(message); - } - } - - const setNextMessage = (message: string) => { - sendMessagePromise.resolve(message); - }; - - const setInitMessagePromise = () => { - receivedInitMessagePromise = createPromise(); - }; - - const resolveInitMessage = (context: InitMessageContext) => { - receivedInitMessagePromise.resolve(context); - }; - - const awaitInitMessage = async () => { - await receivedInitMessagePromise.promise; - }; - - return { - generateMessages, - setNextMessage, - setInitMessagePromise, - resolveInitMessage, - awaitInitMessage, - }; -}; diff --git a/src/server/service/git/index.ts b/src/server/service/git/index.ts deleted file mode 100644 index da9c24b..0000000 --- a/src/server/service/git/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Git service utilities for claude-code-viewer -// Provides comprehensive Git operations including branch management, diff generation, and status checking - -export * from "./getBranches"; -// Re-export main functions for convenience -export { branchExists, getBranches, getCurrentBranch } from "./getBranches"; -export * from "./getCommits"; -export { getCommits } from "./getCommits"; -export * from "./getDiff"; -export { compareBranches, getDiff } from "./getDiff"; -export * from "./getStatus"; -export { - getStatus, - getUncommittedChanges, - isWorkingDirectoryClean, -} from "./getStatus"; -// Types re-export for convenience -export type { - GitBranch, - GitCommit, - GitComparisonResult, - GitDiff, - GitDiffFile, - GitDiffHunk, - GitDiffLine, - GitError, - GitResult, - GitStatus, -} from "./types"; -export * from "./types"; -export * from "./utils"; -export { executeGitCommand, isGitRepository } from "./utils"; diff --git a/src/server/service/schema.ts b/src/server/service/schema.ts deleted file mode 100644 index ef2fd37..0000000 --- a/src/server/service/schema.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from "zod"; -import { parsedCommandSchema } from "./parseCommandXml"; - -export const projectMetaSchema = z.object({ - projectName: z.string().nullable(), - projectPath: z.string().nullable(), - sessionCount: z.number(), -}); - -export const sessionMetaSchema = z.object({ - messageCount: z.number(), - firstCommand: parsedCommandSchema.nullable(), -});