openfeel 1.0.6 → 1.0.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,13 @@ export declare function getDevCoreTemplate(lang: 'zh-CN' | 'en'): string;
12
12
  * @param lang 语言,'zh-CN' 或 'en'
13
13
  */
14
14
  export declare function getCurrentTemplate(lang: 'zh-CN' | 'en'): string;
15
+ /**
16
+ * 根据语言返回 decisions.md 模板
17
+ * @param lang 语言,'zh-CN' 或 'en'
18
+ */
19
+ export declare function getDecisionsTemplate(lang: 'zh-CN' | 'en'): string;
15
20
  export declare const DEV_CORE_TEMPLATE = "# \u52A8\u6001\u89C4\u5219\n> \u4F7F\u7528 [+] / [-] \u6807\u8BB0\u7BA1\u7406\u542F\u7528/\u7981\u7528\u72B6\u6001\u3002\u53EA\u80FD\u6807\u8BB0\u7981\u7528\u4E0D\u80FD\u5220\u9664\u3002\n";
16
21
  export declare const CURRENT_TEMPLATE = "# \u5F53\u524D\u5DE5\u4F5C\u8FDB\u5EA6\n\n> \u603B\u8FDB\u5EA6\uFF1A\u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u7B49\u5F85\u8BA1\u5212\u521B\u5EFA\u3002\n\n## \u56E2\u961F\u6210\u5458\u8FDB\u5EA6\n\n\u6682\u65E0\u6D3B\u8DC3\u6210\u5458\u3002\n";
22
+ export declare const DECISIONS_TEMPLATE = "# \u51B3\u7B56\u8BB0\u5F55\uFF08ADR\uFF09\n\n> \u957F\u671F\u6280\u672F/\u67B6\u6784\u51B3\u7B56\uFF08\u6280\u672F\u9009\u578B\u3001\u67B6\u6784\u65B9\u5411\u3001\u8DE8\u4F1A\u8BDD\u6709\u6548\u7684\u8BBE\u8BA1\u53D6\u820D\uFF09\u4EE5 ADR \u8F7B\u91CF\u683C\u5F0F\u8BB0\u5F55\u4E8E\u6B64\u3002\n> \u4F1A\u8BDD\u4E34\u65F6\u51B3\u7B56\uFF08\u6D41\u7A0B\u8C03\u6574\u3001\u5355\u6B21\u53D6\u820D\uFF09\u8BB0\u5F55\u5728 .openfeel/users/{username}/dev_last.md \u7684\u300C\u51B3\u7B56\u5386\u53F2\u300D\u8282\uFF0C\u4E0D\u5199\u5165\u672C\u6587\u4EF6\u3002\n> \u5199\u5165\u65F6\u673A\uFF1AFeel \u505A\u51FA\u957F\u671F\u6280\u672F/\u67B6\u6784\u51B3\u7B56\u65F6\uFF0C\u540C\u6B65\u8FFD\u52A0\u4E00\u6761 ADR \u8BB0\u5F55\u3002\n\n## ADR \u6A21\u677F\n\n### ADR-{NNN}\uFF1A{\u51B3\u7B56\u6807\u9898}\n- **\u65E5\u671F**\uFF1A{yyyy-mm-dd}\n- **\u72B6\u6001**\uFF1Aproposed / accepted / superseded / deprecated\n- **\u51B3\u7B56**\uFF1A{\u4E00\u53E5\u8BDD\u63CF\u8FF0\u91C7\u7EB3\u7684\u51B3\u7B56\u5185\u5BB9}\n- **\u7406\u7531**\uFF1A{\u4E3A\u4EC0\u4E48\u8FD9\u6837\u51B3\u7B56\uFF0C\u542B\u5907\u9009\u65B9\u6848\u53CA\u53D6\u820D\u5206\u6790}\n";
17
23
  export { CORE_INSTRUCTIONS_TEMPLATE_B64, AGENTS_MD_TEMPLATE } from './template-loader.js';
18
24
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAE/D;AAGD,eAAO,MAAM,iBAAiB,iMAAuB,CAAC;AACtD,eAAO,MAAM,gBAAgB,kPAAsB,CAAC;AAGpD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgEH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAEjE;AAGD,eAAO,MAAM,iBAAiB,iMAAuB,CAAC;AACtD,eAAO,MAAM,gBAAgB,kPAAsB,CAAC;AACpD,eAAO,MAAM,kBAAkB,4nCAAwB,CAAC;AAGxD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -28,6 +28,36 @@ const CURRENT_TEMPLATE_EN = `# Current Progress
28
28
 
29
29
  No active members yet.
30
30
  `;
31
+ /** 中文版 decisions.md 模板(ADR 轻量格式:决策+理由+日期+状态) */
32
+ const DECISIONS_TEMPLATE_ZH = `# 决策记录(ADR)
33
+
34
+ > 长期技术/架构决策(技术选型、架构方向、跨会话有效的设计取舍)以 ADR 轻量格式记录于此。
35
+ > 会话临时决策(流程调整、单次取舍)记录在 .openfeel/users/{username}/dev_last.md 的「决策历史」节,不写入本文件。
36
+ > 写入时机:Feel 做出长期技术/架构决策时,同步追加一条 ADR 记录。
37
+
38
+ ## ADR 模板
39
+
40
+ ### ADR-{NNN}:{决策标题}
41
+ - **日期**:{yyyy-mm-dd}
42
+ - **状态**:proposed / accepted / superseded / deprecated
43
+ - **决策**:{一句话描述采纳的决策内容}
44
+ - **理由**:{为什么这样决策,含备选方案及取舍分析}
45
+ `;
46
+ /** 英文版 decisions.md 模板(ADR 轻量格式) */
47
+ const DECISIONS_TEMPLATE_EN = `# Decision Log (ADR)
48
+
49
+ > Long-term technical/architecture decisions (technology selection, architecture direction, cross-session design trade-offs) are recorded here in lightweight ADR format.
50
+ > Session-scoped temporary decisions (process adjustments, one-off trade-offs) are recorded in the "Decision History" section of .openfeel/users/{username}/dev_last.md, not in this file.
51
+ > Write timing: When Feel makes a long-term technical/architecture decision, append an ADR entry synchronously.
52
+
53
+ ## ADR Template
54
+
55
+ ### ADR-{NNN}: {Decision Title}
56
+ - **Date**: {yyyy-mm-dd}
57
+ - **Status**: proposed / accepted / superseded / deprecated
58
+ - **Decision**: {one-sentence description of the adopted decision}
59
+ - **Rationale**: {why this decision, including alternatives and trade-off analysis}
60
+ `;
31
61
  /**
32
62
  * 根据语言返回 dev_core.md 模板
33
63
  * @param lang 语言,'zh-CN' 或 'en'
@@ -42,9 +72,17 @@ export function getDevCoreTemplate(lang) {
42
72
  export function getCurrentTemplate(lang) {
43
73
  return lang === 'en' ? CURRENT_TEMPLATE_EN : CURRENT_TEMPLATE_ZH;
44
74
  }
75
+ /**
76
+ * 根据语言返回 decisions.md 模板
77
+ * @param lang 语言,'zh-CN' 或 'en'
78
+ */
79
+ export function getDecisionsTemplate(lang) {
80
+ return lang === 'en' ? DECISIONS_TEMPLATE_EN : DECISIONS_TEMPLATE_ZH;
81
+ }
45
82
  // 向后兼容导出(默认中文)
46
83
  export const DEV_CORE_TEMPLATE = DEV_CORE_TEMPLATE_ZH;
47
84
  export const CURRENT_TEMPLATE = CURRENT_TEMPLATE_ZH;
85
+ export const DECISIONS_TEMPLATE = DECISIONS_TEMPLATE_ZH;
48
86
  // 以下常量已由 template-loader.ts 统一管理,此处保留 re-export 以兼容现有消费方
49
87
  export { CORE_INSTRUCTIONS_TEMPLATE_B64, AGENTS_MD_TEMPLATE } from './template-loader.js';
50
88
  //# sourceMappingURL=templates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,MAAM,oBAAoB,GAAG;;CAE5B,CAAC;AAEF,yBAAyB;AACzB,MAAM,oBAAoB,GAAG;;CAE5B,CAAC;AAEF,wBAAwB;AACxB,MAAM,mBAAmB,GAAG;;;;;;;CAO3B,CAAC;AAEF,wBAAwB;AACxB,MAAM,mBAAmB,GAAG;;;;;;;CAO3B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACnE,CAAC;AAED,eAAe;AACf,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,yDAAyD;AACzD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,MAAM,oBAAoB,GAAG;;CAE5B,CAAC;AAEF,yBAAyB;AACzB,MAAM,oBAAoB,GAAG;;CAE5B,CAAC;AAEF,wBAAwB;AACxB,MAAM,mBAAmB,GAAG;;;;;;;CAO3B,CAAC;AAEF,wBAAwB;AACxB,MAAM,mBAAmB,GAAG;;;;;;;CAO3B,CAAC;AAEF,gDAAgD;AAChD,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;CAa7B,CAAC;AAEF,oCAAoC;AACpC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;CAa7B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAoB;IACvD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AACvE,CAAC;AAED,eAAe;AACf,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAExD,yDAAyD;AACzD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ /** 单文件状态 */
3
+ declare const FileStateSchema: z.ZodObject<{
4
+ hash: z.ZodString;
5
+ status: z.ZodEnum<{
6
+ clean: "clean";
7
+ conflict: "conflict";
8
+ }>;
9
+ }, z.core.$strip>;
10
+ /** update_state.json 顶层 Schema */
11
+ export declare const UpdateStateSchema: z.ZodObject<{
12
+ version: z.ZodLiteral<"1.0">;
13
+ last_update: z.ZodString;
14
+ openfeel_version: z.ZodString;
15
+ files: z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ hash: z.ZodString;
17
+ status: z.ZodEnum<{
18
+ clean: "clean";
19
+ conflict: "conflict";
20
+ }>;
21
+ }, z.core.$strip>>;
22
+ }, z.core.$strip>;
23
+ export type UpdateState = z.infer<typeof UpdateStateSchema>;
24
+ export type FileState = z.infer<typeof FileStateSchema>;
25
+ /**
26
+ * 计算字符串的 SHA-256 哈希(hex 编码)
27
+ *
28
+ * REV-002:行尾归一化(CRLF → LF),避免跨平台行尾符差异导致误报
29
+ */
30
+ export declare function hashContent(content: string): string;
31
+ /**
32
+ * 获取 OpenFeel 工具自身版本号
33
+ * 通过 createRequire 从工具自身 package.json 读取(src/core/ 下相对 ../../package.json,
34
+ * 编译产物 dist/core/ 下同样相对 ../../package.json,两个环境路径一致)。
35
+ */
36
+ export declare function getOpenfeelVersion(): string;
37
+ /**
38
+ * 读取 update_state.json
39
+ * 不存在或校验失败 → 返回 null(降级为"全量覆盖"模式)
40
+ */
41
+ export declare function loadUpdateState(projectPath: string): UpdateState | null;
42
+ /**
43
+ * 写入 update_state.json(缩进 JSON,末尾换行)
44
+ */
45
+ export declare function saveUpdateState(projectPath: string, state: UpdateState): void;
46
+ /**
47
+ * 首次 update 时创建初始状态
48
+ * @param projectPath 目标项目路径
49
+ * @param files 受管文件的 { 相对路径 → 文件内容 } 映射
50
+ */
51
+ export declare function createUpdateState(projectPath: string, files: Record<string, string>): UpdateState;
52
+ /**
53
+ * 原地更新 state 中单个文件的 hash,status 标记为 clean
54
+ */
55
+ export declare function updateFileHash(state: UpdateState, relativePath: string, content: string): void;
56
+ /**
57
+ * 原地标记单个文件的 status 为 conflict
58
+ */
59
+ export declare function markFileConflict(state: UpdateState, relativePath: string): void;
60
+ export {};
61
+ //# sourceMappingURL=update-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-state.d.ts","sourceRoot":"","sources":["../../src/core/update-state.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,YAAY;AACZ,QAAA,MAAM,eAAe;;;;;;iBAGnB,CAAC;AAEH,kCAAkC;AAClC,eAAO,MAAM,iBAAiB;;;;;;;;;;;iBAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AASxD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAInD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAOD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAoBvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,GACjB,IAAI,CAIN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,WAAW,CAiBb;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,MAAM,GACnB,IAAI,CAKN"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * update_state.json 读写模块
3
+ * 负责管理 .openfeel/update_state.json 的 hash 追踪和冲突标记状态,
4
+ * 为 openfeel update 的增量更新 + 冲突检测机制提供基础。
5
+ *
6
+ * hash 算法:SHA-256(Node.js 内置 crypto),不引入新 npm 依赖。
7
+ * 降级策略:loadUpdateState() 返回 null 时,调用方回退到"全量覆盖 + 重建 state"模式。
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
11
+ import { resolve, dirname } from 'node:path';
12
+ import { createRequire } from 'node:module';
13
+ import { z } from 'zod';
14
+ // ─── Zod Schema ──────────────────────────────────────────────────────
15
+ /** 单文件状态 */
16
+ const FileStateSchema = z.object({
17
+ hash: z.string(),
18
+ status: z.enum(['clean', 'conflict']),
19
+ });
20
+ /** update_state.json 顶层 Schema */
21
+ export const UpdateStateSchema = z.object({
22
+ version: z.literal('1.0'),
23
+ last_update: z.string(),
24
+ openfeel_version: z.string(),
25
+ files: z.record(z.string(), FileStateSchema),
26
+ });
27
+ // ─── 常量 ────────────────────────────────────────────────────────────
28
+ /** update_state.json 在项目中的相对路径 */
29
+ const STATE_FILE = '.openfeel/update_state.json';
30
+ // ─── 公开 API ────────────────────────────────────────────────────────
31
+ /**
32
+ * 计算字符串的 SHA-256 哈希(hex 编码)
33
+ *
34
+ * REV-002:行尾归一化(CRLF → LF),避免跨平台行尾符差异导致误报
35
+ */
36
+ export function hashContent(content) {
37
+ // 行尾归一化:CRLF / CR → LF(参见 kb/patterns.md #跨平台构建管线中的行尾归一化模式)
38
+ const normalized = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
39
+ return createHash('sha256').update(normalized, 'utf-8').digest('hex');
40
+ }
41
+ /**
42
+ * 获取 OpenFeel 工具自身版本号
43
+ * 通过 createRequire 从工具自身 package.json 读取(src/core/ 下相对 ../../package.json,
44
+ * 编译产物 dist/core/ 下同样相对 ../../package.json,两个环境路径一致)。
45
+ */
46
+ export function getOpenfeelVersion() {
47
+ // 工具自身 package.json(src/core/update-state.ts → ../../package.json = 项目根)
48
+ const require = createRequire(import.meta.url);
49
+ const pkg = require('../../package.json');
50
+ return pkg.version;
51
+ }
52
+ /** 获取 update_state.json 的绝对路径 */
53
+ function getStatePath(projectPath) {
54
+ return resolve(projectPath, STATE_FILE);
55
+ }
56
+ /**
57
+ * 读取 update_state.json
58
+ * 不存在或校验失败 → 返回 null(降级为"全量覆盖"模式)
59
+ */
60
+ export function loadUpdateState(projectPath) {
61
+ const statePath = getStatePath(projectPath);
62
+ if (!existsSync(statePath)) {
63
+ return null;
64
+ }
65
+ try {
66
+ const raw = readFileSync(statePath, 'utf-8');
67
+ const data = JSON.parse(raw);
68
+ const result = UpdateStateSchema.safeParse(data);
69
+ if (!result.success) {
70
+ console.warn(`[update] update_state.json schema mismatch, treating as first update: ${result.error.message}`);
71
+ return null;
72
+ }
73
+ return result.data;
74
+ }
75
+ catch {
76
+ // parse 失败 → 降级
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * 写入 update_state.json(缩进 JSON,末尾换行)
82
+ */
83
+ export function saveUpdateState(projectPath, state) {
84
+ const statePath = getStatePath(projectPath);
85
+ mkdirSync(dirname(statePath), { recursive: true });
86
+ writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
87
+ }
88
+ /**
89
+ * 首次 update 时创建初始状态
90
+ * @param projectPath 目标项目路径
91
+ * @param files 受管文件的 { 相对路径 → 文件内容 } 映射
92
+ */
93
+ export function createUpdateState(projectPath, files) {
94
+ const fileEntries = {};
95
+ for (const [path, content] of Object.entries(files)) {
96
+ fileEntries[path] = {
97
+ hash: hashContent(content),
98
+ status: 'clean',
99
+ };
100
+ }
101
+ // 确保其父目录存在(首次 write 时 .openfeel 可能已存在也可能不存在)
102
+ mkdirSync(dirname(getStatePath(projectPath)), { recursive: true });
103
+ return {
104
+ version: '1.0',
105
+ last_update: new Date().toISOString(),
106
+ openfeel_version: getOpenfeelVersion(),
107
+ files: fileEntries,
108
+ };
109
+ }
110
+ /**
111
+ * 原地更新 state 中单个文件的 hash,status 标记为 clean
112
+ */
113
+ export function updateFileHash(state, relativePath, content) {
114
+ state.files[relativePath] = {
115
+ hash: hashContent(content),
116
+ status: 'clean',
117
+ };
118
+ }
119
+ /**
120
+ * 原地标记单个文件的 status 为 conflict
121
+ */
122
+ export function markFileConflict(state, relativePath) {
123
+ state.files[relativePath] = {
124
+ hash: state.files[relativePath]?.hash ?? '',
125
+ status: 'conflict',
126
+ };
127
+ }
128
+ //# sourceMappingURL=update-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-state.js","sourceRoot":"","sources":["../../src/core/update-state.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export interface UpdateResult {
3
3
  created: string[];
4
4
  updated: string[];
5
5
  skipped: string[];
6
+ conflicts: string[];
6
7
  }
7
8
  /** AGENTS.md 语言冲突错误(由命令层捕获处理) */
8
9
  export declare class AgentsMdLangConflictError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAaA,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iCAAiC;AACjC,qBAAa,yBAA0B,SAAQ,KAAK;IAEzC,WAAW,EAAE,MAAM;IACnB,aAAa,EAAE,MAAM;gBADrB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM;CAK/B;AAID,kBAAkB;AAClB,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,SAAS,EAUrC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBrD;AA24CD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,MAAM,EAAiB,EACtC,IAAI,GAAE,OAAO,GAAG,IAAc,EAC9B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAC1E,YAAY,CAwId"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"AAyBA,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,iCAAiC;AACjC,qBAAa,yBAA0B,SAAQ,KAAK;IAEzC,WAAW,EAAE,MAAM;IACnB,aAAa,EAAE,MAAM;gBADrB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM;CAK/B;AAID,kBAAkB;AAClB,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,SAAS,EAUrC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBrD;AA46CD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,MAAM,EAAiB,EACtC,IAAI,GAAE,OAAO,GAAG,IAAc,EAC9B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAC1E,YAAY,CAuLd"}
@@ -6,10 +6,12 @@
6
6
  * - 新增 instructions/core.md 创建(从 init.ts 迁移至此,职责归位适配器层)
7
7
  */
8
8
  import { writeFileSync, existsSync, readFileSync, mkdirSync, readdirSync } from 'node:fs';
9
- import { resolve, join } from 'node:path';
9
+ import { resolve, dirname, join } from 'node:path';
10
10
  import { loadAgentTemplate, listAgentIds, loadTemplate } from './template-loader.js';
11
11
  import { recordProjectLang, getGlobalConfig, getLang } from './workspace/identity.js';
12
12
  import { getCliLang } from './i18n.js';
13
+ // 新增:update_state.json hash 比对与冲突检测
14
+ import { hashContent, loadUpdateState, saveUpdateState, createUpdateState, updateFileHash, markFileConflict, getOpenfeelVersion, } from './update-state.js';
13
15
  /** AGENTS.md 语言冲突错误(由命令层捕获处理) */
14
16
  export class AgentsMdLangConflictError extends Error {
15
17
  projectLang;
@@ -1179,25 +1181,51 @@ const NEW_SKILL_NAMES = [
1179
1181
  ];
1180
1182
  // ─── 辅助函数 ──────────────────────────────────────────────────────
1181
1183
  /**
1182
- * 写入文件,返回操作类型
1183
- * 若文件已存在且内容一致 → skipped
1184
- * 若文件已存在但内容不同 → updated
1185
- * 若文件不存在 → created
1184
+ * 带冲突检测的写入函数(替代原 writeIfChanged)
1185
+ *
1186
+ * 三态逻辑:
1187
+ * - 文件不存在 → created
1188
+ * - 文件已存在 + hash 匹配 update_state 中记录 → 安全覆盖 → updated
1189
+ * - 文件已存在 + hash 不匹配 → 拒绝覆盖 → conflicts
1190
+ * - 文件已存在 + 不在 update_state 管理中 → 安全覆盖 → updated(降级)
1191
+ * - 文件已存在 + update_state 不存在或损坏 → 安全覆盖 → updated(降级为旧行为)
1192
+ *
1193
+ * REV-001:此函数仅负责分类(created/updated/skipped/conflicts),
1194
+ * hash 的实际更新在 updateProject() 末尾统一处理,
1195
+ * 确保"冲突路径非冲突文件 hash 同步更新"。
1186
1196
  */
1187
- function writeIfChanged(filePath, content, relativePath, created, updated, skipped) {
1188
- if (existsSync(filePath)) {
1189
- const existing = readFileSync(filePath, 'utf-8');
1190
- if (existing === content) {
1191
- skipped.push(relativePath);
1192
- return;
1193
- }
1194
- writeFileSync(filePath, content, 'utf-8');
1195
- updated.push(relativePath);
1196
- }
1197
- else {
1197
+ function writeWithMergeDetection(filePath, content, relativePath, updateState, created, updated, skipped, conflicts) {
1198
+ if (!existsSync(filePath)) {
1199
+ // 文件不存在 → 新建
1200
+ mkdirSync(dirname(filePath), { recursive: true });
1198
1201
  writeFileSync(filePath, content, 'utf-8');
1199
1202
  created.push(relativePath);
1203
+ return;
1200
1204
  }
1205
+ const existing = readFileSync(filePath, 'utf-8');
1206
+ // 内容相同 → skip(快速路径:全文比对,避免 hash 计算)
1207
+ if (existing === content) {
1208
+ skipped.push(relativePath);
1209
+ return;
1210
+ }
1211
+ // 检查 update_state 中是否有该文件的记录
1212
+ const fileState = updateState?.files[relativePath];
1213
+ if (fileState) {
1214
+ // 有记录 → 比对 hash
1215
+ const currentHash = hashContent(existing);
1216
+ if (currentHash === fileState.hash) {
1217
+ // hash 一致 → 用户未修改 → 安全覆盖
1218
+ writeFileSync(filePath, content, 'utf-8');
1219
+ updated.push(relativePath);
1220
+ return;
1221
+ }
1222
+ // hash 不一致 → 用户已修改 → 冲突!
1223
+ conflicts.push(relativePath);
1224
+ return;
1225
+ }
1226
+ // 无记录(降级路径:update_state 损坏或旧版本)→ 安全覆盖
1227
+ writeFileSync(filePath, content, 'utf-8');
1228
+ updated.push(relativePath);
1201
1229
  }
1202
1230
  /**
1203
1231
  * 解析 JSONC 文本为 JavaScript 对象
@@ -1448,6 +1476,9 @@ export function updateProject(projectPath, selectedTools = ["opencode"], lang =
1448
1476
  const created = [];
1449
1477
  const updated = [];
1450
1478
  const skipped = [];
1479
+ // ── 增量更新:加载 update_state.json ──
1480
+ const state = loadUpdateState(projectPath);
1481
+ const conflicts = [];
1451
1482
  const agentsDir = resolve(projectPath, '.opencode', 'agents');
1452
1483
  const skillsDir = resolve(projectPath, '.opencode', 'skills');
1453
1484
  // 确保目标目录存在
@@ -1455,7 +1486,7 @@ export function updateProject(projectPath, selectedTools = ["opencode"], lang =
1455
1486
  mkdirSync(skillsDir, { recursive: true });
1456
1487
  // 过滤:仅处理选中的工具
1457
1488
  if (!selectedTools.includes('opencode')) {
1458
- return { created: [], updated: [], skipped: [] };
1489
+ return { created: [], updated: [], skipped: [], conflicts: [] };
1459
1490
  }
1460
1491
  // ── AGENTS.md 语言同步逻辑 ──
1461
1492
  let agentsDirHasContent = false;
@@ -1544,13 +1575,13 @@ export function updateProject(projectPath, selectedTools = ["opencode"], lang =
1544
1575
  mkdirSync(instructionsDir, { recursive: true });
1545
1576
  const coreInstructionsPath = join(instructionsDir, 'core.md');
1546
1577
  const coreContent = loadTemplate(lang, 'core-instructions');
1547
- writeIfChanged(coreInstructionsPath, coreContent, '.opencode/instructions/core.md', created, updated, skipped);
1578
+ writeWithMergeDetection(coreInstructionsPath, coreContent, '.opencode/instructions/core.md', state, created, updated, skipped, conflicts);
1548
1579
  // 1. 生成 Agent 定义文件(从 template-loader 加载模板,按语言选择)
1549
1580
  for (const name of listAgentIds(lang)) {
1550
1581
  const content = loadAgentTemplate(lang, name);
1551
1582
  const filePath = join(agentsDir, `${name}.md`);
1552
1583
  const relPath = `.opencode/agents/${name}.md`;
1553
- writeIfChanged(filePath, content, relPath, created, updated, skipped);
1584
+ writeWithMergeDetection(filePath, content, relPath, state, created, updated, skipped, conflicts);
1554
1585
  }
1555
1586
  // 2. 生成 Skill 定义文件(每个 Skill 一个子目录,包含 SKILL.md)
1556
1587
  for (const [name, content] of Object.entries(SKILL_DEFINITIONS)) {
@@ -1558,13 +1589,13 @@ export function updateProject(projectPath, selectedTools = ["opencode"], lang =
1558
1589
  mkdirSync(skillSubDir, { recursive: true });
1559
1590
  const filePath = join(skillSubDir, 'SKILL.md');
1560
1591
  const relPath = `.opencode/skills/${name}/SKILL.md`;
1561
- writeIfChanged(filePath, content, relPath, created, updated, skipped);
1592
+ writeWithMergeDetection(filePath, content, relPath, state, created, updated, skipped, conflicts);
1562
1593
  }
1563
1594
  // 3. 更新 opencode.jsonc
1564
1595
  const jsoncPath = resolve(projectPath, 'opencode.jsonc');
1565
1596
  const newContent = buildUpdatedJsonc(projectPath);
1566
1597
  const relJsoncPath = 'opencode.jsonc';
1567
- writeIfChanged(jsoncPath, newContent, relJsoncPath, created, updated, skipped);
1598
+ writeWithMergeDetection(jsoncPath, newContent, relJsoncPath, state, created, updated, skipped, conflicts);
1568
1599
  // 重启提醒(仅在 opencode agent 配置更新时,且为交互模式)
1569
1600
  if (updated.some(f => f.startsWith('.opencode/agents/')) && process.stdout.isTTY) {
1570
1601
  const lang = getCliLang(projectPath);
@@ -1572,6 +1603,99 @@ export function updateProject(projectPath, selectedTools = ["opencode"], lang =
1572
1603
  ? 'opencode agent configuration updated. Please restart opencode to load the new configuration.'
1573
1604
  : 'opencode agent 配置已更新,请重启 opencode 以加载新配置。');
1574
1605
  }
1575
- return { created, updated, skipped };
1606
+ // ── 写入冲突标记文件 ──
1607
+ if (conflicts.length > 0) {
1608
+ const openfeelVersion = getOpenfeelVersion();
1609
+ for (const relPath of conflicts) {
1610
+ const absPath = resolve(projectPath, relPath);
1611
+ const currentContent = existsSync(absPath)
1612
+ ? readFileSync(absPath, 'utf-8')
1613
+ : '';
1614
+ // 获取 incoming 内容:从模板/构建产物中重新读取
1615
+ // 注意:由于 writeWithMergeDetection 未实际写入,需单独获取 incoming 内容
1616
+ const incomingContent = getIncomingContent(projectPath, relPath, lang);
1617
+ writeConflictFile(projectPath, relPath, currentContent, incomingContent, openfeelVersion);
1618
+ }
1619
+ }
1620
+ // ── REV-001:统一更新 update_state.json ──
1621
+ // 规则:
1622
+ // 1. 无论有无冲突,所有 created/updated 文件的 hash 都必须更新到 state
1623
+ // 2. 有冲突时,额外标记冲突文件
1624
+ // 3. 首次 update(state === null)→ 创建新 state
1625
+ const newState = state ?? createUpdateState(projectPath, {});
1626
+ // 更新所有非冲突文件的 hash(created 和 updated)
1627
+ for (const relPath of [...created, ...updated]) {
1628
+ const absPath = resolve(projectPath, relPath);
1629
+ if (existsSync(absPath)) {
1630
+ const content = readFileSync(absPath, 'utf-8');
1631
+ updateFileHash(newState, relPath, content);
1632
+ }
1633
+ }
1634
+ // 标记冲突文件
1635
+ for (const relPath of conflicts) {
1636
+ markFileConflict(newState, relPath);
1637
+ }
1638
+ // 更新时间戳
1639
+ newState.last_update = new Date().toISOString();
1640
+ // 持久化
1641
+ saveUpdateState(projectPath, newState);
1642
+ return { created, updated, skipped, conflicts };
1643
+ }
1644
+ /**
1645
+ * 写入冲突标记文件到 .openfeel/update_conflicts/{relativePath}
1646
+ * 格式:Git 风格冲突标记
1647
+ *
1648
+ * REV-006:update_conflicts/ 目录已加入 .gitignore,不纳入版本管理。
1649
+ */
1650
+ function writeConflictFile(projectPath, relativePath, currentContent, incomingContent, openfeelVersion) {
1651
+ const conflictsBase = resolve(projectPath, '.openfeel', 'update_conflicts');
1652
+ mkdirSync(conflictsBase, { recursive: true });
1653
+ const conflictPath = resolve(conflictsBase, relativePath);
1654
+ mkdirSync(dirname(conflictPath), { recursive: true });
1655
+ const conflictContent = [
1656
+ `<<<<<<< CURRENT (用户修改版)`,
1657
+ currentContent,
1658
+ `=======`,
1659
+ incomingContent,
1660
+ `>>>>>>> INCOMING (openfeel v${openfeelVersion} 更新)`,
1661
+ ].join('\n');
1662
+ writeFileSync(conflictPath, conflictContent, 'utf-8');
1663
+ }
1664
+ /**
1665
+ * 根据相对路径获取 incoming(openfeel 期望写入)内容
1666
+ * 与 updateProject() 中生成内容的逻辑一一对应:
1667
+ * - .opencode/instructions/core.md → loadTemplate(lang, 'core-instructions')
1668
+ * - .opencode/agents/{name}.md → loadAgentTemplate(lang, name)
1669
+ * - .opencode/skills/{name}/SKILL.md → SKILL_DEFINITIONS[name]
1670
+ * - opencode.jsonc → buildUpdatedJsonc(projectPath)
1671
+ * - AGENTS.md → loadTemplate(lang, 'agents-md')
1672
+ */
1673
+ function getIncomingContent(projectPath, relativePath, lang) {
1674
+ // instructions/core.md
1675
+ if (relativePath === '.opencode/instructions/core.md') {
1676
+ return loadTemplate(lang, 'core-instructions');
1677
+ }
1678
+ // Agent 定义文件
1679
+ const agentMatch = relativePath.match(/^\.opencode\/agents\/(.+)\.md$/);
1680
+ if (agentMatch) {
1681
+ const name = agentMatch[1];
1682
+ return loadAgentTemplate(lang, name);
1683
+ }
1684
+ // Skill 定义文件
1685
+ const skillMatch = relativePath.match(/^\.opencode\/skills\/(.+)\/SKILL\.md$/);
1686
+ if (skillMatch) {
1687
+ const name = skillMatch[1];
1688
+ return SKILL_DEFINITIONS[name] ?? '';
1689
+ }
1690
+ // opencode.jsonc
1691
+ if (relativePath === 'opencode.jsonc') {
1692
+ return buildUpdatedJsonc(projectPath);
1693
+ }
1694
+ // AGENTS.md
1695
+ if (relativePath === 'AGENTS.md') {
1696
+ return loadTemplate(lang, 'agents-md');
1697
+ }
1698
+ // 未知路径 → 空内容(不应发生)
1699
+ return '';
1576
1700
  }
1577
1701
  //# sourceMappingURL=update.js.map