新增: 项目多工程系统(工程表+Git 状态查询+AI 工具)

一个项目可含多个工程(Module),每个工程是独立代码仓库,
有自己的目录、Git 地址和技术栈。单仓库项目退化:项目下
只有一个工程,用户无感工程概念。

数据层:
- project_modules 表(V34 迁移):工程名/目录/Git 地址/技术栈
- ProjectModuleRepo:完整 CRUD + 按项目列表(排序)

后端接口:
- 工程 CRUD:添加/更新/删除/列表
- Git 状态查询:实时跑 git 命令返回当前分支/改动文件/最近提交
  (10 秒超时,无 Git 仓库返回空状态)

创建项目适配:
- 新建项目时自动创建一个工程(目录=绑定路径,技术栈=探测结果)

AI 工具:
- list_project_modules:列出项目工程列表(AI 了解项目结构)

同时新增工程系统设计方案文档。
This commit is contained in:
lxy
2026-06-29 01:39:42 +08:00
parent 3c18dea45b
commit b72df78462
12 changed files with 1016 additions and 3 deletions
+21
View File
@@ -170,6 +170,27 @@ async fn create_with_binding(
updated_at: now,
};
state.projects.insert(record.clone()).await.map_err(err_str)?;
// 工程系统:创建项目时自动建一个工程(path = 绑定目录,stack = 探测结果)。
// 单仓库项目退化:项目下只有一个工程,用户无感工程概念。
// 多仓库场景用户后续可添加更多工程(add_project_module IPC)。
if let Some(ref module_path) = record.path {
let now_str = df_types::now_millis().to_string();
let module = df_storage::models::ProjectModuleRecord {
id: df_types::types::new_id(),
project_id: record.id.clone(),
name: record.name.clone(),
path: module_path.clone(),
git_url: None, // 探测 git remote 补充(失败为 None,不影响)
stack: record.stack.clone(), // 复用项目级技术栈探测结果
auto_detected: true, // 自动创建,重新探测时可覆盖
sort_order: 0,
created_at: now_str.clone(),
updated_at: now_str,
};
if let Err(e) = state.project_modules.insert(module).await {
tracing::warn!("创建项目时自动建工程失败(非阻断): {}", e);
}
}
// F-260620: 绑定目录变更后立即 reload 白名单(reload_allowed_dirs 读 projects.path 合并 persistent),
// 否则新绑定目录需重启/改 Settings 才生效 → AI 访问误弹窗(已绑定重复弹窗主因,agent3 问题5)
if record.path.is_some() {