diff --git a/docs/plans/2026-03-22-java-package-structure-reorganization-plan.md b/docs/plans/2026-03-22-java-package-structure-reorganization-plan.md
new file mode 100644
index 00000000..6946deef
--- /dev/null
+++ b/docs/plans/2026-03-22-java-package-structure-reorganization-plan.md
@@ -0,0 +1,469 @@
+# Java 主包目录结构整理计划
+
+**日期**: 2026-03-22
+**状态**: 待执行
+**范围**: `src/main/java/com/github/claudecodegui`
+**目标**: 在不改变插件行为、消息协议和用户体验的前提下,逐步收敛根包、按功能分组目录、降低后续维护和继续重构的理解成本。
+
+---
+
+## 背景判断
+
+当前结构并不是“完全错误”,但已经出现了典型的“分层做到一半”的迹象。
+
+基于现有代码结构的快速盘点:
+
+- 根包 `com.github.claudecodegui` 下面仍直接放了约 20 个类,职责混合了窗口、会话、设置、技能、Action 和工具拦截。
+- `handler` 目录已有约 47 个类,是目前最容易继续膨胀的目录。
+- `util` 目录已有约 18 个类,里面既有纯工具类,也有带明显业务语义的配置类。
+- 与此同时,`permission`、`session`、`provider`、`skill`、`settings`、`ui` 等功能目录已经初步存在,说明项目已经朝“按功能分组”的方向发展。
+
+因此,这次整理的核心目标不是推倒重来,而是把已经形成的分组方向收口,让目录结构更一致、更容易理解。
+
+---
+
+## 核心原则
+
+### 1. 按功能分组,不按类名后缀分组
+
+不建议把所有 `Service`、`Manager`、`Handler`、`Action` 简单集中到同一目录。
+
+原因:
+
+- 这种分法表面整齐,但会把同一业务链路拆散。
+- 后续定位问题时,往往是按“会话 / 权限 / Provider / 技能 / UI”来思考,而不是按“这是个 Service 还是 Manager”来思考。
+- 当前仓库已经有大量按功能分组的基础目录,继续沿这个方向最稳。
+
+### 2. 先清理根包,再继续细分大目录
+
+优先级建议:
+
+1. 先把根包里的明显归属类迁回功能目录。
+2. 再细分 `handler`。
+3. 最后收敛 `util`,只保留真正的通用工具类。
+
+### 3. 小步重构,不一次性搬完整棵树
+
+本计划强调分阶段、小批量迁移:
+
+- 每一轮只处理一组低耦合对象。
+- 每次迁移后都进行编译和插件注册校验。
+- 不在目录迁移时顺便改业务逻辑,避免把“结构整理”和“功能变更”叠到一起。
+
+### 4. 目录移动必须同步更新注册与引用
+
+这是 IntelliJ 插件项目,类路径不仅存在于 Java import 中,也存在于注册文件中。
+
+尤其要同步检查:
+
+- `src/main/resources/META-INF/plugin.xml`
+- 任何通过反射、字符串类名、静态入口引用到旧包路径的代码
+
+---
+
+## 推荐目标目录树
+
+```text
+src/main/java/com/github/claudecodegui
+├── action
+│ ├── chat // 聊天窗口内动作:发送、复制、粘贴、换行、快捷键同步
+│ ├── dev // 开发辅助动作:DevTools 等
+│ ├── editor // 编辑器/项目树动作:发送选中代码、发送文件路径、Quick Fix
+│ ├── tab // 标签页动作:新建、重命名、分离
+│ └── vcs // Git / Commit 相关动作
+├── bridge // Node / SDK bridge 环境、目录、进程管理
+├── cache // Session 索引与缓存
+├── dependency // 依赖安装、更新检测、结果对象
+├── handler
+│ ├── core // Dispatcher、Base handler、上下文对象
+│ ├── context // Java / Python / Runtime 上下文采集
+│ ├── diff // Diff 展示、刷新、请求分发
+│ ├── file // 文件打开、导出、撤销、收集器
+│ ├── history // 历史记录加载、删除、导出、元数据、注入
+│ ├── provider // Provider 读取、切换、导入导出、排序
+│ ├── session // Session 消息处理
+│ ├── settings // 设置相关 handler
+│ ├── skill // Skill / Agent / MCP 相关 handler
+│ └── window // Tab / Window 事件处理
+├── i18n // 国际化 bundle 入口
+├── model // 纯数据模型、枚举、结果对象
+├── notifications // 通知、状态栏、提示音
+├── permission // 权限请求、Diff review、tool interception
+├── provider
+│ ├── claude
+│ ├── codex
+│ └── common
+├── session // 会话状态、回调、消息编排、生命周期
+├── settings // 配置 facade 与各类 manager
+├── skill // Claude / Codex skill 扫描、解析、注册
+├── startup // 启动预热、插件更新监听
+├── terminal // Terminal 集成
+├── ui
+│ ├── detached // 分离窗口
+│ ├── toolwindow // ToolWindow / ChatWindow / tab 关联管理
+│ └── webview // Webview 初始化、watchdog、delegate、编辑器上下文桥接
+├── util // 仅保留通用、无状态工具类
+└── watcher // 文件监听器(若数量持续增长,可再拆)
+```
+
+---
+
+## 根包迁移建议对照表
+
+以下类建议优先从根包迁移到对应目录。
+
+| 当前类 | 建议新位置 | 说明 |
+| --- | --- | --- |
+| `ClaudeChatWindow` | `ui/toolwindow/ClaudeChatWindow.java` | 聊天窗口核心对象,明显属于 ToolWindow/UI 侧 |
+| `ClaudeSDKToolWindow` | `ui/toolwindow/ClaudeSDKToolWindow.java` | ToolWindow 工厂与入口 |
+| `CodeSnippetManager` | `ui/toolwindow/CodeSnippetManager.java` | 标签页/窗口间片段投递协调 |
+| `DetachedChatFrame` | `ui/detached/DetachedChatFrame.java` | 分离窗口 UI |
+| `DetachedWindowManager` | `ui/detached/DetachedWindowManager.java` | 分离窗口注册与生命周期 |
+| `ClaudeSession` | `session/ClaudeSession.java` | 会话核心对象,应与现有 `session` 包收拢 |
+| `SessionLoadService` | `session/SessionLoadService.java` | 会话加载桥接服务 |
+| `CodemossSettingsService` | `settings/CodemossSettingsService.java` | 配置 facade,和现有 `settings` 包高度一致 |
+| `SkillService` | `skill/SkillService.java` | Claude 技能管理 |
+| `CodexSkillService` | `skill/CodexSkillService.java` | Codex 技能管理 |
+| `ToolInterceptor` | `permission/ToolInterceptor.java` | 权限相关工具调用拦截 |
+| `ClaudeCodeGuiBundle` | `i18n/ClaudeCodeGuiBundle.java` | 国际化入口类,避免长期占据根包 |
+| `CreateNewTabAction` | `action/tab/CreateNewTabAction.java` | 标签页动作 |
+| `RenameTabAction` | `action/tab/RenameTabAction.java` | 标签页动作 |
+| `DetachTabAction` | `action/tab/DetachTabAction.java` | 标签页动作 |
+| `SendSelectionToTerminalAction` | `action/editor/SendSelectionToTerminalAction.java` | 编辑器右键动作 |
+| `SendFilePathToInputAction` | `action/editor/SendFilePathToInputAction.java` | 项目树右键动作 |
+| `QuickFixWithClaudeAction` | `action/editor/QuickFixWithClaudeAction.java` | 编辑器修复动作 |
+| `GenerateCommitMessageAction` | `action/vcs/GenerateCommitMessageAction.java` | VCS / Commit 动作 |
+| `OpenDevToolsAction` | `action/dev/OpenDevToolsAction.java` | 开发调试动作 |
+
+完成这一轮后,根包应尽量只保留极少数真正无法明确归属的顶层入口类。理想状态下,根包最终可以接近空壳。
+
+---
+
+## `action` 目录整理建议
+
+当前项目已经有 `action` 包,但只覆盖了聊天窗口内部动作,属于“已经开了头但没有统一到底”的状态。
+
+建议最终分为以下几组:
+
+### `action/chat`
+
+- `ChatSendAction`
+- `ChatNewlineAction`
+- `ChatCopyAction`
+- `ChatCutAction`
+- `ChatPasteAction`
+- `ChatToolWindowAction`
+- `SendShortcutSync`
+
+### `action/editor`
+
+- `SendSelectionToTerminalAction`
+- `SendFilePathToInputAction`
+- `QuickFixWithClaudeAction`
+
+### `action/tab`
+
+- `CreateNewTabAction`
+- `RenameTabAction`
+- `DetachTabAction`
+
+### `action/vcs`
+
+- `GenerateCommitMessageAction`
+
+### `action/dev`
+
+- `OpenDevToolsAction`
+
+---
+
+## `handler` 目录二次拆分建议
+
+`handler` 是当前最需要继续细分的目录,但不建议一上来大改逻辑。最稳的方式是保留消息协议和入口类行为,只按职责移动文件。
+
+### `handler/core`
+
+建议归入:
+
+- `BaseMessageHandler`
+- `MessageHandler`
+- `MessageDispatcher`
+- `HandlerContext`
+
+### `handler/file`
+
+建议归入:
+
+- `FileHandler`
+- `OpenFileHandler`
+- `FileExportHandler`
+- `UndoFileHandler`
+- `OpenFileCollector`
+- `RecentFileCollector`
+- `FileSystemCollector`
+- `RuntimeContextCollector`
+
+### `handler/history`
+
+建议归入:
+
+- `HistoryHandler`
+- `HistoryLoadService`
+- `HistoryDeleteService`
+- `HistoryExportService`
+- `HistoryMetadataService`
+- `HistoryMessageInjector`
+
+### `handler/provider`
+
+建议归入:
+
+- `ProviderHandler`
+- `ClaudeProviderOperations`
+- `CodexProviderOperations`
+- `ProviderImportExportSupport`
+- `ProviderOrderingService`
+- `ModelProviderHandler`
+
+### `handler/session`
+
+建议归入:
+
+- `SessionHandler`
+
+### `handler/settings`
+
+建议归入:
+
+- `SettingsHandler`
+- `NodePathHandler`
+- `PermissionModeHandler`
+- `SoundSettingsHandler`
+- `InputHistoryHandler`
+- `ProjectConfigHandler`
+
+### `handler/skill`
+
+建议归入:
+
+- `SkillHandler`
+- `AgentHandler`
+- `McpServerHandler`
+- `CodexMcpServerHandler`
+- `DependencyHandler`
+
+### `handler/window`
+
+建议归入:
+
+- `TabHandler`
+- `WindowEventHandler`
+
+### 保持原样的子目录
+
+以下目录已经较清晰,可在第一阶段保持不动:
+
+- `handler/context`
+- `handler/diff`
+
+---
+
+## `util` 目录收敛原则
+
+`util` 不建议继续作为“任何暂时不知道放哪就先塞进去”的目录。
+
+推荐原则:
+
+- **保留在 `util` 的类**:纯函数、无状态、跨多个功能域复用的工具类。
+- **逐步迁出的类**:名称中带有明显业务语义、配置语义、主题语义、声音语义、语言语义的类。
+
+可保留在 `util` 的典型类:
+
+- `PathUtils`
+- `LineSeparatorUtil`
+- `TagExtractor`
+- `IgnoreRuleParser`
+- `IgnoreRuleMatcher`
+- `TokenUsageUtils`
+
+可作为后续候选迁出的类:
+
+- `ThemeConfigService`
+- `FontConfigService`
+- `LanguageConfigService`
+- `SoundNotificationService`
+- `HtmlLoader`
+- `JBCefBrowserFactory`
+
+这一步不需要优先执行,但应作为结构治理的长期约束,避免 `util` 持续膨胀。
+
+---
+
+## 推荐执行顺序
+
+### Phase 1:清理根包
+
+目标:
+
+- 先处理最容易确认归属的类。
+- 最大化“第一眼可读性”提升。
+- 降低后续继续细分时的认知负担。
+
+建议顺序:
+
+1. 迁移根包 Action 到 `action/*`
+2. 迁移 `ClaudeSession`、`SessionLoadService` 到 `session`
+3. 迁移 `CodemossSettingsService` 到 `settings`
+4. 迁移 `SkillService`、`CodexSkillService` 到 `skill`
+5. 迁移 `ClaudeChatWindow`、`ClaudeSDKToolWindow`、`CodeSnippetManager` 到 `ui/toolwindow`
+6. 迁移 `DetachedChatFrame`、`DetachedWindowManager` 到 `ui/detached`
+7. 迁移 `ToolInterceptor` 到 `permission`
+8. 迁移 `ClaudeCodeGuiBundle` 到 `i18n`
+
+### Phase 2:细分 `handler`
+
+目标:
+
+- 保持现有 `SUPPORTED_TYPES` 和消息分发协议不变。
+- 按功能继续收拢文件位置。
+
+建议顺序:
+
+1. `core`
+2. `history`
+3. `file`
+4. `provider`
+5. `settings`
+6. `skill`
+7. `window`
+8. `session`
+
+### Phase 3:收敛 `util`
+
+目标:
+
+- 把 `util` 恢复为“真正的工具类目录”。
+- 将业务意味较强的对象迁回所属功能域。
+
+### Phase 4:文档与命名复查
+
+目标:
+
+- 确保目录结构调整后仍易于新人理解。
+- 避免“搬过去了,但命名还是旧上下文”的情况。
+
+建议检查:
+
+- 类名是否还反映当前职责
+- 包名与类职责是否一致
+- 文档、注释、注册文件是否同步更新
+
+---
+
+## 实施约束
+
+为避免结构整理演变为高风险功能改造,本计划约束如下:
+
+- 不在目录迁移时顺便改业务逻辑。
+- 不在同一轮里同时改消息协议、UI 交互和包结构。
+- 不一次性批量移动过多核心类,优先做低耦合迁移。
+- 每次迁移后立即修正 import、注册类名和相关引用。
+- 若发现某个类与多个目录强耦合,先暂停迁移,只记录为待决策项。
+
+---
+
+## 风险点
+
+### 1. `plugin.xml` 注册路径失效
+
+受影响对象:
+
+- ToolWindow factory
+- Action 注册
+- 任何扩展点实现类
+
+处理方式:
+
+- 每一轮目录迁移后立即检查 `src/main/resources/META-INF/plugin.xml`
+- 保证类路径与包名同步更新
+
+### 2. 包级可见性与静态协作关系
+
+例如窗口相关类之间存在包级方法调用或强协作关系,迁移时可能暴露出隐藏耦合。
+
+处理方式:
+
+- 先搬协作最紧密的一组类,避免拆散半套协作对象
+- 必要时再决定是否提升可见性或引入更明确的 coordinator
+
+### 3. 大目录移动引发大面积 import 修改
+
+处理方式:
+
+- 每次只移动一组相关类
+- 每次移动后立即编译验证,避免把多个错误点叠到一起
+
+### 4. `handler` 拆分时误伤消息协议
+
+处理方式:
+
+- 保留原入口类与消息类型定义
+- 只做物理位置整理与内部委托调整,不改前端协议
+
+---
+
+## 验收标准
+
+完成本计划时,应满足以下标准:
+
+- 根包显著瘦身,不再混放窗口、Action、设置、技能、会话等多类职责。
+- 目录结构能从名字直接反映功能域,而不是只能靠类名猜职责。
+- `plugin.xml` 与所有 Java 引用同步更新,无失效注册。
+- `handler` 不再是单层超大目录,核心子领域可以独立浏览。
+- `util` 不再继续吸纳带业务语义的服务对象。
+- 插件行为、消息协议、用户操作路径保持不变。
+
+---
+
+## 推荐验证方式
+
+每一轮目录迁移后,至少执行以下验证:
+
+### 编译 / 测试
+
+- `./gradlew test`
+
+### 定向人工检查
+
+- ToolWindow 能否正常打开
+- 新建标签页 / 重命名 / 分离窗口是否正常
+- 编辑器右键发送代码、发送文件路径是否正常
+- Quick Fix Action 是否仍可触发
+- Commit Message Action 是否仍可显示
+
+### 注册文件检查
+
+- `src/main/resources/META-INF/plugin.xml` 中所有迁移类路径都已同步修改
+
+---
+
+## 非目标
+
+本计划暂不包含以下内容:
+
+- 重写现有业务逻辑
+- 改造 `provider/claude`、`provider/codex` 的内部设计
+- 大规模重命名消息类型或前后端协议
+- 一次性清空所有历史结构问题
+
+这是一份“结构整理计划”,不是“一步到位的架构重写计划”。
+
+---
+
+## 总结
+
+当前项目更适合继续沿“按功能分组”的方向演进,而不是退回到“按 Service / Manager / Handler 类型分组”的做法。
+
+最优先、最划算的一步,是先把根包清理干净;第二步再继续把 `handler` 拆成多个子目录;最后再逐步收敛 `util`。
+
+如果后续按本计划执行,项目目录会更接近“新同事第一次打开就能快速知道每块代码在哪”的状态,同时还能把重构风险控制在较低水平。
diff --git a/src/main/java/com/github/claudecodegui/action/ChatCopyAction.java b/src/main/java/com/github/claudecodegui/action/ChatCopyAction.java
index 2cf7259b..67352a30 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatCopyAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatCopyAction.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/action/ChatCutAction.java b/src/main/java/com/github/claudecodegui/action/ChatCutAction.java
index 685448d1..39623921 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatCutAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatCutAction.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/action/ChatNewlineAction.java b/src/main/java/com/github/claudecodegui/action/ChatNewlineAction.java
index 784eecb8..b539bc0a 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatNewlineAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatNewlineAction.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/action/ChatPasteAction.java b/src/main/java/com/github/claudecodegui/action/ChatPasteAction.java
index bea30831..3d361b0d 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatPasteAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatPasteAction.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.google.gson.Gson;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/src/main/java/com/github/claudecodegui/action/ChatSendAction.java b/src/main/java/com/github/claudecodegui/action/ChatSendAction.java
index 8d2741e1..a58c2eff 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatSendAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatSendAction.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/action/ChatToolWindowAction.java b/src/main/java/com/github/claudecodegui/action/ChatToolWindowAction.java
index e82c1313..6ccda9fe 100644
--- a/src/main/java/com/github/claudecodegui/action/ChatToolWindowAction.java
+++ b/src/main/java/com/github/claudecodegui/action/ChatToolWindowAction.java
@@ -1,7 +1,7 @@
package com.github.claudecodegui.action;
-import com.github.claudecodegui.ClaudeChatWindow;
-import com.github.claudecodegui.ClaudeSDKToolWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/OpenDevToolsAction.java b/src/main/java/com/github/claudecodegui/action/dev/OpenDevToolsAction.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/OpenDevToolsAction.java
rename to src/main/java/com/github/claudecodegui/action/dev/OpenDevToolsAction.java
index 3a2aff9a..4ff4cee7 100644
--- a/src/main/java/com/github/claudecodegui/OpenDevToolsAction.java
+++ b/src/main/java/com/github/claudecodegui/action/dev/OpenDevToolsAction.java
@@ -1,5 +1,6 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.dev;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/QuickFixWithClaudeAction.java b/src/main/java/com/github/claudecodegui/action/editor/QuickFixWithClaudeAction.java
similarity index 97%
rename from src/main/java/com/github/claudecodegui/QuickFixWithClaudeAction.java
rename to src/main/java/com/github/claudecodegui/action/editor/QuickFixWithClaudeAction.java
index 2955d699..e69b578f 100644
--- a/src/main/java/com/github/claudecodegui/QuickFixWithClaudeAction.java
+++ b/src/main/java/com/github/claudecodegui/action/editor/QuickFixWithClaudeAction.java
@@ -1,8 +1,11 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.editor;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.provider.common.MessageCallback;
import com.github.claudecodegui.provider.common.SDKResult;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/SendFilePathToInputAction.java b/src/main/java/com/github/claudecodegui/action/editor/SendFilePathToInputAction.java
similarity index 97%
rename from src/main/java/com/github/claudecodegui/SendFilePathToInputAction.java
rename to src/main/java/com/github/claudecodegui/action/editor/SendFilePathToInputAction.java
index c234f82a..383c06a0 100644
--- a/src/main/java/com/github/claudecodegui/SendFilePathToInputAction.java
+++ b/src/main/java/com/github/claudecodegui/action/editor/SendFilePathToInputAction.java
@@ -1,5 +1,7 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.editor;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/SendSelectionToTerminalAction.java b/src/main/java/com/github/claudecodegui/action/editor/SendSelectionToTerminalAction.java
similarity index 98%
rename from src/main/java/com/github/claudecodegui/SendSelectionToTerminalAction.java
rename to src/main/java/com/github/claudecodegui/action/editor/SendSelectionToTerminalAction.java
index 3fc8e8e5..a13fb660 100644
--- a/src/main/java/com/github/claudecodegui/SendSelectionToTerminalAction.java
+++ b/src/main/java/com/github/claudecodegui/action/editor/SendSelectionToTerminalAction.java
@@ -1,5 +1,7 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.editor;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -19,8 +21,6 @@ import com.intellij.util.concurrency.AppExecutorUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.io.File;
-
/**
* Action that sends selected code to the plugin chat window.
* Supports cross-platform shortcuts: Mac (Cmd+Option+K) and Windows/Linux (Ctrl+Alt+K).
@@ -241,4 +241,3 @@ public class SendSelectionToTerminalAction extends AnAction implements DumbAware
}
}
}
-
diff --git a/src/main/java/com/github/claudecodegui/CreateNewTabAction.java b/src/main/java/com/github/claudecodegui/action/tab/CreateNewTabAction.java
similarity index 92%
rename from src/main/java/com/github/claudecodegui/CreateNewTabAction.java
rename to src/main/java/com/github/claudecodegui/action/tab/CreateNewTabAction.java
index 6861680d..d78ee82e 100644
--- a/src/main/java/com/github/claudecodegui/CreateNewTabAction.java
+++ b/src/main/java/com/github/claudecodegui/action/tab/CreateNewTabAction.java
@@ -1,5 +1,8 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.tab;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/DetachTabAction.java b/src/main/java/com/github/claudecodegui/action/tab/DetachTabAction.java
similarity index 95%
rename from src/main/java/com/github/claudecodegui/DetachTabAction.java
rename to src/main/java/com/github/claudecodegui/action/tab/DetachTabAction.java
index 292fe8e6..3e309451 100644
--- a/src/main/java/com/github/claudecodegui/DetachTabAction.java
+++ b/src/main/java/com/github/claudecodegui/action/tab/DetachTabAction.java
@@ -1,5 +1,10 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.tab;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.ui.detached.DetachedChatFrame;
+import com.github.claudecodegui.ui.detached.DetachedWindowManager;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/RenameTabAction.java b/src/main/java/com/github/claudecodegui/action/tab/RenameTabAction.java
similarity index 95%
rename from src/main/java/com/github/claudecodegui/RenameTabAction.java
rename to src/main/java/com/github/claudecodegui/action/tab/RenameTabAction.java
index 74bec688..04c69e21 100644
--- a/src/main/java/com/github/claudecodegui/RenameTabAction.java
+++ b/src/main/java/com/github/claudecodegui/action/tab/RenameTabAction.java
@@ -1,6 +1,9 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.tab;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.settings.TabStateService;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
diff --git a/src/main/java/com/github/claudecodegui/GenerateCommitMessageAction.java b/src/main/java/com/github/claudecodegui/action/vcs/GenerateCommitMessageAction.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/GenerateCommitMessageAction.java
rename to src/main/java/com/github/claudecodegui/action/vcs/GenerateCommitMessageAction.java
index 8fb9c57f..aa7ecfd1 100644
--- a/src/main/java/com/github/claudecodegui/GenerateCommitMessageAction.java
+++ b/src/main/java/com/github/claudecodegui/action/vcs/GenerateCommitMessageAction.java
@@ -1,5 +1,6 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.action.vcs;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.service.GitCommitMessageService;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
diff --git a/src/main/java/com/github/claudecodegui/handler/AgentHandler.java b/src/main/java/com/github/claudecodegui/handler/AgentHandler.java
index 2c17b51f..cb9165ad 100644
--- a/src/main/java/com/github/claudecodegui/handler/AgentHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/AgentHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.model.ConflictStrategy;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
diff --git a/src/main/java/com/github/claudecodegui/handler/ClaudeProviderOperations.java b/src/main/java/com/github/claudecodegui/handler/ClaudeProviderOperations.java
index 78bf08d6..84b3dde6 100644
--- a/src/main/java/com/github/claudecodegui/handler/ClaudeProviderOperations.java
+++ b/src/main/java/com/github/claudecodegui/handler/ClaudeProviderOperations.java
@@ -128,7 +128,7 @@ public class ClaudeProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to add provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.addFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.addFailed", e.getMessage())));
});
}
}
@@ -163,7 +163,7 @@ public class ClaudeProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to update provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.updateFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.updateFailed", e.getMessage())));
});
}
}
@@ -182,7 +182,7 @@ public class ClaudeProviderOperations {
if (!data.has("id")) {
LOG.error("[ProviderHandler] ERROR: Missing 'id' field in request");
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.deleteMissingId")));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.deleteMissingId")));
});
return;
}
@@ -211,7 +211,7 @@ public class ClaudeProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Exception in handleDeleteProvider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.deleteFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.deleteFailed", e.getMessage())));
});
}
@@ -231,7 +231,7 @@ public class ClaudeProviderOperations {
ApplicationManager.getApplication().invokeLater(() -> {
context.callJavaScript("window.showSwitchSuccess",
- context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.providerDisabled")));
+ context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.providerDisabled")));
handleGetProviders();
handleGetActiveProvider();
});
@@ -245,7 +245,7 @@ public class ClaudeProviderOperations {
LOG.warn("[ProviderHandler] Local settings.json does not exist at: " + settingsPath);
ApplicationManager.getApplication().invokeLater(() -> {
context.callJavaScript("window.showError",
- context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.localProviderSettingsNotFound")));
+ context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.localProviderSettingsNotFound")));
});
return;
}
@@ -258,7 +258,7 @@ public class ClaudeProviderOperations {
LOG.error("[ProviderHandler] Invalid JSON in settings.json: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
context.callJavaScript("window.showError",
- context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.localProviderInvalidJson", e.getMessage())));
+ context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.localProviderInvalidJson", e.getMessage())));
});
return;
}
@@ -277,7 +277,7 @@ public class ClaudeProviderOperations {
ApplicationManager.getApplication().invokeLater(() -> {
context.callJavaScript("window.showSwitchSuccess",
- context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.localProviderSwitchSuccess")));
+ context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.localProviderSwitchSuccess")));
handleGetProviders();
handleGetActiveProvider();
});
@@ -288,14 +288,14 @@ public class ClaudeProviderOperations {
context.getSettingsService().applyActiveProviderToClaudeSettings();
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showSwitchSuccess", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.providerSwitchSuccess") + com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.switchSyncClaude")));
+ context.callJavaScript("window.showSwitchSuccess", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.providerSwitchSuccess") + com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.switchSyncClaude")));
handleGetProviders();
handleGetActiveProvider();
});
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to switch provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.providerSwitchFailed") + ": " + e.getMessage()));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.providerSwitchFailed") + ": " + e.getMessage()));
});
}
}
diff --git a/src/main/java/com/github/claudecodegui/handler/CodexProviderOperations.java b/src/main/java/com/github/claudecodegui/handler/CodexProviderOperations.java
index ebdb508e..e782ff98 100644
--- a/src/main/java/com/github/claudecodegui/handler/CodexProviderOperations.java
+++ b/src/main/java/com/github/claudecodegui/handler/CodexProviderOperations.java
@@ -68,7 +68,7 @@ public class CodexProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to add Codex provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.addCodexFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.addCodexFailed", e.getMessage())));
});
}
}
@@ -103,7 +103,7 @@ public class CodexProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to update Codex provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.updateCodexFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.updateCodexFailed", e.getMessage())));
});
}
}
@@ -122,7 +122,7 @@ public class CodexProviderOperations {
if (!data.has("id")) {
LOG.error("[ProviderHandler] ERROR: Missing 'id' field in request");
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.deleteCodexMissingId")));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.deleteCodexMissingId")));
});
return;
}
@@ -148,7 +148,7 @@ public class CodexProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Exception in handleDeleteCodexProvider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.deleteCodexFailed", e.getMessage())));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.deleteCodexFailed", e.getMessage())));
});
}
@@ -167,7 +167,7 @@ public class CodexProviderOperations {
context.getSettingsService().applyActiveProviderToCodexSettings();
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showSwitchSuccess", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.providerSwitchSuccess") + com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.switchSyncCodex")));
+ context.callJavaScript("window.showSwitchSuccess", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.providerSwitchSuccess") + com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.switchSyncCodex")));
handleGetCodexProviders(); // Refresh provider list
handleGetCurrentCodexConfig(); // Refresh Codex CLI config display
handleGetActiveCodexProvider(); // Refresh active provider config
@@ -175,7 +175,7 @@ public class CodexProviderOperations {
} catch (Exception e) {
LOG.error("[ProviderHandler] Failed to switch Codex provider: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("toast.providerSwitchFailed") + ": " + e.getMessage()));
+ context.callJavaScript("window.showError", context.escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("toast.providerSwitchFailed") + ": " + e.getMessage()));
});
}
}
diff --git a/src/main/java/com/github/claudecodegui/handler/FileExportHandler.java b/src/main/java/com/github/claudecodegui/handler/FileExportHandler.java
index 2dc461e9..729b2646 100644
--- a/src/main/java/com/github/claudecodegui/handler/FileExportHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/FileExportHandler.java
@@ -41,11 +41,11 @@ public class FileExportHandler extends BaseMessageHandler {
public boolean handle(String type, String content) {
if ("save_markdown".equals(type)) {
LOG.info("[FileExportHandler] 处理: save_markdown");
- handleSaveFile(content, ".md", com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveMarkdownDialog"));
+ handleSaveFile(content, ".md", com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveMarkdownDialog"));
return true;
} else if ("save_json".equals(type)) {
LOG.info("[FileExportHandler] 处理: save_json");
- handleSaveFile(content, ".json", com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveJsonDialog"));
+ handleSaveFile(content, ".json", com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveJsonDialog"));
return true;
}
return false;
@@ -111,7 +111,7 @@ public class FileExportHandler extends BaseMessageHandler {
// Notify frontend of success
ApplicationManager.getApplication().invokeLater(() -> {
- String successMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saved"));
+ String successMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saved"));
String jsCode = "if (window.addToast) { " +
" window.addToast('" + successMsg + "', 'success'); " +
"}";
@@ -123,8 +123,8 @@ public class FileExportHandler extends BaseMessageHandler {
// Notify frontend of failure
ApplicationManager.getApplication().invokeLater(() -> {
- String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveFailed");
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
+ String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveFailed");
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
String jsCode = "if (window.addToast) { " +
" window.addToast('" + errorMsg + "', 'error'); " +
"}";
@@ -138,8 +138,8 @@ public class FileExportHandler extends BaseMessageHandler {
} catch (Exception e) {
LOG.error("[FileExportHandler] ❌ 显示对话框失败: " + e.getMessage(), e);
- String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.showDialogFailed");
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
+ String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.showDialogFailed");
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
String jsCode = "if (window.addToast) { " +
" window.addToast('" + errorMsg + "', 'error'); " +
"}";
@@ -153,8 +153,8 @@ public class FileExportHandler extends BaseMessageHandler {
LOG.error("[FileExportHandler] ❌ 处理保存请求失败: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.unknownError");
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
+ String errorDetail = e.getMessage() != null ? e.getMessage() : com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.unknownError");
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("file.saveFailedWithReason", errorDetail));
String jsCode = "if (window.addToast) { " +
" window.addToast('" + errorMsg + "', 'error'); " +
"}";
diff --git a/src/main/java/com/github/claudecodegui/handler/HandlerContext.java b/src/main/java/com/github/claudecodegui/handler/HandlerContext.java
index 6d73e97a..8a7bd304 100644
--- a/src/main/java/com/github/claudecodegui/handler/HandlerContext.java
+++ b/src/main/java/com/github/claudecodegui/handler/HandlerContext.java
@@ -1,9 +1,9 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
import com.github.claudecodegui.provider.codex.CodexSDKBridge;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.ui.jcef.JBCefBrowser;
diff --git a/src/main/java/com/github/claudecodegui/handler/McpServerHandler.java b/src/main/java/com/github/claudecodegui/handler/McpServerHandler.java
index 9ee2997f..2ec7d8a7 100644
--- a/src/main/java/com/github/claudecodegui/handler/McpServerHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/McpServerHandler.java
@@ -261,7 +261,7 @@ public class McpServerHandler extends BaseMessageHandler {
} catch (Exception e) {
LOG.error("[McpServerHandler] Failed to add MCP server: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("mcp.addServerFailedWithReason", e.getMessage()));
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("mcp.addServerFailedWithReason", e.getMessage()));
callJavaScript("window.showError", errorMsg);
});
}
@@ -284,7 +284,7 @@ public class McpServerHandler extends BaseMessageHandler {
} catch (Exception e) {
LOG.error("[McpServerHandler] Failed to update MCP server: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("mcp.updateServerFailedWithReason", e.getMessage()));
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("mcp.updateServerFailedWithReason", e.getMessage()));
callJavaScript("window.showError", errorMsg);
});
}
@@ -308,14 +308,14 @@ public class McpServerHandler extends BaseMessageHandler {
});
} else {
ApplicationManager.getApplication().invokeLater(() -> {
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("mcp.deleteServerFailedWithReason", com.github.claudecodegui.ClaudeCodeGuiBundle.message("mcp.serverNotFound")));
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("mcp.deleteServerFailedWithReason", com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("mcp.serverNotFound")));
callJavaScript("window.showError", errorMsg);
});
}
} catch (Exception e) {
LOG.error("[McpServerHandler] Failed to delete MCP server: " + e.getMessage(), e);
ApplicationManager.getApplication().invokeLater(() -> {
- String errorMsg = escapeJs(com.github.claudecodegui.ClaudeCodeGuiBundle.message("mcp.deleteServerFailedWithReason", e.getMessage()));
+ String errorMsg = escapeJs(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("mcp.deleteServerFailedWithReason", e.getMessage()));
callJavaScript("window.showError", errorMsg);
});
}
diff --git a/src/main/java/com/github/claudecodegui/handler/PermissionHandler.java b/src/main/java/com/github/claudecodegui/handler/PermissionHandler.java
index ccd89b91..b2bdb0d8 100644
--- a/src/main/java/com/github/claudecodegui/handler/PermissionHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/PermissionHandler.java
@@ -167,8 +167,8 @@ public class PermissionHandler extends BaseMessageHandler {
}
// Get the window instance for the target project
- com.github.claudecodegui.ClaudeChatWindow targetWindow =
- com.github.claudecodegui.ClaudeSDKToolWindow.getChatWindow(targetProject);
+ com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow targetWindow =
+ com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow.getChatWindow(targetProject);
if (targetWindow == null) {
LOG.error("[PermissionHandler] Error: cannot find window instance for project " + targetProject.getName());
diff --git a/src/main/java/com/github/claudecodegui/handler/ProjectConfigHandler.java b/src/main/java/com/github/claudecodegui/handler/ProjectConfigHandler.java
index 5cf8966a..8f68ea07 100644
--- a/src/main/java/com/github/claudecodegui/handler/ProjectConfigHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/ProjectConfigHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.action.SendShortcutSync;
import com.github.claudecodegui.provider.claude.ClaudeHistoryReader;
import com.github.claudecodegui.provider.codex.CodexHistoryReader;
diff --git a/src/main/java/com/github/claudecodegui/handler/PromptHandler.java b/src/main/java/com/github/claudecodegui/handler/PromptHandler.java
index c52360d8..4e8542b3 100644
--- a/src/main/java/com/github/claudecodegui/handler/PromptHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/PromptHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.model.ConflictStrategy;
import com.github.claudecodegui.model.PromptScope;
import com.github.claudecodegui.settings.AbstractPromptManager;
diff --git a/src/main/java/com/github/claudecodegui/handler/ProviderImportExportSupport.java b/src/main/java/com/github/claudecodegui/handler/ProviderImportExportSupport.java
index c9e6304d..0e6d274e 100644
--- a/src/main/java/com/github/claudecodegui/handler/ProviderImportExportSupport.java
+++ b/src/main/java/com/github/claudecodegui/handler/ProviderImportExportSupport.java
@@ -50,9 +50,9 @@ public class ProviderImportExportSupport {
LOG.info("[ProviderHandler] Database file exists: " + dbFile.exists());
if (!dbFile.exists()) {
- String errorMsg = com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.notFound", dbFile.getAbsolutePath());
+ String errorMsg = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.notFound", dbFile.getAbsolutePath());
LOG.error("[ProviderHandler] " + errorMsg);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.notFoundTitle"), errorMsg);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.notFoundTitle"), errorMsg);
return;
}
@@ -63,7 +63,7 @@ public class ProviderImportExportSupport {
if (providers.isEmpty()) {
LOG.info("[ProviderHandler] No Claude provider configs found in database");
- sendInfoToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.noDataTitle"), com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.noData"));
+ sendInfoToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.noDataTitle"), com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.noData"));
return;
}
@@ -80,9 +80,9 @@ public class ProviderImportExportSupport {
context.callJavaScript("window.import_preview_result", context.escapeJs(jsonStr));
} catch (Exception e) {
- String errorDetails = com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailed") + ": " + e.getMessage();
+ String errorDetails = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailed") + ": " + e.getMessage();
LOG.error("[ProviderHandler] " + errorDetails, e);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailedTitle"), errorDetails);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailedTitle"), errorDetails);
}
});
});
@@ -103,8 +103,8 @@ public class ProviderImportExportSupport {
false // chooseMultiple
);
- descriptor.setTitle(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.selectTitle"));
- descriptor.setDescription(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.selectDesc"));
+ descriptor.setTitle(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.selectTitle"));
+ descriptor.setDescription(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.selectDesc"));
descriptor.withFileFilter(file -> {
String name = file.getName().toLowerCase();
return name.endsWith(".db");
@@ -131,7 +131,7 @@ public class ProviderImportExportSupport {
if (selectedFiles.length == 0) {
LOG.info("[ProviderHandler] User cancelled file selection");
- sendInfoToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.cancelledTitle"), com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.cancelled"));
+ sendInfoToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.cancelledTitle"), com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.cancelled"));
return;
}
@@ -143,18 +143,18 @@ public class ProviderImportExportSupport {
LOG.info("[ProviderHandler] Database file exists: " + dbFile.exists());
if (!dbFile.exists()) {
- String errorMsg = com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.notFound", dbFile.getAbsolutePath());
+ String errorMsg = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.notFound", dbFile.getAbsolutePath());
LOG.error("[ProviderHandler] " + errorMsg);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.notFoundTitle"), errorMsg);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.notFoundTitle"), errorMsg);
return;
}
if (!dbFile.canRead()) {
- String errorMsg = com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.cannotReadFile") + "\n" +
+ String errorMsg = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.cannotReadFile") + "\n" +
dbFile.getAbsolutePath() + "\n" +
- com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.checkFilePermissions");
+ com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.checkFilePermissions");
LOG.error("[ProviderHandler] " + errorMsg);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.permissionErrorTitle"), errorMsg);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.permissionErrorTitle"), errorMsg);
return;
}
@@ -166,7 +166,7 @@ public class ProviderImportExportSupport {
if (providers.isEmpty()) {
LOG.info("[ProviderHandler] No Claude provider configs found in database");
- sendInfoToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.noDataTitle"), com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.noData"));
+ sendInfoToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.noDataTitle"), com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.noData"));
return;
}
@@ -183,16 +183,16 @@ public class ProviderImportExportSupport {
context.callJavaScript("window.import_preview_result", context.escapeJs(jsonStr));
} catch (Exception e) {
- String errorDetails = com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailed") + ": " + e.getMessage();
+ String errorDetails = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailed") + ": " + e.getMessage();
LOG.error("[ProviderHandler] " + errorDetails, e);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailedTitle"), errorDetails);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.readFailedTitle"), errorDetails);
}
});
} catch (Exception e) {
- String errorDetails = com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.fileChooserFailed") + ": " + e.getMessage();
+ String errorDetails = com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.fileChooserFailed") + ": " + e.getMessage();
LOG.error("[ProviderHandler] " + errorDetails, e);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.fileChooserFailedTitle"), errorDetails);
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.fileChooserFailedTitle"), errorDetails);
}
});
}
@@ -221,12 +221,12 @@ public class ProviderImportExportSupport {
ApplicationManager.getApplication().invokeLater(() -> {
claudeOps.handleGetProviders(); // Refresh UI
- sendInfoToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.importSuccessTitle"), com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.importSuccess", count));
+ sendInfoToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.importSuccessTitle"), com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.importSuccess", count));
});
} catch (Exception e) {
LOG.error("Failed to save imported providers", e);
- sendErrorToFrontend(com.github.claudecodegui.ClaudeCodeGuiBundle.message("provider.ccswitch.saveFailedTitle"), e.getMessage());
+ sendErrorToFrontend(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("provider.ccswitch.saveFailedTitle"), e.getMessage());
}
});
}
diff --git a/src/main/java/com/github/claudecodegui/handler/SessionHandler.java b/src/main/java/com/github/claudecodegui/handler/SessionHandler.java
index 9560ed7d..b9a19762 100644
--- a/src/main/java/com/github/claudecodegui/handler/SessionHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/SessionHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.bridge.NodeDetector;
import com.github.claudecodegui.model.NodeDetectionResult;
import com.github.claudecodegui.notifications.ClaudeNotifier;
@@ -385,8 +385,8 @@ public class SessionHandler extends BaseMessageHandler {
// (relative paths are resolved only when projectPath is valid).
if (projectPath != null && new File(projectPath).exists()) {
try {
- com.github.claudecodegui.CodemossSettingsService settingsService =
- new com.github.claudecodegui.CodemossSettingsService();
+ com.github.claudecodegui.settings.CodemossSettingsService settingsService =
+ new com.github.claudecodegui.settings.CodemossSettingsService();
String customWorkingDir = settingsService.getCustomWorkingDirectory(projectPath);
if (customWorkingDir != null && !customWorkingDir.isEmpty()) {
diff --git a/src/main/java/com/github/claudecodegui/handler/SkillHandler.java b/src/main/java/com/github/claudecodegui/handler/SkillHandler.java
index 23635fd6..55e47f6c 100644
--- a/src/main/java/com/github/claudecodegui/handler/SkillHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/SkillHandler.java
@@ -1,7 +1,7 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.CodexSkillService;
-import com.github.claudecodegui.SkillService;
+import com.github.claudecodegui.skill.CodexSkillService;
+import com.github.claudecodegui.skill.SkillService;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.intellij.openapi.application.ApplicationManager;
diff --git a/src/main/java/com/github/claudecodegui/handler/SoundSettingsHandler.java b/src/main/java/com/github/claudecodegui/handler/SoundSettingsHandler.java
index e33f860a..ad877446 100644
--- a/src/main/java/com/github/claudecodegui/handler/SoundSettingsHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/SoundSettingsHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.util.SoundNotificationService;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/handler/TabHandler.java b/src/main/java/com/github/claudecodegui/handler/TabHandler.java
index b5925078..e252c986 100644
--- a/src/main/java/com/github/claudecodegui/handler/TabHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/TabHandler.java
@@ -1,7 +1,7 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.ClaudeChatWindow;
-import com.github.claudecodegui.ClaudeSDKToolWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.github.claudecodegui.settings.TabStateService;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/src/main/java/com/github/claudecodegui/handler/UsagePushService.java b/src/main/java/com/github/claudecodegui/handler/UsagePushService.java
index 701757ff..ae76fc2b 100644
--- a/src/main/java/com/github/claudecodegui/handler/UsagePushService.java
+++ b/src/main/java/com/github/claudecodegui/handler/UsagePushService.java
@@ -1,10 +1,10 @@
package com.github.claudecodegui.handler;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.util.TokenUsageUtils;
import com.github.claudecodegui.util.EditorFileUtils;
import com.github.claudecodegui.util.IgnoreRuleMatcher;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.intellij.openapi.application.ApplicationManager;
diff --git a/src/main/java/com/github/claudecodegui/handler/diff/EditableDiffHandler.java b/src/main/java/com/github/claudecodegui/handler/diff/EditableDiffHandler.java
index 0dcace9b..698145c8 100644
--- a/src/main/java/com/github/claudecodegui/handler/diff/EditableDiffHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/diff/EditableDiffHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler.diff;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.util.ContentRebuildUtil;
import com.google.gson.Gson;
diff --git a/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffManager.java b/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffManager.java
index 85121a1b..30c4dc7b 100644
--- a/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffManager.java
+++ b/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffManager.java
@@ -23,7 +23,7 @@ import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.FileTypes;
import com.github.claudecodegui.util.LineSeparatorUtil;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
diff --git a/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffMessageHandler.java b/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffMessageHandler.java
index 68032df1..c8f3f0eb 100644
--- a/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffMessageHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/diff/InteractiveDiffMessageHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler.diff;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.handler.HandlerContext;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/handler/diff/SimpleDiffDisplayHandler.java b/src/main/java/com/github/claudecodegui/handler/diff/SimpleDiffDisplayHandler.java
index 2771c4d6..a9a5cb1b 100644
--- a/src/main/java/com/github/claudecodegui/handler/diff/SimpleDiffDisplayHandler.java
+++ b/src/main/java/com/github/claudecodegui/handler/diff/SimpleDiffDisplayHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.handler.diff;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.util.ContentRebuildUtil;
import com.github.claudecodegui.util.EditorFileUtils;
diff --git a/src/main/java/com/github/claudecodegui/ClaudeCodeGuiBundle.java b/src/main/java/com/github/claudecodegui/i18n/ClaudeCodeGuiBundle.java
similarity index 96%
rename from src/main/java/com/github/claudecodegui/ClaudeCodeGuiBundle.java
rename to src/main/java/com/github/claudecodegui/i18n/ClaudeCodeGuiBundle.java
index bfaab2be..778fb69b 100644
--- a/src/main/java/com/github/claudecodegui/ClaudeCodeGuiBundle.java
+++ b/src/main/java/com/github/claudecodegui/i18n/ClaudeCodeGuiBundle.java
@@ -1,4 +1,4 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.i18n;
import com.intellij.DynamicBundle;
import org.jetbrains.annotations.Nls;
diff --git a/src/main/java/com/github/claudecodegui/notifications/ClaudeNotifier.java b/src/main/java/com/github/claudecodegui/notifications/ClaudeNotifier.java
index a914aca5..2416f611 100644
--- a/src/main/java/com/github/claudecodegui/notifications/ClaudeNotifier.java
+++ b/src/main/java/com/github/claudecodegui/notifications/ClaudeNotifier.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.notifications;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.util.SoundNotificationService;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/notifications/ClaudeStatusBarWidget.java b/src/main/java/com/github/claudecodegui/notifications/ClaudeStatusBarWidget.java
index efc2451c..bcd17b1e 100644
--- a/src/main/java/com/github/claudecodegui/notifications/ClaudeStatusBarWidget.java
+++ b/src/main/java/com/github/claudecodegui/notifications/ClaudeStatusBarWidget.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.notifications;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.CustomStatusBarWidget;
diff --git a/src/main/java/com/github/claudecodegui/permission/DiffReviewService.java b/src/main/java/com/github/claudecodegui/permission/DiffReviewService.java
index 7e4a3079..c59faeea 100644
--- a/src/main/java/com/github/claudecodegui/permission/DiffReviewService.java
+++ b/src/main/java/com/github/claudecodegui/permission/DiffReviewService.java
@@ -11,7 +11,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.Computable;
diff --git a/src/main/java/com/github/claudecodegui/permission/PermissionDialog.java b/src/main/java/com/github/claudecodegui/permission/PermissionDialog.java
index 9694df4e..9d2d8b98 100644
--- a/src/main/java/com/github/claudecodegui/permission/PermissionDialog.java
+++ b/src/main/java/com/github/claudecodegui/permission/PermissionDialog.java
@@ -24,7 +24,7 @@ import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.intellij.openapi.diagnostic.Logger;
/**
* Permission request dialog.
diff --git a/src/main/java/com/github/claudecodegui/ToolInterceptor.java b/src/main/java/com/github/claudecodegui/permission/ToolInterceptor.java
similarity index 97%
rename from src/main/java/com/github/claudecodegui/ToolInterceptor.java
rename to src/main/java/com/github/claudecodegui/permission/ToolInterceptor.java
index 6dbd4c0c..0f621eb5 100644
--- a/src/main/java/com/github/claudecodegui/ToolInterceptor.java
+++ b/src/main/java/com/github/claudecodegui/permission/ToolInterceptor.java
@@ -1,8 +1,6 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.permission;
import com.google.gson.*;
-import com.github.claudecodegui.permission.PermissionDialog;
-import com.github.claudecodegui.permission.PermissionRequest;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeDaemonRequestExecutor.java b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeDaemonRequestExecutor.java
index fb67de3e..8a036e79 100644
--- a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeDaemonRequestExecutor.java
+++ b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeDaemonRequestExecutor.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.provider.claude;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.provider.common.DaemonBridge;
import com.github.claudecodegui.provider.common.MessageCallback;
import com.github.claudecodegui.provider.common.SDKResult;
diff --git a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeProcessInvoker.java b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeProcessInvoker.java
index 63c8160a..55d966c3 100644
--- a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeProcessInvoker.java
+++ b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeProcessInvoker.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.provider.claude;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.bridge.EnvironmentConfigurator;
import com.github.claudecodegui.bridge.NodeDetector;
import com.github.claudecodegui.bridge.ProcessManager;
diff --git a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeRequestParamsBuilder.java b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeRequestParamsBuilder.java
index be898c33..cf051166 100644
--- a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeRequestParamsBuilder.java
+++ b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeRequestParamsBuilder.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.provider.claude;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridge.java b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridge.java
index ef539444..a0a899ea 100644
--- a/src/main/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridge.java
+++ b/src/main/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridge.java
@@ -2,7 +2,7 @@ package com.github.claudecodegui.provider.claude;
import com.google.gson.JsonObject;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.model.NodeDetectionResult;
import com.github.claudecodegui.provider.common.BaseSDKBridge;
import com.github.claudecodegui.provider.common.MessageCallback;
diff --git a/src/main/java/com/github/claudecodegui/provider/codex/CodexSDKBridge.java b/src/main/java/com/github/claudecodegui/provider/codex/CodexSDKBridge.java
index f4d96b4d..c6922622 100644
--- a/src/main/java/com/github/claudecodegui/provider/codex/CodexSDKBridge.java
+++ b/src/main/java/com/github/claudecodegui/provider/codex/CodexSDKBridge.java
@@ -4,8 +4,8 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import com.github.claudecodegui.ClaudeSession;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.session.ClaudeSession;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.dependency.DependencyManager;
import com.github.claudecodegui.provider.common.BaseSDKBridge;
import com.github.claudecodegui.provider.common.MessageCallback;
diff --git a/src/main/java/com/github/claudecodegui/service/GitCommitMessageService.java b/src/main/java/com/github/claudecodegui/service/GitCommitMessageService.java
index 4f180ce3..af8321eb 100644
--- a/src/main/java/com/github/claudecodegui/service/GitCommitMessageService.java
+++ b/src/main/java/com/github/claudecodegui/service/GitCommitMessageService.java
@@ -1,7 +1,7 @@
package com.github.claudecodegui.service;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
import com.github.claudecodegui.provider.codex.CodexSDKBridge;
import com.github.claudecodegui.provider.common.MessageCallback;
diff --git a/src/main/java/com/github/claudecodegui/session/CallbackHandler.java b/src/main/java/com/github/claudecodegui/session/CallbackHandler.java
index bb494985..bb1e5470 100644
--- a/src/main/java/com/github/claudecodegui/session/CallbackHandler.java
+++ b/src/main/java/com/github/claudecodegui/session/CallbackHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.permission.PermissionRequest;
import java.util.List;
diff --git a/src/main/java/com/github/claudecodegui/session/ClaudeMessageHandler.java b/src/main/java/com/github/claudecodegui/session/ClaudeMessageHandler.java
index 627e6e7c..14493d3c 100644
--- a/src/main/java/com/github/claudecodegui/session/ClaudeMessageHandler.java
+++ b/src/main/java/com/github/claudecodegui/session/ClaudeMessageHandler.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession.Message;
+import com.github.claudecodegui.session.ClaudeSession.Message;
import com.github.claudecodegui.handler.SettingsHandler;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.provider.common.MessageCallback;
diff --git a/src/main/java/com/github/claudecodegui/ClaudeSession.java b/src/main/java/com/github/claudecodegui/session/ClaudeSession.java
similarity index 98%
rename from src/main/java/com/github/claudecodegui/ClaudeSession.java
rename to src/main/java/com/github/claudecodegui/session/ClaudeSession.java
index 4f89c93b..e86d4ef6 100644
--- a/src/main/java/com/github/claudecodegui/ClaudeSession.java
+++ b/src/main/java/com/github/claudecodegui/session/ClaudeSession.java
@@ -1,15 +1,9 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.session;
import com.github.claudecodegui.permission.PermissionManager;
import com.github.claudecodegui.permission.PermissionRequest;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
import com.github.claudecodegui.provider.codex.CodexSDKBridge;
-import com.github.claudecodegui.session.SessionContextService;
-import com.github.claudecodegui.session.SessionCallbackFacade;
-import com.github.claudecodegui.session.SessionMessageOrchestrator;
-import com.github.claudecodegui.session.SessionProviderRouter;
-import com.github.claudecodegui.session.SessionSendService;
-import com.github.claudecodegui.session.SessionState;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/src/main/java/com/github/claudecodegui/session/CodexMessageHandler.java b/src/main/java/com/github/claudecodegui/session/CodexMessageHandler.java
index 0b8d8dfc..8b4c5249 100644
--- a/src/main/java/com/github/claudecodegui/session/CodexMessageHandler.java
+++ b/src/main/java/com/github/claudecodegui/session/CodexMessageHandler.java
@@ -2,7 +2,7 @@ package com.github.claudecodegui.session;
import com.github.claudecodegui.provider.common.MessageCallback;
import com.github.claudecodegui.provider.common.SDKResult;
-import com.github.claudecodegui.ClaudeSession.Message;
+import com.github.claudecodegui.session.ClaudeSession.Message;
import com.intellij.openapi.diagnostic.Logger;
/**
diff --git a/src/main/java/com/github/claudecodegui/session/MessageParser.java b/src/main/java/com/github/claudecodegui/session/MessageParser.java
index 46a87d13..2ddb334c 100644
--- a/src/main/java/com/github/claudecodegui/session/MessageParser.java
+++ b/src/main/java/com/github/claudecodegui/session/MessageParser.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionCallbackAdapter.java b/src/main/java/com/github/claudecodegui/session/SessionCallbackAdapter.java
index 77c58135..c39cc533 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionCallbackAdapter.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionCallbackAdapter.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.handler.PermissionHandler;
import com.github.claudecodegui.permission.PermissionRequest;
import com.github.claudecodegui.util.JsUtils;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionCallbackFacade.java b/src/main/java/com/github/claudecodegui/session/SessionCallbackFacade.java
index 027f6b4e..5d5df414 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionCallbackFacade.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionCallbackFacade.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.permission.PermissionRequest;
import com.intellij.openapi.project.Project;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionContextService.java b/src/main/java/com/github/claudecodegui/session/SessionContextService.java
index 5eb72298..04a4951c 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionContextService.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionContextService.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.service.RunConfigMonitorService;
import com.github.claudecodegui.terminal.TerminalMonitorService;
import com.google.gson.JsonArray;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionLifecycleManager.java b/src/main/java/com/github/claudecodegui/session/SessionLifecycleManager.java
index fb3384da..8f710c02 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionLifecycleManager.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionLifecycleManager.java
@@ -1,8 +1,8 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
-import com.github.claudecodegui.ClaudeSession;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.session.ClaudeSession;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.handler.SettingsHandler;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
diff --git a/src/main/java/com/github/claudecodegui/SessionLoadService.java b/src/main/java/com/github/claudecodegui/session/SessionLoadService.java
similarity index 97%
rename from src/main/java/com/github/claudecodegui/SessionLoadService.java
rename to src/main/java/com/github/claudecodegui/session/SessionLoadService.java
index d74ab298..27f8eb71 100644
--- a/src/main/java/com/github/claudecodegui/SessionLoadService.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionLoadService.java
@@ -1,4 +1,4 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.session;
/**
* Session load service (singleton).
diff --git a/src/main/java/com/github/claudecodegui/session/SessionMessageOrchestrator.java b/src/main/java/com/github/claudecodegui/session/SessionMessageOrchestrator.java
index 844ac97a..ad5a38b7 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionMessageOrchestrator.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionMessageOrchestrator.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.handler.SettingsHandler;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.util.TokenUsageUtils;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionSendService.java b/src/main/java/com/github/claudecodegui/session/SessionSendService.java
index 821436fa..572a2f77 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionSendService.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionSendService.java
@@ -1,7 +1,7 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.session.ClaudeSession;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.notifications.ClaudeNotifier;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
import com.github.claudecodegui.provider.codex.CodexSDKBridge;
diff --git a/src/main/java/com/github/claudecodegui/session/SessionState.java b/src/main/java/com/github/claudecodegui/session/SessionState.java
index c922a099..27ab0324 100644
--- a/src/main/java/com/github/claudecodegui/session/SessionState.java
+++ b/src/main/java/com/github/claudecodegui/session/SessionState.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/com/github/claudecodegui/session/StreamMessageCoalescer.java b/src/main/java/com/github/claudecodegui/session/StreamMessageCoalescer.java
index 29e4069b..f10a279f 100644
--- a/src/main/java/com/github/claudecodegui/session/StreamMessageCoalescer.java
+++ b/src/main/java/com/github/claudecodegui/session/StreamMessageCoalescer.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.util.JsUtils;
import com.github.claudecodegui.util.MessageJsonConverter;
diff --git a/src/main/java/com/github/claudecodegui/CodemossSettingsService.java b/src/main/java/com/github/claudecodegui/settings/CodemossSettingsService.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/CodemossSettingsService.java
rename to src/main/java/com/github/claudecodegui/settings/CodemossSettingsService.java
index c4fce5d4..5339b734 100644
--- a/src/main/java/com/github/claudecodegui/CodemossSettingsService.java
+++ b/src/main/java/com/github/claudecodegui/settings/CodemossSettingsService.java
@@ -1,9 +1,9 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.settings;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.model.ConflictStrategy;
import com.github.claudecodegui.model.DeleteResult;
import com.github.claudecodegui.model.PromptScope;
-import com.github.claudecodegui.settings.*;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
diff --git a/src/main/java/com/github/claudecodegui/settings/ProviderManager.java b/src/main/java/com/github/claudecodegui/settings/ProviderManager.java
index 3b86bd91..97835ce7 100644
--- a/src/main/java/com/github/claudecodegui/settings/ProviderManager.java
+++ b/src/main/java/com/github/claudecodegui/settings/ProviderManager.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.settings;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.bridge.NodeDetector;
import com.github.claudecodegui.model.DeleteResult;
import com.google.gson.Gson;
diff --git a/src/main/java/com/github/claudecodegui/CodexSkillService.java b/src/main/java/com/github/claudecodegui/skill/CodexSkillService.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/CodexSkillService.java
rename to src/main/java/com/github/claudecodegui/skill/CodexSkillService.java
index b46ee911..db1b9074 100644
--- a/src/main/java/com/github/claudecodegui/CodexSkillService.java
+++ b/src/main/java/com/github/claudecodegui/skill/CodexSkillService.java
@@ -1,7 +1,6 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.skill;
import com.github.claudecodegui.settings.CodexSettingsManager;
-import com.github.claudecodegui.skill.SkillFrontmatterParser;
import com.github.claudecodegui.util.PlatformUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
diff --git a/src/main/java/com/github/claudecodegui/SkillService.java b/src/main/java/com/github/claudecodegui/skill/SkillService.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/SkillService.java
rename to src/main/java/com/github/claudecodegui/skill/SkillService.java
index 34c143e1..e688f1df 100644
--- a/src/main/java/com/github/claudecodegui/SkillService.java
+++ b/src/main/java/com/github/claudecodegui/skill/SkillService.java
@@ -1,6 +1,5 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.skill;
-import com.github.claudecodegui.skill.SkillFrontmatterParser;
import com.github.claudecodegui.util.PlatformUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
diff --git a/src/main/java/com/github/claudecodegui/skill/SlashCommandRegistry.java b/src/main/java/com/github/claudecodegui/skill/SlashCommandRegistry.java
index cf7e421a..40559dc4 100644
--- a/src/main/java/com/github/claudecodegui/skill/SlashCommandRegistry.java
+++ b/src/main/java/com/github/claudecodegui/skill/SlashCommandRegistry.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.skill;
-import com.github.claudecodegui.CodexSkillService;
+import com.github.claudecodegui.skill.CodexSkillService;
import com.github.claudecodegui.util.PlatformUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
diff --git a/src/main/java/com/github/claudecodegui/ui/ChatWindowDelegate.java b/src/main/java/com/github/claudecodegui/ui/ChatWindowDelegate.java
index d44f7ee4..5fe6888a 100644
--- a/src/main/java/com/github/claudecodegui/ui/ChatWindowDelegate.java
+++ b/src/main/java/com/github/claudecodegui/ui/ChatWindowDelegate.java
@@ -1,8 +1,8 @@
package com.github.claudecodegui.ui;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
-import com.github.claudecodegui.ClaudeSession;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.session.ClaudeSession;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.handler.AgentHandler;
import com.github.claudecodegui.handler.ClipboardHandler;
import com.github.claudecodegui.handler.CodexMcpServerHandler;
diff --git a/src/main/java/com/github/claudecodegui/ui/EditorContextTracker.java b/src/main/java/com/github/claudecodegui/ui/EditorContextTracker.java
index c269d0e0..63f45cf4 100644
--- a/src/main/java/com/github/claudecodegui/ui/EditorContextTracker.java
+++ b/src/main/java/com/github/claudecodegui/ui/EditorContextTracker.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.ui;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.util.IgnoreRuleMatcher;
import com.github.claudecodegui.util.JsUtils;
import com.intellij.openapi.application.ApplicationManager;
diff --git a/src/main/java/com/github/claudecodegui/ui/ErrorPanelBuilder.java b/src/main/java/com/github/claudecodegui/ui/ErrorPanelBuilder.java
index 46a75e06..32c19b61 100644
--- a/src/main/java/com/github/claudecodegui/ui/ErrorPanelBuilder.java
+++ b/src/main/java/com/github/claudecodegui/ui/ErrorPanelBuilder.java
@@ -53,7 +53,7 @@ public class ErrorPanelBuilder {
bottomPanel.setBorder(BorderFactory.createEmptyBorder(10, 20, 20, 20));
bottomPanel.setBackground(new Color(30, 30, 30));
- JLabel nodeLabel = new JLabel(com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.nodePathLabel"));
+ JLabel nodeLabel = new JLabel(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.nodePathLabel"));
nodeLabel.setForeground(Color.WHITE);
nodeLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
@@ -74,7 +74,7 @@ public class ErrorPanelBuilder {
LOG.warn("Failed to preload Node.js path: " + e.getMessage());
}
- JButton saveAndRetryButton = new JButton(com.github.claudecodegui.ClaudeCodeGuiBundle.message("error.saveButton"));
+ JButton saveAndRetryButton = new JButton(com.github.claudecodegui.i18n.ClaudeCodeGuiBundle.message("error.saveButton"));
saveAndRetryButton.setAlignmentX(Component.LEFT_ALIGNMENT);
saveAndRetryButton.addActionListener(e -> {
String manualPath = nodeField.getText();
diff --git a/src/main/java/com/github/claudecodegui/ui/WebviewInitializer.java b/src/main/java/com/github/claudecodegui/ui/WebviewInitializer.java
index ab4c50cd..2b93b933 100644
--- a/src/main/java/com/github/claudecodegui/ui/WebviewInitializer.java
+++ b/src/main/java/com/github/claudecodegui/ui/WebviewInitializer.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.ui;
-import com.github.claudecodegui.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.bridge.NodeDetector;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
diff --git a/src/main/java/com/github/claudecodegui/DetachedChatFrame.java b/src/main/java/com/github/claudecodegui/ui/detached/DetachedChatFrame.java
similarity index 98%
rename from src/main/java/com/github/claudecodegui/DetachedChatFrame.java
rename to src/main/java/com/github/claudecodegui/ui/detached/DetachedChatFrame.java
index fd4a2ab5..5c0c0c37 100644
--- a/src/main/java/com/github/claudecodegui/DetachedChatFrame.java
+++ b/src/main/java/com/github/claudecodegui/ui/detached/DetachedChatFrame.java
@@ -1,5 +1,8 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.ui.detached;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
+import com.github.claudecodegui.ui.toolwindow.ClaudeSDKToolWindow;
import com.intellij.ide.ui.LafManagerListener;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/src/main/java/com/github/claudecodegui/DetachedWindowManager.java b/src/main/java/com/github/claudecodegui/ui/detached/DetachedWindowManager.java
similarity index 98%
rename from src/main/java/com/github/claudecodegui/DetachedWindowManager.java
rename to src/main/java/com/github/claudecodegui/ui/detached/DetachedWindowManager.java
index f24fd178..2d030ad0 100644
--- a/src/main/java/com/github/claudecodegui/DetachedWindowManager.java
+++ b/src/main/java/com/github/claudecodegui/ui/detached/DetachedWindowManager.java
@@ -1,5 +1,6 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.ui.detached;
+import com.github.claudecodegui.ui.toolwindow.ClaudeChatWindow;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/com/github/claudecodegui/ClaudeChatWindow.java b/src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeChatWindow.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/ClaudeChatWindow.java
rename to src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeChatWindow.java
index 1233c422..b1534ea4 100644
--- a/src/main/java/com/github/claudecodegui/ClaudeChatWindow.java
+++ b/src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeChatWindow.java
@@ -1,4 +1,4 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.ui.toolwindow;
import com.github.claudecodegui.action.SendShortcutSync;
import com.github.claudecodegui.handler.HandlerContext;
@@ -9,9 +9,12 @@ import com.github.claudecodegui.permission.PermissionService;
import com.github.claudecodegui.provider.claude.ClaudeSDKBridge;
import com.github.claudecodegui.provider.codex.CodexSDKBridge;
import com.github.claudecodegui.provider.common.MessageCallback;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.session.SessionCallbackAdapter;
import com.github.claudecodegui.session.SessionLifecycleManager;
+import com.github.claudecodegui.session.SessionLoadService;
import com.github.claudecodegui.session.StreamMessageCoalescer;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.ui.ChatWindowDelegate;
import com.github.claudecodegui.ui.EditorContextTracker;
import com.github.claudecodegui.ui.WebviewInitializer;
diff --git a/src/main/java/com/github/claudecodegui/ClaudeSDKToolWindow.java b/src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeSDKToolWindow.java
similarity index 98%
rename from src/main/java/com/github/claudecodegui/ClaudeSDKToolWindow.java
rename to src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeSDKToolWindow.java
index 366bb4f8..4e2f63a6 100644
--- a/src/main/java/com/github/claudecodegui/ClaudeSDKToolWindow.java
+++ b/src/main/java/com/github/claudecodegui/ui/toolwindow/ClaudeSDKToolWindow.java
@@ -1,7 +1,9 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.ui.toolwindow;
+import com.github.claudecodegui.i18n.ClaudeCodeGuiBundle;
import com.github.claudecodegui.settings.TabStateService;
import com.github.claudecodegui.startup.BridgePreloader;
+import com.github.claudecodegui.ui.detached.DetachedWindowManager;
import com.github.claudecodegui.util.PlatformUtils;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -112,14 +114,14 @@ public class ClaudeSDKToolWindow implements ToolWindowFactory, DumbAware {
* Mark a Content as being detached (moving to a floating window).
* This prevents the contentRemoved listener from disposing the associated ClaudeChatWindow.
*/
- static void markContentAsDetaching(Content content) {
+ public static void markContentAsDetaching(Content content) {
detachingContents.add(content);
}
/**
* Remove the detaching mark from a Content after the detach operation is complete.
*/
- static void unmarkContentAsDetaching(Content content) {
+ public static void unmarkContentAsDetaching(Content content) {
detachingContents.remove(content);
}
diff --git a/src/main/java/com/github/claudecodegui/CodeSnippetManager.java b/src/main/java/com/github/claudecodegui/ui/toolwindow/CodeSnippetManager.java
similarity index 99%
rename from src/main/java/com/github/claudecodegui/CodeSnippetManager.java
rename to src/main/java/com/github/claudecodegui/ui/toolwindow/CodeSnippetManager.java
index 0b4069a6..09ed3b09 100644
--- a/src/main/java/com/github/claudecodegui/CodeSnippetManager.java
+++ b/src/main/java/com/github/claudecodegui/ui/toolwindow/CodeSnippetManager.java
@@ -1,4 +1,4 @@
-package com.github.claudecodegui;
+package com.github.claudecodegui.ui.toolwindow;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/src/main/java/com/github/claudecodegui/util/MessageJsonConverter.java b/src/main/java/com/github/claudecodegui/util/MessageJsonConverter.java
index da176d1b..65933e73 100644
--- a/src/main/java/com/github/claudecodegui/util/MessageJsonConverter.java
+++ b/src/main/java/com/github/claudecodegui/util/MessageJsonConverter.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.util;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.handler.HandlerContext;
import com.github.claudecodegui.handler.SettingsHandler;
import com.google.gson.Gson;
diff --git a/src/main/java/com/github/claudecodegui/util/SoundNotificationService.java b/src/main/java/com/github/claudecodegui/util/SoundNotificationService.java
index dc6f145d..0d9c405f 100644
--- a/src/main/java/com/github/claudecodegui/util/SoundNotificationService.java
+++ b/src/main/java/com/github/claudecodegui/util/SoundNotificationService.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.util;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import javazoom.jl.decoder.JavaLayerException;
diff --git a/src/main/java/com/github/claudecodegui/util/TokenUsageUtils.java b/src/main/java/com/github/claudecodegui/util/TokenUsageUtils.java
index f37f3e20..51acd6b5 100644
--- a/src/main/java/com/github/claudecodegui/util/TokenUsageUtils.java
+++ b/src/main/java/com/github/claudecodegui/util/TokenUsageUtils.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.util;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.google.gson.JsonObject;
import java.util.List;
diff --git a/src/main/java/com/github/claudecodegui/watcher/PromptFileWatcher.java b/src/main/java/com/github/claudecodegui/watcher/PromptFileWatcher.java
index 933ee11a..e591fad0 100644
--- a/src/main/java/com/github/claudecodegui/watcher/PromptFileWatcher.java
+++ b/src/main/java/com/github/claudecodegui/watcher/PromptFileWatcher.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.watcher;
-import com.github.claudecodegui.CodemossSettingsService;
+import com.github.claudecodegui.settings.CodemossSettingsService;
import com.github.claudecodegui.model.PromptScope;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index fb42772e..547e7d9e 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -53,7 +53,7 @@
@@ -77,7 +77,7 @@
@@ -88,7 +88,7 @@
@@ -128,7 +128,7 @@
diff --git a/src/test/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridgeRefactorTest.java b/src/test/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridgeRefactorTest.java
index c410652b..9e35718a 100644
--- a/src/test/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridgeRefactorTest.java
+++ b/src/test/java/com/github/claudecodegui/provider/claude/ClaudeSDKBridgeRefactorTest.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.provider.claude;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.provider.common.MessageCallback;
import com.github.claudecodegui.provider.common.SDKResult;
import com.google.gson.Gson;
diff --git a/src/test/java/com/github/claudecodegui/session/SessionContextServiceTest.java b/src/test/java/com/github/claudecodegui/session/SessionContextServiceTest.java
index c610f72f..43df20c5 100644
--- a/src/test/java/com/github/claudecodegui/session/SessionContextServiceTest.java
+++ b/src/test/java/com/github/claudecodegui/session/SessionContextServiceTest.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.junit.Rule;
diff --git a/src/test/java/com/github/claudecodegui/session/SessionMessageOrchestratorTest.java b/src/test/java/com/github/claudecodegui/session/SessionMessageOrchestratorTest.java
index f3010741..a7db1705 100644
--- a/src/test/java/com/github/claudecodegui/session/SessionMessageOrchestratorTest.java
+++ b/src/test/java/com/github/claudecodegui/session/SessionMessageOrchestratorTest.java
@@ -1,6 +1,6 @@
package com.github.claudecodegui.session;
-import com.github.claudecodegui.ClaudeSession;
+import com.github.claudecodegui.session.ClaudeSession;
import com.github.claudecodegui.permission.PermissionRequest;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;