speccore 4.6.1 → 4.8.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.
Files changed (43) hide show
  1. package/dist/cli.js +31 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/backup.d.ts +18 -0
  4. package/dist/commands/backup.d.ts.map +1 -0
  5. package/dist/commands/backup.js +102 -0
  6. package/dist/commands/backup.js.map +1 -0
  7. package/dist/commands/completion.d.ts +7 -0
  8. package/dist/commands/completion.d.ts.map +1 -0
  9. package/dist/commands/completion.js +94 -0
  10. package/dist/commands/completion.js.map +1 -0
  11. package/dist/commands/current.d.ts +9 -0
  12. package/dist/commands/current.d.ts.map +1 -0
  13. package/dist/commands/current.js +33 -0
  14. package/dist/commands/current.js.map +1 -0
  15. package/dist/commands/execute.d.ts +2 -0
  16. package/dist/commands/execute.d.ts.map +1 -1
  17. package/dist/commands/execute.js +215 -66
  18. package/dist/commands/execute.js.map +1 -1
  19. package/dist/commands/hooks.d.ts +5 -0
  20. package/dist/commands/hooks.d.ts.map +1 -0
  21. package/dist/commands/hooks.js +22 -0
  22. package/dist/commands/hooks.js.map +1 -0
  23. package/dist/core/error-feedback.d.ts +30 -0
  24. package/dist/core/error-feedback.d.ts.map +1 -0
  25. package/dist/core/error-feedback.js +87 -0
  26. package/dist/core/error-feedback.js.map +1 -0
  27. package/dist/core/execution-state.d.ts +58 -0
  28. package/dist/core/execution-state.d.ts.map +1 -0
  29. package/dist/core/execution-state.js +142 -0
  30. package/dist/core/execution-state.js.map +1 -0
  31. package/dist/core/git-integration.d.ts +36 -0
  32. package/dist/core/git-integration.d.ts.map +1 -0
  33. package/dist/core/git-integration.js +139 -0
  34. package/dist/core/git-integration.js.map +1 -0
  35. package/dist/core/operation-log.d.ts +15 -0
  36. package/dist/core/operation-log.d.ts.map +1 -0
  37. package/dist/core/operation-log.js +88 -0
  38. package/dist/core/operation-log.js.map +1 -0
  39. package/dist/core/task-lock.d.ts +30 -0
  40. package/dist/core/task-lock.d.ts.map +1 -0
  41. package/dist/core/task-lock.js +94 -0
  42. package/dist/core/task-lock.js.map +1 -0
  43. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * Execution State — 执行状态追踪
4
+ *
5
+ * 管理分批执行的状态:批次划分、断点续传、进度记录
6
+ * 状态文件:.speccore/local/execution-state.json
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.initExecutionState = initExecutionState;
10
+ exports.loadExecutionState = loadExecutionState;
11
+ exports.saveExecutionState = saveExecutionState;
12
+ exports.completeBatch = completeBatch;
13
+ exports.failTask = failTask;
14
+ exports.clearExecutionState = clearExecutionState;
15
+ exports.getCurrentBatchTasks = getCurrentBatchTasks;
16
+ exports.canResume = canResume;
17
+ const fs_extra_1 = require("fs-extra");
18
+ const STATE_PATH = '.speccore/local/execution-state.json';
19
+ /**
20
+ * 初始化执行状态
21
+ */
22
+ function initExecutionState(tasks, iteration, batchSize = 3) {
23
+ const batches = chunkArray(tasks, batchSize);
24
+ const batchStatus = {};
25
+ batches.forEach((batch, i) => {
26
+ batchStatus[String(i + 1)] = {
27
+ status: i === 0 ? 'in_progress' : 'pending',
28
+ tasks: batch,
29
+ };
30
+ });
31
+ const state = {
32
+ iteration,
33
+ totalBatches: batches.length,
34
+ currentBatch: 1,
35
+ batchSize,
36
+ totalTasks: tasks.length,
37
+ completedTasks: [],
38
+ failedTasks: [],
39
+ pendingTasks: tasks.slice(),
40
+ batchStatus,
41
+ startedAt: new Date().toISOString(),
42
+ updatedAt: new Date().toISOString(),
43
+ };
44
+ saveExecutionState(state);
45
+ return state;
46
+ }
47
+ /**
48
+ * 加载执行状态
49
+ */
50
+ function loadExecutionState() {
51
+ try {
52
+ if (!(0, fs_extra_1.existsSync)(STATE_PATH))
53
+ return null;
54
+ const raw = (0, fs_extra_1.readFileSync)(STATE_PATH, 'utf-8');
55
+ return JSON.parse(raw);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * 保存执行状态
63
+ */
64
+ function saveExecutionState(state) {
65
+ state.updatedAt = new Date().toISOString();
66
+ (0, fs_extra_1.ensureFileSync)(STATE_PATH);
67
+ (0, fs_extra_1.writeFileSync)(STATE_PATH, JSON.stringify(state, null, 2));
68
+ }
69
+ /**
70
+ * 标记批次完成
71
+ */
72
+ function completeBatch(state, batchNum, completedTasks) {
73
+ const batch = state.batchStatus[String(batchNum)];
74
+ if (batch) {
75
+ batch.status = 'completed';
76
+ batch.completedAt = new Date().toISOString();
77
+ }
78
+ state.completedTasks.push(...completedTasks);
79
+ state.pendingTasks = state.pendingTasks.filter((t) => !completedTasks.includes(t));
80
+ // 移动到下一个批次
81
+ const nextBatch = batchNum + 1;
82
+ if (state.batchStatus[String(nextBatch)]) {
83
+ state.currentBatch = nextBatch;
84
+ state.batchStatus[String(nextBatch)].status = 'in_progress';
85
+ state.batchStatus[String(nextBatch)].startedAt = new Date().toISOString();
86
+ }
87
+ saveExecutionState(state);
88
+ return state;
89
+ }
90
+ /**
91
+ * 标记任务失败
92
+ */
93
+ function failTask(state, taskId) {
94
+ if (!state.failedTasks.includes(taskId)) {
95
+ state.failedTasks.push(taskId);
96
+ }
97
+ state.pendingTasks = state.pendingTasks.filter((t) => t !== taskId);
98
+ saveExecutionState(state);
99
+ return state;
100
+ }
101
+ /**
102
+ * 清除执行状态(完成或取消后)
103
+ */
104
+ function clearExecutionState() {
105
+ try {
106
+ if ((0, fs_extra_1.existsSync)(STATE_PATH)) {
107
+ const { unlinkSync } = require('fs');
108
+ unlinkSync(STATE_PATH);
109
+ }
110
+ }
111
+ catch { }
112
+ }
113
+ /**
114
+ * 获取当前批次的任务列表
115
+ */
116
+ function getCurrentBatchTasks(state) {
117
+ const batch = state.batchStatus[String(state.currentBatch)];
118
+ return batch?.tasks || [];
119
+ }
120
+ /**
121
+ * 检查是否有断点可恢复
122
+ */
123
+ function canResume() {
124
+ const state = loadExecutionState();
125
+ if (!state)
126
+ return false;
127
+ // 检查是否有未完成的批次
128
+ for (const [key, batch] of Object.entries(state.batchStatus)) {
129
+ if (batch.status === 'pending' || batch.status === 'in_progress') {
130
+ return true;
131
+ }
132
+ }
133
+ return false;
134
+ }
135
+ function chunkArray(arr, size) {
136
+ const chunks = [];
137
+ for (let i = 0; i < arr.length; i += size) {
138
+ chunks.push(arr.slice(i, i + size));
139
+ }
140
+ return chunks;
141
+ }
142
+ //# sourceMappingURL=execution-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-state.js","sourceRoot":"","sources":["../../src/core/execution-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Git Integration — 任务与 Git 工作流深度整合
3
+ *
4
+ * 功能:
5
+ * - 任务 ↔ 分支关联
6
+ * - Commit 消息自动生成
7
+ * - PR 描述自动生成
8
+ * - Git Hook 安装
9
+ */
10
+ /**
11
+ * 为任务创建 Git 分支
12
+ */
13
+ export declare function createTaskBranch(taskId: string, taskName: string): string | null;
14
+ /**
15
+ * 获取当前分支关联的任务
16
+ */
17
+ export declare function getCurrentTaskMapping(): {
18
+ taskId: string;
19
+ taskName: string;
20
+ } | null;
21
+ /**
22
+ * 生成 Commit 消息
23
+ */
24
+ export declare function generateCommitMessage(taskId: string, taskName: string, specs?: string[]): string;
25
+ /**
26
+ * 生成 PR 描述
27
+ */
28
+ export declare function generatePRDescription(taskId: string, taskName: string): string;
29
+ /**
30
+ * 安装 Git Hooks
31
+ */
32
+ export declare function installGitHooks(): {
33
+ preCommit: boolean;
34
+ prePush: boolean;
35
+ };
36
+ //# sourceMappingURL=git-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-integration.d.ts","sourceRoot":"","sources":["../../src/core/git-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAchG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB9E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyB1E"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Git Integration — 任务与 Git 工作流深度整合
4
+ *
5
+ * 功能:
6
+ * - 任务 ↔ 分支关联
7
+ * - Commit 消息自动生成
8
+ * - PR 描述自动生成
9
+ * - Git Hook 安装
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createTaskBranch = createTaskBranch;
13
+ exports.getCurrentTaskMapping = getCurrentTaskMapping;
14
+ exports.generateCommitMessage = generateCommitMessage;
15
+ exports.generatePRDescription = generatePRDescription;
16
+ exports.installGitHooks = installGitHooks;
17
+ const fs_extra_1 = require("fs-extra");
18
+ const path_1 = require("path");
19
+ const child_process_1 = require("child_process");
20
+ const GIT_MAPPING_PATH = '.speccore/.git-mapping.json';
21
+ /**
22
+ * 为任务创建 Git 分支
23
+ */
24
+ function createTaskBranch(taskId, taskName) {
25
+ try {
26
+ const safeName = taskName.replace(/[^\w\u4e00-\u9fa5-]/g, '-').replace(/-+/g, '-');
27
+ const branchName = `feature/${taskId}-${safeName}`.substring(0, 100);
28
+ (0, child_process_1.execSync)(`git checkout -b "${branchName}"`, { stdio: 'pipe' });
29
+ // 记录关联
30
+ const mapping = loadMapping();
31
+ mapping[branchName] = { taskId, taskName: taskName, createdAt: new Date().toISOString() };
32
+ saveMapping(mapping);
33
+ return branchName;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * 获取当前分支关联的任务
41
+ */
42
+ function getCurrentTaskMapping() {
43
+ try {
44
+ const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' }).trim();
45
+ const mapping = loadMapping();
46
+ return mapping[branch] || null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /**
53
+ * 生成 Commit 消息
54
+ */
55
+ function generateCommitMessage(taskId, taskName, specs) {
56
+ const lines = [`feat(${taskId}): ${taskName}`, ''];
57
+ const changed = getChangedFiles();
58
+ if (changed.length > 0) {
59
+ lines.push('变更文件:');
60
+ for (const f of changed.slice(0, 10)) {
61
+ lines.push(` - ${f}`);
62
+ }
63
+ lines.push('');
64
+ }
65
+ lines.push(`关联 Spec: ${taskId}`);
66
+ return lines.join('\n');
67
+ }
68
+ /**
69
+ * 生成 PR 描述
70
+ */
71
+ function generatePRDescription(taskId, taskName) {
72
+ const taskDir = (0, path_1.join)(process.cwd(), `.speccore`);
73
+ const lines = [
74
+ `## 关联任务`,
75
+ `- ${taskId} ${taskName}`,
76
+ '',
77
+ '## 变更内容',
78
+ ...getChangedFiles().map((f) => `- [ ] ${f}`),
79
+ '',
80
+ '## 验收标准',
81
+ '- [ ] AC-01: 功能正常',
82
+ '- [ ] AC-02: 边界处理',
83
+ '',
84
+ '## 测试',
85
+ '- 通过 `speccore validate` 校验',
86
+ '',
87
+ `关联 Spec: ${taskId}`,
88
+ ];
89
+ return lines.join('\n');
90
+ }
91
+ /**
92
+ * 安装 Git Hooks
93
+ */
94
+ function installGitHooks() {
95
+ const gitDir = (0, path_1.join)(process.cwd(), '.git');
96
+ if (!(0, fs_extra_1.existsSync)(gitDir)) {
97
+ throw new Error('Not a Git repository');
98
+ }
99
+ const hooksDir = (0, path_1.join)(gitDir, 'hooks');
100
+ // pre-commit: check spec annotations
101
+ const preCommitContent = `#!/bin/sh
102
+ # SpecCore pre-commit hook
103
+ echo "🔍 SpecCore: Checking @spec annotations..."
104
+ git diff --cached --name-only | grep -q "@spec" && echo "✅ Spec annotations found" || true
105
+ `;
106
+ (0, fs_extra_1.writeFileSync)((0, path_1.join)(hooksDir, 'pre-commit'), preCommitContent, { mode: 0o755 });
107
+ // pre-push: run validate
108
+ const prePushContent = `#!/bin/sh
109
+ # SpecCore pre-push hook
110
+ echo "🔍 SpecCore: Validating specs..."
111
+ speccore validate --warn-only
112
+ `;
113
+ (0, fs_extra_1.writeFileSync)((0, path_1.join)(hooksDir, 'pre-push'), prePushContent, { mode: 0o755 });
114
+ return { preCommit: true, prePush: true };
115
+ }
116
+ // === Helpers ===
117
+ function loadMapping() {
118
+ try {
119
+ if ((0, fs_extra_1.existsSync)(GIT_MAPPING_PATH)) {
120
+ return JSON.parse((0, fs_extra_1.readFileSync)(GIT_MAPPING_PATH, 'utf-8'));
121
+ }
122
+ }
123
+ catch { }
124
+ return {};
125
+ }
126
+ function saveMapping(mapping) {
127
+ (0, fs_extra_1.ensureFileSync)(GIT_MAPPING_PATH);
128
+ (0, fs_extra_1.writeFileSync)(GIT_MAPPING_PATH, JSON.stringify(mapping, null, 2));
129
+ }
130
+ function getChangedFiles() {
131
+ try {
132
+ const output = (0, child_process_1.execSync)('git diff --name-only HEAD', { encoding: 'utf-8', stdio: 'pipe' });
133
+ return output.trim().split('\n').filter(Boolean);
134
+ }
135
+ catch {
136
+ return [];
137
+ }
138
+ }
139
+ //# sourceMappingURL=git-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-integration.js","sourceRoot":"","sources":["../../src/core/git-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Operation Log — 操作日志记录
3
+ *
4
+ * 记录所有关键操作到 .speccore/logs/YYYY-MM-DD.log
5
+ * 格式: [时间] 用户 命令 参数
6
+ */
7
+ /**
8
+ * 记录操作日志
9
+ */
10
+ export declare function logOperation(command: string, detail?: string): void;
11
+ /**
12
+ * 记录命令执行(不带详情)
13
+ */
14
+ export declare function logCommand(command: string[]): void;
15
+ //# sourceMappingURL=operation-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-log.d.ts","sourceRoot":"","sources":["../../src/core/operation-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAanE;AAkBD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAElD"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Operation Log — 操作日志记录
4
+ *
5
+ * 记录所有关键操作到 .speccore/logs/YYYY-MM-DD.log
6
+ * 格式: [时间] 用户 命令 参数
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.logOperation = logOperation;
43
+ exports.logCommand = logCommand;
44
+ const fs_extra_1 = require("fs-extra");
45
+ const path_1 = require("path");
46
+ const os = __importStar(require("os"));
47
+ const getLogDir = () => (0, path_1.join)(process.cwd(), '.speccore', 'logs');
48
+ /**
49
+ * 记录操作日志
50
+ */
51
+ function logOperation(command, detail) {
52
+ const now = new Date().toISOString().replace('T', ' ').substring(0, 19);
53
+ const user = getUserName();
54
+ const logDir = getLogDir();
55
+ const logFile = (0, path_1.join)(logDir, `${now.substring(0, 10)}.log`);
56
+ try {
57
+ (0, fs_extra_1.ensureFileSync)(logFile);
58
+ const line = `[${now}] ${user} ${command}${detail ? ` | ${detail}` : ''}`;
59
+ (0, fs_extra_1.appendFileSync)(logFile, line + '\n');
60
+ }
61
+ catch {
62
+ // 日志写入失败不影响主流程
63
+ }
64
+ }
65
+ /**
66
+ * 获取用户名(git config 优先)
67
+ */
68
+ function getUserName() {
69
+ try {
70
+ const { execSync } = require('child_process');
71
+ return execSync('git config user.name', { encoding: 'utf-8' }).trim() || 'unknown';
72
+ }
73
+ catch {
74
+ try {
75
+ return os.userInfo().username || 'unknown';
76
+ }
77
+ catch {
78
+ return 'unknown';
79
+ }
80
+ }
81
+ }
82
+ /**
83
+ * 记录命令执行(不带详情)
84
+ */
85
+ function logCommand(command) {
86
+ logOperation(command.join(' '));
87
+ }
88
+ //# sourceMappingURL=operation-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-log.js","sourceRoot":"","sources":["../../src/core/operation-log.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWH,oCAaC;AAqBD,gCAEC;AA7CD,uCAA0D;AAC1D,+BAA4B;AAC5B,uCAAyB;AAEzB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAEjE;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,MAAe;IAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,IAAA,yBAAc,EAAC,OAAO,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1E,IAAA,yBAAc,EAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9C,OAAO,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAiB;IAC1C,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Task Lock — 远程协作锁机制
3
+ *
4
+ * 防止多人同时修改同一个 Task
5
+ * 锁文件:.speccore/.locks/{taskId}.lock
6
+ */
7
+ interface LockData {
8
+ taskId: string;
9
+ holder: string;
10
+ operation: string;
11
+ acquiredAt: string;
12
+ expiresAt: string;
13
+ }
14
+ /**
15
+ * 获取锁(如果可用)
16
+ */
17
+ export declare function acquireLock(taskId: string, operation: string): {
18
+ holder: string;
19
+ acquiredAt: string;
20
+ } | null;
21
+ /**
22
+ * 释放锁
23
+ */
24
+ export declare function releaseLock(taskId: string): void;
25
+ /**
26
+ * 检查锁状态
27
+ */
28
+ export declare function checkLock(taskId: string): LockData | null;
29
+ export {};
30
+ //# sourceMappingURL=task-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lock.d.ts","sourceRoot":"","sources":["../../src/core/task-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAkBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA+B5G;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAczD"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Task Lock — 远程协作锁机制
4
+ *
5
+ * 防止多人同时修改同一个 Task
6
+ * 锁文件:.speccore/.locks/{taskId}.lock
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.acquireLock = acquireLock;
10
+ exports.releaseLock = releaseLock;
11
+ exports.checkLock = checkLock;
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const LOCKS_DIR = '.speccore/.locks';
15
+ const LOCK_TIMEOUT_MINUTES = 30;
16
+ function getLockPath(taskId) {
17
+ return (0, path_1.join)(LOCKS_DIR, `${taskId}.lock`);
18
+ }
19
+ function getUser() {
20
+ try {
21
+ const { execSync } = require('child_process');
22
+ return execSync('git config user.name', { encoding: 'utf-8', stdio: 'pipe' }).trim() || 'unknown';
23
+ }
24
+ catch {
25
+ return 'unknown';
26
+ }
27
+ }
28
+ /**
29
+ * 获取锁(如果可用)
30
+ */
31
+ function acquireLock(taskId, operation) {
32
+ ensureLocksDir();
33
+ const lockPath = getLockPath(taskId);
34
+ // 检查已有锁
35
+ if ((0, fs_1.existsSync)(lockPath)) {
36
+ try {
37
+ const existing = JSON.parse((0, fs_1.readFileSync)(lockPath, 'utf-8'));
38
+ const expired = Date.now() > new Date(existing.expiresAt).getTime();
39
+ if (!expired) {
40
+ return { holder: existing.holder, acquiredAt: existing.acquiredAt };
41
+ }
42
+ // 过期锁,删除
43
+ (0, fs_1.unlinkSync)(lockPath);
44
+ }
45
+ catch {
46
+ (0, fs_1.unlinkSync)(lockPath);
47
+ }
48
+ }
49
+ // 创建新锁
50
+ const user = getUser();
51
+ const data = {
52
+ taskId,
53
+ holder: user,
54
+ operation,
55
+ acquiredAt: new Date().toISOString(),
56
+ expiresAt: new Date(Date.now() + LOCK_TIMEOUT_MINUTES * 60 * 1000).toISOString(),
57
+ };
58
+ (0, fs_1.writeFileSync)(lockPath, JSON.stringify(data, null, 2));
59
+ return null; // 锁获取成功,返回 null 表示无冲突
60
+ }
61
+ /**
62
+ * 释放锁
63
+ */
64
+ function releaseLock(taskId) {
65
+ const lockPath = getLockPath(taskId);
66
+ if ((0, fs_1.existsSync)(lockPath)) {
67
+ (0, fs_1.unlinkSync)(lockPath);
68
+ }
69
+ }
70
+ /**
71
+ * 检查锁状态
72
+ */
73
+ function checkLock(taskId) {
74
+ const lockPath = getLockPath(taskId);
75
+ if (!(0, fs_1.existsSync)(lockPath))
76
+ return null;
77
+ try {
78
+ const data = JSON.parse((0, fs_1.readFileSync)(lockPath, 'utf-8'));
79
+ if (Date.now() > new Date(data.expiresAt).getTime()) {
80
+ (0, fs_1.unlinkSync)(lockPath);
81
+ return null;
82
+ }
83
+ return data;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ function ensureLocksDir() {
90
+ if (!(0, fs_1.existsSync)(LOCKS_DIR)) {
91
+ (0, fs_1.mkdirSync)(LOCKS_DIR, { recursive: true });
92
+ }
93
+ }
94
+ //# sourceMappingURL=task-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lock.js","sourceRoot":"","sources":["../../src/core/task-lock.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speccore",
3
- "version": "4.6.1",
3
+ "version": "4.8.0",
4
4
  "description": "SpecCore - Code by Spec, Not by Vibe.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",