speccore 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/commands/change.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CzE"}
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../src/commands/change.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CzE"}
@@ -3,12 +3,46 @@
3
3
  * change - 需求变更联动命令
4
4
  * 修改任务需求时,自动更新关联 Spec 文件
5
5
  */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
6
39
  Object.defineProperty(exports, "__esModule", { value: true });
7
40
  exports.changeCommand = changeCommand;
8
41
  const logger_1 = require("../utils/logger");
9
42
  const context_1 = require("../core/context");
10
43
  const fs_extra_1 = require("fs-extra");
11
44
  const path_1 = require("path");
45
+ const transaction_1 = require("../core/transaction");
12
46
  async function changeCommand(options) {
13
47
  if (!options.task && !options.global) {
14
48
  logger_1.logger.error('请指定要变更的 Task 或使用 --global。用法: speccore change --task=<Task编号> --desc="<变更描述>"');
@@ -96,37 +130,61 @@ async function applyTaskChange(options, iteration) {
96
130
  logger_1.logger.error(`任务目录不存在: ${taskDir}`);
97
131
  return;
98
132
  }
99
- // 更新 REQ.md
133
+ const tx = new transaction_1.FileTransaction();
134
+ const now = new Date().toISOString().split('T')[0];
135
+ // 更新 REQ.md(事务保护)
100
136
  const reqPath = (0, path_1.join)(taskDir, 'backend', 'REQ.md');
101
137
  if (await (0, fs_extra_1.pathExists)(reqPath)) {
102
138
  let content = await (0, fs_extra_1.readFile)(reqPath, 'utf-8');
103
- const now = new Date().toISOString().split('T')[0];
104
139
  const changeNote = `\n## 变更记录\n\n| ${now} | v1.1 | ${options.desc} | SpecCore |\n`;
105
- content += changeNote;
106
- await (0, fs_extra_1.writeFile)(reqPath, content);
107
- logger_1.logger.info(`✅ 已更新: ${options.task}/backend/REQ.md`);
140
+ tx.write(reqPath, content + changeNote);
108
141
  }
109
- // 更新 TASK.md 变更履历
142
+ // 更新 TASK.md 变更履历(事务保护)
110
143
  const taskMdPath = (0, path_1.join)(taskDir, 'backend', 'TASK.md');
111
144
  if (await (0, fs_extra_1.pathExists)(taskMdPath)) {
112
145
  let content = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
113
- const now = new Date().toISOString().split('T')[0];
114
146
  const changeEntry = `| ${now} | v1.1 | 需求变更: ${options.desc} | SpecCore |\n`;
115
- // 在变更履历表格后插入
116
- content = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${changeEntry}`);
117
- await (0, fs_extra_1.writeFile)(taskMdPath, content);
118
- logger_1.logger.info(`✅ 已更新: ${options.task}/backend/TASK.md`);
147
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${changeEntry}`);
148
+ tx.write(taskMdPath, updated);
149
+ }
150
+ // 同步前端各平台 TASK.md(事务保护)
151
+ const frontendDir = (0, path_1.join)(taskDir, 'frontend');
152
+ if (await (0, fs_extra_1.pathExists)(frontendDir)) {
153
+ const { readdir: rd } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
154
+ const platformDirs = await rd(frontendDir, { withFileTypes: true });
155
+ for (const pd of platformDirs) {
156
+ if (pd.isDirectory()) {
157
+ const ftaskPath = (0, path_1.join)(frontendDir, pd.name, 'TASK.md');
158
+ if (await (0, fs_extra_1.pathExists)(ftaskPath)) {
159
+ let content = await (0, fs_extra_1.readFile)(ftaskPath, 'utf-8');
160
+ const changeEntry = `| ${now} | v1.1 | 需求变更: ${options.desc} | SpecCore |\n`;
161
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${changeEntry}`);
162
+ tx.write(ftaskPath, updated);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ // 提交事务 — 原子写入,失败回滚
168
+ if (tx.length > 0) {
169
+ await tx.commit();
170
+ logger_1.logger.info(`✅ 已更新 ${tx.length} 个文件(事务保护)`);
171
+ logger_1.logger.info(` ${options.task}/backend/REQ.md`);
172
+ logger_1.logger.info(` ${options.task}/backend/TASK.md`);
119
173
  }
120
174
  }
121
175
  async function applyGlobalChange(options) {
122
- // 更新 CONSTITUTION.md 的变更记录
176
+ const tx = new transaction_1.FileTransaction();
177
+ // 更新 CONSTITUTION.md 的变更记录(事务保护)
123
178
  const constPath = (0, path_1.join)(process.cwd(), '.speccore', 'CONSTITUTION.md');
124
179
  if (await (0, fs_extra_1.pathExists)(constPath)) {
125
180
  let content = await (0, fs_extra_1.readFile)(constPath, 'utf-8');
126
181
  const now = new Date().toISOString().split('T')[0];
127
182
  content += `\n## 变更记录\n\n| ${now} | ${options.desc} | SpecCore |\n`;
128
- await (0, fs_extra_1.writeFile)(constPath, content);
129
- logger_1.logger.info('✅ 已更新: .speccore/CONSTITUTION.md');
183
+ tx.write(constPath, content);
184
+ }
185
+ if (tx.length > 0) {
186
+ await tx.commit();
187
+ logger_1.logger.info('✅ 已更新: .speccore/CONSTITUTION.md(事务保护)');
130
188
  }
131
189
  }
132
190
  function findDependentTasks(graphContent, taskName) {
@@ -1 +1 @@
1
- {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/commands/change.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/commands/change.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBH,sCA0CC;AAzDD,4CAAkD;AAClD,6CAAsD;AACtD,uCAAoE;AACpE,+BAA4B;AAC5B,qDAAsD;AAW/C,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,eAAM,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAmB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,eAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QACnF,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAsB,EAAE,SAAiB;IACnE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,eAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,eAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtD,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC;IAC1C,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAErC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnE,eAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,eAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,eAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACzD,eAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,4BAA4B,CAAC,CAAC;QAC3D,eAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,0CAA0C,CAAC,CAAC;QAEzE,aAAa;QACb,IAAI,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;YAChF,IAAI,MAAM,IAAA,qBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChB,eAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,eAAM,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAsB,EAAE,SAAiB;IACtE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,6BAAe,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnD,IAAI,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,kBAAkB,GAAG,aAAa,OAAO,CAAC,IAAI,iBAAiB,CAAC;QACnF,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,MAAM,IAAA,qBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,KAAK,GAAG,mBAAmB,OAAO,CAAC,IAAI,iBAAiB,CAAC;QAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,sCAAsC,EACtC,OAAO,WAAW,EAAE,CACrB,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,IAAA,qBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACxD,IAAI,MAAM,IAAA,qBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM,WAAW,GAAG,KAAK,GAAG,mBAAmB,OAAO,CAAC,IAAI,iBAAiB,CAAC;oBAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,sCAAsC,EACtC,OAAO,WAAW,EAAE,CACrB,CAAC;oBACF,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QAClB,eAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,YAAY,CAAC,CAAC;QAC5C,eAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,iBAAiB,CAAC,CAAC;QACjD,eAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAsB;IACrD,MAAM,EAAE,GAAG,IAAI,6BAAe,EAAE,CAAC;IAEjC,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACtE,IAAI,MAAM,IAAA,qBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAChC,IAAI,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,IAAI,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,iBAAiB,CAAC;QACpE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QAClB,eAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAoB,EAAE,QAAgB;IAChE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,+BAA+B;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE"}
@@ -42,6 +42,7 @@ const logger_1 = require("../utils/logger");
42
42
  const context_1 = require("../core/context");
43
43
  const fs_extra_1 = require("fs-extra");
44
44
  const path_1 = require("path");
45
+ const transaction_1 = require("../core/transaction");
45
46
  async function syncCommand(options) {
46
47
  if (!options.task && !options.iteration) {
47
48
  logger_1.logger.error('请指定要同步的 Task 或期次。用法: speccore sync --task=<Task编号> [--auto]');
@@ -123,6 +124,7 @@ async function analyzeTaskDiff(task, iteration) {
123
124
  }
124
125
  async function syncTaskSpec(task, iteration, auto) {
125
126
  const taskDir = (0, path_1.join)(process.cwd(), iteration, task);
127
+ const tx = new transaction_1.FileTransaction();
126
128
  if (!await (0, fs_extra_1.pathExists)(taskDir)) {
127
129
  logger_1.logger.error(`任务目录不存在: ${taskDir}`);
128
130
  return;
@@ -134,20 +136,41 @@ async function syncTaskSpec(task, iteration, auto) {
134
136
  const now = new Date().toISOString().split('T')[0];
135
137
  if (!auto) {
136
138
  logger_1.logger.info(`当前 TASK.md 状态:`);
137
- // 提取变更履历的最后 3 条
138
139
  const historyMatch = content.match(/变更履历[\s\S]*?(?=\n##\s)/);
139
140
  if (historyMatch) {
140
141
  logger_1.logger.info(historyMatch[0].substring(0, 300));
141
142
  }
142
143
  }
143
- // 自动模式下添加上下文更新记录
144
+ // 自动模式下添加上下文更新记录(使用事务)
144
145
  if (auto) {
145
146
  const syncEntry = `| ${now} | auto | 自动反向同步: 更新 Spec 文件 | SpecCore |\n`;
146
- content = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${syncEntry}`);
147
- await (0, fs_extra_1.writeFile)(taskMdPath, content);
148
- logger_1.logger.info(`✅ 已同步: ${task}/backend/TASK.md`);
147
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${syncEntry}`);
148
+ tx.write(taskMdPath, updated);
149
149
  }
150
150
  }
151
+ // 同步前端各平台 TASK.md
152
+ const frontendDir = (0, path_1.join)(taskDir, 'frontend');
153
+ if (await (0, fs_extra_1.pathExists)(frontendDir)) {
154
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
155
+ const platformDirs = await readdir(frontendDir, { withFileTypes: true });
156
+ for (const pd of platformDirs) {
157
+ if (pd.isDirectory()) {
158
+ const ftaskPath = (0, path_1.join)(frontendDir, pd.name, 'TASK.md');
159
+ if (await (0, fs_extra_1.pathExists)(ftaskPath) && auto) {
160
+ let content = await (0, fs_extra_1.readFile)(ftaskPath, 'utf-8');
161
+ const now = new Date().toISOString().split('T')[0];
162
+ const syncEntry = `| ${now} | auto | 自动反向同步: 更新 Spec 文件 | SpecCore |\n`;
163
+ const updated = content.replace(/(\| :--- \| :--- \| :--- \| :--- \|)/, `$1\n${syncEntry}`);
164
+ tx.write(ftaskPath, updated);
165
+ }
166
+ }
167
+ }
168
+ }
169
+ // 提交事务 — 原子写入所有变更
170
+ if (tx.length > 0) {
171
+ await tx.commit();
172
+ logger_1.logger.info(`✅ 已同步: ${task}/ (${tx.length} 个文件,事务保护)`);
173
+ }
151
174
  }
152
175
  async function syncIterationSpec(iteration, auto) {
153
176
  const iterDir = (0, path_1.join)(process.cwd(), iteration);
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * FileTransaction — 文件操作事务
3
+ *
4
+ * 提供原子性的多文件操作:写入、删除、移动。
5
+ * 操作前自动备份原始内容,失败时回滚到备份。
6
+ *
7
+ * 使用方式:
8
+ * const tx = new FileTransaction();
9
+ * tx.write('path/to/file.md', 'new content')
10
+ * .write('path/to/other.md', 'updated')
11
+ * .delete('path/to/temp.md');
12
+ * await tx.commit();
13
+ */
14
+ /** 操作类型 */
15
+ type OpType = 'write' | 'delete' | 'move';
16
+ export declare class FileTransaction {
17
+ private operations;
18
+ private committed;
19
+ /**
20
+ * 写入文件。自动备份原内容。
21
+ */
22
+ write(path: string, content: string): this;
23
+ /**
24
+ * 删除文件。自动备份原内容以便回滚。
25
+ */
26
+ delete(path: string): this;
27
+ /**
28
+ * 移动/重命名文件。
29
+ */
30
+ move(srcPath: string, destPath: string): this;
31
+ /**
32
+ * 执行所有操作。任何一步失败则自动回滚。
33
+ */
34
+ commit(): Promise<void>;
35
+ /**
36
+ * 回滚已执行的操作。
37
+ */
38
+ private rollback;
39
+ /**
40
+ * 获取操作数量。
41
+ */
42
+ getOperations(): ReadonlyArray<{
43
+ type: OpType;
44
+ path: string;
45
+ }>;
46
+ /**
47
+ * 获取操作数量。
48
+ */
49
+ get length(): number;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,WAAW;AACX,KAAK,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAW1C,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO1C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO1B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAc7C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C7B;;OAEG;YACW,QAAQ;IA8BtB;;OAEG;IACH,aAAa,IAAI,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAI9D;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * FileTransaction — 文件操作事务
4
+ *
5
+ * 提供原子性的多文件操作:写入、删除、移动。
6
+ * 操作前自动备份原始内容,失败时回滚到备份。
7
+ *
8
+ * 使用方式:
9
+ * const tx = new FileTransaction();
10
+ * tx.write('path/to/file.md', 'new content')
11
+ * .write('path/to/other.md', 'updated')
12
+ * .delete('path/to/temp.md');
13
+ * await tx.commit();
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.FileTransaction = void 0;
17
+ const fs_1 = require("fs");
18
+ const path_1 = require("path");
19
+ const fs_extra_1 = require("fs-extra");
20
+ class FileTransaction {
21
+ constructor() {
22
+ this.operations = [];
23
+ this.committed = false;
24
+ }
25
+ /**
26
+ * 写入文件。自动备份原内容。
27
+ */
28
+ write(path, content) {
29
+ const hasBackup = (0, fs_1.existsSync)(path);
30
+ const backup = hasBackup ? (0, fs_1.readFileSync)(path, 'utf-8') : null;
31
+ this.operations.push({ type: 'write', path, content, backup });
32
+ return this;
33
+ }
34
+ /**
35
+ * 删除文件。自动备份原内容以便回滚。
36
+ */
37
+ delete(path) {
38
+ const hasBackup = (0, fs_1.existsSync)(path);
39
+ const backup = hasBackup ? (0, fs_1.readFileSync)(path, 'utf-8') : null;
40
+ this.operations.push({ type: 'delete', path, backup });
41
+ return this;
42
+ }
43
+ /**
44
+ * 移动/重命名文件。
45
+ */
46
+ move(srcPath, destPath) {
47
+ const hasBackup = (0, fs_1.existsSync)(destPath);
48
+ const backup = hasBackup ? (0, fs_1.readFileSync)(destPath, 'utf-8') : null;
49
+ const srcBackup = (0, fs_1.existsSync)(srcPath) ? (0, fs_1.readFileSync)(srcPath, 'utf-8') : null;
50
+ this.operations.push({
51
+ type: 'move',
52
+ path: srcPath,
53
+ destPath,
54
+ backup: backup || null,
55
+ content: srcBackup || undefined,
56
+ });
57
+ return this;
58
+ }
59
+ /**
60
+ * 执行所有操作。任何一步失败则自动回滚。
61
+ */
62
+ async commit() {
63
+ if (this.committed) {
64
+ throw new Error('Transaction already committed');
65
+ }
66
+ const executed = [];
67
+ try {
68
+ for (const op of this.operations) {
69
+ // 确保父目录存在
70
+ const parentDir = (0, path_1.dirname)(op.path);
71
+ (0, fs_extra_1.mkdirpSync)(parentDir);
72
+ if (op.destPath) {
73
+ (0, fs_extra_1.mkdirpSync)((0, path_1.dirname)(op.destPath));
74
+ }
75
+ switch (op.type) {
76
+ case 'write':
77
+ (0, fs_1.writeFileSync)(op.path, op.content, 'utf-8');
78
+ break;
79
+ case 'delete':
80
+ if ((0, fs_1.existsSync)(op.path)) {
81
+ (0, fs_1.unlinkSync)(op.path);
82
+ }
83
+ break;
84
+ case 'move':
85
+ if ((0, fs_1.existsSync)(op.path)) {
86
+ (0, fs_1.renameSync)(op.path, op.destPath);
87
+ }
88
+ break;
89
+ }
90
+ executed.push(op);
91
+ }
92
+ this.committed = true;
93
+ }
94
+ catch (error) {
95
+ // 回滚:逆序恢复所有已执行操作
96
+ await this.rollback(executed);
97
+ throw new Error(`Transaction failed: ${error instanceof Error ? error.message : String(error)}`);
98
+ }
99
+ }
100
+ /**
101
+ * 回滚已执行的操作。
102
+ */
103
+ async rollback(executed) {
104
+ for (const op of executed.reverse()) {
105
+ try {
106
+ switch (op.type) {
107
+ case 'write':
108
+ if (op.backup !== null && op.backup !== undefined) {
109
+ (0, fs_1.writeFileSync)(op.path, op.backup, 'utf-8');
110
+ }
111
+ else if ((0, fs_1.existsSync)(op.path)) {
112
+ (0, fs_1.unlinkSync)(op.path);
113
+ }
114
+ break;
115
+ case 'delete':
116
+ if (op.backup !== null && op.backup !== undefined) {
117
+ (0, fs_1.writeFileSync)(op.path, op.backup, 'utf-8');
118
+ }
119
+ break;
120
+ case 'move':
121
+ if ((0, fs_1.existsSync)(op.destPath)) {
122
+ (0, fs_1.renameSync)(op.destPath, op.path);
123
+ }
124
+ break;
125
+ }
126
+ }
127
+ catch {
128
+ // 回滚失败时记录但不抛出(避免掩盖原始错误)
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * 获取操作数量。
134
+ */
135
+ getOperations() {
136
+ return this.operations.map((op) => ({ type: op.type, path: op.path }));
137
+ }
138
+ /**
139
+ * 获取操作数量。
140
+ */
141
+ get length() {
142
+ return this.operations.length;
143
+ }
144
+ }
145
+ exports.FileTransaction = FileTransaction;
146
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speccore",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "SpecCore - Code by Spec, Not by Vibe.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",