新增: 初始化 DevFlow 项目仓库

Tauri 2 + Vue 3 + Vite 6 桌面应用,Rust workspace 含 13 个 crate
(df-ai / df-storage / df-workflow / df-core / df-execute 等)。
核心能力:AI 聊天 agentic 循环(工具调用+人工审批)、工作流引擎、
任务/想法/项目/阶段管理、可追溯性,及配套前端组件。
This commit is contained in:
2026-06-12 01:31:05 +08:00
commit 98393b4908
178 changed files with 27859 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
[package]
name = "df-project"
version = "0.1.0"
edition = "2021"
[dependencies]
df-core = { path = "../df-core" }
serde = { workspace = true }
serde_json = { workspace = true }
tokio = { workspace = true }
anyhow = { workspace = true }
chrono = { workspace = true }
tracing = { workspace = true }

View File

@@ -0,0 +1,52 @@
//! 项目上下文 — 项目运行时的环境与配置信息
use serde::{Deserialize, Serialize};
use df_core::types::ProjectId;
/// 项目上下文
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectContext {
/// 项目 ID
pub project_id: ProjectId,
/// 项目根目录(本地文件系统路径)
pub root_path: Option<String>,
/// Git 仓库 URL
pub repo_url: Option<String>,
/// 当前分支
pub current_branch: Option<String>,
/// 环境变量
pub env_vars: std::collections::HashMap<String, String>,
/// 技术栈
pub tech_stack: Vec<String>,
/// AI 上下文(项目相关的 AI 记忆)
pub ai_context: Option<AiContext>,
}
/// AI 上下文信息
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AiContext {
/// 项目摘要
pub summary: String,
/// 架构描述
pub architecture: Option<String>,
/// 关键决策记录
pub decisions: Vec<String>,
/// 最近修改摘要
pub recent_changes: Vec<String>,
}
impl ProjectContext {
/// 创建空上下文
pub fn new(project_id: ProjectId) -> Self {
Self {
project_id,
root_path: None,
repo_url: None,
current_branch: None,
env_vars: std::collections::HashMap::new(),
tech_stack: Vec::new(),
ai_context: None,
}
}
}

View File

@@ -0,0 +1,6 @@
//! df-project: 项目管理 — 项目创建、调度、上下文、时间线
pub mod context;
pub mod manager;
pub mod scheduler;
pub mod timeline;

View File

@@ -0,0 +1,84 @@
//! 项目管理器 — 项目的 CRUD 与生命周期管理
use serde::{Deserialize, Serialize};
use df_core::types::{IdeaId, Priority, ProjectId, ProjectStatus};
/// 项目实体
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Project {
/// 唯一 ID
pub id: ProjectId,
/// 项目名称
pub name: String,
/// 项目描述
pub description: String,
/// 当前状态
pub status: ProjectStatus,
/// 来源想法 ID可选如果是从想法晋升来的
pub idea_id: Option<IdeaId>,
/// 优先级
pub priority: Priority,
/// 标签
pub tags: Vec<String>,
/// 创建时间
pub created_at: chrono::DateTime<chrono::Utc>,
/// 更新时间
pub updated_at: chrono::DateTime<chrono::Utc>,
}
/// 创建项目的输入
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateProjectInput {
pub name: String,
pub description: String,
pub idea_id: Option<IdeaId>,
#[serde(default)]
pub priority: Priority,
#[serde(default)]
pub tags: Vec<String>,
}
/// 项目管理器
pub struct ProjectManager;
impl ProjectManager {
/// 创建新项目
///
/// TODO: 接入存储层持久化
pub fn create(input: CreateProjectInput) -> Project {
let now = chrono::Utc::now();
Project {
id: df_core::types::new_id(),
name: input.name,
description: input.description,
status: ProjectStatus::Planning,
idea_id: input.idea_id,
priority: input.priority,
tags: input.tags,
created_at: now,
updated_at: now,
}
}
/// 从想法创建项目
pub fn create_from_idea(name: String, description: String, idea_id: IdeaId) -> Project {
Self::create(CreateProjectInput {
name,
description,
idea_id: Some(idea_id),
priority: Priority::default(),
tags: Vec::new(),
})
}
/// 更新项目状态
///
/// TODO: 状态转换校验
pub fn transition_status(project: &mut Project, new_status: ProjectStatus) -> anyhow::Result<()> {
// TODO: 校验状态转换是否合法
project.status = new_status;
project.updated_at = chrono::Utc::now();
Ok(())
}
}

View File

@@ -0,0 +1,66 @@
//! 项目调度器 — 自动化任务分配与调度
use df_core::types::{ProjectId, TaskId};
/// 调度策略
#[derive(Debug, Clone, Copy)]
pub enum SchedulingStrategy {
/// FIFO先进先出
Fifo,
/// 按优先级调度
Priority,
/// 最短任务优先
ShortestFirst,
/// AI 智能调度
AiDriven,
}
/// 调度决策
#[derive(Debug, Clone)]
pub struct SchedulingDecision {
pub project_id: ProjectId,
pub task_order: Vec<TaskId>,
pub strategy: SchedulingStrategy,
}
/// 项目调度器
pub struct ProjectScheduler {
strategy: SchedulingStrategy,
}
impl ProjectScheduler {
/// 创建调度器
pub fn new(strategy: SchedulingStrategy) -> Self {
Self { strategy }
}
/// 为项目生成调度计划
///
/// TODO: 实现基于策略的调度算法
pub fn schedule(&self, project_id: &ProjectId) -> anyhow::Result<SchedulingDecision> {
match self.strategy {
SchedulingStrategy::Fifo => {
// TODO: 按创建时间排序
tracing::info!("FIFO 调度,项目: {}", project_id);
}
SchedulingStrategy::Priority => {
// TODO: 按优先级排序
tracing::info!("优先级调度,项目: {}", project_id);
}
SchedulingStrategy::ShortestFirst => {
// TODO: 按预估工作量排序
tracing::info!("最短任务优先调度,项目: {}", project_id);
}
SchedulingStrategy::AiDriven => {
// TODO: 接入 AI 进行智能调度
tracing::info!("AI 智能调度,项目: {}", project_id);
}
}
Ok(SchedulingDecision {
project_id: project_id.clone(),
task_order: Vec::new(),
strategy: self.strategy,
})
}
}

View File

@@ -0,0 +1,64 @@
//! 项目时间线 — 里程碑与进度追踪
use serde::{Deserialize, Serialize};
use df_core::types::ProjectId;
/// 里程碑
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Milestone {
/// 唯一 ID
pub id: String,
/// 所属项目 ID
pub project_id: ProjectId,
/// 里程碑名称
pub name: String,
/// 描述
pub description: String,
/// 计划完成时间
pub due_date: Option<chrono::DateTime<chrono::Utc>>,
/// 实际完成时间
pub completed_at: Option<chrono::DateTime<chrono::Utc>>,
/// 进度百分比 (0-100)
pub progress: u8,
/// 是否已完成
pub completed: bool,
}
/// 项目时间线
pub struct Timeline {
pub project_id: ProjectId,
pub milestones: Vec<Milestone>,
}
impl Timeline {
/// 创建空时间线
pub fn new(project_id: ProjectId) -> Self {
Self {
project_id,
milestones: Vec::new(),
}
}
/// 添加里程碑
pub fn add_milestone(&mut self, milestone: Milestone) {
self.milestones.push(milestone);
}
/// 计算整体进度
pub fn overall_progress(&self) -> f64 {
if self.milestones.is_empty() {
return 0.0;
}
let total: f64 = self.milestones.iter().map(|m| m.progress as f64).sum();
total / self.milestones.len() as f64
}
/// 获取下一个待完成的里程碑
pub fn next_milestone(&self) -> Option<&Milestone> {
self.milestones
.iter()
.filter(|m| !m.completed)
.min_by_key(|m| m.due_date)
}
}