feat: 工作空间切换校验 + 初始化检测 + 继承基础设置

新增功能:
- workspace:check IPC — 校验路径有效性 + 检测 4 个必需文件状态
- workspace:inheritFiles IPC — 从旧工作空间继承 SOUL/AGENTS/USERS 到新工作空间
- app:restart IPC — 渲染进程触发应用重启(app.relaunch + app.exit)

前端 WorkspaceSettings 改造:
- 选择文件夹后立即校验路径(是否存在、是否目录、4 个必需文件状态)
- 显示工作空间状态:
  · 新工作空间 → 提示将自动创建 4 个文件
  · 部分文件缺失 → 提示缺失文件将自动创建
  · 已有工作空间 → 提示将直接加载现有配置
- 继承选项:当切换到新工作空间时,可勾选继承 SOUL/AGENTS/USERS.md
  · MEMORY.md 不继承(记忆与工作空间项目上下文绑定)
  · 继承白名单:仅允许 SOUL.md、AGENTS.md、USERS.md(防路径遍历)
- 确认切换按钮 + 取消按钮
- 切换完成后弹出重启确认对话框(立即重启 / 稍后手动重启)

安全考虑:
- workspace:inheritFiles 使用文件名白名单,防止路径遍历攻击
- workspace:check 返回 resolvedPath,前端只展示不直接用于文件操作
- app:restart 延迟 200ms 让 IPC 响应先返回
This commit is contained in:
thzxx
2026-07-12 13:59:31 +08:00
parent aa13a98f63
commit 0363176215
4 changed files with 315 additions and 2 deletions
+26
View File
@@ -172,6 +172,31 @@ interface MetonaAppAPI {
openExternal: (url: string) => Promise<void>;
showItemInFolder: (path: string) => Promise<void>;
selectFolder: (defaultPath?: string) => Promise<{ canceled: boolean; path: string }>;
restart: () => Promise<{ success: boolean }>;
}
// ===== Workspace API =====
interface MetonaWorkspaceCheckResult {
valid: boolean;
path?: string;
exists?: boolean;
missingFiles?: string[];
isNewWorkspace?: boolean;
reason?: string;
}
interface MetonaWorkspaceInheritResult {
success: boolean;
inherited?: string[];
failed?: Array<{ file: string; error: string }>;
error?: string;
}
interface MetonaWorkspaceAPI {
check: (targetPath: string) => Promise<MetonaWorkspaceCheckResult>;
inheritFiles: (params: { targetPath: string; sourcePath: string; files: string[] }) =>
Promise<MetonaWorkspaceInheritResult>;
}
// ===== Toast API =====
@@ -312,6 +337,7 @@ interface MetonaBridge {
memory: MetonaMemoryAPI;
config: MetonaConfigAPI;
app: MetonaAppAPI;
workspace: MetonaWorkspaceAPI;
toast: MetonaToastAPI;
tools: MetonaToolsAPI;
data: MetonaDataAPI;