aifastdb-devplan 1.5.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/autopilot.d.ts +58 -0
- package/dist/autopilot.d.ts.map +1 -0
- package/dist/autopilot.js +250 -0
- package/dist/autopilot.js.map +1 -0
- package/dist/dev-plan-document-store.d.ts +15 -1
- package/dist/dev-plan-document-store.d.ts.map +1 -1
- package/dist/dev-plan-document-store.js +122 -0
- package/dist/dev-plan-document-store.js.map +1 -1
- package/dist/dev-plan-factory.d.ts +69 -3
- package/dist/dev-plan-factory.d.ts.map +1 -1
- package/dist/dev-plan-factory.js +113 -19
- package/dist/dev-plan-factory.js.map +1 -1
- package/dist/dev-plan-graph-store.d.ts +79 -1
- package/dist/dev-plan-graph-store.d.ts.map +1 -1
- package/dist/dev-plan-graph-store.js +420 -3
- package/dist/dev-plan-graph-store.js.map +1 -1
- package/dist/dev-plan-interface.d.ts +24 -1
- package/dist/dev-plan-interface.d.ts.map +1 -1
- package/dist/dev-plan-migrate.d.ts +1 -0
- package/dist/dev-plan-migrate.d.ts.map +1 -1
- package/dist/dev-plan-migrate.js +28 -2
- package/dist/dev-plan-migrate.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +397 -4
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/types.d.ts +160 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -1
- package/dist/types.js.map +1 -1
- package/dist/visualize/graph-canvas/api-compat.d.ts +20 -0
- package/dist/visualize/graph-canvas/api-compat.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/api-compat.js +344 -0
- package/dist/visualize/graph-canvas/api-compat.js.map +1 -0
- package/dist/visualize/graph-canvas/clusterer.d.ts +16 -0
- package/dist/visualize/graph-canvas/clusterer.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/clusterer.js +460 -0
- package/dist/visualize/graph-canvas/clusterer.js.map +1 -0
- package/dist/visualize/graph-canvas/core.d.ts +11 -0
- package/dist/visualize/graph-canvas/core.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/core.js +1136 -0
- package/dist/visualize/graph-canvas/core.js.map +1 -0
- package/dist/visualize/graph-canvas/index.d.ts +22 -0
- package/dist/visualize/graph-canvas/index.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/index.js +69 -0
- package/dist/visualize/graph-canvas/index.js.map +1 -0
- package/dist/visualize/graph-canvas/interaction.d.ts +13 -0
- package/dist/visualize/graph-canvas/interaction.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/interaction.js +457 -0
- package/dist/visualize/graph-canvas/interaction.js.map +1 -0
- package/dist/visualize/graph-canvas/layout-worker.d.ts +17 -0
- package/dist/visualize/graph-canvas/layout-worker.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/layout-worker.js +577 -0
- package/dist/visualize/graph-canvas/layout-worker.js.map +1 -0
- package/dist/visualize/graph-canvas/lod.d.ts +10 -0
- package/dist/visualize/graph-canvas/lod.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/lod.js +111 -0
- package/dist/visualize/graph-canvas/lod.js.map +1 -0
- package/dist/visualize/graph-canvas/renderer.d.ts +12 -0
- package/dist/visualize/graph-canvas/renderer.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/renderer.js +813 -0
- package/dist/visualize/graph-canvas/renderer.js.map +1 -0
- package/dist/visualize/graph-canvas/spatial-index.d.ts +13 -0
- package/dist/visualize/graph-canvas/spatial-index.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/spatial-index.js +482 -0
- package/dist/visualize/graph-canvas/spatial-index.js.map +1 -0
- package/dist/visualize/graph-canvas/styles.d.ts +11 -0
- package/dist/visualize/graph-canvas/styles.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/styles.js +152 -0
- package/dist/visualize/graph-canvas/styles.js.map +1 -0
- package/dist/visualize/graph-canvas/viewport.d.ts +17 -0
- package/dist/visualize/graph-canvas/viewport.d.ts.map +1 -0
- package/dist/visualize/graph-canvas/viewport.js +385 -0
- package/dist/visualize/graph-canvas/viewport.js.map +1 -0
- package/dist/visualize/server.js +737 -7
- package/dist/visualize/server.js.map +1 -1
- package/dist/visualize/template-core.d.ts +9 -0
- package/dist/visualize/template-core.d.ts.map +1 -0
- package/dist/visualize/template-core.js +714 -0
- package/dist/visualize/template-core.js.map +1 -0
- package/dist/visualize/template-data-loading.d.ts +7 -0
- package/dist/visualize/template-data-loading.d.ts.map +1 -0
- package/dist/visualize/template-data-loading.js +677 -0
- package/dist/visualize/template-data-loading.js.map +1 -0
- package/dist/visualize/template-detail-panel.d.ts +14 -0
- package/dist/visualize/template-detail-panel.d.ts.map +1 -0
- package/dist/visualize/template-detail-panel.js +553 -0
- package/dist/visualize/template-detail-panel.js.map +1 -0
- package/dist/visualize/template-graph-3d.d.ts +7 -0
- package/dist/visualize/template-graph-3d.d.ts.map +1 -0
- package/dist/visualize/template-graph-3d.js +1112 -0
- package/dist/visualize/template-graph-3d.js.map +1 -0
- package/dist/visualize/template-graph-vis.d.ts +8 -0
- package/dist/visualize/template-graph-vis.d.ts.map +1 -0
- package/dist/visualize/template-graph-vis.js +1204 -0
- package/dist/visualize/template-graph-vis.js.map +1 -0
- package/dist/visualize/template-html.d.ts +9 -0
- package/dist/visualize/template-html.d.ts.map +1 -0
- package/dist/visualize/template-html.js +484 -0
- package/dist/visualize/template-html.js.map +1 -0
- package/dist/visualize/template-pages.d.ts +7 -0
- package/dist/visualize/template-pages.d.ts.map +1 -0
- package/dist/visualize/template-pages.js +806 -0
- package/dist/visualize/template-pages.js.map +1 -0
- package/dist/visualize/template-stats-modal.d.ts +7 -0
- package/dist/visualize/template-stats-modal.d.ts.map +1 -0
- package/dist/visualize/template-stats-modal.js +406 -0
- package/dist/visualize/template-stats-modal.js.map +1 -0
- package/dist/visualize/template-styles.d.ts +9 -0
- package/dist/visualize/template-styles.d.ts.map +1 -0
- package/dist/visualize/template-styles.js +487 -0
- package/dist/visualize/template-styles.js.map +1 -0
- package/dist/visualize/template.d.ts +14 -3
- package/dist/visualize/template.d.ts.map +1 -1
- package/dist/visualize/template.js +38 -2889
- package/dist/visualize/template.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot 核心逻辑模块
|
|
3
|
+
*
|
|
4
|
+
* 提供 getAutopilotStatus() 和 getAutopilotNextAction() 两个核心函数,
|
|
5
|
+
* 供 HTTP API(visualize/server.ts)和 MCP 工具(mcp-server/index.ts)共用。
|
|
6
|
+
*
|
|
7
|
+
* 设计原则:
|
|
8
|
+
* - 纯逻辑函数,接收 IDevPlanStore 实例,不涉及 HTTP/MCP 传输层
|
|
9
|
+
* - 无副作用(读取任务状态,不修改)
|
|
10
|
+
* - 返回强类型结构,调用方直接 JSON.stringify 即可
|
|
11
|
+
*/
|
|
12
|
+
import type { IDevPlanStore } from './dev-plan-interface';
|
|
13
|
+
import type { AutopilotStatus, AutopilotNextAction, AutopilotConfig, ExecutorHeartbeat } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* 获取 Autopilot 执行状态
|
|
16
|
+
*
|
|
17
|
+
* 分析项目的任务状态,返回:
|
|
18
|
+
* - 是否有进行中的阶段
|
|
19
|
+
* - 当前活跃阶段的进度
|
|
20
|
+
* - 当前进行中的子任务
|
|
21
|
+
* - 下一个待执行的子任务
|
|
22
|
+
* - 下一个待启动的阶段
|
|
23
|
+
* - 剩余未完成阶段数
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAutopilotStatus(store: IDevPlanStore): AutopilotStatus;
|
|
26
|
+
/**
|
|
27
|
+
* 智能推荐下一步动作
|
|
28
|
+
*
|
|
29
|
+
* 决策逻辑(优先级从高到低):
|
|
30
|
+
* 1. 所有阶段已完成 → all_done
|
|
31
|
+
* 2. 有活跃阶段 + 有 in_progress 子任务 → wait(AI 正在工作)
|
|
32
|
+
* 3. 有活跃阶段 + 有 pending 子任务 → send_task(发送下一个子任务)
|
|
33
|
+
* 4. 有活跃阶段 + 全部子任务完成 → start_phase(启动下一个阶段)
|
|
34
|
+
* 5. 无活跃阶段 + 有 pending 阶段 → start_phase(启动第一个待开始阶段)
|
|
35
|
+
* 6. 无活跃阶段 + 无 pending 阶段 → all_done
|
|
36
|
+
*/
|
|
37
|
+
export declare function getAutopilotNextAction(store: IDevPlanStore): AutopilotNextAction;
|
|
38
|
+
/**
|
|
39
|
+
* 获取项目的 Autopilot 配置
|
|
40
|
+
*/
|
|
41
|
+
export declare function getAutopilotConfig(projectName: string): AutopilotConfig;
|
|
42
|
+
/**
|
|
43
|
+
* 更新项目的 Autopilot 配置(合并更新)
|
|
44
|
+
*/
|
|
45
|
+
export declare function updateAutopilotConfig(projectName: string, updates: Partial<AutopilotConfig>): AutopilotConfig;
|
|
46
|
+
/**
|
|
47
|
+
* 记录 executor 心跳
|
|
48
|
+
*/
|
|
49
|
+
export declare function recordHeartbeat(projectName: string, heartbeat: ExecutorHeartbeat): void;
|
|
50
|
+
/**
|
|
51
|
+
* 获取最近的心跳信息
|
|
52
|
+
*/
|
|
53
|
+
export declare function getLastHeartbeat(projectName: string): {
|
|
54
|
+
heartbeat: ExecutorHeartbeat | null;
|
|
55
|
+
receivedAt: number;
|
|
56
|
+
isAlive: boolean;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=autopilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../src/autopilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EAClB,MAAM,SAAS,CAAC;AA+BjB;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CA2DxE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,CAwGhF;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAEvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,eAAe,CAIjB;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAIvF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG;IACrD,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAWA"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Autopilot 核心逻辑模块
|
|
4
|
+
*
|
|
5
|
+
* 提供 getAutopilotStatus() 和 getAutopilotNextAction() 两个核心函数,
|
|
6
|
+
* 供 HTTP API(visualize/server.ts)和 MCP 工具(mcp-server/index.ts)共用。
|
|
7
|
+
*
|
|
8
|
+
* 设计原则:
|
|
9
|
+
* - 纯逻辑函数,接收 IDevPlanStore 实例,不涉及 HTTP/MCP 传输层
|
|
10
|
+
* - 无副作用(读取任务状态,不修改)
|
|
11
|
+
* - 返回强类型结构,调用方直接 JSON.stringify 即可
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getAutopilotStatus = getAutopilotStatus;
|
|
15
|
+
exports.getAutopilotNextAction = getAutopilotNextAction;
|
|
16
|
+
exports.getAutopilotConfig = getAutopilotConfig;
|
|
17
|
+
exports.updateAutopilotConfig = updateAutopilotConfig;
|
|
18
|
+
exports.recordHeartbeat = recordHeartbeat;
|
|
19
|
+
exports.getLastHeartbeat = getLastHeartbeat;
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
const runtimeMap = new Map();
|
|
22
|
+
function getRuntime(projectName) {
|
|
23
|
+
if (!runtimeMap.has(projectName)) {
|
|
24
|
+
runtimeMap.set(projectName, {
|
|
25
|
+
config: { ...types_1.DEFAULT_AUTOPILOT_CONFIG },
|
|
26
|
+
lastHeartbeat: null,
|
|
27
|
+
lastHeartbeatTime: 0,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return runtimeMap.get(projectName);
|
|
31
|
+
}
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Core Logic: getAutopilotStatus
|
|
34
|
+
// ============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* 获取 Autopilot 执行状态
|
|
37
|
+
*
|
|
38
|
+
* 分析项目的任务状态,返回:
|
|
39
|
+
* - 是否有进行中的阶段
|
|
40
|
+
* - 当前活跃阶段的进度
|
|
41
|
+
* - 当前进行中的子任务
|
|
42
|
+
* - 下一个待执行的子任务
|
|
43
|
+
* - 下一个待启动的阶段
|
|
44
|
+
* - 剩余未完成阶段数
|
|
45
|
+
*/
|
|
46
|
+
function getAutopilotStatus(store) {
|
|
47
|
+
const progress = store.getProgress();
|
|
48
|
+
const tasks = progress.tasks;
|
|
49
|
+
// 找到 in_progress 状态的主任务(活跃阶段)
|
|
50
|
+
const activePhaseProgress = tasks.find(t => t.status === 'in_progress');
|
|
51
|
+
// 剩余未完成阶段(pending + in_progress)
|
|
52
|
+
const remainingPhases = tasks.filter(t => t.status !== 'completed' && t.status !== 'cancelled').length;
|
|
53
|
+
const result = {
|
|
54
|
+
hasActivePhase: !!activePhaseProgress,
|
|
55
|
+
remainingPhases,
|
|
56
|
+
};
|
|
57
|
+
if (activePhaseProgress) {
|
|
58
|
+
result.activePhase = {
|
|
59
|
+
taskId: activePhaseProgress.taskId,
|
|
60
|
+
title: activePhaseProgress.title,
|
|
61
|
+
totalSubtasks: activePhaseProgress.total,
|
|
62
|
+
completedSubtasks: activePhaseProgress.completed,
|
|
63
|
+
percent: activePhaseProgress.percent,
|
|
64
|
+
};
|
|
65
|
+
// 获取活跃阶段的子任务列表
|
|
66
|
+
const subTasks = store.listSubTasks(activePhaseProgress.taskId);
|
|
67
|
+
// 当前 in_progress 的子任务
|
|
68
|
+
const currentSub = subTasks.find(s => s.status === 'in_progress');
|
|
69
|
+
if (currentSub) {
|
|
70
|
+
result.currentSubTask = {
|
|
71
|
+
taskId: currentSub.taskId,
|
|
72
|
+
title: currentSub.title,
|
|
73
|
+
status: currentSub.status,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// 下一个 pending 的子任务
|
|
77
|
+
const nextPending = subTasks.find(s => s.status === 'pending');
|
|
78
|
+
if (nextPending) {
|
|
79
|
+
result.nextPendingSubTask = {
|
|
80
|
+
taskId: nextPending.taskId,
|
|
81
|
+
title: nextPending.title,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 下一个待启动的阶段(pending 状态,按 order 排序取第一个)
|
|
86
|
+
const nextPendingPhaseProgress = tasks.find(t => t.status === 'pending');
|
|
87
|
+
if (nextPendingPhaseProgress) {
|
|
88
|
+
const mainTask = store.getMainTask(nextPendingPhaseProgress.taskId);
|
|
89
|
+
result.nextPendingPhase = {
|
|
90
|
+
taskId: nextPendingPhaseProgress.taskId,
|
|
91
|
+
title: nextPendingPhaseProgress.title,
|
|
92
|
+
priority: mainTask?.priority || 'P0',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Core Logic: getAutopilotNextAction
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* 智能推荐下一步动作
|
|
102
|
+
*
|
|
103
|
+
* 决策逻辑(优先级从高到低):
|
|
104
|
+
* 1. 所有阶段已完成 → all_done
|
|
105
|
+
* 2. 有活跃阶段 + 有 in_progress 子任务 → wait(AI 正在工作)
|
|
106
|
+
* 3. 有活跃阶段 + 有 pending 子任务 → send_task(发送下一个子任务)
|
|
107
|
+
* 4. 有活跃阶段 + 全部子任务完成 → start_phase(启动下一个阶段)
|
|
108
|
+
* 5. 无活跃阶段 + 有 pending 阶段 → start_phase(启动第一个待开始阶段)
|
|
109
|
+
* 6. 无活跃阶段 + 无 pending 阶段 → all_done
|
|
110
|
+
*/
|
|
111
|
+
function getAutopilotNextAction(store) {
|
|
112
|
+
const status = getAutopilotStatus(store);
|
|
113
|
+
const progress = store.getProgress();
|
|
114
|
+
const tasks = progress.tasks;
|
|
115
|
+
// Case 1: 所有阶段已完成
|
|
116
|
+
if (status.remainingPhases === 0) {
|
|
117
|
+
return {
|
|
118
|
+
action: 'all_done',
|
|
119
|
+
message: `项目所有 ${tasks.length} 个阶段已全部完成!`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Case 2~4: 有活跃阶段
|
|
123
|
+
if (status.hasActivePhase && status.activePhase) {
|
|
124
|
+
const phase = status.activePhase;
|
|
125
|
+
const subTasks = store.listSubTasks(phase.taskId);
|
|
126
|
+
// 有 in_progress 子任务 → wait
|
|
127
|
+
if (status.currentSubTask) {
|
|
128
|
+
return {
|
|
129
|
+
action: 'wait',
|
|
130
|
+
phase: {
|
|
131
|
+
taskId: phase.taskId,
|
|
132
|
+
title: phase.title,
|
|
133
|
+
status: 'in_progress',
|
|
134
|
+
totalSubtasks: phase.totalSubtasks,
|
|
135
|
+
completedSubtasks: phase.completedSubtasks,
|
|
136
|
+
},
|
|
137
|
+
subTask: {
|
|
138
|
+
taskId: status.currentSubTask.taskId,
|
|
139
|
+
title: status.currentSubTask.title,
|
|
140
|
+
status: status.currentSubTask.status,
|
|
141
|
+
},
|
|
142
|
+
message: `${status.currentSubTask.taskId} — ${status.currentSubTask.title} 正在执行中,等待完成`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// 有 pending 子任务 → send_task
|
|
146
|
+
const nextPending = subTasks.find(s => s.status === 'pending');
|
|
147
|
+
if (nextPending) {
|
|
148
|
+
return {
|
|
149
|
+
action: 'send_task',
|
|
150
|
+
phase: {
|
|
151
|
+
taskId: phase.taskId,
|
|
152
|
+
title: phase.title,
|
|
153
|
+
status: 'in_progress',
|
|
154
|
+
totalSubtasks: phase.totalSubtasks,
|
|
155
|
+
completedSubtasks: phase.completedSubtasks,
|
|
156
|
+
},
|
|
157
|
+
subTask: {
|
|
158
|
+
taskId: nextPending.taskId,
|
|
159
|
+
title: nextPending.title,
|
|
160
|
+
description: nextPending.description,
|
|
161
|
+
status: nextPending.status,
|
|
162
|
+
},
|
|
163
|
+
message: `当前阶段有 ${phase.totalSubtasks - phase.completedSubtasks} 个待完成子任务,下一个: ${nextPending.taskId} — ${nextPending.title}`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// 活跃阶段的子任务全部完成 → 查找下一个阶段
|
|
167
|
+
const nextPhase = tasks.find(t => t.status === 'pending');
|
|
168
|
+
if (nextPhase) {
|
|
169
|
+
return {
|
|
170
|
+
action: 'start_phase',
|
|
171
|
+
phase: {
|
|
172
|
+
taskId: nextPhase.taskId,
|
|
173
|
+
title: nextPhase.title,
|
|
174
|
+
status: 'pending',
|
|
175
|
+
totalSubtasks: nextPhase.total,
|
|
176
|
+
completedSubtasks: nextPhase.completed,
|
|
177
|
+
},
|
|
178
|
+
message: `${phase.taskId} 全部子任务已完成,建议启动下一阶段: ${nextPhase.taskId} — ${nextPhase.title}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// 无更多阶段
|
|
182
|
+
return {
|
|
183
|
+
action: 'all_done',
|
|
184
|
+
message: `${phase.taskId} 全部子任务已完成,且无更多待启动阶段。项目开发完毕!`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Case 5: 无活跃阶段 + 有 pending 阶段
|
|
188
|
+
if (status.nextPendingPhase) {
|
|
189
|
+
const nextPhase = tasks.find(t => t.taskId === status.nextPendingPhase.taskId);
|
|
190
|
+
return {
|
|
191
|
+
action: 'start_phase',
|
|
192
|
+
phase: {
|
|
193
|
+
taskId: status.nextPendingPhase.taskId,
|
|
194
|
+
title: status.nextPendingPhase.title,
|
|
195
|
+
status: 'pending',
|
|
196
|
+
totalSubtasks: nextPhase?.total || 0,
|
|
197
|
+
completedSubtasks: nextPhase?.completed || 0,
|
|
198
|
+
},
|
|
199
|
+
message: `无进行中阶段,建议启动: ${status.nextPendingPhase.taskId} — ${status.nextPendingPhase.title}`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// Case 6: 全部完成
|
|
203
|
+
return {
|
|
204
|
+
action: 'all_done',
|
|
205
|
+
message: `项目所有阶段已全部完成!`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Config Management
|
|
210
|
+
// ============================================================================
|
|
211
|
+
/**
|
|
212
|
+
* 获取项目的 Autopilot 配置
|
|
213
|
+
*/
|
|
214
|
+
function getAutopilotConfig(projectName) {
|
|
215
|
+
return { ...getRuntime(projectName).config };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 更新项目的 Autopilot 配置(合并更新)
|
|
219
|
+
*/
|
|
220
|
+
function updateAutopilotConfig(projectName, updates) {
|
|
221
|
+
const runtime = getRuntime(projectName);
|
|
222
|
+
runtime.config = { ...runtime.config, ...updates };
|
|
223
|
+
return { ...runtime.config };
|
|
224
|
+
}
|
|
225
|
+
// ============================================================================
|
|
226
|
+
// Heartbeat Management
|
|
227
|
+
// ============================================================================
|
|
228
|
+
/**
|
|
229
|
+
* 记录 executor 心跳
|
|
230
|
+
*/
|
|
231
|
+
function recordHeartbeat(projectName, heartbeat) {
|
|
232
|
+
const runtime = getRuntime(projectName);
|
|
233
|
+
runtime.lastHeartbeat = heartbeat;
|
|
234
|
+
runtime.lastHeartbeatTime = Date.now();
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 获取最近的心跳信息
|
|
238
|
+
*/
|
|
239
|
+
function getLastHeartbeat(projectName) {
|
|
240
|
+
const runtime = getRuntime(projectName);
|
|
241
|
+
const timeoutMs = runtime.config.pollIntervalSeconds * 3 * 1000; // 3 倍轮询间隔视为超时
|
|
242
|
+
const isAlive = runtime.lastHeartbeat !== null &&
|
|
243
|
+
(Date.now() - runtime.lastHeartbeatTime) < timeoutMs;
|
|
244
|
+
return {
|
|
245
|
+
heartbeat: runtime.lastHeartbeat,
|
|
246
|
+
receivedAt: runtime.lastHeartbeatTime,
|
|
247
|
+
isAlive,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=autopilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../src/autopilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - Append-only 存储,更新通过 delete + put 实现
|
|
11
11
|
*/
|
|
12
12
|
import type { IDevPlanStore } from './dev-plan-interface';
|
|
13
|
-
import type { DevPlanSection, DevPlanDocInput, DevPlanDoc, MainTaskInput, MainTask, SubTaskInput, SubTask, CompleteSubTaskResult, ProjectProgress, ModuleInput, Module, ModuleDetail, ModuleStatus, TaskStatus, TaskPriority, SyncGitResult, DevPlanStoreConfig, DevPlanExportedGraph } from './types';
|
|
13
|
+
import type { DevPlanSection, DevPlanDocInput, DevPlanDoc, MainTaskInput, MainTask, SubTaskInput, SubTask, CompleteSubTaskResult, ProjectProgress, ModuleInput, Module, ModuleDetail, ModuleStatus, TaskStatus, TaskPriority, SyncGitResult, DevPlanStoreConfig, DevPlanExportedGraph, PromptInput, Prompt } from './types';
|
|
14
14
|
/**
|
|
15
15
|
* 基于 EnhancedDocumentStore 的开发计划存储
|
|
16
16
|
*
|
|
@@ -18,12 +18,16 @@ import type { DevPlanSection, DevPlanDocInput, DevPlanDoc, MainTaskInput, MainTa
|
|
|
18
18
|
* - docStore: 文档片段 (Markdown 内容)
|
|
19
19
|
* - taskStore: 任务 (主任务 + 子任务层级)
|
|
20
20
|
* - moduleStore: 功能模块
|
|
21
|
+
* - promptStore: Prompt 日志
|
|
21
22
|
*/
|
|
22
23
|
export declare class DevPlanDocumentStore implements IDevPlanStore {
|
|
23
24
|
private docStore;
|
|
24
25
|
private taskStore;
|
|
25
26
|
private moduleStore;
|
|
27
|
+
private promptStore;
|
|
26
28
|
private projectName;
|
|
29
|
+
/** Git 操作的工作目录(多项目路由时指向项目根目录) */
|
|
30
|
+
private gitCwd;
|
|
27
31
|
constructor(projectName: string, config: DevPlanStoreConfig);
|
|
28
32
|
/**
|
|
29
33
|
* 保存文档片段
|
|
@@ -199,6 +203,16 @@ export declare class DevPlanDocumentStore implements IDevPlanStore {
|
|
|
199
203
|
* 获取模块详情 — 包含关联的任务和文档
|
|
200
204
|
*/
|
|
201
205
|
getModuleDetail(moduleId: string): ModuleDetail | null;
|
|
206
|
+
savePrompt(input: PromptInput): Prompt;
|
|
207
|
+
listPrompts(filter?: {
|
|
208
|
+
date?: string;
|
|
209
|
+
relatedTaskId?: string;
|
|
210
|
+
limit?: number;
|
|
211
|
+
}): Prompt[];
|
|
212
|
+
/**
|
|
213
|
+
* 将 DocumentStore 文档转为 Prompt 对象
|
|
214
|
+
*/
|
|
215
|
+
private docToPrompt;
|
|
202
216
|
/**
|
|
203
217
|
* 将存储的更改刷到磁盘
|
|
204
218
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-plan-document-store.d.ts","sourceRoot":"","sources":["../src/dev-plan-document-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,UAAU,EACV,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,eAAe,EAEf,WAAW,EACX,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAClB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"dev-plan-document-store.d.ts","sourceRoot":"","sources":["../src/dev-plan-document-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,13 +45,16 @@ function sectionImportance(section) {
|
|
|
45
45
|
* - docStore: 文档片段 (Markdown 内容)
|
|
46
46
|
* - taskStore: 任务 (主任务 + 子任务层级)
|
|
47
47
|
* - moduleStore: 功能模块
|
|
48
|
+
* - promptStore: Prompt 日志
|
|
48
49
|
*/
|
|
49
50
|
class DevPlanDocumentStore {
|
|
50
51
|
constructor(projectName, config) {
|
|
51
52
|
this.projectName = projectName;
|
|
53
|
+
this.gitCwd = config.gitCwd;
|
|
52
54
|
this.docStore = new aifastdb_1.EnhancedDocumentStore(config.documentPath, (0, aifastdb_1.documentStoreProductionConfig)());
|
|
53
55
|
this.taskStore = new aifastdb_1.EnhancedDocumentStore(config.taskPath, (0, aifastdb_1.documentStoreProductionConfig)());
|
|
54
56
|
this.moduleStore = new aifastdb_1.EnhancedDocumentStore(config.modulePath, (0, aifastdb_1.documentStoreProductionConfig)());
|
|
57
|
+
this.promptStore = new aifastdb_1.EnhancedDocumentStore(config.promptPath, (0, aifastdb_1.documentStoreProductionConfig)());
|
|
55
58
|
}
|
|
56
59
|
// ==========================================================================
|
|
57
60
|
// Document Section Operations
|
|
@@ -1123,6 +1126,122 @@ class DevPlanDocumentStore {
|
|
|
1123
1126
|
return { module: mod, mainTasks, subTasks, documents };
|
|
1124
1127
|
}
|
|
1125
1128
|
// ==========================================================================
|
|
1129
|
+
// Prompt Operations (Prompt 日志)
|
|
1130
|
+
// ==========================================================================
|
|
1131
|
+
savePrompt(input) {
|
|
1132
|
+
const now = Date.now();
|
|
1133
|
+
const today = new Date(now).toISOString().slice(0, 10); // YYYY-MM-DD
|
|
1134
|
+
// 获取当天已有 prompt 数量,分配自增序号
|
|
1135
|
+
const existingToday = this.listPrompts({ date: today });
|
|
1136
|
+
const promptIndex = existingToday.length + 1;
|
|
1137
|
+
const promptData = {
|
|
1138
|
+
content: input.content,
|
|
1139
|
+
aiInterpretation: input.aiInterpretation || '',
|
|
1140
|
+
summary: input.summary || '',
|
|
1141
|
+
relatedTaskId: input.relatedTaskId || null,
|
|
1142
|
+
};
|
|
1143
|
+
const tags = [
|
|
1144
|
+
`plan:${this.projectName}`,
|
|
1145
|
+
'type:prompt',
|
|
1146
|
+
`date:${today}`,
|
|
1147
|
+
];
|
|
1148
|
+
// 关联主任务 tag
|
|
1149
|
+
if (input.relatedTaskId) {
|
|
1150
|
+
tags.push(`task:${input.relatedTaskId}`);
|
|
1151
|
+
}
|
|
1152
|
+
// 用户自定义 tags
|
|
1153
|
+
if (input.tags?.length) {
|
|
1154
|
+
for (const t of input.tags) {
|
|
1155
|
+
tags.push(`custom:${t}`);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
const docInput = {
|
|
1159
|
+
content: JSON.stringify(promptData),
|
|
1160
|
+
contentType: aifastdb_1.ContentType.Text,
|
|
1161
|
+
tags,
|
|
1162
|
+
metadata: {
|
|
1163
|
+
projectName: this.projectName,
|
|
1164
|
+
promptIndex,
|
|
1165
|
+
date: today,
|
|
1166
|
+
relatedTaskId: input.relatedTaskId || null,
|
|
1167
|
+
tags: input.tags || [],
|
|
1168
|
+
createdAt: now,
|
|
1169
|
+
},
|
|
1170
|
+
importance: 0.5,
|
|
1171
|
+
};
|
|
1172
|
+
const id = this.promptStore.put(docInput);
|
|
1173
|
+
this.promptStore.flush();
|
|
1174
|
+
return {
|
|
1175
|
+
id,
|
|
1176
|
+
projectName: this.projectName,
|
|
1177
|
+
promptIndex,
|
|
1178
|
+
content: input.content,
|
|
1179
|
+
aiInterpretation: input.aiInterpretation,
|
|
1180
|
+
summary: input.summary,
|
|
1181
|
+
relatedTaskId: input.relatedTaskId,
|
|
1182
|
+
tags: input.tags || [],
|
|
1183
|
+
createdAt: now,
|
|
1184
|
+
};
|
|
1185
|
+
}
|
|
1186
|
+
listPrompts(filter) {
|
|
1187
|
+
let docs;
|
|
1188
|
+
if (filter?.relatedTaskId) {
|
|
1189
|
+
// 按关联任务查询
|
|
1190
|
+
docs = this.promptStore.findByTag(`task:${filter.relatedTaskId}`)
|
|
1191
|
+
.filter((doc) => doc.tags.includes(`plan:${this.projectName}`) &&
|
|
1192
|
+
doc.tags.includes('type:prompt'));
|
|
1193
|
+
}
|
|
1194
|
+
else if (filter?.date) {
|
|
1195
|
+
// 按日期查询
|
|
1196
|
+
docs = this.promptStore.findByTag(`date:${filter.date}`)
|
|
1197
|
+
.filter((doc) => doc.tags.includes(`plan:${this.projectName}`) &&
|
|
1198
|
+
doc.tags.includes('type:prompt'));
|
|
1199
|
+
}
|
|
1200
|
+
else {
|
|
1201
|
+
// 全量查询
|
|
1202
|
+
docs = this.promptStore.findByTag(`plan:${this.projectName}`)
|
|
1203
|
+
.filter((doc) => doc.tags.includes('type:prompt'));
|
|
1204
|
+
}
|
|
1205
|
+
// 去重(保留最新)
|
|
1206
|
+
const latestMap = new Map();
|
|
1207
|
+
for (const doc of docs) {
|
|
1208
|
+
latestMap.set(doc.id, doc);
|
|
1209
|
+
}
|
|
1210
|
+
let prompts = Array.from(latestMap.values())
|
|
1211
|
+
.map((doc) => this.docToPrompt(doc))
|
|
1212
|
+
.sort((a, b) => b.createdAt - a.createdAt);
|
|
1213
|
+
if (filter?.limit && filter.limit > 0) {
|
|
1214
|
+
prompts = prompts.slice(0, filter.limit);
|
|
1215
|
+
}
|
|
1216
|
+
return prompts;
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* 将 DocumentStore 文档转为 Prompt 对象
|
|
1220
|
+
*/
|
|
1221
|
+
docToPrompt(doc) {
|
|
1222
|
+
const meta = doc.metadata || {};
|
|
1223
|
+
let data = {};
|
|
1224
|
+
try {
|
|
1225
|
+
data = JSON.parse(doc.content || '{}');
|
|
1226
|
+
}
|
|
1227
|
+
catch { /* ignore */ }
|
|
1228
|
+
// 从 tags 中提取自定义标签
|
|
1229
|
+
const customTags = (doc.tags || [])
|
|
1230
|
+
.filter((t) => t.startsWith('custom:'))
|
|
1231
|
+
.map((t) => t.slice(7));
|
|
1232
|
+
return {
|
|
1233
|
+
id: doc.id,
|
|
1234
|
+
projectName: this.projectName,
|
|
1235
|
+
promptIndex: meta.promptIndex || 0,
|
|
1236
|
+
content: data.content || '',
|
|
1237
|
+
aiInterpretation: data.aiInterpretation || undefined,
|
|
1238
|
+
summary: data.summary || undefined,
|
|
1239
|
+
relatedTaskId: data.relatedTaskId || meta.relatedTaskId || undefined,
|
|
1240
|
+
tags: customTags.length > 0 ? customTags : (meta.tags || []),
|
|
1241
|
+
createdAt: meta.createdAt || doc.created_at || Date.now(),
|
|
1242
|
+
};
|
|
1243
|
+
}
|
|
1244
|
+
// ==========================================================================
|
|
1126
1245
|
// Utility
|
|
1127
1246
|
// ==========================================================================
|
|
1128
1247
|
/**
|
|
@@ -1132,6 +1251,7 @@ class DevPlanDocumentStore {
|
|
|
1132
1251
|
this.docStore.flush();
|
|
1133
1252
|
this.taskStore.flush();
|
|
1134
1253
|
this.moduleStore.flush();
|
|
1254
|
+
this.promptStore.flush();
|
|
1135
1255
|
}
|
|
1136
1256
|
/**
|
|
1137
1257
|
* 获取项目名称
|
|
@@ -1490,6 +1610,7 @@ class DevPlanDocumentStore {
|
|
|
1490
1610
|
encoding: 'utf-8',
|
|
1491
1611
|
timeout: 5000,
|
|
1492
1612
|
stdio: ['pipe', 'pipe', 'pipe'], // 静默 stderr
|
|
1613
|
+
cwd: this.gitCwd,
|
|
1493
1614
|
}).trim();
|
|
1494
1615
|
}
|
|
1495
1616
|
catch {
|
|
@@ -1508,6 +1629,7 @@ class DevPlanDocumentStore {
|
|
|
1508
1629
|
execSync(`git merge-base --is-ancestor ${commit} ${target}`, {
|
|
1509
1630
|
timeout: 5000,
|
|
1510
1631
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1632
|
+
cwd: this.gitCwd,
|
|
1511
1633
|
});
|
|
1512
1634
|
return true; // exit code 0 = is ancestor
|
|
1513
1635
|
}
|