openfeel 1.1.4 → 1.1.6
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 +25 -4
- package/README.md +13 -3
- package/README.zh-CN.md +25 -4
- package/dist/cli/deploy-check-output.d.ts +35 -0
- package/dist/cli/deploy-check-output.d.ts.map +1 -0
- package/dist/cli/deploy-check-output.js +53 -0
- package/dist/cli/deploy-check-output.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +3 -0
- package/dist/cli/repl.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +56 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +16 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/core/backup.d.ts.map +1 -1
- package/dist/core/backup.js +18 -5
- package/dist/core/backup.js.map +1 -1
- package/dist/core/claude-settings.d.ts +31 -0
- package/dist/core/claude-settings.d.ts.map +1 -0
- package/dist/core/claude-settings.js +120 -0
- package/dist/core/claude-settings.js.map +1 -0
- package/dist/core/config.js +2 -2
- package/dist/core/deployment-check.d.ts +44 -0
- package/dist/core/deployment-check.d.ts.map +1 -0
- package/dist/core/deployment-check.js +98 -0
- package/dist/core/deployment-check.js.map +1 -0
- package/dist/core/global-paths.d.ts +10 -0
- package/dist/core/global-paths.d.ts.map +1 -1
- package/dist/core/global-paths.js +21 -0
- package/dist/core/global-paths.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +23 -2
- 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 +23 -2
- package/dist/core/i18n-data/zh-CN.js.map +1 -1
- package/dist/core/setup.d.ts +2 -2
- package/dist/core/setup.d.ts.map +1 -1
- package/dist/core/setup.js +84 -54
- package/dist/core/setup.js.map +1 -1
- package/dist/core/template-loader.d.ts +15 -0
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +3906 -109
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/update.d.ts +8 -0
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +344 -133
- package/dist/core/update.js.map +1 -1
- package/package.json +1 -1
package/dist/core/backup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAavC,2BAA2B;AAC3B,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,QAAQ,CAAS;IAC1B,YAAY,QAAgB,EAAE,KAAc;QAC1C,KAAK,CAAC,QAAQ,QAAQ,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;AACnC,gCAAgC;AAChC,MAAM,UAAU,mBAAmB;IACjC,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,uCAAuC;AACvC,SAAS,QAAQ;IACf,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5J,CAAC;AAED,uEAAuE;AACvE,SAAS,gBAAgB,CAAC,OAAe,EAAE,WAAoB;IAC7D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,gDAAgD;QAChD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,uBAAuB,IAAI,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IACtF,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type UpdateState } from './update-state.js';
|
|
2
|
+
/** settings.json 非严格 JSON / 顶层非对象时抛出(调用方捕获 → 跳过写入 + anomaly) */
|
|
3
|
+
export declare class ClaudeSettingsParseError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
/** 框架注入片段(供应商中立;JSON 无语言维度 → 代码常量,不经 build 注入) */
|
|
7
|
+
export declare function buildClaudeSettingsFragment(): {
|
|
8
|
+
agent: string;
|
|
9
|
+
permissions: {
|
|
10
|
+
defaultMode: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* 严格 JSON 深合并:在用户既有 settings 上并入框架片段,逐字保留用户未知键。
|
|
15
|
+
* - 顶层须为对象;严格 JSON.parse(不接受注释 / trailing comma);失败抛 ClaudeSettingsParseError;
|
|
16
|
+
* - 框架自有键 agent / permissions.defaultMode 覆盖;permissions 下用户其它子键(allow/deny/…)保留;
|
|
17
|
+
* - 输出稳定序列化 JSON.stringify(obj, null, 2) + '\n'(依赖 JS 对象插入序保证二次运行字节幂等)。
|
|
18
|
+
*/
|
|
19
|
+
export declare function mergeClaudeSettings(currentRaw: string): string;
|
|
20
|
+
/** applyClaudeSettings 结果动作 */
|
|
21
|
+
export type ClaudeSettingsAction = 'created' | 'updated' | 'skipped';
|
|
22
|
+
/**
|
|
23
|
+
* 应用 Claude settings.json 注入(**单一共享函数**,setup.ts / update.ts 共用,避免双实现漂移 R-新11)。
|
|
24
|
+
* 顺序:① lock 之外写前备份(目标存在即备份,对齐 jsonc 口径)→ ② lock 内 read → merge → atomicWrite。
|
|
25
|
+
* @param state 全局 update state(成功写回后以绝对路径记 hash)
|
|
26
|
+
* @param command 调用方(决定 i18n 域前缀;仅 setup / update 接入)
|
|
27
|
+
* @param lang 输出语言
|
|
28
|
+
* @returns 'created'(原不存在)/ 'updated'(合并后变化)/ 'skipped'(无变化 或 备份/读取/解析失败)
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyClaudeSettings(state: UpdateState, command: 'setup' | 'update', lang: 'zh-CN' | 'en'): ClaudeSettingsAction;
|
|
31
|
+
//# sourceMappingURL=claude-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/core/claude-settings.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrE,gEAAgE;AAChE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAOD,kDAAkD;AAClD,wBAAgB,2BAA2B,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAErG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB9D;AAED,+BAA+B;AAC/B,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GAAG,QAAQ,EAC3B,IAAI,EAAE,OAAO,GAAG,IAAI,GACnB,oBAAoB,CAsDtB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude 全局 settings.json 注入模块(stage-73)
|
|
3
|
+
* 严格 JSON「读-深合并-写回」:把框架自有键(agent / permissions.defaultMode)并入用户既有
|
|
4
|
+
* ~/.claude/settings.json,逐字保留其余用户键。settings.json 为严格 JSON(无注释 / 无受管区标记),
|
|
5
|
+
* 故不复用 opencode-config 的 jsonc 剥注释逻辑,亦不复用 managed-region 的标记三态。
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
import { atomicWriteFileSync } from './fs/atomic-write.js';
|
|
9
|
+
import { withFileLock, globalLockPath } from './fs/file-lock.js';
|
|
10
|
+
import { backupFileBeforeWrite, notifyBackupIfTTY, BackupError } from './backup.js';
|
|
11
|
+
import { appendUpdateInfo } from './update-infos.js';
|
|
12
|
+
import { getClaudeSettingsPath } from './global-paths.js';
|
|
13
|
+
import { updateFileHash } from './update-state.js';
|
|
14
|
+
import { t } from './i18n.js';
|
|
15
|
+
/** settings.json 非严格 JSON / 顶层非对象时抛出(调用方捕获 → 跳过写入 + anomaly) */
|
|
16
|
+
export class ClaudeSettingsParseError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(`settings.json 解析失败:${message}`);
|
|
19
|
+
this.name = 'ClaudeSettingsParseError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** 判断纯对象(排除数组 / null) */
|
|
23
|
+
function isPlainObject(v) {
|
|
24
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
25
|
+
}
|
|
26
|
+
/** 框架注入片段(供应商中立;JSON 无语言维度 → 代码常量,不经 build 注入) */
|
|
27
|
+
export function buildClaudeSettingsFragment() {
|
|
28
|
+
return { agent: 'feel', permissions: { defaultMode: 'auto' } };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 严格 JSON 深合并:在用户既有 settings 上并入框架片段,逐字保留用户未知键。
|
|
32
|
+
* - 顶层须为对象;严格 JSON.parse(不接受注释 / trailing comma);失败抛 ClaudeSettingsParseError;
|
|
33
|
+
* - 框架自有键 agent / permissions.defaultMode 覆盖;permissions 下用户其它子键(allow/deny/…)保留;
|
|
34
|
+
* - 输出稳定序列化 JSON.stringify(obj, null, 2) + '\n'(依赖 JS 对象插入序保证二次运行字节幂等)。
|
|
35
|
+
*/
|
|
36
|
+
export function mergeClaudeSettings(currentRaw) {
|
|
37
|
+
const raw = currentRaw.trim() === '' ? '{}' : currentRaw;
|
|
38
|
+
let base;
|
|
39
|
+
try {
|
|
40
|
+
base = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new ClaudeSettingsParseError(err.message);
|
|
44
|
+
}
|
|
45
|
+
if (!isPlainObject(base)) {
|
|
46
|
+
throw new ClaudeSettingsParseError('顶层必须为 JSON 对象');
|
|
47
|
+
}
|
|
48
|
+
const fragment = buildClaudeSettingsFragment();
|
|
49
|
+
const result = { ...base };
|
|
50
|
+
// 框架自有键:已存在则原位覆盖(保序),不存在则按片段声明序追加
|
|
51
|
+
result.agent = fragment.agent;
|
|
52
|
+
const basePerm = isPlainObject(result.permissions) ? result.permissions : {};
|
|
53
|
+
result.permissions = { ...basePerm, defaultMode: fragment.permissions.defaultMode };
|
|
54
|
+
return JSON.stringify(result, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 应用 Claude settings.json 注入(**单一共享函数**,setup.ts / update.ts 共用,避免双实现漂移 R-新11)。
|
|
58
|
+
* 顺序:① lock 之外写前备份(目标存在即备份,对齐 jsonc 口径)→ ② lock 内 read → merge → atomicWrite。
|
|
59
|
+
* @param state 全局 update state(成功写回后以绝对路径记 hash)
|
|
60
|
+
* @param command 调用方(决定 i18n 域前缀;仅 setup / update 接入)
|
|
61
|
+
* @param lang 输出语言
|
|
62
|
+
* @returns 'created'(原不存在)/ 'updated'(合并后变化)/ 'skipped'(无变化 或 备份/读取/解析失败)
|
|
63
|
+
*/
|
|
64
|
+
export function applyClaudeSettings(state, command, lang) {
|
|
65
|
+
const settingsPath = getClaudeSettingsPath();
|
|
66
|
+
// ① 写前备份(lock 之外,避免 backup 锁与 settings 锁嵌套)——目标存在时备份 + backed + TTY 通知
|
|
67
|
+
try {
|
|
68
|
+
const backup = backupFileBeforeWrite(settingsPath, { command });
|
|
69
|
+
if (backup) {
|
|
70
|
+
appendUpdateInfo('backed', { absolutePath: settingsPath, backupRel: backup.backupRel, command });
|
|
71
|
+
notifyBackupIfTTY(backup.backupRel);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
// 备份失败(B3):跳过 settings 写入、记 anomaly、继续其余步骤
|
|
76
|
+
if (err instanceof BackupError) {
|
|
77
|
+
appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'backup_failed' });
|
|
78
|
+
console.warn(t(`${command}.claudeSettingsWriteSkipTmpl`, lang, { err: err.message }));
|
|
79
|
+
return 'skipped';
|
|
80
|
+
}
|
|
81
|
+
throw err; // 非备份错误照旧上抛(锁超时等不回退)
|
|
82
|
+
}
|
|
83
|
+
// ② 锁内 read → merge → atomicWrite(read 也在锁内,消除 TOCTOU)
|
|
84
|
+
return withFileLock(globalLockPath('global-claude-settings'), () => {
|
|
85
|
+
const existed = existsSync(settingsPath);
|
|
86
|
+
let raw;
|
|
87
|
+
try {
|
|
88
|
+
raw = existed ? readFileSync(settingsPath, 'utf-8') : '';
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// 目录占位 / 权限不可读:不写盘,记 anomaly
|
|
92
|
+
appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'read_failed' });
|
|
93
|
+
console.warn(t(`${command}.claudeSettingsWriteSkipTmpl`, lang, { err: err.message }));
|
|
94
|
+
return 'skipped';
|
|
95
|
+
}
|
|
96
|
+
let merged;
|
|
97
|
+
try {
|
|
98
|
+
merged = mergeClaudeSettings(raw);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof ClaudeSettingsParseError) {
|
|
102
|
+
// 严格 JSON 解析失败:不写盘,保留原文件,记 anomaly
|
|
103
|
+
appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'parse_failed' });
|
|
104
|
+
console.warn(t(`${command}.claudeSettingsParseSkipTmpl`, lang, { err: err.message }));
|
|
105
|
+
return 'skipped';
|
|
106
|
+
}
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
if (existed && merged === raw) {
|
|
110
|
+
return 'skipped'; // 合并无变化 → 幂等(文件字节不变)
|
|
111
|
+
}
|
|
112
|
+
atomicWriteFileSync(settingsPath, merged);
|
|
113
|
+
updateFileHash(state, settingsPath, merged);
|
|
114
|
+
if (process.stdout.isTTY) {
|
|
115
|
+
console.log(t(`${command}.claudeSettingsMergedTmpl`, lang));
|
|
116
|
+
}
|
|
117
|
+
return existed ? 'updated' : 'created';
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=claude-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/core/claude-settings.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
|
@@ -341,7 +341,7 @@ const CONFIG_TEMPLATE_ZH = `# .openfeel/config.yaml
|
|
|
341
341
|
# 本文件为所有阶段提供默认值,status.md 可覆盖
|
|
342
342
|
|
|
343
343
|
meta:
|
|
344
|
-
version: 1.1.
|
|
344
|
+
version: 1.1.6
|
|
345
345
|
project: OpenFeel
|
|
346
346
|
tech_stack: TypeScript
|
|
347
347
|
|
|
@@ -393,7 +393,7 @@ const CONFIG_TEMPLATE_EN = `# .openfeel/config.yaml
|
|
|
393
393
|
# This file provides defaults for all stages; status.md can override
|
|
394
394
|
|
|
395
395
|
meta:
|
|
396
|
-
version: 1.1.
|
|
396
|
+
version: 1.1.6
|
|
397
397
|
project: OpenFeel
|
|
398
398
|
tech_stack: TypeScript
|
|
399
399
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** 全局部署一致性检测结果状态 */
|
|
2
|
+
export type DeployCheckStatus = 'ok' | 'mismatch' | 'missing' | 'unknown';
|
|
3
|
+
/** 全局部署一致性检测结果 */
|
|
4
|
+
export interface DeployCheckResult {
|
|
5
|
+
/** 四态判定 */
|
|
6
|
+
status: DeployCheckStatus;
|
|
7
|
+
/** 当前 CLI 版本(基准) */
|
|
8
|
+
cliVersion: string;
|
|
9
|
+
/** 全局 state 记录的已部署版本;缺失/损坏时为 null */
|
|
10
|
+
deployedVersion: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 检测全局部署版本与当前 CLI 版本是否一致(只读、不写盘、不加锁)。
|
|
14
|
+
* - 全局 state 文件缺失 → 'missing'
|
|
15
|
+
* - 文件存在但 Schema 非法/解析失败(load 返回 null)→ 'unknown'(静默)
|
|
16
|
+
* - 版本一致 → 'ok';不一致 → 'mismatch'
|
|
17
|
+
* - 任何读取异常(权限/占用/EISDIR)→ 'unknown'(静默,不抛)
|
|
18
|
+
* @param options.currentVersion 覆盖 CLI 版本基准(测试注入用;缺省取 getOpenfeelVersion())
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkGlobalDeployment(options?: {
|
|
21
|
+
currentVersion?: string;
|
|
22
|
+
}): DeployCheckResult;
|
|
23
|
+
/** 门控纯函数输入(stage-67 由 runCli/startRepl 构造) */
|
|
24
|
+
export interface DeployCheckGateInput {
|
|
25
|
+
/** 进程参数(不含 node/bin) */
|
|
26
|
+
argv: string[];
|
|
27
|
+
/** process.stdout.isTTY */
|
|
28
|
+
isTTY: boolean;
|
|
29
|
+
/** process.env */
|
|
30
|
+
env: NodeJS.ProcessEnv;
|
|
31
|
+
/** 本进程是否已提示过(每进程一次) */
|
|
32
|
+
alreadyWarned: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 是否应执行/输出被动部署提示(纯函数,输入全显式,便于单测矩阵)。
|
|
36
|
+
* 返回 false(静默)的条件(任一):
|
|
37
|
+
* - 非 TTY;已提示过;
|
|
38
|
+
* - argv 含 --json / --quiet;
|
|
39
|
+
* - argv 含 --version / -v / --help / -h;
|
|
40
|
+
* - 首个非选项 token ∈ {setup, update, init, migrate};
|
|
41
|
+
* - CI / OPENFEEL_NO_UPDATE_CHECK 为真值。
|
|
42
|
+
*/
|
|
43
|
+
export declare function shouldRunDeployCheck(input: DeployCheckGateInput): boolean;
|
|
44
|
+
//# sourceMappingURL=deployment-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-check.d.ts","sourceRoot":"","sources":["../../src/core/deployment-check.ts"],"names":[],"mappings":"AAkBA,oBAAoB;AACpB,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1E,kBAAkB;AAClB,MAAM,WAAW,iBAAiB;IAChC,WAAW;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAsB9F;AAED,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,uBAAuB;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAYD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAkBzE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deployment-check.ts — 全局部署版本一致性检测核心(stage-66)
|
|
3
|
+
*
|
|
4
|
+
* 职责:只读检测 `~/.openfeel/update_state.json.openfeel_version` 与当前 CLI 版本是否一致,
|
|
5
|
+
* 并提供「是否应输出被动部署提示」的纯函数门控策略。
|
|
6
|
+
* 本模块**不接 CLI**(接入归 stage-67);检测**只读**、不加锁、不写盘。
|
|
7
|
+
*
|
|
8
|
+
* ── 集成契约(stage-67 复用,勿改结构;R-4)──────────────────────────
|
|
9
|
+
* - checkGlobalDeployment({ currentVersion? }) => DeployCheckResult
|
|
10
|
+
* 四态:ok | mismatch | missing | unknown(unknown 静默)
|
|
11
|
+
* - shouldRunDeployCheck({ argv, isTTY, env, alreadyWarned }) => boolean
|
|
12
|
+
* true = 允许输出被动提示;false = 静默
|
|
13
|
+
* ────────────────────────────────────────────────────────────────
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from 'node:fs';
|
|
16
|
+
import { getGlobalUpdateStatePath } from './global-paths.js';
|
|
17
|
+
import { loadGlobalUpdateState, getOpenfeelVersion } from './update-state.js';
|
|
18
|
+
/**
|
|
19
|
+
* 检测全局部署版本与当前 CLI 版本是否一致(只读、不写盘、不加锁)。
|
|
20
|
+
* - 全局 state 文件缺失 → 'missing'
|
|
21
|
+
* - 文件存在但 Schema 非法/解析失败(load 返回 null)→ 'unknown'(静默)
|
|
22
|
+
* - 版本一致 → 'ok';不一致 → 'mismatch'
|
|
23
|
+
* - 任何读取异常(权限/占用/EISDIR)→ 'unknown'(静默,不抛)
|
|
24
|
+
* @param options.currentVersion 覆盖 CLI 版本基准(测试注入用;缺省取 getOpenfeelVersion())
|
|
25
|
+
*/
|
|
26
|
+
export function checkGlobalDeployment(options) {
|
|
27
|
+
const cliVersion = options?.currentVersion ?? getOpenfeelVersion();
|
|
28
|
+
try {
|
|
29
|
+
const statePath = getGlobalUpdateStatePath();
|
|
30
|
+
// 文件不存在 → 部署缺失(与「存在但非法」区分;loadGlobalUpdateState 对二者均返回 null)
|
|
31
|
+
if (!existsSync(statePath)) {
|
|
32
|
+
return { status: 'missing', cliVersion, deployedVersion: null };
|
|
33
|
+
}
|
|
34
|
+
const state = loadGlobalUpdateState();
|
|
35
|
+
// 文件存在但 Schema 非法/解析失败 → unknown 静默(避免 Schema 演进误报)
|
|
36
|
+
if (state === null) {
|
|
37
|
+
return { status: 'unknown', cliVersion, deployedVersion: null };
|
|
38
|
+
}
|
|
39
|
+
const deployedVersion = state.openfeel_version;
|
|
40
|
+
// 版本一致 → ok;否则 mismatch(含降级:部署版本 > CLI 版本亦按 != 处理)
|
|
41
|
+
return deployedVersion === cliVersion
|
|
42
|
+
? { status: 'ok', cliVersion, deployedVersion }
|
|
43
|
+
: { status: 'mismatch', cliVersion, deployedVersion };
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// 读取异常(权限/占用/目录占位等)→ unknown 静默,不抛
|
|
47
|
+
return { status: 'unknown', cliVersion, deployedVersion: null };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** 部署修复类命令白名单:避免「提示用户去做他正在做的事」 */
|
|
51
|
+
const DEPLOY_COMMANDS = new Set(['setup', 'update', 'init', 'migrate']);
|
|
52
|
+
/** 环境变量真值判定:仅识别 '1' / 'true'(大小写与首尾空白不敏感);CI=yes 等其它值不识别,由门控的 !isTTY 兜底(REV-003) */
|
|
53
|
+
function isTruthyEnv(value) {
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const v = value.trim().toLowerCase();
|
|
58
|
+
return v === '1' || v === 'true';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 是否应执行/输出被动部署提示(纯函数,输入全显式,便于单测矩阵)。
|
|
62
|
+
* 返回 false(静默)的条件(任一):
|
|
63
|
+
* - 非 TTY;已提示过;
|
|
64
|
+
* - argv 含 --json / --quiet;
|
|
65
|
+
* - argv 含 --version / -v / --help / -h;
|
|
66
|
+
* - 首个非选项 token ∈ {setup, update, init, migrate};
|
|
67
|
+
* - CI / OPENFEEL_NO_UPDATE_CHECK 为真值。
|
|
68
|
+
*/
|
|
69
|
+
export function shouldRunDeployCheck(input) {
|
|
70
|
+
// 非交互(CI/测试/管道)→ 静默
|
|
71
|
+
if (!input.isTTY) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// 每进程一次 → 已提示则静默
|
|
75
|
+
if (input.alreadyWarned) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
// 机器可读/安静模式 → 静默(保护 --json stdout 契约)
|
|
79
|
+
if (input.argv.includes('--json') || input.argv.includes('--quiet')) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
// 帮助/版本次命令 → 静默
|
|
83
|
+
if (input.argv.includes('--version') || input.argv.includes('-v') ||
|
|
84
|
+
input.argv.includes('--help') || input.argv.includes('-h')) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
// 部署修复类命令 → 静默
|
|
88
|
+
const firstToken = input.argv.find((a) => !a.startsWith('-'));
|
|
89
|
+
if (firstToken !== undefined && DEPLOY_COMMANDS.has(firstToken)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// CI / 显式禁用 → 静默
|
|
93
|
+
if (isTruthyEnv(input.env.CI) || isTruthyEnv(input.env.OPENFEEL_NO_UPDATE_CHECK)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=deployment-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-check.js","sourceRoot":"","sources":["../../src/core/deployment-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,4 +33,14 @@ export declare function getGlobalSchemasDir(): string;
|
|
|
33
33
|
export declare function getGlobalBackupRootPath(): string;
|
|
34
34
|
/** CLI 运行日志目录(~/.openfeel/cli/logs;跨项目诊断日志,stage-58) */
|
|
35
35
|
export declare function getCliLogsDir(): string;
|
|
36
|
+
/** Claude 全局配置根目录:CLAUDE_CONFIG_DIR 非空优先(函数体内读 env,空/空白回落 ~/.claude) */
|
|
37
|
+
export declare function getClaudeConfigDir(): string;
|
|
38
|
+
/** Claude 全局 agents 目录(<config>/agents) */
|
|
39
|
+
export declare function getClaudeAgentsDir(): string;
|
|
40
|
+
/** Claude 全局 skills 目录(<config>/skills) */
|
|
41
|
+
export declare function getClaudeSkillsDir(): string;
|
|
42
|
+
/** Claude 全局约束文件路径(<config>/CLAUDE.md) */
|
|
43
|
+
export declare function getClaudeMdPath(): string;
|
|
44
|
+
/** Claude 全局 settings.json 路径(<config>/settings.json;stage-73 消费,本阶段仅解析不写) */
|
|
45
|
+
export declare function getClaudeSettingsPath(): string;
|
|
36
46
|
//# sourceMappingURL=global-paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-paths.d.ts","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,gGAAgG;AAChG,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,uDAAuD;AACvD,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
1
|
+
{"version":3,"file":"global-paths.d.ts","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,gGAAgG;AAChG,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,uDAAuD;AACvD,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
|
@@ -73,4 +73,25 @@ export function getGlobalBackupRootPath() {
|
|
|
73
73
|
export function getCliLogsDir() {
|
|
74
74
|
return join(homedir(), '.openfeel', 'cli', 'logs');
|
|
75
75
|
}
|
|
76
|
+
/** Claude 全局配置根目录:CLAUDE_CONFIG_DIR 非空优先(函数体内读 env,空/空白回落 ~/.claude) */
|
|
77
|
+
export function getClaudeConfigDir() {
|
|
78
|
+
const dir = process.env.CLAUDE_CONFIG_DIR?.trim();
|
|
79
|
+
return dir ? dir : join(homedir(), '.claude');
|
|
80
|
+
}
|
|
81
|
+
/** Claude 全局 agents 目录(<config>/agents) */
|
|
82
|
+
export function getClaudeAgentsDir() {
|
|
83
|
+
return join(getClaudeConfigDir(), 'agents');
|
|
84
|
+
}
|
|
85
|
+
/** Claude 全局 skills 目录(<config>/skills) */
|
|
86
|
+
export function getClaudeSkillsDir() {
|
|
87
|
+
return join(getClaudeConfigDir(), 'skills');
|
|
88
|
+
}
|
|
89
|
+
/** Claude 全局约束文件路径(<config>/CLAUDE.md) */
|
|
90
|
+
export function getClaudeMdPath() {
|
|
91
|
+
return join(getClaudeConfigDir(), 'CLAUDE.md');
|
|
92
|
+
}
|
|
93
|
+
/** Claude 全局 settings.json 路径(<config>/settings.json;stage-73 消费,本阶段仅解析不写) */
|
|
94
|
+
export function getClaudeSettingsPath() {
|
|
95
|
+
return join(getClaudeConfigDir(), 'settings.json');
|
|
96
|
+
}
|
|
76
97
|
//# sourceMappingURL=global-paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-paths.js","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,0BAA0B;IACxC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,2BAA2B;IACzC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAChE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"global-paths.js","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UAwBpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UA0QlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UAwBpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UA0QlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UAiCpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA8CrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UA6BnB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UA+BlB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAOrB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAAe,CAAC;AAGtC,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,UAAe,CAAC;AAG3C,eAAO,MAAM,IAAI,EAAE,UAalB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyOlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UA6BpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA4BrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAqBnB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAenB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UASrB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAqBlE,CAAC"}
|
|
@@ -327,6 +327,15 @@ export const update = {
|
|
|
327
327
|
'legacyLayoutWarnTmpl': { key: 'update.legacyLayoutWarnTmpl', zh: '', en: '[update] Detected legacy in-project layout .opencode/{dirs}; run openfeel migrate (provided since stage-39) to migrate.' },
|
|
328
328
|
'globalJsoncParseSkipTmpl': { key: 'update.globalJsoncParseSkipTmpl', zh: '', en: '[update] Failed to parse global opencode.jsonc (may contain block comments); skipping merge and keeping the original file: {err}' },
|
|
329
329
|
'globalJsoncWriteSkipTmpl': { key: 'update.globalJsoncWriteSkipTmpl', zh: '', en: '[update] {err}; skipped global opencode.jsonc write, continuing with remaining steps' },
|
|
330
|
+
'globalStaleWarnTmpl': { key: 'update.globalStaleWarnTmpl', zh: '', en: '[openfeel] Global OpenFeel deployment version {deployed} differs from CLI version {cli}; run `openfeel setup` and restart the harness to load the latest global configuration.' },
|
|
331
|
+
'globalMissingWarnTmpl': { key: 'update.globalMissingWarnTmpl', zh: '', en: '[openfeel] No global OpenFeel deployment detected; run `openfeel setup` and restart the harness.' },
|
|
332
|
+
'toolsInvalidTmpl': { key: 'update.toolsInvalidTmpl', zh: '', en: 'Invalid tool value(s): {tools} (valid: {valid})' },
|
|
333
|
+
'nonInteractiveToolsTmpl': { key: 'update.nonInteractiveToolsTmpl', zh: '', en: '(Non-interactive environment; using the default tool list)' },
|
|
334
|
+
'restartHarnessTmpl': { key: 'update.restartHarnessTmpl', zh: '', en: '{harness} global configuration updated. Please restart {harness} to load the new configuration.' },
|
|
335
|
+
'claudeReloadHintTmpl': { key: 'update.claudeReloadHintTmpl', zh: '', en: 'Claude Code: after first creating ~/.claude/{agents,skills}, restart the session or run /reload-skills; CLAUDE.md takes effect next session.' },
|
|
336
|
+
'claudeSettingsMergedTmpl': { key: 'update.claudeSettingsMergedTmpl', zh: '', en: '[update] Merged ~/.claude/settings.json (injected agent:"feel" and permissions.defaultMode:"auto"; existing user keys preserved; original backed up)' },
|
|
337
|
+
'claudeSettingsParseSkipTmpl': { key: 'update.claudeSettingsParseSkipTmpl', zh: '', en: '[update] ~/.claude/settings.json is not strict JSON (comments or trailing comma); skipped merge, kept original: {err}' },
|
|
338
|
+
'claudeSettingsWriteSkipTmpl': { key: 'update.claudeSettingsWriteSkipTmpl', zh: '', en: '[update] {err}; skipped writing ~/.claude/settings.json, continuing with remaining steps' },
|
|
330
339
|
};
|
|
331
340
|
/* ==================== project ==================== */
|
|
332
341
|
export const project = {
|
|
@@ -517,13 +526,17 @@ export const help = {
|
|
|
517
526
|
'init': { key: 'help.init', zh: '', en: 'Initialize project workspace, create .openfeel/ directory structure and config files' },
|
|
518
527
|
'init.demo': { key: 'help.init.demo', zh: '', en: 'Create demo project skeleton (NumKit style)' },
|
|
519
528
|
'init.lang': { key: 'help.init.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN in non-interactive mode' },
|
|
520
|
-
'init.workspaceOnly': { key: 'help.init.workspaceOnly', zh: '', en: 'Create the .openfeel/ workspace only (no global rules / platform adapter config
|
|
529
|
+
'init.workspaceOnly': { key: 'help.init.workspaceOnly', zh: '', en: 'Create the .openfeel/ workspace only (no global rules / platform adapter config); used by Feel to auto-setup blank projects' },
|
|
521
530
|
'init.nonInteractive': { key: 'help.init.nonInteractive', zh: '', en: 'Non-interactive mode (used together with --workspace-only)' },
|
|
522
|
-
'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global
|
|
531
|
+
'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global rules file + agents + skills + platform adapter config); does not create the project .openfeel/; defaults to opencode only (use --tools to add claude)' },
|
|
523
532
|
'setup.lang': { key: 'help.setup.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN' },
|
|
533
|
+
'setup.check': { key: 'help.setup.check', zh: '', en: 'Diagnose whether the global deployment matches the CLI version (read-only; no deploy); exit 0 if consistent, else 1' },
|
|
534
|
+
'setup.json': { key: 'help.setup.json', zh: '', en: 'Output the diagnosis as JSON (pure single JSON document with schemaVersion)' },
|
|
535
|
+
'setup.tools': { key: 'help.setup.tools', zh: '', en: 'Deploy target tools (comma-separated, e.g. opencode,claude; defaults to opencode only; invalid value exits 1)' },
|
|
524
536
|
'update': { key: 'help.update', zh: '', en: 'Deploy OpenFeel adapter files to target project (interactive tool selection when no args)' },
|
|
525
537
|
'update.lang': { key: 'help.update.lang', zh: '', en: 'Agent prompt language (zh-CN or en)' },
|
|
526
538
|
'update.force': { key: 'help.update.force', zh: '', en: 'Skip AGENTS.md overwrite confirmation, force overwrite' },
|
|
539
|
+
'update.tools': { key: 'help.update.tools', zh: '', en: 'Deploy target tools (comma-separated, e.g. opencode,claude; invalid value exits 1)' },
|
|
527
540
|
'flow': { key: 'help.flow', zh: '', en: 'Pipeline status management' },
|
|
528
541
|
'flow.status': { key: 'help.flow.status', zh: '', en: 'Show pipeline status summary' },
|
|
529
542
|
'flow.status.verbose': { key: 'help.flow.status.verbose', zh: '', en: 'Enhanced output: config cascade, recent changes, downstream agent readiness' },
|
|
@@ -812,6 +825,14 @@ export const setup = {
|
|
|
812
825
|
'updated': { key: 'setup.updated', zh: '', en: 'Updated global files:' },
|
|
813
826
|
'appended': { key: 'setup.appended', zh: '', en: 'Global files needing manual confirmation (already exist and are unmanaged; not overwritten):' },
|
|
814
827
|
'complete': { key: 'setup.complete', zh: '', en: '? Global OpenFeel framework config deployed' },
|
|
828
|
+
'checkOkTmpl': { key: 'setup.checkOkTmpl', zh: '', en: 'Global deployment version {deployed} (matches CLI version {cli})' },
|
|
829
|
+
'checkMismatchTmpl': { key: 'setup.checkMismatchTmpl', zh: '', en: 'Global deployment version {deployed} != CLI version {cli}; run `openfeel setup` and restart the harness.' },
|
|
830
|
+
'checkMissingTmpl': { key: 'setup.checkMissingTmpl', zh: '', en: 'No global OpenFeel deployment detected; run `openfeel setup` and restart the harness.' },
|
|
831
|
+
'checkUnknownTmpl': { key: 'setup.checkUnknownTmpl', zh: '', en: 'Global deployment status cannot be determined (update_state.json missing or corrupted); run `openfeel setup` to redeploy.' },
|
|
832
|
+
'restartHarnessTmpl': { key: 'setup.restartHarnessTmpl', zh: '', en: 'Restart the harness ({harness}) to load the new global configuration.' },
|
|
833
|
+
'claudeSettingsMergedTmpl': { key: 'setup.claudeSettingsMergedTmpl', zh: '', en: '[setup] Merged ~/.claude/settings.json (injected agent:"feel" and permissions.defaultMode:"auto"; existing user keys preserved; original backed up)' },
|
|
834
|
+
'claudeSettingsParseSkipTmpl': { key: 'setup.claudeSettingsParseSkipTmpl', zh: '', en: '[setup] ~/.claude/settings.json is not strict JSON (comments or trailing comma); skipped merge, kept original: {err}' },
|
|
835
|
+
'claudeSettingsWriteSkipTmpl': { key: 'setup.claudeSettingsWriteSkipTmpl', zh: '', en: '[setup] {err}; skipped writing ~/.claude/settings.json, continuing with remaining steps' },
|
|
815
836
|
};
|
|
816
837
|
/* ==================== metrics domain: agent performance summary (T15) ==================== */
|
|
817
838
|
export const metrics = {
|