openfeel 1.0.9 → 1.1.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 +11 -11
- package/README.md +2 -1
- package/README.zh-CN.md +13 -13
- package/bin/openfeel.js +2 -2
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +28 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/archive.d.ts +1 -1
- package/dist/commands/flow.d.ts +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +20 -8
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +10 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +106 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/model.d.ts +10 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +135 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +31 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/stage.d.ts.map +1 -1
- package/dist/commands/stage.js +50 -29
- package/dist/commands/stage.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +13 -10
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/view.d.ts +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +2 -1
- package/dist/commands/view.js.map +1 -1
- package/dist/core/archive/merge.d.ts.map +1 -1
- package/dist/core/archive/merge.js +5 -4
- package/dist/core/archive/merge.js.map +1 -1
- package/dist/core/artifact-graph/resolver.js +2 -2
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/config.d.ts +8 -8
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +22 -17
- package/dist/core/config.js.map +1 -1
- package/dist/core/flow-manager.d.ts +25 -4
- package/dist/core/flow-manager.d.ts.map +1 -1
- package/dist/core/flow-manager.js +144 -79
- package/dist/core/flow-manager.js.map +1 -1
- package/dist/core/fs/atomic-write.d.ts +31 -0
- package/dist/core/fs/atomic-write.d.ts.map +1 -0
- package/dist/core/fs/atomic-write.js +80 -0
- package/dist/core/fs/atomic-write.js.map +1 -0
- package/dist/core/fs/file-lock.d.ts +34 -0
- package/dist/core/fs/file-lock.d.ts.map +1 -0
- package/dist/core/fs/file-lock.js +142 -0
- package/dist/core/fs/file-lock.js.map +1 -0
- package/dist/core/fs/sequence.d.ts +42 -0
- package/dist/core/fs/sequence.d.ts.map +1 -0
- package/dist/core/fs/sequence.js +69 -0
- package/dist/core/fs/sequence.js.map +1 -0
- package/dist/core/global-paths.d.ts +27 -0
- package/dist/core/global-paths.d.ts.map +1 -0
- package/dist/core/global-paths.js +61 -0
- package/dist/core/global-paths.js.map +1 -0
- package/dist/core/i18n-data/en.d.ts +3 -0
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +86 -1
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts +3 -0
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +87 -1
- 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/init.d.ts +10 -15
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +65 -134
- package/dist/core/init.js.map +1 -1
- package/dist/core/managed-region.d.ts +54 -0
- package/dist/core/managed-region.d.ts.map +1 -0
- package/dist/core/managed-region.js +171 -0
- package/dist/core/managed-region.js.map +1 -0
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +6 -3
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/migrate.d.ts +115 -0
- package/dist/core/migrate.d.ts.map +1 -0
- package/dist/core/migrate.js +558 -0
- package/dist/core/migrate.js.map +1 -0
- package/dist/core/model-config.d.ts +62 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/model-config.js +336 -0
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/opencode-config.d.ts +17 -0
- package/dist/core/opencode-config.d.ts.map +1 -0
- package/dist/core/opencode-config.js +135 -0
- package/dist/core/opencode-config.js.map +1 -0
- package/dist/core/plan/roadmap.d.ts.map +1 -1
- package/dist/core/plan/roadmap.js +3 -2
- package/dist/core/plan/roadmap.js.map +1 -1
- package/dist/core/plan/scheme.d.ts.map +1 -1
- package/dist/core/plan/scheme.js +35 -36
- package/dist/core/plan/scheme.js.map +1 -1
- package/dist/core/plan/stage.d.ts.map +1 -1
- package/dist/core/plan/stage.js +4 -3
- package/dist/core/plan/stage.js.map +1 -1
- package/dist/core/public-logger.d.ts +3 -3
- package/dist/core/public-logger.d.ts.map +1 -1
- package/dist/core/public-logger.js +36 -40
- package/dist/core/public-logger.js.map +1 -1
- package/dist/core/setup.d.ts +10 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +75 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/template-loader.d.ts +4 -5
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +3974 -3274
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/templates.d.ts +2 -2
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +2 -2
- package/dist/core/templates.js.map +1 -1
- package/dist/core/update-infos.d.ts +32 -0
- package/dist/core/update-infos.d.ts.map +1 -0
- package/dist/core/update-infos.js +153 -0
- package/dist/core/update-infos.js.map +1 -0
- package/dist/core/update-state.d.ts +18 -0
- package/dist/core/update-state.d.ts.map +1 -1
- package/dist/core/update-state.js +66 -3
- package/dist/core/update-state.js.map +1 -1
- package/dist/core/update.d.ts +12 -6
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +400 -550
- package/dist/core/update.js.map +1 -1
- package/dist/core/view/entry.js +4 -4
- package/dist/core/view/entry.js.map +1 -1
- package/dist/core/workspace/identity.d.ts.map +1 -1
- package/dist/core/workspace/identity.js +13 -10
- package/dist/core/workspace/identity.js.map +1 -1
- package/dist/core/workspace/knowledge.d.ts.map +1 -1
- package/dist/core/workspace/knowledge.js +24 -14
- package/dist/core/workspace/knowledge.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 控制区标记工具
|
|
3
|
+
* 按文件类型提供受管区(managed region)的识别 / 包裹 / 替换原语,
|
|
4
|
+
* 供 openfeel update 三态部署使用:控制区标记包裹受管内容,更新只覆盖区内,
|
|
5
|
+
* 区外用户内容天然保留(D3 落地)。
|
|
6
|
+
*
|
|
7
|
+
* 四策略:
|
|
8
|
+
* - markdown:<!-- openfeel:begin --> … <!-- openfeel:end -->
|
|
9
|
+
* - gitignore:# openfeel:begin … # openfeel:end
|
|
10
|
+
* - frontmatter:无标记,结构化字段合并(框架字段覆盖 + 用户字段 passthrough)
|
|
11
|
+
* - jsonc:无标记,深度合并(复用 opencode-config.ts,本模块仅分派)
|
|
12
|
+
*
|
|
13
|
+
* 与 openfeel:generated(单行整文件声明,构建产物)不冲突、不统一(N6):
|
|
14
|
+
* generated 是单行信号,begin/end 是成对区间,两者 token 与形态均不同。
|
|
15
|
+
*/
|
|
16
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
17
|
+
/** 标记 token(按类型) */
|
|
18
|
+
const MARKERS = {
|
|
19
|
+
markdown: { begin: '<!-- openfeel:begin -->', end: '<!-- openfeel:end -->' },
|
|
20
|
+
gitignore: { begin: '# openfeel:begin', end: '# openfeel:end' },
|
|
21
|
+
};
|
|
22
|
+
/** 检测文件类型(.gitignore→gitignore;.jsonc→jsonc;其余→markdown;无法识别→null) */
|
|
23
|
+
export function detectFileType(filePath) {
|
|
24
|
+
const base = filePath.split(/[\\/]/).pop() ?? '';
|
|
25
|
+
if (base === '.gitignore')
|
|
26
|
+
return 'gitignore';
|
|
27
|
+
if (base.endsWith('.jsonc'))
|
|
28
|
+
return 'jsonc';
|
|
29
|
+
if (base.endsWith('.md'))
|
|
30
|
+
return 'markdown';
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/** 行尾归一化(CRLF / CR → LF,见 kb 行尾归一化模式);导出供 update.ts skip 判定归一化比对(REV-1006) */
|
|
34
|
+
export function normalize(content) {
|
|
35
|
+
return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
36
|
+
}
|
|
37
|
+
/** 取某类型的 begin/end 标记 token */
|
|
38
|
+
function markers(type) {
|
|
39
|
+
return MARKERS[type];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 解析控制区:精确整行匹配 begin/end,计数判定 ok/none/malformed。
|
|
43
|
+
* CRLF 归一化后匹配;>1 对或数量不等 → malformed(REV-908)。
|
|
44
|
+
*/
|
|
45
|
+
export function parseRegion(existing, type) {
|
|
46
|
+
const { begin, end } = markers(type);
|
|
47
|
+
const lines = normalize(existing).split('\n');
|
|
48
|
+
let beginIndex = -1;
|
|
49
|
+
let endIndex = -1;
|
|
50
|
+
let beginCount = 0;
|
|
51
|
+
let endCount = 0;
|
|
52
|
+
for (let i = 0; i < lines.length; i++) {
|
|
53
|
+
const trimmed = lines[i].trim();
|
|
54
|
+
if (trimmed === begin) {
|
|
55
|
+
if (beginIndex === -1) {
|
|
56
|
+
beginIndex = i;
|
|
57
|
+
}
|
|
58
|
+
beginCount++;
|
|
59
|
+
}
|
|
60
|
+
if (trimmed === end) {
|
|
61
|
+
endIndex = i;
|
|
62
|
+
endCount++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (beginCount === 0 && endCount === 0) {
|
|
66
|
+
return { status: 'none' };
|
|
67
|
+
}
|
|
68
|
+
if (beginCount === 1 && endCount === 1 && beginIndex < endIndex) {
|
|
69
|
+
return { status: 'ok', regionContent: lines.slice(beginIndex + 1, endIndex).join('\n').trim() };
|
|
70
|
+
}
|
|
71
|
+
return { status: 'malformed' };
|
|
72
|
+
}
|
|
73
|
+
/** 是否含完整成对标记(等价 parseRegion().status === 'ok') */
|
|
74
|
+
export function hasRegion(existing, type) {
|
|
75
|
+
return parseRegion(existing, type).status === 'ok';
|
|
76
|
+
}
|
|
77
|
+
/** 提取区内内容(trim 后正文);无标记或异常 → null */
|
|
78
|
+
export function extractRegion(existing, type) {
|
|
79
|
+
const r = parseRegion(existing, type);
|
|
80
|
+
return r.status === 'ok' ? (r.regionContent ?? '') : null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 包裹内容为受管区(正文 trim 后包裹,输出末尾单换行)。
|
|
84
|
+
* 产出格式:`{begin}\n{content}\n{end}\n`
|
|
85
|
+
*/
|
|
86
|
+
export function wrapRegion(content, type) {
|
|
87
|
+
const { begin, end } = markers(type);
|
|
88
|
+
return `${begin}\n${content.trim()}\n${end}\n`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 替换区内内容(保留区外,含标记行本身);异常状态抛错由调用方决定降级。
|
|
92
|
+
* 输出:begin 行之前的区外前缀 + 新包裹正文 + end 行之后的区外后缀。
|
|
93
|
+
*
|
|
94
|
+
* 区外逐字符保留(含原文件末尾换行),使 `replaceRegion(x, extractRegion(x))` 与
|
|
95
|
+
* 归一化后的 x 完全一致,支撑 op-002 的 skip 判定(REV-901)。
|
|
96
|
+
*/
|
|
97
|
+
export function replaceRegion(existing, incoming, type) {
|
|
98
|
+
// 防误用:先 parseRegion 判态,非 ok(none / malformed)直接抛错,避免调用方误删用户内容(REV-1007 修订)
|
|
99
|
+
if (parseRegion(existing, type).status !== 'ok') {
|
|
100
|
+
throw new Error('managed-region: replaceRegion 要求恰好一对完整标记(parseRegion status=ok)');
|
|
101
|
+
}
|
|
102
|
+
const { begin, end } = markers(type);
|
|
103
|
+
const lines = normalize(existing).split('\n');
|
|
104
|
+
let beginIndex = -1;
|
|
105
|
+
let endIndex = -1;
|
|
106
|
+
for (let i = 0; i < lines.length; i++) {
|
|
107
|
+
const t = lines[i].trim();
|
|
108
|
+
if (t === begin && beginIndex === -1) {
|
|
109
|
+
beginIndex = i;
|
|
110
|
+
}
|
|
111
|
+
if (t === end) {
|
|
112
|
+
endIndex = i;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// parseRegion 已保证 begin/end 存在且 begin 在前;此处为防御性兜底
|
|
116
|
+
if (beginIndex === -1 || endIndex === -1 || beginIndex >= endIndex) {
|
|
117
|
+
throw new Error('managed-region: replaceRegion 要求恰好一对完整标记');
|
|
118
|
+
}
|
|
119
|
+
// 前缀:begin 行之前的整行(原样保留),join 后补回被 split 去掉的行尾换行
|
|
120
|
+
const prefixLines = lines.slice(0, beginIndex);
|
|
121
|
+
const prefix = prefixLines.length > 0 ? prefixLines.join('\n') + '\n' : '';
|
|
122
|
+
// 后缀:end 行之后的整行(原样保留,含原文件末尾换行,若有)
|
|
123
|
+
const suffixLines = lines.slice(endIndex + 1);
|
|
124
|
+
const suffix = suffixLines.join('\n');
|
|
125
|
+
const wrapped = `${begin}\n${incoming.trim()}\n${end}`;
|
|
126
|
+
// end 后存在后续行(含仅末尾空行)才补换行分隔;文件以 end 结尾且无尾换行时不追加,保证与 normalize 一致(REV-1102)
|
|
127
|
+
return suffixLines.length > 0 ? prefix + wrapped + '\n' + suffix : prefix + wrapped;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 分割 YAML frontmatter 与正文。
|
|
131
|
+
* 仅当文件以 `---\n` 开头且存在闭合 `---\n` 时返回解析结果;否则返回 null。
|
|
132
|
+
* 解析失败(YAML 语法错误)→ 返回 null(调用方按「无 frontmatter」处理,降级不中断)。
|
|
133
|
+
*/
|
|
134
|
+
export function splitFrontmatter(content) {
|
|
135
|
+
const text = normalize(content);
|
|
136
|
+
if (!text.startsWith('---\n')) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const end = text.indexOf('\n---\n', 3); // 从 3 开始:空 frontmatter(`---\n---\n`)的闭合 `\n` 在 index 3(REV-1005 修订)
|
|
140
|
+
if (end === -1) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const fmRaw = text.slice(4, end);
|
|
144
|
+
try {
|
|
145
|
+
// 空 frontmatter(`---\n---\n`):parseYaml('') 返回 null,需特判为空对象
|
|
146
|
+
const parsed = fmRaw.trim() === '' ? {} : parseYaml(fmRaw);
|
|
147
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
return { frontmatter: parsed, body: text.slice(end + 5) }; // end+5 跳过 '\n---\n'
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// YAML 语法错误:视为无 frontmatter,降级不中断
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 合并 frontmatter(REV-904:字段级白名单,浅合并)。
|
|
159
|
+
* incoming(框架模板字段)覆盖同名 existing 字段;existing 独有字段 passthrough 保留。
|
|
160
|
+
*/
|
|
161
|
+
export function mergeFrontmatter(existing, incoming) {
|
|
162
|
+
return { ...existing, ...incoming };
|
|
163
|
+
}
|
|
164
|
+
/** 序列化 frontmatter 为 `---\n{...}\n---\n`(yaml.stringify 输出,显式保证末尾换行) */
|
|
165
|
+
export function serializeFrontmatter(frontmatter) {
|
|
166
|
+
// 显式保证 yaml 末尾换行,避免 stringify 无尾换行时与闭合 `---` 粘连(REV-1008 修订)
|
|
167
|
+
const yaml = stringifyYaml(frontmatter);
|
|
168
|
+
const body = yaml.endsWith('\n') ? yaml : yaml + '\n';
|
|
169
|
+
return `---\n${body}---\n`;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=managed-region.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-region.js","sourceRoot":"","sources":["../../src/core/managed-region.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAoBD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;IAIP,yCAAyC;IACzC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IASlD,iBAAiB;IACjB,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,GAAE,MAAU,GAClB,IAAI;IAqBP;;;OAGG;IACH,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,EAAE,GAAG,SAAS;IAO9E;;;OAGG;IACH,OAAO,IAAI,MAAM;IA2BjB,0BAA0B;IAC1B,OAAO,KAAK,WAAW,GAEtB;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI;IAoBZ;;;OAGG;IACH,IAAI,IAAI,IAAI;CAeb"}
|
package/dist/core/metrics.js
CHANGED
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
* 记录每个 Agent 的执行时间、成功率、重试次数
|
|
4
4
|
* 数据持久化到 .openfeel/metrics.json(与 flow.json 同级)
|
|
5
5
|
*/
|
|
6
|
-
import { readFileSync,
|
|
6
|
+
import { readFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
7
7
|
import { resolve } from 'node:path';
|
|
8
|
+
import { atomicWriteFileSync } from './fs/atomic-write.js';
|
|
9
|
+
import { normalizeAgentName } from './flow-manager.js';
|
|
8
10
|
/** 创建默认的 AgentMetrics 初始值 */
|
|
9
11
|
function createDefaultMetrics(agentName) {
|
|
10
12
|
return {
|
|
@@ -87,7 +89,7 @@ export class MetricsStore {
|
|
|
87
89
|
const successRate = m.totalRuns > 0
|
|
88
90
|
? `${((m.successfulRuns / m.totalRuns) * 100).toFixed(1)}%`
|
|
89
91
|
: 'N/A';
|
|
90
|
-
lines.push(`\n${m.agentName}`, ` 总执行次数: ${m.totalRuns}`, ` 成功 / 失败: ${m.successfulRuns} / ${m.failedRuns}`, ` 成功率: ${successRate}`, ` 总重试次数: ${m.totalRetries}`, ` 总耗时: ${m.totalDurationMs}ms`, ` 平均耗时: ${m.avgDurationMs}ms`);
|
|
92
|
+
lines.push(`\n${normalizeAgentName(m.agentName)}`, ` 总执行次数: ${m.totalRuns}`, ` 成功 / 失败: ${m.successfulRuns} / ${m.failedRuns}`, ` 成功率: ${successRate}`, ` 总重试次数: ${m.totalRetries}`, ` 总耗时: ${m.totalDurationMs}ms`, ` 平均耗时: ${m.avgDurationMs}ms`);
|
|
91
93
|
}
|
|
92
94
|
return lines.join('\n');
|
|
93
95
|
}
|
|
@@ -131,7 +133,8 @@ export class MetricsStore {
|
|
|
131
133
|
agents[name] = { ...metrics };
|
|
132
134
|
}
|
|
133
135
|
const data = { agents };
|
|
134
|
-
|
|
136
|
+
// 指标写入:仅原子写,不加锁(低并发、非一致性关键路径)
|
|
137
|
+
atomicWriteFileSync(this.metricsPath, JSON.stringify(data, null, 2) + '\n');
|
|
135
138
|
}
|
|
136
139
|
}
|
|
137
140
|
//# sourceMappingURL=metrics.js.map
|
package/dist/core/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type UpdateState } from './update-state.js';
|
|
2
|
+
/** legacy 检测报告(M3 五条判据) */
|
|
3
|
+
export interface LegacyReport {
|
|
4
|
+
projectOpendirAgents: boolean;
|
|
5
|
+
projectOpendirSkills: boolean;
|
|
6
|
+
projectOpendirInstructions: boolean;
|
|
7
|
+
legacyJsoncSkillsMapping: boolean;
|
|
8
|
+
legacyJsoncInstructions: boolean;
|
|
9
|
+
mixedUpdateState: boolean;
|
|
10
|
+
isLegacy: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** manifest 单条记录 */
|
|
13
|
+
export interface ManifestEntry {
|
|
14
|
+
op: 'delete' | 'modify';
|
|
15
|
+
source: string;
|
|
16
|
+
backupPath: string;
|
|
17
|
+
hash: string;
|
|
18
|
+
note?: string;
|
|
19
|
+
}
|
|
20
|
+
/** manifest 元数据 */
|
|
21
|
+
export interface Manifest {
|
|
22
|
+
version: '1.0';
|
|
23
|
+
openfeel_version: string;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
projectPath: string;
|
|
26
|
+
legacy: LegacyReport;
|
|
27
|
+
entries: ManifestEntry[];
|
|
28
|
+
/** REV-1302:本次 migrate 新增/写入的全局 state key(rollback 仅删这些,不触碰历史全局条目) */
|
|
29
|
+
globalStateKeys: string[];
|
|
30
|
+
}
|
|
31
|
+
/** 迁移结果 */
|
|
32
|
+
export interface MigrateResult {
|
|
33
|
+
legacy: LegacyReport;
|
|
34
|
+
backupDir: string | null;
|
|
35
|
+
deployed: string[];
|
|
36
|
+
stateSplit: SplitStateResult;
|
|
37
|
+
cleaned: string[];
|
|
38
|
+
keptCustom: string[];
|
|
39
|
+
jsoncCleaned: boolean;
|
|
40
|
+
assigneeReport: {
|
|
41
|
+
oldName: string;
|
|
42
|
+
newName: string;
|
|
43
|
+
count: number;
|
|
44
|
+
}[];
|
|
45
|
+
remapped: boolean;
|
|
46
|
+
deprecated: DeprecatedCompatReport;
|
|
47
|
+
}
|
|
48
|
+
/** 兼容过渡检测报告(v1.1.1):全局旧 core.md 与存量项目 AGENTS.md(均不强制删除,仅提示) */
|
|
49
|
+
export interface DeprecatedCompatReport {
|
|
50
|
+
globalCoreMdExists: boolean;
|
|
51
|
+
projectAgentsMdExists: boolean;
|
|
52
|
+
}
|
|
53
|
+
/** state 拆分结果 */
|
|
54
|
+
export interface SplitStateResult {
|
|
55
|
+
movedToGlobal: string[];
|
|
56
|
+
keptInProject: string[];
|
|
57
|
+
unmapped: string[];
|
|
58
|
+
}
|
|
59
|
+
/** legacy 判据 5 条(M3) */
|
|
60
|
+
export declare function detectLegacy(projectPath: string): LegacyReport;
|
|
61
|
+
/**
|
|
62
|
+
* 列出 legacy 项目文件,按「框架同源 / 项目自定义」分类。
|
|
63
|
+
* framework = 文件名归一化后命中框架清单(9 agent + 14 skill + core.md);
|
|
64
|
+
* custom = 其余(项目自定义 agent/skill),保留原位不迁移不删除。
|
|
65
|
+
* 旧名(planner.md 等)经 normalizeAgentName 归一化后再比对(P5 兼容)。
|
|
66
|
+
*/
|
|
67
|
+
export declare function listLegacyFiles(projectPath: string, lang?: 'zh-CN' | 'en'): {
|
|
68
|
+
framework: string[];
|
|
69
|
+
custom: string[];
|
|
70
|
+
};
|
|
71
|
+
/** 备份将被删除/改写的项目文件到 .openfeel/backup/{ts}/ 并生成 manifest.json */
|
|
72
|
+
export declare function backupLegacy(projectPath: string, report: LegacyReport, opts?: {
|
|
73
|
+
remapAssignee?: boolean;
|
|
74
|
+
}): {
|
|
75
|
+
backupDir: string;
|
|
76
|
+
manifest: Manifest;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* 旧项目 state 框架条目 → 全局 state 重键;项目条目保留。
|
|
80
|
+
* 重键规则:旧 key(.opencode/agents/planner.md)→ normalizeAgentName(文件名) 得新名
|
|
81
|
+
* → 拼全局绝对路径(agentsDir/{新名}.md / skillsDir/{新名}/SKILL.md / core.md)。
|
|
82
|
+
* 无法映射的条目保留项目 state 并记 unmapped 待人工处理。
|
|
83
|
+
* @param globalStateIn 可选:调用方已加载的全局 state(REV-1402 复用避免重复 load)
|
|
84
|
+
*/
|
|
85
|
+
export declare function splitUpdateState(projectPath: string, lang?: 'zh-CN' | 'en', globalStateIn?: UpdateState): SplitStateResult;
|
|
86
|
+
/**
|
|
87
|
+
* 兼容过渡检测(v1.1.1):全局旧 core.md 与存量项目 AGENTS.md(均不强制删除,仅提示)。
|
|
88
|
+
* globalCoreMdExists 检测的是全局资产(跨项目),故仅作提示,删除须显式 --clean-global-core-md。
|
|
89
|
+
*/
|
|
90
|
+
export declare function detectDeprecatedCompat(projectPath: string): DeprecatedCompatReport;
|
|
91
|
+
/** 扫描 flow.json 旧 assignee,报告旧名→新名映射;dryRun 仅报告不写 */
|
|
92
|
+
export declare function remapAssignees(projectPath: string, dryRun: boolean): {
|
|
93
|
+
changes: string[];
|
|
94
|
+
count: number;
|
|
95
|
+
};
|
|
96
|
+
/** 保留最近 keep 次备份,删除更早的备份目录 */
|
|
97
|
+
export declare function cleanOldBackups(projectPath: string, keep?: number): string[];
|
|
98
|
+
/** 迁移主流程:检测→备份→全局部署→state 拆分→清理→assignee 报告 */
|
|
99
|
+
export declare function migrateProject(projectPath: string, opts?: {
|
|
100
|
+
dryRun?: boolean;
|
|
101
|
+
remapAssignee?: boolean;
|
|
102
|
+
lang?: 'zh-CN' | 'en';
|
|
103
|
+
cleanGlobalCoreMd?: boolean;
|
|
104
|
+
}): MigrateResult;
|
|
105
|
+
/** 回滚最近一次迁移:按 manifest 逆向恢复项目文件 + 还原全局 state 新增条目 */
|
|
106
|
+
export declare function rollbackMigration(projectPath: string, backupTs?: string): {
|
|
107
|
+
restored: string[];
|
|
108
|
+
stateRestored: boolean;
|
|
109
|
+
};
|
|
110
|
+
/** 回滚预览(REV-1309):读取最新 manifest,返回 entries 列表(source + op 类型),不写盘 */
|
|
111
|
+
export declare function previewRollback(projectPath: string, backupTs?: string): {
|
|
112
|
+
op: 'delete' | 'modify';
|
|
113
|
+
source: string;
|
|
114
|
+
}[];
|
|
115
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"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"}
|