aifastdb-devplan 1.3.9 → 1.6.1
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 +2 -0
- package/dist/dev-plan-document-store.d.ts.map +1 -1
- package/dist/dev-plan-document-store.js +3 -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 +111 -18
- package/dist/dev-plan-factory.js.map +1 -1
- package/dist/dev-plan-graph-store.d.ts +15 -0
- package/dist/dev-plan-graph-store.d.ts.map +1 -1
- package/dist/dev-plan-graph-store.js +57 -2
- package/dist/dev-plan-graph-store.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 +278 -4
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/types.d.ts +72 -0
- 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 +334 -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 +844 -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 +446 -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 +541 -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 +682 -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 +137 -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 +375 -0
- package/dist/visualize/graph-canvas/viewport.js.map +1 -0
- package/dist/visualize/server.js +619 -6
- package/dist/visualize/server.js.map +1 -1
- package/dist/visualize/template.d.ts.map +1 -1
- package/dist/visualize/template.js +604 -18
- package/dist/visualize/template.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
* 2. .devplan/{projectName}/engine.json 中的配置
|
|
12
12
|
* 3. 旧项目(已有 JSONL 数据文件)自动识别为 'document'
|
|
13
13
|
* 4. 新项目默认使用 'graph'
|
|
14
|
+
*
|
|
15
|
+
* 多项目工作区支持:
|
|
16
|
+
* 通过 .devplan/config.json 中的 projects 注册表,
|
|
17
|
+
* projectName 自动路由到对应项目目录下的 .devplan/ 数据库。
|
|
18
|
+
* 例如 projectName="aifastdb-devplan" → D:\xxx\aifastdb-devplan\.devplan\
|
|
14
19
|
*/
|
|
15
20
|
import type { IDevPlanStore } from './dev-plan-interface';
|
|
16
21
|
/**
|
|
@@ -22,11 +27,23 @@ import type { IDevPlanStore } from './dev-plan-interface';
|
|
|
22
27
|
export declare const DEFAULT_PROJECT_NAME = "devplan-db";
|
|
23
28
|
/** 存储引擎类型 */
|
|
24
29
|
export type DevPlanEngine = 'graph' | 'document';
|
|
30
|
+
/**
|
|
31
|
+
* 项目注册表条目
|
|
32
|
+
*
|
|
33
|
+
* 在多项目工作区中,每个 projectName 可映射到独立的项目根目录,
|
|
34
|
+
* 使得 DevPlan 数据存储到对应项目自己的 .devplan/ 目录下。
|
|
35
|
+
*/
|
|
36
|
+
export interface ProjectRegistryEntry {
|
|
37
|
+
/** 项目根目录的绝对路径(如 "D:\\Project\\git\\aifastdb-devplan") */
|
|
38
|
+
rootPath: string;
|
|
39
|
+
}
|
|
25
40
|
/**
|
|
26
41
|
* .devplan/config.json 的内容格式
|
|
27
42
|
*
|
|
28
43
|
* 存放在 .devplan/ 根目录下(与各项目子目录同级),
|
|
29
44
|
* 用于配置当前工作区的 DevPlan 默认行为。
|
|
45
|
+
*
|
|
46
|
+
* 多项目工作区:通过 projects 注册表将 projectName 路由到对应项目目录。
|
|
30
47
|
*/
|
|
31
48
|
export interface DevPlanConfig {
|
|
32
49
|
/** 默认项目名称(即 .devplan/ 下的子目录名) */
|
|
@@ -35,6 +52,19 @@ export interface DevPlanConfig {
|
|
|
35
52
|
enableSemanticSearch?: boolean;
|
|
36
53
|
/** Embedding 向量维度(默认 384) */
|
|
37
54
|
embeddingDimension?: number;
|
|
55
|
+
/**
|
|
56
|
+
* 多项目工作区注册表:projectName → 项目根目录路径。
|
|
57
|
+
*
|
|
58
|
+
* 当 projectName 在此表中找到时,数据存储到对应项目的 .devplan/ 目录,
|
|
59
|
+
* 而非 MCP Server 进程 cwd 解析到的默认 .devplan/ 目录。
|
|
60
|
+
*
|
|
61
|
+
* 示例:
|
|
62
|
+
* {
|
|
63
|
+
* "ai_db": { "rootPath": "D:\\Project\\git\\ai_db" },
|
|
64
|
+
* "aifastdb-devplan": { "rootPath": "D:\\Project\\git\\aifastdb-devplan" }
|
|
65
|
+
* }
|
|
66
|
+
*/
|
|
67
|
+
projects?: Record<string, ProjectRegistryEntry>;
|
|
38
68
|
}
|
|
39
69
|
/**
|
|
40
70
|
* 读取 .devplan/config.json 工作区配置
|
|
@@ -60,21 +90,50 @@ export declare function writeDevPlanConfig(config: DevPlanConfig, basePath?: str
|
|
|
60
90
|
*/
|
|
61
91
|
export declare function resolveProjectName(explicitName?: string, basePath?: string): string;
|
|
62
92
|
/**
|
|
63
|
-
* 获取默认的 DevPlan
|
|
93
|
+
* 获取默认的 DevPlan 存储基础路径(工作区级别)
|
|
64
94
|
*
|
|
65
95
|
* 优先级:
|
|
66
96
|
* 1. AIFASTDB_DEVPLAN_PATH 环境变量(显式指定)
|
|
67
97
|
* 2. 项目内 .devplan/ 目录(天然跟随 Git 版本管理)
|
|
68
98
|
* 3. 回退到用户目录 ~/.aifastdb/dev-plans/(兜底)
|
|
99
|
+
*
|
|
100
|
+
* 注意:此函数返回 MCP Server 进程 cwd 解析到的默认 .devplan/ 路径。
|
|
101
|
+
* 多项目工作区中,请优先使用 resolveBasePathForProject(projectName) 获取
|
|
102
|
+
* 项目特定的 basePath。
|
|
69
103
|
*/
|
|
70
104
|
export declare function getDefaultBasePath(): string;
|
|
105
|
+
/**
|
|
106
|
+
* 根据 projectName 解析数据存储的 basePath(.devplan/ 目录路径)
|
|
107
|
+
*
|
|
108
|
+
* 多项目工作区核心路由函数。优先级:
|
|
109
|
+
* 1. 工作区 config.json → projects[projectName].rootPath → {rootPath}/.devplan/
|
|
110
|
+
* 2. 回退到默认 basePath(getDefaultBasePath())
|
|
111
|
+
*
|
|
112
|
+
* 示例:
|
|
113
|
+
* - resolveBasePathForProject("ai_db")
|
|
114
|
+
* → config.projects.ai_db.rootPath = "D:\\Project\\git\\ai_db"
|
|
115
|
+
* → 返回 "D:\\Project\\git\\ai_db\\.devplan"
|
|
116
|
+
*
|
|
117
|
+
* - resolveBasePathForProject("aifastdb-devplan")
|
|
118
|
+
* → config.projects["aifastdb-devplan"].rootPath = "D:\\Project\\git\\aifastdb-devplan"
|
|
119
|
+
* → 返回 "D:\\Project\\git\\aifastdb-devplan\\.devplan"
|
|
120
|
+
*
|
|
121
|
+
* - resolveBasePathForProject("unknown-project")
|
|
122
|
+
* → 注册表中未找到 → 返回 getDefaultBasePath()
|
|
123
|
+
*/
|
|
124
|
+
export declare function resolveBasePathForProject(projectName?: string): string;
|
|
71
125
|
/**
|
|
72
126
|
* 为项目创建 DevPlan 存储实例
|
|
73
127
|
*
|
|
74
|
-
* @param projectName -
|
|
75
|
-
* @param basePath -
|
|
128
|
+
* @param projectName - 项目名称(同时作为多项目工作区的路由键)
|
|
129
|
+
* @param basePath - 存储基础路径(显式指定时跳过项目路由)
|
|
76
130
|
* @param engine - 显式指定引擎(优先级最高)
|
|
77
131
|
*
|
|
132
|
+
* basePath 解析优先级:
|
|
133
|
+
* 1. 显式传入 basePath → 直接使用
|
|
134
|
+
* 2. 项目注册表路由 → resolveBasePathForProject(projectName)
|
|
135
|
+
* 3. 默认 basePath → getDefaultBasePath()(由 cwd 决定)
|
|
136
|
+
*
|
|
78
137
|
* 引擎选择逻辑:
|
|
79
138
|
* 1. 显式 engine 参数 → 使用指定引擎
|
|
80
139
|
* 2. engine.json 已存在 → 使用配置的引擎
|
|
@@ -84,10 +143,17 @@ export declare function getDefaultBasePath(): string;
|
|
|
84
143
|
export declare function createDevPlan(projectName: string, basePath?: string, engine?: DevPlanEngine): IDevPlanStore;
|
|
85
144
|
/**
|
|
86
145
|
* 列出所有已有的 DevPlan 项目
|
|
146
|
+
*
|
|
147
|
+
* 多项目工作区支持:
|
|
148
|
+
* 1. 扫描默认 basePath 下的子目录
|
|
149
|
+
* 2. 扫描项目注册表中每个注册项目的 .devplan/ 目录
|
|
150
|
+
* 3. 去重后返回完整列表
|
|
87
151
|
*/
|
|
88
152
|
export declare function listDevPlans(basePath?: string): string[];
|
|
89
153
|
/**
|
|
90
154
|
* 获取项目使用的引擎类型
|
|
155
|
+
*
|
|
156
|
+
* 支持项目注册表路由:自动解析项目对应的 basePath。
|
|
91
157
|
*/
|
|
92
158
|
export declare function getProjectEngine(projectName: string, basePath?: string): DevPlanEngine | null;
|
|
93
159
|
//# sourceMappingURL=dev-plan-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-plan-factory.d.ts","sourceRoot":"","sources":["../src/dev-plan-factory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dev-plan-factory.d.ts","sourceRoot":"","sources":["../src/dev-plan-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQ1D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAMjD,aAAa;AACb,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,CAAC;AAQjD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,6BAA6B;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACjD;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAWjF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnF;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAgCtE;AA8ED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,aAAa,GACrB,aAAa,CAsDf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA8BxD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAG7F"}
|
package/dist/dev-plan-factory.js
CHANGED
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
* 2. .devplan/{projectName}/engine.json 中的配置
|
|
13
13
|
* 3. 旧项目(已有 JSONL 数据文件)自动识别为 'document'
|
|
14
14
|
* 4. 新项目默认使用 'graph'
|
|
15
|
+
*
|
|
16
|
+
* 多项目工作区支持:
|
|
17
|
+
* 通过 .devplan/config.json 中的 projects 注册表,
|
|
18
|
+
* projectName 自动路由到对应项目目录下的 .devplan/ 数据库。
|
|
19
|
+
* 例如 projectName="aifastdb-devplan" → D:\xxx\aifastdb-devplan\.devplan\
|
|
15
20
|
*/
|
|
16
21
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
22
|
if (k2 === undefined) k2 = k;
|
|
@@ -52,6 +57,7 @@ exports.readDevPlanConfig = readDevPlanConfig;
|
|
|
52
57
|
exports.writeDevPlanConfig = writeDevPlanConfig;
|
|
53
58
|
exports.resolveProjectName = resolveProjectName;
|
|
54
59
|
exports.getDefaultBasePath = getDefaultBasePath;
|
|
60
|
+
exports.resolveBasePathForProject = resolveBasePathForProject;
|
|
55
61
|
exports.createDevPlan = createDevPlan;
|
|
56
62
|
exports.listDevPlans = listDevPlans;
|
|
57
63
|
exports.getProjectEngine = getProjectEngine;
|
|
@@ -132,12 +138,16 @@ function resolveProjectName(explicitName, basePath) {
|
|
|
132
138
|
// Path Resolution
|
|
133
139
|
// ============================================================================
|
|
134
140
|
/**
|
|
135
|
-
* 获取默认的 DevPlan
|
|
141
|
+
* 获取默认的 DevPlan 存储基础路径(工作区级别)
|
|
136
142
|
*
|
|
137
143
|
* 优先级:
|
|
138
144
|
* 1. AIFASTDB_DEVPLAN_PATH 环境变量(显式指定)
|
|
139
145
|
* 2. 项目内 .devplan/ 目录(天然跟随 Git 版本管理)
|
|
140
146
|
* 3. 回退到用户目录 ~/.aifastdb/dev-plans/(兜底)
|
|
147
|
+
*
|
|
148
|
+
* 注意:此函数返回 MCP Server 进程 cwd 解析到的默认 .devplan/ 路径。
|
|
149
|
+
* 多项目工作区中,请优先使用 resolveBasePathForProject(projectName) 获取
|
|
150
|
+
* 项目特定的 basePath。
|
|
141
151
|
*/
|
|
142
152
|
function getDefaultBasePath() {
|
|
143
153
|
if (process.env.AIFASTDB_DEVPLAN_PATH) {
|
|
@@ -149,6 +159,50 @@ function getDefaultBasePath() {
|
|
|
149
159
|
}
|
|
150
160
|
return path.join(os.homedir(), '.aifastdb', 'dev-plans');
|
|
151
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* 根据 projectName 解析数据存储的 basePath(.devplan/ 目录路径)
|
|
164
|
+
*
|
|
165
|
+
* 多项目工作区核心路由函数。优先级:
|
|
166
|
+
* 1. 工作区 config.json → projects[projectName].rootPath → {rootPath}/.devplan/
|
|
167
|
+
* 2. 回退到默认 basePath(getDefaultBasePath())
|
|
168
|
+
*
|
|
169
|
+
* 示例:
|
|
170
|
+
* - resolveBasePathForProject("ai_db")
|
|
171
|
+
* → config.projects.ai_db.rootPath = "D:\\Project\\git\\ai_db"
|
|
172
|
+
* → 返回 "D:\\Project\\git\\ai_db\\.devplan"
|
|
173
|
+
*
|
|
174
|
+
* - resolveBasePathForProject("aifastdb-devplan")
|
|
175
|
+
* → config.projects["aifastdb-devplan"].rootPath = "D:\\Project\\git\\aifastdb-devplan"
|
|
176
|
+
* → 返回 "D:\\Project\\git\\aifastdb-devplan\\.devplan"
|
|
177
|
+
*
|
|
178
|
+
* - resolveBasePathForProject("unknown-project")
|
|
179
|
+
* → 注册表中未找到 → 返回 getDefaultBasePath()
|
|
180
|
+
*/
|
|
181
|
+
function resolveBasePathForProject(projectName) {
|
|
182
|
+
const defaultBase = getDefaultBasePath();
|
|
183
|
+
if (!projectName)
|
|
184
|
+
return defaultBase;
|
|
185
|
+
// 读取工作区级别的 config.json(从默认 basePath)
|
|
186
|
+
const workspaceConfig = readDevPlanConfig(defaultBase);
|
|
187
|
+
if (workspaceConfig?.projects?.[projectName]?.rootPath) {
|
|
188
|
+
const projectRootPath = workspaceConfig.projects[projectName].rootPath;
|
|
189
|
+
// 验证项目根目录是否存在(优雅降级)
|
|
190
|
+
const fs = require('fs');
|
|
191
|
+
if (!fs.existsSync(projectRootPath)) {
|
|
192
|
+
console.error(`[DevPlan] WARNING: Project "${projectName}" registered rootPath does not exist: ${projectRootPath}. ` +
|
|
193
|
+
`Falling back to default basePath: ${defaultBase}. ` +
|
|
194
|
+
`Please update .devplan/config.json projects registry or create the directory.`);
|
|
195
|
+
return defaultBase;
|
|
196
|
+
}
|
|
197
|
+
const projectBasePath = path.join(projectRootPath, '.devplan');
|
|
198
|
+
// 确保 .devplan/ 目录存在
|
|
199
|
+
if (!fs.existsSync(projectBasePath)) {
|
|
200
|
+
fs.mkdirSync(projectBasePath, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
return projectBasePath;
|
|
203
|
+
}
|
|
204
|
+
return defaultBase;
|
|
205
|
+
}
|
|
152
206
|
/**
|
|
153
207
|
* 从当前工作目录向上查找项目根目录
|
|
154
208
|
*/
|
|
@@ -217,10 +271,15 @@ function hasExistingDocumentData(projectName, basePath) {
|
|
|
217
271
|
/**
|
|
218
272
|
* 为项目创建 DevPlan 存储实例
|
|
219
273
|
*
|
|
220
|
-
* @param projectName -
|
|
221
|
-
* @param basePath -
|
|
274
|
+
* @param projectName - 项目名称(同时作为多项目工作区的路由键)
|
|
275
|
+
* @param basePath - 存储基础路径(显式指定时跳过项目路由)
|
|
222
276
|
* @param engine - 显式指定引擎(优先级最高)
|
|
223
277
|
*
|
|
278
|
+
* basePath 解析优先级:
|
|
279
|
+
* 1. 显式传入 basePath → 直接使用
|
|
280
|
+
* 2. 项目注册表路由 → resolveBasePathForProject(projectName)
|
|
281
|
+
* 3. 默认 basePath → getDefaultBasePath()(由 cwd 决定)
|
|
282
|
+
*
|
|
224
283
|
* 引擎选择逻辑:
|
|
225
284
|
* 1. 显式 engine 参数 → 使用指定引擎
|
|
226
285
|
* 2. engine.json 已存在 → 使用配置的引擎
|
|
@@ -228,7 +287,8 @@ function hasExistingDocumentData(projectName, basePath) {
|
|
|
228
287
|
* 4. 全新项目 → 默认使用 'graph'
|
|
229
288
|
*/
|
|
230
289
|
function createDevPlan(projectName, basePath, engine) {
|
|
231
|
-
|
|
290
|
+
// 核心变更:basePath 优先使用项目注册表路由
|
|
291
|
+
const base = basePath || resolveBasePathForProject(projectName);
|
|
232
292
|
// 解析引擎类型
|
|
233
293
|
let resolvedEngine;
|
|
234
294
|
if (engine) {
|
|
@@ -248,10 +308,19 @@ function createDevPlan(projectName, basePath, engine) {
|
|
|
248
308
|
}
|
|
249
309
|
// 写入/更新引擎配置
|
|
250
310
|
writeEngineConfig(projectName, base, resolvedEngine);
|
|
251
|
-
//
|
|
252
|
-
const
|
|
253
|
-
const
|
|
254
|
-
const
|
|
311
|
+
// 读取语义搜索配置(优先项目自己的 config,其次工作区 config)
|
|
312
|
+
const projectConfig = readDevPlanConfig(base);
|
|
313
|
+
const defaultBase = getDefaultBasePath();
|
|
314
|
+
const workspaceConfig = base !== defaultBase ? readDevPlanConfig(defaultBase) : null;
|
|
315
|
+
const enableSemanticSearch = projectConfig?.enableSemanticSearch
|
|
316
|
+
?? workspaceConfig?.enableSemanticSearch
|
|
317
|
+
?? false;
|
|
318
|
+
const embeddingDimension = projectConfig?.embeddingDimension
|
|
319
|
+
?? workspaceConfig?.embeddingDimension
|
|
320
|
+
?? 384;
|
|
321
|
+
// 推导项目根目录(用于 git 操作的 cwd)
|
|
322
|
+
// base 是 .devplan 目录路径(如 D:\xxx\project\.devplan),dirname 即项目根
|
|
323
|
+
const gitCwd = base !== defaultBase ? path.dirname(base) : undefined;
|
|
255
324
|
// 创建对应的存储实例
|
|
256
325
|
if (resolvedEngine === 'graph') {
|
|
257
326
|
return new dev_plan_graph_store_1.DevPlanGraphStore(projectName, {
|
|
@@ -259,6 +328,7 @@ function createDevPlan(projectName, basePath, engine) {
|
|
|
259
328
|
shardCount: 4,
|
|
260
329
|
enableSemanticSearch,
|
|
261
330
|
embeddingDimension,
|
|
331
|
+
gitCwd,
|
|
262
332
|
});
|
|
263
333
|
}
|
|
264
334
|
else {
|
|
@@ -266,32 +336,55 @@ function createDevPlan(projectName, basePath, engine) {
|
|
|
266
336
|
documentPath: path.join(base, projectName, 'documents.jsonl'),
|
|
267
337
|
taskPath: path.join(base, projectName, 'tasks.jsonl'),
|
|
268
338
|
modulePath: path.join(base, projectName, 'modules.jsonl'),
|
|
339
|
+
gitCwd,
|
|
269
340
|
});
|
|
270
341
|
}
|
|
271
342
|
}
|
|
272
343
|
/**
|
|
273
344
|
* 列出所有已有的 DevPlan 项目
|
|
345
|
+
*
|
|
346
|
+
* 多项目工作区支持:
|
|
347
|
+
* 1. 扫描默认 basePath 下的子目录
|
|
348
|
+
* 2. 扫描项目注册表中每个注册项目的 .devplan/ 目录
|
|
349
|
+
* 3. 去重后返回完整列表
|
|
274
350
|
*/
|
|
275
351
|
function listDevPlans(basePath) {
|
|
352
|
+
const fs = require('fs');
|
|
276
353
|
const base = basePath || getDefaultBasePath();
|
|
354
|
+
const plans = new Set();
|
|
355
|
+
// 1. 扫描默认 basePath 下的子目录
|
|
277
356
|
try {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
});
|
|
357
|
+
if (fs.existsSync(base)) {
|
|
358
|
+
fs.readdirSync(base).filter((name) => {
|
|
359
|
+
const fullPath = path.join(base, name);
|
|
360
|
+
return fs.statSync(fullPath).isDirectory();
|
|
361
|
+
}).forEach((name) => plans.add(name));
|
|
362
|
+
}
|
|
285
363
|
}
|
|
286
|
-
catch {
|
|
287
|
-
|
|
364
|
+
catch { /* ignore */ }
|
|
365
|
+
// 2. 扫描项目注册表中的注册项目
|
|
366
|
+
const config = readDevPlanConfig(base);
|
|
367
|
+
if (config?.projects) {
|
|
368
|
+
for (const [projectName, entry] of Object.entries(config.projects)) {
|
|
369
|
+
try {
|
|
370
|
+
const projectBase = path.join(entry.rootPath, '.devplan');
|
|
371
|
+
const projectDataDir = path.join(projectBase, projectName);
|
|
372
|
+
if (fs.existsSync(projectDataDir) && fs.statSync(projectDataDir).isDirectory()) {
|
|
373
|
+
plans.add(projectName);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch { /* ignore */ }
|
|
377
|
+
}
|
|
288
378
|
}
|
|
379
|
+
return Array.from(plans);
|
|
289
380
|
}
|
|
290
381
|
/**
|
|
291
382
|
* 获取项目使用的引擎类型
|
|
383
|
+
*
|
|
384
|
+
* 支持项目注册表路由:自动解析项目对应的 basePath。
|
|
292
385
|
*/
|
|
293
386
|
function getProjectEngine(projectName, basePath) {
|
|
294
|
-
const base = basePath ||
|
|
387
|
+
const base = basePath || resolveBasePathForProject(projectName);
|
|
295
388
|
return readEngineConfig(projectName, base);
|
|
296
389
|
}
|
|
297
390
|
//# sourceMappingURL=dev-plan-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-plan-factory.js","sourceRoot":"","sources":["../src/dev-plan-factory.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"dev-plan-factory.js","sourceRoot":"","sources":["../src/dev-plan-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,8 @@ import type { DevPlanSection, DevPlanDocInput, DevPlanDoc, DevPlanDocTree, MainT
|
|
|
25
25
|
export declare class DevPlanGraphStore implements IDevPlanStore {
|
|
26
26
|
private graph;
|
|
27
27
|
private projectName;
|
|
28
|
+
/** Git 操作的工作目录(多项目路由时指向项目根目录) */
|
|
29
|
+
private gitCwd;
|
|
28
30
|
/** 缓存的项目根实体 ID */
|
|
29
31
|
private projectEntityId;
|
|
30
32
|
/** VibeSynapse 实例(用于 Embedding 生成),仅启用语义搜索时可用 */
|
|
@@ -39,6 +41,19 @@ export declare class DevPlanGraphStore implements IDevPlanStore {
|
|
|
39
41
|
* 初始化失败时降级为纯字面搜索(graceful degradation)。
|
|
40
42
|
*/
|
|
41
43
|
private initSynapse;
|
|
44
|
+
/**
|
|
45
|
+
* 一次性迁移:将旧 WAL 目录名重命名为语义化新名。
|
|
46
|
+
*
|
|
47
|
+
* 映射表:
|
|
48
|
+
* - shard_0_entities → shard_0_tasks
|
|
49
|
+
* - shard_2_index → shard_2_docs
|
|
50
|
+
* - shard_3_meta → shard_3_modules
|
|
51
|
+
* - shard_1_relations 不变
|
|
52
|
+
*
|
|
53
|
+
* 该方法必须在 `new SocialGraphV2(config)` 之前调用。
|
|
54
|
+
* 幂等:如果旧目录不存在或新目录已存在则跳过。
|
|
55
|
+
*/
|
|
56
|
+
private static migrateWalDirNames;
|
|
42
57
|
private ensureProjectEntity;
|
|
43
58
|
private findProjectEntity;
|
|
44
59
|
private getProjectId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-plan-graph-store.d.ts","sourceRoot":"","sources":["../src/dev-plan-graph-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"dev-plan-graph-store.d.ts","sourceRoot":"","sources":["../src/dev-plan-graph-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
52
52
|
exports.DevPlanGraphStore = void 0;
|
|
53
53
|
const aifastdb_1 = require("aifastdb");
|
|
54
54
|
const path = __importStar(require("path"));
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
55
56
|
// ============================================================================
|
|
56
57
|
// Constants
|
|
57
58
|
// ============================================================================
|
|
@@ -107,13 +108,27 @@ class DevPlanGraphStore {
|
|
|
107
108
|
/** 语义搜索是否成功初始化 */
|
|
108
109
|
this.semanticSearchReady = false;
|
|
109
110
|
this.projectName = projectName;
|
|
111
|
+
this.gitCwd = config.gitCwd;
|
|
112
|
+
// ── WAL 目录迁移:旧名 → 语义化新名 ──
|
|
113
|
+
// 必须在 SocialGraphV2 构造之前执行,否则 recover() 会找不到旧数据
|
|
114
|
+
DevPlanGraphStore.migrateWalDirNames(config.graphPath);
|
|
110
115
|
// 构建 SocialGraphV2 配置
|
|
111
116
|
const graphConfig = {
|
|
112
117
|
path: config.graphPath,
|
|
113
118
|
shardCount: config.shardCount || 4,
|
|
114
119
|
walEnabled: true,
|
|
115
120
|
mode: 'balanced',
|
|
116
|
-
shardNames: ['
|
|
121
|
+
shardNames: ['tasks', 'relations', 'docs', 'modules'],
|
|
122
|
+
// 显式路由:DevPlan 实体类型 → 对应分片
|
|
123
|
+
typeShardMapping: {
|
|
124
|
+
'devplan-project': 0, // 项目根节点 → tasks shard
|
|
125
|
+
'devplan-main-task': 0, // 主任务 → tasks shard
|
|
126
|
+
'devplan-sub-task': 0, // 子任务 → tasks shard
|
|
127
|
+
'devplan-doc': 2, // 文档片段 → docs shard
|
|
128
|
+
'devplan-module': 3, // 功能模块 → modules shard
|
|
129
|
+
'_default': 0, // 未知类型 → tasks shard (fallback)
|
|
130
|
+
},
|
|
131
|
+
relationShardId: 1, // 所有关系 → relations shard
|
|
117
132
|
};
|
|
118
133
|
// 如果启用语义搜索,配置 SocialGraphV2 的向量搜索
|
|
119
134
|
const dimension = config.embeddingDimension || 384;
|
|
@@ -167,7 +182,7 @@ class DevPlanGraphStore {
|
|
|
167
182
|
try {
|
|
168
183
|
this.synapse.embed('test');
|
|
169
184
|
this.semanticSearchReady = true;
|
|
170
|
-
console.
|
|
185
|
+
console.error('[DevPlan] Semantic search initialized (Candle MiniLM)');
|
|
171
186
|
}
|
|
172
187
|
catch {
|
|
173
188
|
console.warn('[DevPlan] VibeSynapse embed() dry-run failed. Falling back to literal search.');
|
|
@@ -182,6 +197,44 @@ class DevPlanGraphStore {
|
|
|
182
197
|
}
|
|
183
198
|
}
|
|
184
199
|
// ==========================================================================
|
|
200
|
+
// WAL Directory Migration (旧分片名 → 语义化新名)
|
|
201
|
+
// ==========================================================================
|
|
202
|
+
/**
|
|
203
|
+
* 一次性迁移:将旧 WAL 目录名重命名为语义化新名。
|
|
204
|
+
*
|
|
205
|
+
* 映射表:
|
|
206
|
+
* - shard_0_entities → shard_0_tasks
|
|
207
|
+
* - shard_2_index → shard_2_docs
|
|
208
|
+
* - shard_3_meta → shard_3_modules
|
|
209
|
+
* - shard_1_relations 不变
|
|
210
|
+
*
|
|
211
|
+
* 该方法必须在 `new SocialGraphV2(config)` 之前调用。
|
|
212
|
+
* 幂等:如果旧目录不存在或新目录已存在则跳过。
|
|
213
|
+
*/
|
|
214
|
+
static migrateWalDirNames(graphPath) {
|
|
215
|
+
const walBase = path.join(graphPath, 'wal');
|
|
216
|
+
if (!fs.existsSync(walBase))
|
|
217
|
+
return; // 全新安装,无需迁移
|
|
218
|
+
const renames = [
|
|
219
|
+
['shard_0_entities', 'shard_0_tasks'],
|
|
220
|
+
['shard_2_index', 'shard_2_docs'],
|
|
221
|
+
['shard_3_meta', 'shard_3_modules'],
|
|
222
|
+
];
|
|
223
|
+
for (const [oldName, newName] of renames) {
|
|
224
|
+
const oldDir = path.join(walBase, oldName);
|
|
225
|
+
const newDir = path.join(walBase, newName);
|
|
226
|
+
if (fs.existsSync(oldDir) && !fs.existsSync(newDir)) {
|
|
227
|
+
try {
|
|
228
|
+
fs.renameSync(oldDir, newDir);
|
|
229
|
+
console.error(`[DevPlan] WAL dir migrated: ${oldName} → ${newName}`);
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
console.warn(`[DevPlan] Failed to migrate WAL dir ${oldName} → ${newName}: ${e instanceof Error ? e.message : String(e)}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ==========================================================================
|
|
185
238
|
// Project Entity
|
|
186
239
|
// ==========================================================================
|
|
187
240
|
ensureProjectEntity() {
|
|
@@ -1612,6 +1665,7 @@ class DevPlanGraphStore {
|
|
|
1612
1665
|
encoding: 'utf-8',
|
|
1613
1666
|
timeout: 5000,
|
|
1614
1667
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1668
|
+
cwd: this.gitCwd,
|
|
1615
1669
|
}).trim();
|
|
1616
1670
|
}
|
|
1617
1671
|
catch {
|
|
@@ -1624,6 +1678,7 @@ class DevPlanGraphStore {
|
|
|
1624
1678
|
execSync(`git merge-base --is-ancestor ${commit} ${target}`, {
|
|
1625
1679
|
timeout: 5000,
|
|
1626
1680
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1681
|
+
cwd: this.gitCwd,
|
|
1627
1682
|
});
|
|
1628
1683
|
return true;
|
|
1629
1684
|
}
|