dsh-tree-task-flow 0.3.14 → 0.3.15
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/README.md +119 -98
- package/client.js +590 -675
- package/config.example.yml +8 -7
- package/cordis.patch.yml +4 -4
- package/lib/commands.js +57 -25
- package/lib/http.js +181 -46
- package/lib/index.js +1 -1
- package/lib/notes.js +173 -0
- package/lib/pause.js +44 -0
- package/lib/prompt.js +20 -4
- package/lib/region.js +375 -58
- package/lib/render.js +311 -0
- package/lib/requirement.js +914 -0
- package/lib/store.js +50 -7
- package/lib/tools.js +588 -144
- package/package.json +2 -2
package/lib/store.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 三类状态,都**以 `sessionId` 为键**:
|
|
5
5
|
*
|
|
6
|
-
* - `plans/<sessionId>.json`
|
|
6
|
+
* - `plans/<sessionId>.json` 计划树(需求都在里面的 `goals` 里)
|
|
7
|
+
* - `notes/<sessionId>.json` 笔记,按会话一份
|
|
7
8
|
* - `surfaces/<sessionId>.json` 三层的折叠游标(只给界面看,不参与折叠)
|
|
8
9
|
* - `held/<sessionId>.json` 「被按住」:暂停 / 停止,**要跨重启保留**
|
|
9
10
|
* - `revive/<sessionId>.json` 意外中断的拉起重试链,**要跨重启保留**
|
|
@@ -28,6 +29,8 @@
|
|
|
28
29
|
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
29
30
|
import { homedir } from "node:os";
|
|
30
31
|
import { dirname, join } from "node:path";
|
|
32
|
+
import { normalizeNotes } from "./notes.js";
|
|
33
|
+
import { normalizeRequirement } from "./requirement.js";
|
|
31
34
|
|
|
32
35
|
/**
|
|
33
36
|
* 没有显式配置时的状态根目录。
|
|
@@ -60,19 +63,29 @@ function writeJson(file, value) {
|
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
/**
|
|
63
|
-
* 老结构(整棵树只有一个 `goal` 字段)读进来时升级成 `goals`
|
|
66
|
+
* 老结构(整棵树只有一个 `goal` 字段)读进来时升级成 `goals` 数组,
|
|
67
|
+
* 再给每条记录补上需求那一层缺的字段。
|
|
64
68
|
*
|
|
65
|
-
*
|
|
69
|
+
* 计划文件是插件自己的持久状态,换个版本不该让既有的树失联——所以**读的时候补,
|
|
70
|
+
* 不迁移磁盘上的老文件**:老会话的计划文件保持原样,缺什么字段就在内存里补什么,
|
|
71
|
+
* 下一次写入自然带上(见 `requirement.normalizeRequirement`)。
|
|
66
72
|
*
|
|
67
73
|
* @param plan - 磁盘上读到的对象,可能是 null。
|
|
68
74
|
* @returns 归一化后的计划树。
|
|
69
75
|
*/
|
|
70
76
|
function normalizePlan(plan) {
|
|
71
77
|
if (plan === null || typeof plan !== "object") return plan;
|
|
72
|
-
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
let upgraded = plan;
|
|
79
|
+
if (!Array.isArray(plan.goals)) {
|
|
80
|
+
if (plan.goal === undefined || plan.goal === null) {
|
|
81
|
+
upgraded = { ...plan, goals: [] };
|
|
82
|
+
} else {
|
|
83
|
+
const { goal, ...rest } = plan;
|
|
84
|
+
upgraded = { ...rest, version: 2, goals: [goal] };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const goal of upgraded.goals) normalizeRequirement(goal);
|
|
88
|
+
return upgraded;
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
/**
|
|
@@ -93,6 +106,9 @@ export function createStore(root) {
|
|
|
93
106
|
/** 设置文件的路径(与会话无关,整个状态根一份)。 */
|
|
94
107
|
const settingsFile = () => file("settings.json");
|
|
95
108
|
|
|
109
|
+
/** 笔记文件的路径(按会话一份)。 */
|
|
110
|
+
const notesFile = (sessionId) => file("notes", `${sessionId}.json`);
|
|
111
|
+
|
|
96
112
|
/** 读「被按住」状态;读不到或文件坏了,一律按"没被按住"处理。 */
|
|
97
113
|
function readHeldState(sessionId) {
|
|
98
114
|
if (!sessionId) return { paused: false, stopped: false, at: null };
|
|
@@ -217,6 +233,33 @@ export function createStore(root) {
|
|
|
217
233
|
return next;
|
|
218
234
|
},
|
|
219
235
|
|
|
236
|
+
// ---- 笔记:**按会话**,一个会话一份 ----
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 读这个会话的笔记。
|
|
240
|
+
*
|
|
241
|
+
* 笔记跟着会话走:它记的是"这次工作的上下文里必须一直记着的几句话",
|
|
242
|
+
* 换一个会话就等于换了一份工作,旧笔记跟过去只会变成噪声。
|
|
243
|
+
*
|
|
244
|
+
* @param sessionId - 会话 id。
|
|
245
|
+
* @returns `{ version, items, updatedAt }`;没有笔记时 `items` 是空数组。
|
|
246
|
+
*/
|
|
247
|
+
readNotes(sessionId) {
|
|
248
|
+
if (!sessionId) return normalizeNotes(null);
|
|
249
|
+
return normalizeNotes(readJson(notesFile(sessionId), null));
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* 整份写回笔记表。调用方(`lib/notes.js` 的 `upsertNote`)已经改好了内容。
|
|
254
|
+
*
|
|
255
|
+
* @param sessionId - 会话 id。
|
|
256
|
+
* @param state - 完整笔记表。
|
|
257
|
+
*/
|
|
258
|
+
writeNotes(sessionId, state) {
|
|
259
|
+
if (!sessionId) return;
|
|
260
|
+
writeJson(notesFile(sessionId), state);
|
|
261
|
+
},
|
|
262
|
+
|
|
220
263
|
// ---- 「被按住」:暂停 / 停止。**要跨重启保留**,所以落盘 ----
|
|
221
264
|
|
|
222
265
|
/**
|