@whispering233/ai-editor-db 0.0.21 → 0.0.29
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/connection.js +2 -2
- package/dist/connection.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/002_event_timeline.js +1 -1
- package/dist/migrations/002_event_timeline.js.map +1 -1
- package/dist/migrations/003_timepoint.js +8 -8
- package/dist/migrations/003_timepoint.js.map +1 -1
- package/dist/migrations/004_setting_tags.js +2 -2
- package/dist/migrations/004_setting_tags.js.map +1 -1
- package/dist/migrations/005_reference.js +2 -2
- package/dist/migrations/005_reference.js.map +1 -1
- package/dist/migrations/index.d.ts +2 -2
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +7 -7
- package/dist/migrations/index.js.map +1 -1
- package/dist/queries/chat.d.ts +20 -20
- package/dist/queries/chat.d.ts.map +1 -1
- package/dist/queries/chat.js +105 -59
- package/dist/queries/chat.js.map +1 -1
- package/dist/queries/compute-state.d.ts +9 -9
- package/dist/queries/compute-state.d.ts.map +1 -1
- package/dist/queries/compute-state.js +22 -28
- package/dist/queries/compute-state.js.map +1 -1
- package/dist/queries/delta.d.ts +21 -21
- package/dist/queries/delta.d.ts.map +1 -1
- package/dist/queries/delta.js +110 -63
- package/dist/queries/delta.js.map +1 -1
- package/dist/queries/entity.d.ts +50 -46
- package/dist/queries/entity.d.ts.map +1 -1
- package/dist/queries/entity.js +226 -137
- package/dist/queries/entity.js.map +1 -1
- package/dist/queries/migration.d.ts +31 -31
- package/dist/queries/migration.d.ts.map +1 -1
- package/dist/queries/migration.js +43 -44
- package/dist/queries/migration.js.map +1 -1
- package/dist/queries/outline-ops.d.ts +22 -22
- package/dist/queries/outline-ops.d.ts.map +1 -1
- package/dist/queries/outline-ops.js +35 -42
- package/dist/queries/outline-ops.js.map +1 -1
- package/dist/queries/relation.d.ts +18 -18
- package/dist/queries/relation.d.ts.map +1 -1
- package/dist/queries/relation.js +115 -84
- package/dist/queries/relation.js.map +1 -1
- package/dist/queries/trash.d.ts +10 -10
- package/dist/queries/trash.d.ts.map +1 -1
- package/dist/queries/trash.js +75 -48
- package/dist/queries/trash.js.map +1 -1
- package/dist/query-db.d.ts +5 -0
- package/dist/query-db.d.ts.map +1 -0
- package/dist/query-db.js +22 -0
- package/dist/query-db.js.map +1 -0
- package/dist/schema.d.ts +8 -20
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +13 -85
- package/dist/schema.js.map +1 -1
- package/dist/storage/atomic.d.ts +8 -8
- package/dist/storage/atomic.d.ts.map +1 -1
- package/dist/storage/atomic.js +10 -11
- package/dist/storage/atomic.js.map +1 -1
- package/dist/storage/outline.d.ts +14 -14
- package/dist/storage/outline.d.ts.map +1 -1
- package/dist/storage/outline.js +17 -18
- package/dist/storage/outline.js.map +1 -1
- package/dist/storage/project.d.ts +11 -11
- package/dist/storage/project.d.ts.map +1 -1
- package/dist/storage/project.js +17 -18
- package/dist/storage/project.js.map +1 -1
- package/dist/tables.d.ts +718 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +141 -0
- package/dist/tables.js.map +1 -0
- package/package.json +3 -2
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import type { OutlineFileNode, OutlineFileNodeBase, OutlineFileTree } from "@whispering233/ai-editor-shared";
|
|
2
|
-
/** outline.json
|
|
2
|
+
/** outline.json 文件名(项目根目录) */
|
|
3
3
|
export declare const OUTLINE_FILE_NAME = "outline.json";
|
|
4
4
|
/**
|
|
5
5
|
* 读取 outline.json。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* 缺失文件语义(本项目首次初始化即创建):**返回最小空树**而非抛错——
|
|
8
8
|
* 调用方(server 打开项目前的探测、初始化流程)无需为「文件还不存在」分支处理;
|
|
9
|
-
* 空树的 schema_version 取当前 SCHEMA_VERSION
|
|
9
|
+
* 空树的 schema_version 取当前 SCHEMA_VERSION,与初始化流程写入的一致。
|
|
10
10
|
* 注意:返回的是新对象,调用方修改它不会影响后续读取。
|
|
11
11
|
*
|
|
12
12
|
* JSON 损坏 / 结构不符:**抛错**,不静默重建——静默覆盖会掩盖文件损坏并可能
|
|
13
13
|
* 丢弃用户数据,由上层决定提示用户还是重建。
|
|
14
|
-
* schema_version 数值与 SCHEMA_VERSION
|
|
14
|
+
* schema_version 数值与 SCHEMA_VERSION 不一致时**不在此校验**(以
|
|
15
15
|
* data.db 的 user_version 为准判定重建,JSON 版本仅用于结构判断,由上层流程处理)。
|
|
16
16
|
*
|
|
17
17
|
* @param dir 项目根目录
|
|
@@ -19,10 +19,10 @@ export declare const OUTLINE_FILE_NAME = "outline.json";
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function readOutlineFile(dir: string): OutlineFileTree;
|
|
21
21
|
/**
|
|
22
|
-
* 原子写 outline.json
|
|
22
|
+
* 原子写 outline.json(临时文件 + fsync + rename,见 writeJsonAtomic)。
|
|
23
23
|
* 顶层 schema_version 随 tree.schema_version 原样写入——保持与 project.json
|
|
24
|
-
*
|
|
25
|
-
* 节点 updated_at
|
|
24
|
+
* 同步写入是调用方职责(两个文件用同一版本号常量)。
|
|
25
|
+
* 节点 updated_at 版本戳由调用方在变更后通过 touch/update 更新,
|
|
26
26
|
* 本函数不隐式修改树。
|
|
27
27
|
*/
|
|
28
28
|
export declare function writeOutlineFile(dir: string, tree: OutlineFileTree): void;
|
|
@@ -32,8 +32,8 @@ export declare function writeOutlineFile(dir: string, tree: OutlineFileTree): vo
|
|
|
32
32
|
*/
|
|
33
33
|
export declare function findOutlineNode(tree: OutlineFileTree, nodeId: string): OutlineFileNode | undefined;
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
36
|
-
* 由服务端原子写时统一更新 updated_at
|
|
35
|
+
* 更新节点版本戳(任何字段变更——含 children 重排、软删/还原——
|
|
36
|
+
* 由服务端原子写时统一更新 updated_at,支撑 提案快照比对)。
|
|
37
37
|
* 仅更新 updated_at,不改动其他字段;改 title/summary 用 updateOutlineNode。
|
|
38
38
|
*
|
|
39
39
|
* @param updatedAt ISO 8601,由调用方(应用层)传入,模块不生成时间
|
|
@@ -42,13 +42,13 @@ export declare function findOutlineNode(tree: OutlineFileTree, nodeId: string):
|
|
|
42
42
|
export declare function touchOutlineNode(tree: OutlineFileTree, nodeId: string, updatedAt: string): void;
|
|
43
43
|
/**
|
|
44
44
|
* updateOutlineNode 可更新的节点字段
|
|
45
|
-
*
|
|
45
|
+
* (title/summary;data——与 title/summary 同等对待,patch 含 data 时整体替换,
|
|
46
46
|
* 未传字段保留;data 的浅合并语义在 outline-ops.updateOutlineNodeInfo(与实体 updateEntity 同构);
|
|
47
|
-
*
|
|
47
|
+
* 软删字段)
|
|
48
48
|
*/
|
|
49
49
|
export type OutlineNodePatch = Partial<Pick<OutlineFileNodeBase, "title" | "summary" | "data" | "deleted" | "deleted_at">>;
|
|
50
50
|
/**
|
|
51
|
-
* 更新节点字段并统一更新 updated_at
|
|
51
|
+
* 更新节点字段并统一更新 updated_at 版本戳。
|
|
52
52
|
* 就地修改树(返回节点引用),调用方随后 writeOutlineFile 落盘;
|
|
53
53
|
* children 重排等无法用 patch 表达的变更请用 touchOutlineNode。
|
|
54
54
|
*
|
|
@@ -59,8 +59,8 @@ export type OutlineNodePatch = Partial<Pick<OutlineFileNodeBase, "title" | "summ
|
|
|
59
59
|
export declare function updateOutlineNode(tree: OutlineFileTree, nodeId: string, patch: OutlineNodePatch, updatedAt: string): OutlineFileNode;
|
|
60
60
|
/**
|
|
61
61
|
* 根 → 目标节点的路径 id 列表(含 root 与目标节点自身)。
|
|
62
|
-
*
|
|
63
|
-
*
|
|
62
|
+
* 供后续卡使用:章节序现推、computeState 树路径排序(
|
|
63
|
+
* getNodePathIds)。
|
|
64
64
|
*
|
|
65
65
|
* @throws 节点不存在时抛错(路径唯一是严格三层的推论,找不到即调用方 bug)
|
|
66
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/storage/outline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/storage/outline.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAI7G,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAUhD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAK5D;AAsBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAEzE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElG;AAoBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM/F;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACpC,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC,CACnF,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,GAChB,eAAe,CAQjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAIjF"}
|
package/dist/storage/outline.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
// @whispering233/ai-editor-db outline.json 存储模块(T2.2)
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// 软删字段 deleted/deleted_at(决策 12)。
|
|
3
|
+
// 严格三层(卷→章→场景)、节点携带 updated_at 版本戳、顶层 schema_version、
|
|
4
|
+
// 软删字段 deleted/deleted_at。
|
|
6
5
|
// 读接口返回 shared 存储形态 OutlineFileTree(snake_case),映射到 API 形态由
|
|
7
6
|
// @whispering233/ai-editor-shared/utils 的 mapOutlineFileToTree 负责(本模块不映射)。
|
|
8
7
|
import { join } from "node:path";
|
|
9
8
|
import { SCHEMA_VERSION } from "../schema.js";
|
|
10
9
|
import { readTextFileOrNull, writeJsonAtomic } from "./atomic.js";
|
|
11
|
-
/** outline.json
|
|
10
|
+
/** outline.json 文件名(项目根目录) */
|
|
12
11
|
export const OUTLINE_FILE_NAME = "outline.json";
|
|
13
12
|
/** 最小空树:文件缺失时的返回值(见 readOutlineFile 注释) */
|
|
14
13
|
const EMPTY_TREE = {
|
|
@@ -20,14 +19,14 @@ const EMPTY_TREE = {
|
|
|
20
19
|
/**
|
|
21
20
|
* 读取 outline.json。
|
|
22
21
|
*
|
|
23
|
-
*
|
|
22
|
+
* 缺失文件语义(本项目首次初始化即创建):**返回最小空树**而非抛错——
|
|
24
23
|
* 调用方(server 打开项目前的探测、初始化流程)无需为「文件还不存在」分支处理;
|
|
25
|
-
* 空树的 schema_version 取当前 SCHEMA_VERSION
|
|
24
|
+
* 空树的 schema_version 取当前 SCHEMA_VERSION,与初始化流程写入的一致。
|
|
26
25
|
* 注意:返回的是新对象,调用方修改它不会影响后续读取。
|
|
27
26
|
*
|
|
28
27
|
* JSON 损坏 / 结构不符:**抛错**,不静默重建——静默覆盖会掩盖文件损坏并可能
|
|
29
28
|
* 丢弃用户数据,由上层决定提示用户还是重建。
|
|
30
|
-
* schema_version 数值与 SCHEMA_VERSION
|
|
29
|
+
* schema_version 数值与 SCHEMA_VERSION 不一致时**不在此校验**(以
|
|
31
30
|
* data.db 的 user_version 为准判定重建,JSON 版本仅用于结构判断,由上层流程处理)。
|
|
32
31
|
*
|
|
33
32
|
* @param dir 项目根目录
|
|
@@ -41,10 +40,10 @@ export function readOutlineFile(dir) {
|
|
|
41
40
|
return validateOutlineFile(parsed);
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
|
-
* 校验 outline.json 顶层结构(读时校验,
|
|
43
|
+
* 校验 outline.json 顶层结构(读时校验, ):
|
|
45
44
|
* 顶层必须是 { id:"root", type:"root", schema_version:number, children:[] }。
|
|
46
45
|
* 节点级字段(title/updated_at 等)不逐一校验——文件格式演进由 schema_version
|
|
47
|
-
*
|
|
46
|
+
* 判定,此处只拦「完全不是大纲树」的脏数据。
|
|
48
47
|
*/
|
|
49
48
|
function validateOutlineFile(parsed) {
|
|
50
49
|
if (typeof parsed !== "object" ||
|
|
@@ -53,15 +52,15 @@ function validateOutlineFile(parsed) {
|
|
|
53
52
|
parsed.type !== "root" ||
|
|
54
53
|
typeof parsed.schema_version !== "number" ||
|
|
55
54
|
!Array.isArray(parsed.children)) {
|
|
56
|
-
throw new Error("outline.json
|
|
55
|
+
throw new Error("outline.json 顶层结构不符(需 {id:\"root\", type:\"root\", schema_version, children[]})");
|
|
57
56
|
}
|
|
58
57
|
return parsed;
|
|
59
58
|
}
|
|
60
59
|
/**
|
|
61
|
-
* 原子写 outline.json
|
|
60
|
+
* 原子写 outline.json(临时文件 + fsync + rename,见 writeJsonAtomic)。
|
|
62
61
|
* 顶层 schema_version 随 tree.schema_version 原样写入——保持与 project.json
|
|
63
|
-
*
|
|
64
|
-
* 节点 updated_at
|
|
62
|
+
* 同步写入是调用方职责(两个文件用同一版本号常量)。
|
|
63
|
+
* 节点 updated_at 版本戳由调用方在变更后通过 touch/update 更新,
|
|
65
64
|
* 本函数不隐式修改树。
|
|
66
65
|
*/
|
|
67
66
|
export function writeOutlineFile(dir, tree) {
|
|
@@ -93,8 +92,8 @@ function nodeChildren(node) {
|
|
|
93
92
|
return node.children;
|
|
94
93
|
}
|
|
95
94
|
/**
|
|
96
|
-
*
|
|
97
|
-
* 由服务端原子写时统一更新 updated_at
|
|
95
|
+
* 更新节点版本戳(任何字段变更——含 children 重排、软删/还原——
|
|
96
|
+
* 由服务端原子写时统一更新 updated_at,支撑 提案快照比对)。
|
|
98
97
|
* 仅更新 updated_at,不改动其他字段;改 title/summary 用 updateOutlineNode。
|
|
99
98
|
*
|
|
100
99
|
* @param updatedAt ISO 8601,由调用方(应用层)传入,模块不生成时间
|
|
@@ -108,7 +107,7 @@ export function touchOutlineNode(tree, nodeId, updatedAt) {
|
|
|
108
107
|
node.updated_at = updatedAt;
|
|
109
108
|
}
|
|
110
109
|
/**
|
|
111
|
-
* 更新节点字段并统一更新 updated_at
|
|
110
|
+
* 更新节点字段并统一更新 updated_at 版本戳。
|
|
112
111
|
* 就地修改树(返回节点引用),调用方随后 writeOutlineFile 落盘;
|
|
113
112
|
* children 重排等无法用 patch 表达的变更请用 touchOutlineNode。
|
|
114
113
|
*
|
|
@@ -127,8 +126,8 @@ export function updateOutlineNode(tree, nodeId, patch, updatedAt) {
|
|
|
127
126
|
}
|
|
128
127
|
/**
|
|
129
128
|
* 根 → 目标节点的路径 id 列表(含 root 与目标节点自身)。
|
|
130
|
-
*
|
|
131
|
-
*
|
|
129
|
+
* 供后续卡使用:章节序现推、computeState 树路径排序(
|
|
130
|
+
* getNodePathIds)。
|
|
132
131
|
*
|
|
133
132
|
* @throws 节点不存在时抛错(路径唯一是严格三层的推论,找不到即调用方 bug)
|
|
134
133
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/storage/outline.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/storage/outline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ProjectFileConfig } from "@whispering233/ai-editor-shared";
|
|
2
|
-
/** project.json
|
|
2
|
+
/** project.json 文件名(项目根目录) */
|
|
3
3
|
export declare const PROJECT_FILE_NAME = "project.json";
|
|
4
|
-
/**
|
|
4
|
+
/** 文件名(项目规则文件,项目根目录,与 project.json 同级) */
|
|
5
5
|
export declare const AGENTS_FILE_NAME = "AGENTS.md";
|
|
6
6
|
/**
|
|
7
7
|
* 读取 project.json。
|
|
8
8
|
*
|
|
9
9
|
* 缺失文件语义:**返回 null**——project.json 是项目「是否已初始化」的判定文件
|
|
10
|
-
*
|
|
10
|
+
* (首次初始化时自动创建),null 即未初始化,由上层决定创建流程;
|
|
11
11
|
* 与 readOutlineFile(缺失返回空树)语义不同:大纲空树可直接使用,项目配置
|
|
12
12
|
* 不存在则无法合成默认值(id 需生成、name 需取目录名,属初始化逻辑)。
|
|
13
13
|
*
|
|
@@ -15,18 +15,18 @@ export declare const AGENTS_FILE_NAME = "AGENTS.md";
|
|
|
15
15
|
*
|
|
16
16
|
* @param dir 项目根目录
|
|
17
17
|
* @returns 项目配置;文件不存在返回 null
|
|
18
|
-
* @throws 文件存在但 JSON
|
|
18
|
+
* @throws 文件存在但 JSON 解析失败或顶层结构不符时抛出
|
|
19
19
|
*/
|
|
20
20
|
export declare function readProjectFile(dir: string): ProjectFileConfig | null;
|
|
21
21
|
/**
|
|
22
|
-
* 原子写 project.json
|
|
23
|
-
* schema_version 随 config 原样写入——与 outline.json
|
|
22
|
+
* 原子写 project.json( 同款流程:临时文件 + fsync + rename,)。
|
|
23
|
+
* schema_version 随 config 原样写入——与 outline.json 同步写入是调用方职责。
|
|
24
24
|
*/
|
|
25
25
|
export declare function writeProjectFile(dir: string, config: ProjectFileConfig): void;
|
|
26
26
|
/**
|
|
27
|
-
* 读取项目规则文件
|
|
27
|
+
* 读取项目规则文件 内容。
|
|
28
28
|
*
|
|
29
|
-
* 缺失文件语义:**返回 null**——
|
|
29
|
+
* 缺失文件语义:**返回 null**—— 是可选文件(新项目/未迁移项目可能没有),
|
|
30
30
|
* 由上层决定(GET /project/agents 返回 exists:false + 空串;chat 注入跳过「## 项目设定」段)。
|
|
31
31
|
*
|
|
32
32
|
* @param dir 项目根目录
|
|
@@ -35,16 +35,16 @@ export declare function writeProjectFile(dir: string, config: ProjectFileConfig)
|
|
|
35
35
|
*/
|
|
36
36
|
export declare function readAgentsFile(dir: string): string | null;
|
|
37
37
|
/**
|
|
38
|
-
* 原子写项目规则文件
|
|
38
|
+
* 原子写项目规则文件 ( 同款流程:临时文件 + fsync + rename)。
|
|
39
39
|
* 文件不存在时自动创建;内容**整体替换**(空串 = 清空规则,保留空文件不删除——exists 语义稳定)。
|
|
40
40
|
*
|
|
41
41
|
* @param dir 项目根目录
|
|
42
|
-
* @param content
|
|
42
|
+
* @param content 完整内容
|
|
43
43
|
* @throws 目录不可写 / 磁盘错误时抛出,且原文件保持完好
|
|
44
44
|
*/
|
|
45
45
|
export declare function writeAgentsFile(dir: string, content: string): void;
|
|
46
46
|
/**
|
|
47
|
-
* 读取
|
|
47
|
+
* 读取 的 mtime(ISO 8601)——外部修改检测依据。
|
|
48
48
|
* 文件不存在返回 null(与 GET /project/agents 的 updatedAt 语义一致)。
|
|
49
49
|
*
|
|
50
50
|
* @param dir 项目根目录
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAIrE;AAuBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE7E;AAID;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAElE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7D"}
|
package/dist/storage/project.js
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
// @whispering233/ai-editor-db project.json 存储模块(T2.2)
|
|
2
2
|
//
|
|
3
|
-
// 单一事实来源:doc/database/schema.md 第 157-186 行(project.json 契约)——
|
|
4
3
|
// id/name/language/prompt/schema_version/current_position/created_at/updated_at,
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// 项目规则唯一事实源 = 项目目录
|
|
4
|
+
// 文件写入走 原子写同款流程(第 186 行),DeepSeek key 绝不写入本文件。
|
|
5
|
+
// (2026-08 批次十): 项目规则文件读写也收敛于此(「」节)——
|
|
6
|
+
// 项目规则唯一事实源 = 项目目录 (取代 project.json `prompt` 字段,不再读写)。
|
|
8
7
|
import { join } from "node:path";
|
|
9
8
|
import { statSync } from "node:fs";
|
|
10
9
|
import { readTextFileOrNull, writeJsonAtomic, writeTextAtomic } from "./atomic.js";
|
|
11
|
-
/** project.json
|
|
10
|
+
/** project.json 文件名(项目根目录) */
|
|
12
11
|
export const PROJECT_FILE_NAME = "project.json";
|
|
13
|
-
/**
|
|
12
|
+
/** 文件名(项目规则文件,项目根目录,与 project.json 同级) */
|
|
14
13
|
export const AGENTS_FILE_NAME = "AGENTS.md";
|
|
15
14
|
/**
|
|
16
15
|
* 读取 project.json。
|
|
17
16
|
*
|
|
18
17
|
* 缺失文件语义:**返回 null**——project.json 是项目「是否已初始化」的判定文件
|
|
19
|
-
*
|
|
18
|
+
* (首次初始化时自动创建),null 即未初始化,由上层决定创建流程;
|
|
20
19
|
* 与 readOutlineFile(缺失返回空树)语义不同:大纲空树可直接使用,项目配置
|
|
21
20
|
* 不存在则无法合成默认值(id 需生成、name 需取目录名,属初始化逻辑)。
|
|
22
21
|
*
|
|
@@ -24,7 +23,7 @@ export const AGENTS_FILE_NAME = "AGENTS.md";
|
|
|
24
23
|
*
|
|
25
24
|
* @param dir 项目根目录
|
|
26
25
|
* @returns 项目配置;文件不存在返回 null
|
|
27
|
-
* @throws 文件存在但 JSON
|
|
26
|
+
* @throws 文件存在但 JSON 解析失败或顶层结构不符时抛出
|
|
28
27
|
*/
|
|
29
28
|
export function readProjectFile(dir) {
|
|
30
29
|
const raw = readTextFileOrNull(join(dir, PROJECT_FILE_NAME));
|
|
@@ -35,7 +34,7 @@ export function readProjectFile(dir) {
|
|
|
35
34
|
/**
|
|
36
35
|
* 校验 project.json 顶层结构(读时校验,与 outline.ts 的 validateOutlineFile 对称)。
|
|
37
36
|
* 必检字段(oracle 审核补):id / name / schema_version——schema_version 是 JSON
|
|
38
|
-
*
|
|
37
|
+
* 结构演进判定依据,id/name 是初始化即写入的必填项;language/prompt/
|
|
39
38
|
* current_position/时间戳等属可缺省或后续扩展字段,不在此拦截(避免旧文件误伤)。
|
|
40
39
|
* 节点级字段不逐一校验——文件格式演进由 schema_version 判定,此处只拦
|
|
41
40
|
* 「完全不是项目配置」的脏数据。
|
|
@@ -46,22 +45,22 @@ function validateProjectFile(parsed) {
|
|
|
46
45
|
typeof parsed.id !== "string" ||
|
|
47
46
|
typeof parsed.name !== "string" ||
|
|
48
47
|
typeof parsed.schema_version !== "number") {
|
|
49
|
-
throw new Error("project.json
|
|
48
|
+
throw new Error("project.json 顶层结构不符(需 {id:string, name:string, schema_version:number, ...})");
|
|
50
49
|
}
|
|
51
50
|
return parsed;
|
|
52
51
|
}
|
|
53
52
|
/**
|
|
54
|
-
* 原子写 project.json
|
|
55
|
-
* schema_version 随 config 原样写入——与 outline.json
|
|
53
|
+
* 原子写 project.json( 同款流程:临时文件 + fsync + rename,)。
|
|
54
|
+
* schema_version 随 config 原样写入——与 outline.json 同步写入是调用方职责。
|
|
56
55
|
*/
|
|
57
56
|
export function writeProjectFile(dir, config) {
|
|
58
57
|
writeJsonAtomic(join(dir, PROJECT_FILE_NAME), config);
|
|
59
58
|
}
|
|
60
|
-
// ============
|
|
59
|
+
// ============ 项目规则文件 ============
|
|
61
60
|
/**
|
|
62
|
-
* 读取项目规则文件
|
|
61
|
+
* 读取项目规则文件 内容。
|
|
63
62
|
*
|
|
64
|
-
* 缺失文件语义:**返回 null**——
|
|
63
|
+
* 缺失文件语义:**返回 null**—— 是可选文件(新项目/未迁移项目可能没有),
|
|
65
64
|
* 由上层决定(GET /project/agents 返回 exists:false + 空串;chat 注入跳过「## 项目设定」段)。
|
|
66
65
|
*
|
|
67
66
|
* @param dir 项目根目录
|
|
@@ -72,18 +71,18 @@ export function readAgentsFile(dir) {
|
|
|
72
71
|
return readTextFileOrNull(join(dir, AGENTS_FILE_NAME));
|
|
73
72
|
}
|
|
74
73
|
/**
|
|
75
|
-
* 原子写项目规则文件
|
|
74
|
+
* 原子写项目规则文件 ( 同款流程:临时文件 + fsync + rename)。
|
|
76
75
|
* 文件不存在时自动创建;内容**整体替换**(空串 = 清空规则,保留空文件不删除——exists 语义稳定)。
|
|
77
76
|
*
|
|
78
77
|
* @param dir 项目根目录
|
|
79
|
-
* @param content
|
|
78
|
+
* @param content 完整内容
|
|
80
79
|
* @throws 目录不可写 / 磁盘错误时抛出,且原文件保持完好
|
|
81
80
|
*/
|
|
82
81
|
export function writeAgentsFile(dir, content) {
|
|
83
82
|
writeTextAtomic(join(dir, AGENTS_FILE_NAME), content);
|
|
84
83
|
}
|
|
85
84
|
/**
|
|
86
|
-
* 读取
|
|
85
|
+
* 读取 的 mtime(ISO 8601)——外部修改检测依据。
|
|
87
86
|
* 文件不存在返回 null(与 GET /project/agents 的 updatedAt 语义一致)。
|
|
88
87
|
*
|
|
89
88
|
* @param dir 项目根目录
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,+
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,iFAAiF;AACjF,+CAA+C;AAC/C,sCAAsC;AACtC,uDAAuD;AAEvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,4BAA4B;AAC3E,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,MAAe;IAC1C,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,OAAQ,MAAkC,CAAC,EAAE,KAAK,QAAQ;QAC1D,OAAQ,MAAkC,CAAC,IAAI,KAAK,QAAQ;QAC5D,OAAQ,MAAkC,CAAC,cAAc,KAAK,QAAQ,EACtE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,MAA2B,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAyB;IACrE,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,mCAAmC;AAEnC;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,OAAe;IAC1D,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|