openfeel 1.2.0 → 1.2.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/README.en.md +27 -8
- package/README.md +24 -5
- package/README.zh-CN.md +27 -8
- package/bin/openfeel.js +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +6 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +106 -8
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +7 -1
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/req.d.ts +2 -1
- package/dist/commands/req.d.ts.map +1 -1
- package/dist/commands/req.js +199 -26
- package/dist/commands/req.js.map +1 -1
- package/dist/commands/stage.d.ts.map +1 -1
- package/dist/commands/stage.js +7 -1
- package/dist/commands/stage.js.map +1 -1
- package/dist/core/config.d.ts +6 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +6 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/flow-manager.d.ts +60 -9
- package/dist/core/flow-manager.d.ts.map +1 -1
- package/dist/core/flow-manager.js +189 -38
- package/dist/core/flow-manager.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +44 -8
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +44 -8
- package/dist/core/i18n-data/zh-CN.js.map +1 -1
- package/dist/core/managed-region.d.ts +16 -2
- package/dist/core/managed-region.d.ts.map +1 -1
- package/dist/core/managed-region.js +24 -3
- package/dist/core/managed-region.js.map +1 -1
- package/dist/core/metrics.d.ts +2 -0
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +15 -0
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/model-config.d.ts +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -2
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/opencode-config.js +1 -1
- package/dist/core/opencode-config.js.map +1 -1
- package/dist/core/pipeline-schema.d.ts +15 -0
- package/dist/core/pipeline-schema.d.ts.map +1 -1
- package/dist/core/pipeline-schema.js +17 -0
- package/dist/core/pipeline-schema.js.map +1 -1
- package/dist/core/plan/stage.d.ts +2 -1
- package/dist/core/plan/stage.d.ts.map +1 -1
- package/dist/core/plan/stage.js +7 -2
- package/dist/core/plan/stage.js.map +1 -1
- package/dist/core/req/aggregate.d.ts +2 -1
- package/dist/core/req/aggregate.d.ts.map +1 -1
- package/dist/core/req/aggregate.js.map +1 -1
- package/dist/core/req/body-file.d.ts.map +1 -1
- package/dist/core/req/body-file.js +7 -3
- package/dist/core/req/body-file.js.map +1 -1
- package/dist/core/req/requirement-ops.d.ts +44 -2
- package/dist/core/req/requirement-ops.d.ts.map +1 -1
- package/dist/core/req/requirement-ops.js +108 -3
- package/dist/core/req/requirement-ops.js.map +1 -1
- package/dist/core/req/types.d.ts +7 -1
- package/dist/core/req/types.d.ts.map +1 -1
- package/dist/core/req/types.js +0 -6
- package/dist/core/req/types.js.map +1 -1
- package/dist/core/runtime-log.d.ts +18 -0
- package/dist/core/runtime-log.d.ts.map +1 -1
- package/dist/core/runtime-log.js +72 -0
- package/dist/core/runtime-log.js.map +1 -1
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +107 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +2982 -6686
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +694 -33
- package/dist/core/update.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话标识模块(v1.2.1-stage-86 op-002 · T2)
|
|
3
|
+
*
|
|
4
|
+
* 职责:为 CLI 运行日志(start/done 行)与流水线审计(跨会话恢复标注)提供**会话标识**。
|
|
5
|
+
* 三级链(优先级降序;`projectPath` 缺省 = `process.cwd()`):
|
|
6
|
+
* 1. `env` —— harness 环境变量实测命中(`SESSION_ENV_CANDIDATES`)
|
|
7
|
+
* 2. `project` —— 项目续接文件 `<projectPath>/.openfeel/tmp/session.json`
|
|
8
|
+
* 3. `proc` —— 单进程兜底(随机 UUID 短前缀;**不写文件**)
|
|
9
|
+
* 标识值含来源前缀(`env:` / `project:` / `proc:`),机器可判人工 vs 自动化。
|
|
10
|
+
*
|
|
11
|
+
* 设计边界:
|
|
12
|
+
* - **全部 IO try/catch 静默**:本模块任何失败都不得中断 CLI(best-effort)。
|
|
13
|
+
* - **`proc` 级不落盘**:保持「单进程」语义,防把自动化进程固化成跨进程会话。
|
|
14
|
+
* - **禁止 TTL 猜测**:无过期 / 无轮换逻辑;轮换仅由「env 值变化」驱动。
|
|
15
|
+
* - **不 import runtime-log / flow-manager**(二者均为本模块消费方,防 import 环 R-86-7)。
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { dirname, join, resolve } from 'node:path';
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
/** env 候选清单(仅录入实机实测命中者;R-86-3——执行期实测为准增删) */
|
|
21
|
+
const SESSION_ENV_CANDIDATES = ['CLAUDE_CODE_SESSION_ID'];
|
|
22
|
+
/** 续接文件相对路径(项目域;`tmp/` 处 `.gitignore` 忽略范围) */
|
|
23
|
+
const SESSION_FILE_REL = join('.openfeel', 'tmp', 'session.json');
|
|
24
|
+
/** 按 projectPath memoize(同进程内稳定;resetSessionCache 清零) */
|
|
25
|
+
const cache = new Map();
|
|
26
|
+
/** 续接文件完整路径 */
|
|
27
|
+
function sessionFilePath(projectPath) {
|
|
28
|
+
return join(projectPath, SESSION_FILE_REL);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 读取续接文件内的 `session_id`。
|
|
32
|
+
* @returns trim 后非空的 session_id;文件缺失 / JSON 损坏 / 值非法 → null(调用方回落下一级)
|
|
33
|
+
*/
|
|
34
|
+
function readProjectSessionId(projectPath) {
|
|
35
|
+
try {
|
|
36
|
+
const raw = readFileSync(sessionFilePath(projectPath), 'utf-8');
|
|
37
|
+
const parsed = JSON.parse(raw);
|
|
38
|
+
const value = typeof parsed?.session_id === 'string' ? parsed.session_id.trim() : '';
|
|
39
|
+
// 空值 / 非字符串 → 视为无续接
|
|
40
|
+
return value.length > 0 ? value : null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// 文件缺失 / JSON 损坏 / 读取失败 → 视为无续接
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* best-effort 维护续接文件(env 命中时调用;文件缺失或值不一致时更新)。
|
|
49
|
+
* 任何失败静默——会话标识仍以 env 值返回,绝不中断 CLI。
|
|
50
|
+
*/
|
|
51
|
+
function writeProjectSession(projectPath, sessionId) {
|
|
52
|
+
try {
|
|
53
|
+
if (existsSync(sessionFilePath(projectPath)) && readProjectSessionId(projectPath) === sessionId) {
|
|
54
|
+
return; // 已一致 → 不重复写
|
|
55
|
+
}
|
|
56
|
+
const filePath = sessionFilePath(projectPath);
|
|
57
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
58
|
+
writeFileSync(filePath, JSON.stringify({ session_id: sessionId, source: 'env', started_at: new Date().toISOString() }, null, 2) + '\n', 'utf-8');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// 写续接文件失败(权限 / 磁盘 / 路径非法)→ 静默
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 解析当前会话标识(三级链;按 projectPath memoized)。
|
|
66
|
+
* @param opts.env 环境变量表(缺省 = process.env;注入以便单测)
|
|
67
|
+
* @param opts.projectPath 项目根路径(缺省 = process.cwd())
|
|
68
|
+
*/
|
|
69
|
+
export function getSessionIdentity(opts = {}) {
|
|
70
|
+
const env = opts.env ?? process.env;
|
|
71
|
+
const projectPath = resolve(opts.projectPath ?? process.cwd());
|
|
72
|
+
const cached = cache.get(projectPath);
|
|
73
|
+
if (cached) {
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
// 1) env:harness 环境变量(值须非空且 trim 非空才命中)
|
|
77
|
+
for (const name of SESSION_ENV_CANDIDATES) {
|
|
78
|
+
const value = (env[name] ?? '').trim();
|
|
79
|
+
if (value.length === 0) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const identity = { id: 'env:' + value, source: 'env' };
|
|
83
|
+
writeProjectSession(projectPath, value); // best-effort 续接(失败静默)
|
|
84
|
+
cache.set(projectPath, identity);
|
|
85
|
+
return identity;
|
|
86
|
+
}
|
|
87
|
+
// 2) project:项目续接文件
|
|
88
|
+
const projectId = readProjectSessionId(projectPath);
|
|
89
|
+
if (projectId !== null) {
|
|
90
|
+
const identity = { id: 'project:' + projectId, source: 'project' };
|
|
91
|
+
cache.set(projectPath, identity);
|
|
92
|
+
return identity;
|
|
93
|
+
}
|
|
94
|
+
// 3) proc:单进程兜底(不写文件——保持「单进程」语义)
|
|
95
|
+
const identity = { id: 'proc:' + randomUUID().slice(0, 8), source: 'proc' };
|
|
96
|
+
cache.set(projectPath, identity);
|
|
97
|
+
return identity;
|
|
98
|
+
}
|
|
99
|
+
/** 会话标识字符串(= `getSessionIdentity().id`,含来源前缀) */
|
|
100
|
+
export function getSessionId(opts) {
|
|
101
|
+
return getSessionIdentity(opts).id;
|
|
102
|
+
}
|
|
103
|
+
/** 清空 memo(测试用——模块态隔离) */
|
|
104
|
+
export function resetSessionCache() {
|
|
105
|
+
cache.clear();
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkqEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnD;AAED,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC;AAEvC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAS7E;AAslMD,eAAO,MAAM,kBAAkB,EAAE,MAAqC,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGzD"}
|