openfeel 1.1.7 → 1.2.0
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.en.md +13 -5
- package/README.md +8 -2
- package/README.zh-CN.md +13 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +23 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +279 -6
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +12 -5
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/req.d.ts +14 -0
- package/dist/commands/req.d.ts.map +1 -0
- package/dist/commands/req.js +562 -0
- package/dist/commands/req.js.map +1 -0
- package/dist/core/config.js +2 -2
- package/dist/core/flow-archive/archive-file.d.ts +35 -0
- package/dist/core/flow-archive/archive-file.d.ts.map +1 -0
- package/dist/core/flow-archive/archive-file.js +3 -0
- package/dist/core/flow-archive/archive-file.js.map +1 -0
- package/dist/core/flow-archive/archive-health.d.ts +34 -0
- package/dist/core/flow-archive/archive-health.d.ts.map +1 -0
- package/dist/core/flow-archive/archive-health.js +76 -0
- package/dist/core/flow-archive/archive-health.js.map +1 -0
- package/dist/core/flow-archive/archive-ops.d.ts +68 -0
- package/dist/core/flow-archive/archive-ops.d.ts.map +1 -0
- package/dist/core/flow-archive/archive-ops.js +184 -0
- package/dist/core/flow-archive/archive-ops.js.map +1 -0
- package/dist/core/flow-archive/grouping.d.ts +58 -0
- package/dist/core/flow-archive/grouping.d.ts.map +1 -0
- package/dist/core/flow-archive/grouping.js +153 -0
- package/dist/core/flow-archive/grouping.js.map +1 -0
- package/dist/core/flow-manager.d.ts +7 -0
- package/dist/core/flow-manager.d.ts.map +1 -1
- package/dist/core/flow-manager.js +54 -13
- package/dist/core/flow-manager.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts +1 -0
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +134 -0
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts +1 -0
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +135 -0
- package/dist/core/i18n-data/zh-CN.js.map +1 -1
- package/dist/core/i18n.js +4 -4
- package/dist/core/i18n.js.map +1 -1
- package/dist/core/plan/path.d.ts +17 -0
- package/dist/core/plan/path.d.ts.map +1 -1
- package/dist/core/plan/path.js +31 -0
- package/dist/core/plan/path.js.map +1 -1
- package/dist/core/req/aggregate.d.ts +61 -0
- package/dist/core/req/aggregate.d.ts.map +1 -0
- package/dist/core/req/aggregate.js +134 -0
- package/dist/core/req/aggregate.js.map +1 -0
- package/dist/core/req/body-file.d.ts +16 -0
- package/dist/core/req/body-file.d.ts.map +1 -0
- package/dist/core/req/body-file.js +80 -0
- package/dist/core/req/body-file.js.map +1 -0
- package/dist/core/req/requirement-ops.d.ts +74 -0
- package/dist/core/req/requirement-ops.d.ts.map +1 -0
- package/dist/core/req/requirement-ops.js +290 -0
- package/dist/core/req/requirement-ops.js.map +1 -0
- package/dist/core/req/types.d.ts +40 -0
- package/dist/core/req/types.d.ts.map +1 -0
- package/dist/core/req/types.js +13 -0
- package/dist/core/req/types.js.map +1 -0
- package/dist/core/setup.js +4 -4
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +305 -12
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +91 -8
- package/dist/core/update.js.map +1 -1
- package/package.json +1 -1
package/dist/core/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnE,cAAc;AACd,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,IAAI,QAAQ,EACtF,OAAO,IAAI,SAAS,EAAE,KAAK,IAAI,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,SAAS,IAAI,WAAW,EAChF,OAAO,IAAI,SAAS,EAAE,OAAO,IAAI,SAAS,EAAE,IAAI,IAAI,MAAM,EAAE,YAAY,IAAI,cAAc,EAC1F,IAAI,IAAI,MAAM,EAAE,MAAM,IAAI,QAAQ,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,EAC5F,OAAO,IAAI,SAAS,EAAE,IAAI,IAAI,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/core/plan/path.d.ts
CHANGED
|
@@ -35,6 +35,23 @@ export declare function stageIdToPlanDir(stageId: string): string | null;
|
|
|
35
35
|
* 无法解析返回 null。
|
|
36
36
|
*/
|
|
37
37
|
export declare function normalizeStageId(stageId: string): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* 判断给定 stageId 是否指向「已归档版本」的阶段(跨版本 deps 判定的单一口径,全仓唯一实现)。
|
|
40
|
+
*
|
|
41
|
+
* 判据:**显式携带版本前缀(全名格式)∧ 版本段 ∈ archivedVersions** → true;其余一律 false。
|
|
42
|
+
*
|
|
43
|
+
* @param stageId 待判定的阶段 ID(**恒传原始输入**,不得传归一化产物)
|
|
44
|
+
* @param archivedVersions 已归档版本前缀列表(`meta.archived_versions`;缺省/非数组 → 视为 [])
|
|
45
|
+
* @returns 是否命中已归档版本
|
|
46
|
+
*
|
|
47
|
+
* 三点理由:
|
|
48
|
+
* 1. **短名恒 false(REV-80-001)**:短名 `stage-NN` 经 parseStageId 归一为 `v1.0.0-*` 属默认版本语义
|
|
49
|
+
* (DEFAULT_STAGE_VERSION),不得据此判「已归档」——故以 `parsed.fullStageId !== stageId` 拒掉归一化产物。
|
|
50
|
+
* 2. **探针法零自写正则(REV-80-010)**:复用 parseStageId 派生(其内部正则即格式权威),消除第二信源。
|
|
51
|
+
* 3. **与 versionOfStageId 同源且禁 import flow-archive(REV-80-005)**:版本段派生技术一致(剥离 `-{stageDir}`
|
|
52
|
+
* 后缀),但 `plan/path.ts` 不得 import `flow-archive/*`(反向依赖成环),故就地重实现。
|
|
53
|
+
*/
|
|
54
|
+
export declare function isArchivedVersionOf(stageId: string, archivedVersions: readonly string[] | undefined): boolean;
|
|
38
55
|
/** stageId 校验结果 */
|
|
39
56
|
export interface StageIdValidation {
|
|
40
57
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/core/plan/path.ts"],"names":[],"mappings":"AAaA,oBAAoB;AACpB,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,iDAAiD;AACjD,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAsBlE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAQhE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAyCzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBxF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BrF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+BvF"}
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/core/plan/path.ts"],"names":[],"mappings":"AAaA,oBAAoB;AACpB,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,iDAAiD;AACjD,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAsBlE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAC9C,OAAO,CAcT;AAED,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAQhE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAyCzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBxF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BrF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+BvF"}
|
package/dist/core/plan/path.js
CHANGED
|
@@ -67,6 +67,37 @@ export function normalizeStageId(stageId) {
|
|
|
67
67
|
const parsed = parseStageId(stageId);
|
|
68
68
|
return parsed ? parsed.fullStageId : null;
|
|
69
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* 判断给定 stageId 是否指向「已归档版本」的阶段(跨版本 deps 判定的单一口径,全仓唯一实现)。
|
|
72
|
+
*
|
|
73
|
+
* 判据:**显式携带版本前缀(全名格式)∧ 版本段 ∈ archivedVersions** → true;其余一律 false。
|
|
74
|
+
*
|
|
75
|
+
* @param stageId 待判定的阶段 ID(**恒传原始输入**,不得传归一化产物)
|
|
76
|
+
* @param archivedVersions 已归档版本前缀列表(`meta.archived_versions`;缺省/非数组 → 视为 [])
|
|
77
|
+
* @returns 是否命中已归档版本
|
|
78
|
+
*
|
|
79
|
+
* 三点理由:
|
|
80
|
+
* 1. **短名恒 false(REV-80-001)**:短名 `stage-NN` 经 parseStageId 归一为 `v1.0.0-*` 属默认版本语义
|
|
81
|
+
* (DEFAULT_STAGE_VERSION),不得据此判「已归档」——故以 `parsed.fullStageId !== stageId` 拒掉归一化产物。
|
|
82
|
+
* 2. **探针法零自写正则(REV-80-010)**:复用 parseStageId 派生(其内部正则即格式权威),消除第二信源。
|
|
83
|
+
* 3. **与 versionOfStageId 同源且禁 import flow-archive(REV-80-005)**:版本段派生技术一致(剥离 `-{stageDir}`
|
|
84
|
+
* 后缀),但 `plan/path.ts` 不得 import `flow-archive/*`(反向依赖成环),故就地重实现。
|
|
85
|
+
*/
|
|
86
|
+
export function isArchivedVersionOf(stageId, archivedVersions) {
|
|
87
|
+
const parsed = parseStageId(stageId);
|
|
88
|
+
// 短名输入经 parseStageId 归一化(fullStageId ≠ 原输入)→ 恒 false(REV-80-001)
|
|
89
|
+
if (!parsed || parsed.fullStageId !== stageId) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// 版本段派生:剥离 `-{stageDir}` 后缀(与 versionOfStageId 同源技术)
|
|
93
|
+
const suffix = `-${parsed.stageDir}`;
|
|
94
|
+
if (!parsed.fullStageId.endsWith(suffix)) {
|
|
95
|
+
// 防御:parseStageId 产物恒满足(不可达分支,防未来漂移)
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const version = parsed.fullStageId.slice(0, -suffix.length);
|
|
99
|
+
return Array.isArray(archivedVersions) ? archivedVersions.includes(version) : false;
|
|
100
|
+
}
|
|
70
101
|
/**
|
|
71
102
|
* 校验 stageId 是否为合法格式(stage-NN / vX.Y.Z-stage-NN / vX-stage-NN)。
|
|
72
103
|
* 空字符串、'foo'、'v1' 等无法被 parseStageId 解析者判为非法。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/core/plan/path.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/core/plan/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 需求聚合投影与对称回写 — 阶段 phase 集合 → 需求状态的投影与内存回写
|
|
3
|
+
*
|
|
4
|
+
* 职责:① computeRequirementAggregate(纯投影;done 判定委托 allLinkedStagesDone 单一原语——REV-83-002;
|
|
5
|
+
* 零关联 → aggregate = null,空集守卫禁误报 done);② resolveRequirementStatusForStage(单阶段 → 目标状态,纯函数);
|
|
6
|
+
* ③ syncRequirementStatus(对称回写入口,纯内存,返回受影响需求 ID 列表,供测试/日志);
|
|
7
|
+
* ④ requirementHealthItems(需求对账项构造——悬空关联 / done 漂移;只读纯函数,warn-only 恒无 fail)。
|
|
8
|
+
* 正交声明:不依赖归档层 / 不引用工作流模式字段(禁用串零命中);对 flow-manager 仅 `import type`(防运行时环)。
|
|
9
|
+
* 写盘:全部纯内存——落盘恒走调用方 FlowManager.save()(不新增写盘点)。
|
|
10
|
+
*/
|
|
11
|
+
import type { FlowData, HealthCheckItem } from '../flow-manager.js';
|
|
12
|
+
import type { RequirementStatus } from './types.js';
|
|
13
|
+
/** auto-done 前置集(REV-83-004):聚合 done 时自动置 done 的合法来源状态。
|
|
14
|
+
* health 漂移判据与此**同口径**(结构化单点,禁第二份列表);draft/blocked/终态为设计豁免。 */
|
|
15
|
+
export declare const AUTO_DONE_PRECONDITION: readonly RequirementStatus[];
|
|
16
|
+
/** 聚合投影值域(三值;零关联 → null——空集守卫,禁误报 done) */
|
|
17
|
+
export type RequirementAggregateValue = 'scheduled' | 'in_progress' | 'done' | null;
|
|
18
|
+
/** 聚合投影结果(stageIds = data.stages 键序) */
|
|
19
|
+
export interface RequirementAggregate {
|
|
20
|
+
/** 关联阶段 ID 列表(data.stages 键序) */
|
|
21
|
+
stageIds: string[];
|
|
22
|
+
/** 关联阶段数 */
|
|
23
|
+
stageCount: number;
|
|
24
|
+
/** 其中 phase === 'done' 的数量 */
|
|
25
|
+
doneCount: number;
|
|
26
|
+
/** 粗粒度投影:全 done → done;任一非 plan_pending → in_progress;全 plan_pending → scheduled;零关联 → null */
|
|
27
|
+
aggregate: RequirementAggregateValue;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 需求聚合投影(纯函数;无 IO、无 this 依赖,给定输入相同输出)。
|
|
31
|
+
* done 分支**委托** allLinkedStagesDone(含空集守卫同源)——禁第二份 done 表达式(REV-83-002)。
|
|
32
|
+
* 零关联阶段 → aggregate = null(不参与 done 判定——空集守卫,禁误报)。
|
|
33
|
+
*/
|
|
34
|
+
export declare function computeRequirementAggregate(data: FlowData, requirementId: string): RequirementAggregate;
|
|
35
|
+
/**
|
|
36
|
+
* 单阶段 → 其关联需求的目标状态(纯函数;供回写入口消费)。
|
|
37
|
+
* 阶段不存在 / 无关联(null / undefined / 空串)→ null(早返回单点——零动作)。
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveRequirementStatusForStage(data: FlowData, stageId: string): {
|
|
40
|
+
requirementId: string;
|
|
41
|
+
target: Exclude<RequirementAggregateValue, null>;
|
|
42
|
+
} | null;
|
|
43
|
+
/**
|
|
44
|
+
* 需求聚合对称回写入口(纯内存;返回受影响需求 ID 列表)。
|
|
45
|
+
* 规则(聚合视图表述——不绑定事件,REV-83-005 / plan 不变量 8):
|
|
46
|
+
* - 聚合 done ∧ status ∈ AUTO_DONE_PRECONDITION → 置 done + 审计 requirement_auto_done;
|
|
47
|
+
* - 聚合 ≠ done ∧ status === 'done' → 回退 'in_progress'(不做 done→scheduled 细粒度回退,S-83-5)+ 审计 requirement_auto_reopen;
|
|
48
|
+
* - 其余(前置集外 / 悬空关联 / 状态无变化)→ 零动作零审计。
|
|
49
|
+
* 触发点由调用方约束:advance 仅 done 分支 / reset 写入后(op-002);dry-run 路径均不可达。
|
|
50
|
+
*/
|
|
51
|
+
export declare function syncRequirementStatus(data: FlowData, stageId: string): string[];
|
|
52
|
+
/**
|
|
53
|
+
* 需求对账检查项(只读纯函数):① 悬空 requirement_id(阶段引用的需求不存在);
|
|
54
|
+
* ② done 漂移(**前置集内**(AUTO_DONE_PRECONDITION 同口径单点)∧ 聚合 done ∧ status ≠ done——
|
|
55
|
+
* draft/blocked/终态为设计豁免不报)。恒无 fail → 不改退出码、不参与 --fix(对齐归档对账范式)。
|
|
56
|
+
*/
|
|
57
|
+
export declare function requirementHealthItems(input: {
|
|
58
|
+
data: FlowData;
|
|
59
|
+
lang?: string;
|
|
60
|
+
}): HealthCheckItem[];
|
|
61
|
+
//# sourceMappingURL=aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/core/req/aggregate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD;gEACgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,SAAS,iBAAiB,EAAiC,CAAC;AAEjG,2CAA2C;AAC3C,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpF,wCAAwC;AACxC,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,SAAS,EAAE,yBAAyB,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,oBAAoB,CAgBvG;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,GACd;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAA;CAAE,GAAG,IAAI,CAOpF;AAOD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB/E;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,EAAE,CA6BlG"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { allLinkedStagesDone } from './requirement-ops.js'; // done 判定唯一原语(REV-83-002)
|
|
2
|
+
import { t } from '../i18n.js'; // 对账文案(新键 flow.health.req*;双表成对)
|
|
3
|
+
/** auto-done 前置集(REV-83-004):聚合 done 时自动置 done 的合法来源状态。
|
|
4
|
+
* health 漂移判据与此**同口径**(结构化单点,禁第二份列表);draft/blocked/终态为设计豁免。 */
|
|
5
|
+
export const AUTO_DONE_PRECONDITION = ['scheduled', 'in_progress'];
|
|
6
|
+
/**
|
|
7
|
+
* 需求聚合投影(纯函数;无 IO、无 this 依赖,给定输入相同输出)。
|
|
8
|
+
* done 分支**委托** allLinkedStagesDone(含空集守卫同源)——禁第二份 done 表达式(REV-83-002)。
|
|
9
|
+
* 零关联阶段 → aggregate = null(不参与 done 判定——空集守卫,禁误报)。
|
|
10
|
+
*/
|
|
11
|
+
export function computeRequirementAggregate(data, requirementId) {
|
|
12
|
+
const linked = Object.entries(data.stages ?? {}).filter(([, s]) => (s.requirement_id ?? null) === requirementId);
|
|
13
|
+
const stageIds = linked.map(([stageId]) => stageId);
|
|
14
|
+
const stageCount = stageIds.length;
|
|
15
|
+
let doneCount = 0;
|
|
16
|
+
let anyStarted = false;
|
|
17
|
+
for (const [, s] of linked) {
|
|
18
|
+
if (s.phase === 'done') {
|
|
19
|
+
doneCount += 1;
|
|
20
|
+
}
|
|
21
|
+
if (s.phase !== 'plan_pending') {
|
|
22
|
+
anyStarted = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// 零关联 → null(空集守卫);done 判定唯一经 allLinkedStagesDone 委托(禁第二份表达式)
|
|
26
|
+
let aggregate = null;
|
|
27
|
+
if (stageCount > 0) {
|
|
28
|
+
aggregate = allLinkedStagesDone(data, requirementId) ? 'done' : (anyStarted ? 'in_progress' : 'scheduled');
|
|
29
|
+
}
|
|
30
|
+
return { stageIds, stageCount, doneCount, aggregate };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 单阶段 → 其关联需求的目标状态(纯函数;供回写入口消费)。
|
|
34
|
+
* 阶段不存在 / 无关联(null / undefined / 空串)→ null(早返回单点——零动作)。
|
|
35
|
+
*/
|
|
36
|
+
export function resolveRequirementStatusForStage(data, stageId) {
|
|
37
|
+
const stage = data.stages?.[stageId];
|
|
38
|
+
const requirementId = stage?.requirement_id ?? null;
|
|
39
|
+
if (!requirementId) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const agg = computeRequirementAggregate(data, requirementId);
|
|
43
|
+
if (agg.aggregate === null) {
|
|
44
|
+
return null;
|
|
45
|
+
} // 不可达(该阶段自身即关联)——防御
|
|
46
|
+
return { requirementId, target: agg.aggregate };
|
|
47
|
+
}
|
|
48
|
+
/** 追加聚合回写审计日志(纯内存;save 由调用方承担;与需求原语审计同形——agent 'cli',S-83-6) */
|
|
49
|
+
function appendAggregateLog(data, action, detail) {
|
|
50
|
+
data.log.push({ time: new Date().toISOString(), agent: 'cli', action, detail });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 需求聚合对称回写入口(纯内存;返回受影响需求 ID 列表)。
|
|
54
|
+
* 规则(聚合视图表述——不绑定事件,REV-83-005 / plan 不变量 8):
|
|
55
|
+
* - 聚合 done ∧ status ∈ AUTO_DONE_PRECONDITION → 置 done + 审计 requirement_auto_done;
|
|
56
|
+
* - 聚合 ≠ done ∧ status === 'done' → 回退 'in_progress'(不做 done→scheduled 细粒度回退,S-83-5)+ 审计 requirement_auto_reopen;
|
|
57
|
+
* - 其余(前置集外 / 悬空关联 / 状态无变化)→ 零动作零审计。
|
|
58
|
+
* 触发点由调用方约束:advance 仅 done 分支 / reset 写入后(op-002);dry-run 路径均不可达。
|
|
59
|
+
*/
|
|
60
|
+
export function syncRequirementStatus(data, stageId) {
|
|
61
|
+
const resolved = resolveRequirementStatusForStage(data, stageId);
|
|
62
|
+
if (!resolved) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
// raw find 改本体(禁经浅副本——与需求原语写路径同纪律);非数组视同空集(读侧宽容,零注入)
|
|
66
|
+
const req = (Array.isArray(data.requirements) ? data.requirements : []).find((r) => r?.id === resolved.requirementId);
|
|
67
|
+
if (!req) {
|
|
68
|
+
return [];
|
|
69
|
+
} // 悬空 requirement_id → 零动作(health 对账报告,不自动修)
|
|
70
|
+
const affected = [];
|
|
71
|
+
if (resolved.target === 'done') {
|
|
72
|
+
// 正向:聚合 done ∧ 前置集内 → done(前置集外零动作零审计——REV-83-004)
|
|
73
|
+
if (AUTO_DONE_PRECONDITION.includes(req.status)) {
|
|
74
|
+
const from = req.status;
|
|
75
|
+
req.status = 'done';
|
|
76
|
+
req.updated_at = new Date().toISOString();
|
|
77
|
+
appendAggregateLog(data, 'requirement_auto_done', { requirementId: req.id, from, to: 'done', triggerStage: stageId });
|
|
78
|
+
affected.push(req.id);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (req.status === 'done') {
|
|
82
|
+
// 对称回退(聚合视图,不绑定事件):聚合 ≠ done ∧ status === done → in_progress(REV-83-005)
|
|
83
|
+
req.status = 'in_progress';
|
|
84
|
+
req.updated_at = new Date().toISOString();
|
|
85
|
+
appendAggregateLog(data, 'requirement_auto_reopen', { requirementId: req.id, from: 'done', to: 'in_progress', triggerStage: stageId });
|
|
86
|
+
affected.push(req.id);
|
|
87
|
+
}
|
|
88
|
+
return affected;
|
|
89
|
+
}
|
|
90
|
+
/** 需求对账 section(悬空关联;恒产生 1 条 pass/warn——对齐归档对账 a 项先例) */
|
|
91
|
+
const SECTION_REQ_LINKS = '需求对账';
|
|
92
|
+
/** 需求漂移 section(仅非空时产生 warn——对齐归档对账 b 项先例) */
|
|
93
|
+
const SECTION_REQ_DRIFT = '需求漂移';
|
|
94
|
+
/**
|
|
95
|
+
* 需求对账检查项(只读纯函数):① 悬空 requirement_id(阶段引用的需求不存在);
|
|
96
|
+
* ② done 漂移(**前置集内**(AUTO_DONE_PRECONDITION 同口径单点)∧ 聚合 done ∧ status ≠ done——
|
|
97
|
+
* draft/blocked/终态为设计豁免不报)。恒无 fail → 不改退出码、不参与 --fix(对齐归档对账范式)。
|
|
98
|
+
*/
|
|
99
|
+
export function requirementHealthItems(input) {
|
|
100
|
+
const { data } = input;
|
|
101
|
+
const lang = input.lang ?? 'zh-CN';
|
|
102
|
+
const items = [];
|
|
103
|
+
const requirements = Array.isArray(data.requirements) ? data.requirements : [];
|
|
104
|
+
const ids = new Set(requirements.map((r) => r?.id).filter((x) => typeof x === 'string'));
|
|
105
|
+
// ① 悬空需求关联(阶段 → 不存在需求)
|
|
106
|
+
const dangling = [];
|
|
107
|
+
for (const [stageId, s] of Object.entries(data.stages ?? {})) {
|
|
108
|
+
const rid = s?.requirement_id ?? null;
|
|
109
|
+
if (rid !== null && rid !== '' && !ids.has(rid)) {
|
|
110
|
+
dangling.push(`${stageId} → ${rid}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (dangling.length === 0) {
|
|
114
|
+
items.push({ section: SECTION_REQ_LINKS, status: 'pass', message: t('flow.health.reqLinksPassTmpl', lang, { n: String(requirements.length) }) });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
items.push({ section: SECTION_REQ_LINKS, status: 'warn', message: t('flow.health.reqDanglingTmpl', lang, { items: dangling.slice(0, 5).join(', ') }) });
|
|
118
|
+
}
|
|
119
|
+
// ② done 漂移:与回写守卫**同口径**(AUTO_DONE_PRECONDITION 单点——禁第二份前置集列表)
|
|
120
|
+
const drifted = [];
|
|
121
|
+
for (const r of requirements) {
|
|
122
|
+
if (!AUTO_DONE_PRECONDITION.includes(r.status)) {
|
|
123
|
+
continue;
|
|
124
|
+
} // 前置集外(含 draft/blocked/终态)设计豁免
|
|
125
|
+
if (computeRequirementAggregate(data, r.id).aggregate === 'done') {
|
|
126
|
+
drifted.push(r.id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (drifted.length > 0) {
|
|
130
|
+
items.push({ section: SECTION_REQ_DRIFT, status: 'warn', message: t('flow.health.reqDriftTmpl', lang, { items: drifted.slice(0, 5).join(', ') }) });
|
|
131
|
+
}
|
|
132
|
+
return items;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/core/req/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RequirementData } from './types.js';
|
|
2
|
+
/** 需求正文目录:{projectPath}/.openfeel/requirements(**不纳入 WORKSPACE_DIRS**,按需 mkdir 幂等创建——与归档目录同口径) */
|
|
3
|
+
export declare function getRequirementsDir(projectPath: string): string;
|
|
4
|
+
/** 正文**存储**相对路径(恒 POSIX 正斜杠,跨平台一致;禁 path.join——Windows 产反斜杠) */
|
|
5
|
+
export declare function getRequirementBodyRelPath(id: string): string;
|
|
6
|
+
/** 正文**文件系统**路径(单点;FS 访问用原生分隔符) */
|
|
7
|
+
export declare function getRequirementBodyPath(projectPath: string, id: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* 机械铺需求正文骨架(人读副本)。
|
|
10
|
+
* - mkdir 幂等;atomicWriteFileSync(backup 缺省 false)
|
|
11
|
+
* - 目标文件已存在 → **no-op 不覆盖**(保留人工补充内容)
|
|
12
|
+
* - 恒将 req.body_path 设为本函数单点派生的 POSIX 相对路径(传入须为 addRequirement 返回的本体)
|
|
13
|
+
* @returns 目标文件的绝对路径
|
|
14
|
+
*/
|
|
15
|
+
export declare function writeRequirementBodySkeleton(projectPath: string, req: RequirementData): string;
|
|
16
|
+
//# sourceMappingURL=body-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-file.d.ts","sourceRoot":"","sources":["../../../src/core/req/body-file.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,gEAAgE;AAChE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9E;AA0CD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAQ9F"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 需求正文文件原语 — 正文路径单点与骨架机械铺
|
|
3
|
+
*
|
|
4
|
+
* 职责:`.openfeel/requirements/REQ-NNN.md` 正文文件(人读副本)的路径派生与骨架写入。
|
|
5
|
+
* 正交声明:路径全由 `projectPath` 参数传入,零全局路径依赖;不依赖归档层 / 不引用工作流模式字段。
|
|
6
|
+
* 唯一 IO 点:骨架经 `atomicWriteFileSync` 落盘(目录按需 mkdir 幂等创建)。
|
|
7
|
+
*/
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
10
|
+
import { atomicWriteFileSync } from '../fs/atomic-write.js';
|
|
11
|
+
/** 需求正文目录:{projectPath}/.openfeel/requirements(**不纳入 WORKSPACE_DIRS**,按需 mkdir 幂等创建——与归档目录同口径) */
|
|
12
|
+
export function getRequirementsDir(projectPath) {
|
|
13
|
+
return join(projectPath, '.openfeel', 'requirements');
|
|
14
|
+
}
|
|
15
|
+
/** 正文**存储**相对路径(恒 POSIX 正斜杠,跨平台一致;禁 path.join——Windows 产反斜杠) */
|
|
16
|
+
export function getRequirementBodyRelPath(id) {
|
|
17
|
+
return `.openfeel/requirements/${id}.md`;
|
|
18
|
+
}
|
|
19
|
+
/** 正文**文件系统**路径(单点;FS 访问用原生分隔符) */
|
|
20
|
+
export function getRequirementBodyPath(projectPath, id) {
|
|
21
|
+
return join(getRequirementsDir(projectPath), `${id}.md`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 渲染需求正文骨架(裁定 6 模板逐字)。
|
|
25
|
+
* 状态取当前值(新需求恒为 draft 快照);`target_version` 缺省渲染为 `(未指定)`。
|
|
26
|
+
*/
|
|
27
|
+
function renderRequirementBodySkeleton(req) {
|
|
28
|
+
const targetVersion = req.target_version !== undefined && req.target_version !== ''
|
|
29
|
+
? req.target_version
|
|
30
|
+
: '(未指定)';
|
|
31
|
+
return [
|
|
32
|
+
`# ${req.id}:${req.title}`,
|
|
33
|
+
'',
|
|
34
|
+
'> 本文件为需求正文(人读副本,由 req add 机械铺骨架)。**机读权威恒为 `.openfeel/flow.json` 的 `requirements` 条目**;两者不一致时以 flow.json 为准。下方状态为创建时快照,不追写实时状态。',
|
|
35
|
+
'',
|
|
36
|
+
'## 状态',
|
|
37
|
+
'',
|
|
38
|
+
`${req.status}(创建时快照;以 flow.json 为准)`,
|
|
39
|
+
'',
|
|
40
|
+
'## 摘要',
|
|
41
|
+
'',
|
|
42
|
+
'(待补充)',
|
|
43
|
+
'',
|
|
44
|
+
'## 目标与验收',
|
|
45
|
+
'',
|
|
46
|
+
'(待补充)',
|
|
47
|
+
'',
|
|
48
|
+
'## 预估版本',
|
|
49
|
+
'',
|
|
50
|
+
targetVersion,
|
|
51
|
+
'',
|
|
52
|
+
'## 关联阶段',
|
|
53
|
+
'',
|
|
54
|
+
'(以 flow.json 的 `stages[*].requirement_id` 为准;此处可人工补充说明)',
|
|
55
|
+
'',
|
|
56
|
+
'## 变更记录',
|
|
57
|
+
'',
|
|
58
|
+
`- ${req.created_at} 创建(${req.id},初始状态 draft)`,
|
|
59
|
+
'',
|
|
60
|
+
].join('\n');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 机械铺需求正文骨架(人读副本)。
|
|
64
|
+
* - mkdir 幂等;atomicWriteFileSync(backup 缺省 false)
|
|
65
|
+
* - 目标文件已存在 → **no-op 不覆盖**(保留人工补充内容)
|
|
66
|
+
* - 恒将 req.body_path 设为本函数单点派生的 POSIX 相对路径(传入须为 addRequirement 返回的本体)
|
|
67
|
+
* @returns 目标文件的绝对路径
|
|
68
|
+
*/
|
|
69
|
+
export function writeRequirementBodySkeleton(projectPath, req) {
|
|
70
|
+
const dir = getRequirementsDir(projectPath);
|
|
71
|
+
mkdirSync(dir, { recursive: true }); // 幂等
|
|
72
|
+
const filePath = getRequirementBodyPath(projectPath, req.id);
|
|
73
|
+
req.body_path = getRequirementBodyRelPath(req.id); // 单点赋值(no-op 路径亦保证一致)
|
|
74
|
+
if (existsSync(filePath)) {
|
|
75
|
+
return filePath;
|
|
76
|
+
} // 已存在 → 不覆盖
|
|
77
|
+
atomicWriteFileSync(filePath, renderRequirementBodySkeleton(req));
|
|
78
|
+
return filePath;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=body-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-file.js","sourceRoot":"","sources":["../../../src/core/req/body-file.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,yBAAyB,CAAC,EAAU;IAClD,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC3C,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,EAAU;IACpE,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,6BAA6B,CAAC,GAAoB;IACzD,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,GAAG,CAAC,cAAc,KAAK,EAAE;QACjF,CAAC,CAAC,GAAG,CAAC,cAAc;QACpB,CAAC,CAAC,OAAO,CAAC;IACZ,OAAO;QACL,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE;QAC1B,EAAE;QACF,gIAAgI;QAChI,EAAE;QACF,OAAO;QACP,EAAE;QACF,GAAG,GAAG,CAAC,MAAM,wBAAwB;QACrC,EAAE;QACF,OAAO;QACP,EAAE;QACF,OAAO;QACP,EAAE;QACF,UAAU;QACV,EAAE;QACF,OAAO;QACP,EAAE;QACF,SAAS;QACT,EAAE;QACF,aAAa;QACb,EAAE;QACF,SAAS;QACT,EAAE;QACF,yDAAyD;QACzD,EAAE;QACF,SAAS;QACT,EAAE;QACF,KAAK,GAAG,CAAC,UAAU,OAAO,GAAG,CAAC,EAAE,cAAc;QAC9C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAmB,EAAE,GAAoB;IACpF,MAAM,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAuB,KAAK;IAChE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7D,GAAG,CAAC,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAS,sBAAsB;IACjF,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC,CAAa,YAAY;IACvE,mBAAmB,CAAC,QAAQ,EAAE,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 需求原语 — 需求层纯内存操作的单一入口
|
|
3
|
+
*
|
|
4
|
+
* 职责:需求读取(读侧宽容 + 浅副本)、ID 分配、写路径原语(add / claim / release / update / advance / link)
|
|
5
|
+
* 与共用谓词(终态判定 / 全部关联阶段 done)。全部为**纯内存**操作 + 审计内嵌(`data.log`),
|
|
6
|
+
* 零独立写盘点——落盘恒走调用方(命令层)的 `FlowManager` 落盘方法。
|
|
7
|
+
* 正交声明:不依赖归档层 / 不引用工作流模式字段。
|
|
8
|
+
*/
|
|
9
|
+
import type { FlowData } from '../flow-manager.js';
|
|
10
|
+
import { type RequirementData, type RequirementPriority, type RequirementStatus } from './types.js';
|
|
11
|
+
/** 需求原语错误码(冻结;命令层据此映射 exit 非 0 零写盘) */
|
|
12
|
+
export type RequirementErrorCode = 'not_found' | 'stage_not_found' | 'already_claimed' | 'already_linked' | 'invalid_status' | 'invalid_field';
|
|
13
|
+
/** 写路径原语结果(ok=false 时携错误码;命令层映射 exit 非 0 零写盘) */
|
|
14
|
+
export type RequirementOpResult = {
|
|
15
|
+
ok: true;
|
|
16
|
+
changed: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
code: RequirementErrorCode;
|
|
20
|
+
};
|
|
21
|
+
/** 全量需求(读侧宽容:缺失/非数组 → [];数组 + 元素浅副本,防外部直改内存) */
|
|
22
|
+
export declare function getRequirements(data: FlowData): RequirementData[];
|
|
23
|
+
/** 按 id 查询(未命中 null;返回浅副本) */
|
|
24
|
+
export declare function getRequirement(data: FlowData, id: string): RequirementData | null;
|
|
25
|
+
/** 过滤查询(status 精确 / target_version 精确 / owner 精确;多条件 AND;API 面命名统一 target_version——REV-81-012) */
|
|
26
|
+
export declare function listRequirements(data: FlowData, filter?: {
|
|
27
|
+
status?: RequirementStatus;
|
|
28
|
+
target_version?: string;
|
|
29
|
+
owner?: string;
|
|
30
|
+
}): RequirementData[];
|
|
31
|
+
/** 下一个需求 ID:现存 id 数字部分 max+1(不回收;异常 id 跳过不崩) */
|
|
32
|
+
export declare function nextRequirementId(data: FlowData): string;
|
|
33
|
+
/** 终态判定(done/cancelled/rejected;claim / link 门共用) */
|
|
34
|
+
export declare function isTerminalRequirementStatus(status: RequirementStatus): boolean;
|
|
35
|
+
/** 裁定 4:全部关联阶段 done(零关联 → false,空集守卫) */
|
|
36
|
+
export declare function allLinkedStagesDone(data: FlowData, requirementId: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 新建需求(恒 `status: 'draft'`;读侧宽容写路径;返回**本体**供调用方继续设 body_path)。
|
|
39
|
+
* 非法入参(空 title / 非法 priority / 空 target_version)属构造期契约违反 → 抛错(唯一抛错原语,REV-81-015)。
|
|
40
|
+
* REV-81-018 登记:add 构造期抛错 / update 运行期错误码为接受差异(与命令层分流矩阵同口径,REV-82-002);stage-81 冻结面不统一。
|
|
41
|
+
*/
|
|
42
|
+
export declare function addRequirement(data: FlowData, input: {
|
|
43
|
+
title: string;
|
|
44
|
+
target_version?: string;
|
|
45
|
+
priority?: RequirementPriority;
|
|
46
|
+
}): RequirementData;
|
|
47
|
+
/** 认领需求(占用校验;同 owner 幂等;终态拒绝;他人占用零变更零审计) */
|
|
48
|
+
export declare function claimRequirement(data: FlowData, id: string, owner: string): RequirementOpResult;
|
|
49
|
+
/** 释放认领(裁定 5:无占用者 = no-op 成功——不刷 updated_at / 不写审计;不设状态门) */
|
|
50
|
+
export declare function releaseRequirement(data: FlowData, id: string): RequirementOpResult;
|
|
51
|
+
/**
|
|
52
|
+
* 当前状态的合法目标列表(只读纯函数;领域外状态 → [])。
|
|
53
|
+
* 命令层「列合法目标」的唯一来源——禁第二份流转表(REV-82-003);返回副本,防调用方直改内部表。
|
|
54
|
+
*/
|
|
55
|
+
export declare function getAllowedNextStatuses(status: RequirementStatus): RequirementStatus[];
|
|
56
|
+
/**
|
|
57
|
+
* 更新需求(patch 白名单;全部维度先校验后落地——校验失败整 patch 零变更)。
|
|
58
|
+
* 恒 raw find 改 `data.requirements` 本体(禁经 getRequirement 的浅副本——副本陷阱,REV-81-011)。
|
|
59
|
+
*/
|
|
60
|
+
export declare function updateRequirement(data: FlowData, id: string, patch: {
|
|
61
|
+
status?: RequirementStatus;
|
|
62
|
+
title?: string;
|
|
63
|
+
target_version?: string;
|
|
64
|
+
priority?: RequirementPriority;
|
|
65
|
+
}): RequirementOpResult;
|
|
66
|
+
/** 显式人工推进(裁定 M);语义与 update({status}) 完全一致(同表同门同审计,零第二套) */
|
|
67
|
+
export declare function advanceRequirement(data: FlowData, id: string, to: RequirementStatus): RequirementOpResult;
|
|
68
|
+
/**
|
|
69
|
+
* 阶段关联需求(stage 侧写点;`null` = 解绑)。
|
|
70
|
+
* 终态需求拒绝关联、他人已关联阶段拒绝重绑(须先解绑);
|
|
71
|
+
* 不刷新 requirement.updated_at(关联写点落在 stage 记录,需求对象零变更)。
|
|
72
|
+
*/
|
|
73
|
+
export declare function linkRequirement(data: FlowData, stageId: string, requirementId: string | null): RequirementOpResult;
|
|
74
|
+
//# sourceMappingURL=requirement-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement-ops.d.ts","sourceRoot":"","sources":["../../../src/core/req/requirement-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAEL,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EACvE,MAAM,YAAY,CAAC;AAEpB,uCAAuC;AACvC,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,CAAC;AAEpB,iDAAiD;AACjD,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAS7G,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,EAAE,CAGjE;AAED,8BAA8B;AAC9B,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGjF;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,MAAM,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/E,eAAe,EAAE,CAMnB;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CASxD;AAED,qDAAqD;AACrD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAE9E;AAED,yCAAyC;AACzC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAGlF;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAChF,eAAe,CAuBjB;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAa/F;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,mBAAmB,CASlF;AAWD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,CAErF;AAoBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAC7G,mBAAmB,CAyDrB;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,mBAAmB,CAEzG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,mBAAmB,CAoBlH"}
|