speccore 8.3.175 → 8.3.177

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.
@@ -0,0 +1,45 @@
1
+ export interface FeatureMetadata {
2
+ feature: string;
3
+ platforms: string[];
4
+ dependencies: string[];
5
+ apis: Array<{
6
+ path: string;
7
+ method?: string;
8
+ description?: string;
9
+ }>;
10
+ summary: string;
11
+ sources: string[];
12
+ status: string;
13
+ }
14
+ export interface OverviewInput {
15
+ iteration: string;
16
+ features: FeatureMetadata[];
17
+ globalConstraints: {
18
+ techStack?: string;
19
+ apiFormat?: string;
20
+ errorCode?: string;
21
+ };
22
+ }
23
+ /**
24
+ * 扫描迭代目录下的所有功能单元元数据
25
+ */
26
+ export declare function scanFeatureMetadata(iteration: string): Promise<FeatureMetadata[]>;
27
+ /**
28
+ * 构建总览输入 JSON
29
+ * @param iteration 迭代目录名
30
+ * @param metadata 功能单元元数据列表
31
+ * @returns 总览输入结构
32
+ */
33
+ export declare function buildOverviewInput(iteration: string, metadata: FeatureMetadata[]): Promise<OverviewInput>;
34
+ /**
35
+ * 计算端覆盖统计
36
+ */
37
+ export declare function calculatePlatformCoverage(metadata: FeatureMetadata[]): Record<string, number>;
38
+ /**
39
+ * 计算功能单元间的交叉引用(被多个功能引用的接口)
40
+ */
41
+ export declare function findCrossFeatureApis(metadata: FeatureMetadata[]): Array<{
42
+ path: string;
43
+ usedBy: string[];
44
+ }>;
45
+ //# sourceMappingURL=feature-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-metadata.d.ts","sourceRoot":"","sources":["../../src/core/feature-metadata.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,iBAAiB,EAAE;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA6BvF;AA+FD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC,aAAa,CAAC,CAUxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EAAE,GAC1B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgB3C"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scanFeatureMetadata = scanFeatureMetadata;
7
+ exports.buildOverviewInput = buildOverviewInput;
8
+ exports.calculatePlatformCoverage = calculatePlatformCoverage;
9
+ exports.findCrossFeatureApis = findCrossFeatureApis;
10
+ /**
11
+ * feature-metadata — 功能单元元数据扫描器
12
+ *
13
+ * 扫描 features/ 目录下的所有功能单元,提取元数据用于总览生成。
14
+ * 核心原则:不读全文,只读 _matrix.md + README.md 前 2 句。
15
+ */
16
+ const fs_extra_1 = require("fs-extra");
17
+ const path_1 = require("path");
18
+ const js_yaml_1 = __importDefault(require("js-yaml"));
19
+ const logger_1 = require("../utils/logger");
20
+ /**
21
+ * 扫描迭代目录下的所有功能单元元数据
22
+ */
23
+ async function scanFeatureMetadata(iteration) {
24
+ const featuresDir = (0, path_1.join)(iteration, '010-requirements', 'features');
25
+ if (!(await (0, fs_extra_1.pathExists)(featuresDir))) {
26
+ return [];
27
+ }
28
+ const entries = await (0, fs_extra_1.readdir)(featuresDir, { withFileTypes: true });
29
+ const featureDirs = entries.filter(e => e.isDirectory()).map(e => e.name);
30
+ const metadata = [];
31
+ for (const dirName of featureDirs) {
32
+ const featureDir = (0, path_1.join)(featuresDir, dirName);
33
+ const matrix = await parseMatrixFile(featureDir);
34
+ const summary = await extractSummary(featureDir);
35
+ const sources = await listSources(featureDir);
36
+ const status = await readStatus(featureDir);
37
+ metadata.push({
38
+ feature: matrix.feature || dirName,
39
+ platforms: matrix.platforms || [],
40
+ dependencies: matrix.dependencies || [],
41
+ apis: matrix.apis || [],
42
+ summary,
43
+ sources,
44
+ status,
45
+ });
46
+ }
47
+ return metadata;
48
+ }
49
+ /**
50
+ * 解析功能单元的 _matrix.md 文件
51
+ */
52
+ async function parseMatrixFile(featureDir) {
53
+ const matrixPath = (0, path_1.join)(featureDir, '_matrix.md');
54
+ if (!(await (0, fs_extra_1.pathExists)(matrixPath))) {
55
+ return {};
56
+ }
57
+ try {
58
+ const content = await (0, fs_extra_1.readFile)(matrixPath, 'utf-8');
59
+ // 去掉 Markdown 标题行(# xxx),保留 YAML 内容
60
+ const yamlContent = content.replace(/^#.*\n+/, '');
61
+ const data = js_yaml_1.default.load(yamlContent);
62
+ return {
63
+ feature: data?.feature || '',
64
+ platforms: Array.isArray(data?.platforms) ? data.platforms : [],
65
+ dependencies: Array.isArray(data?.dependencies) ? data.dependencies : [],
66
+ apis: Array.isArray(data?.apis) ? data.apis : [],
67
+ };
68
+ }
69
+ catch (error) {
70
+ logger_1.logger.warn(`解析 _matrix.md 失败: ${featureDir}`);
71
+ return {};
72
+ }
73
+ }
74
+ /**
75
+ * 从 README.md 提取前 2 句话作为摘要
76
+ */
77
+ async function extractSummary(featureDir) {
78
+ const readmePath = (0, path_1.join)(featureDir, 'README.md');
79
+ if (!(await (0, fs_extra_1.pathExists)(readmePath))) {
80
+ return '';
81
+ }
82
+ try {
83
+ const content = await (0, fs_extra_1.readFile)(readmePath, 'utf-8');
84
+ const lines = content.split('\n');
85
+ // 跳过标题和元数据,取第一个正文段落的前 2 句
86
+ const contentLines = lines.filter(line => !line.startsWith('#') &&
87
+ !line.startsWith('>') &&
88
+ !line.startsWith('|') &&
89
+ line.trim() !== '');
90
+ const firstParagraph = contentLines[0] || '';
91
+ // 按中文句号、英文句号、感叹号、问号分割
92
+ const sentences = firstParagraph.split(/[。\.!??!]/).filter(s => s.trim());
93
+ return sentences.slice(0, 2).join('。') + (sentences.length > 0 ? '。' : '');
94
+ }
95
+ catch {
96
+ return '';
97
+ }
98
+ }
99
+ /**
100
+ * 列出功能单元的来源文档(从 .meta/source 读取)
101
+ */
102
+ async function listSources(featureDir) {
103
+ const sourcePath = (0, path_1.join)(featureDir, '.meta', 'source');
104
+ if (!(await (0, fs_extra_1.pathExists)(sourcePath))) {
105
+ return [];
106
+ }
107
+ try {
108
+ const content = await (0, fs_extra_1.readFile)(sourcePath, 'utf-8');
109
+ const data = js_yaml_1.default.load(content);
110
+ return data?.source_file ? [data.source_file] : [];
111
+ }
112
+ catch {
113
+ return [];
114
+ }
115
+ }
116
+ /**
117
+ * 读取功能单元状态
118
+ */
119
+ async function readStatus(featureDir) {
120
+ const sourcePath = (0, path_1.join)(featureDir, '.meta', 'source');
121
+ if (!(await (0, fs_extra_1.pathExists)(sourcePath))) {
122
+ return 'unknown';
123
+ }
124
+ try {
125
+ const content = await (0, fs_extra_1.readFile)(sourcePath, 'utf-8');
126
+ const data = js_yaml_1.default.load(content);
127
+ return data?.status || 'unknown';
128
+ }
129
+ catch {
130
+ return 'unknown';
131
+ }
132
+ }
133
+ /**
134
+ * 构建总览输入 JSON
135
+ * @param iteration 迭代目录名
136
+ * @param metadata 功能单元元数据列表
137
+ * @returns 总览输入结构
138
+ */
139
+ async function buildOverviewInput(iteration, metadata) {
140
+ return {
141
+ iteration,
142
+ features: metadata,
143
+ globalConstraints: {
144
+ techStack: '从 CONSTITUTION.md 读取',
145
+ apiFormat: '从 CONSTITUTION.md 读取',
146
+ errorCode: '从 CONSTITUTION.md 读取',
147
+ },
148
+ };
149
+ }
150
+ /**
151
+ * 计算端覆盖统计
152
+ */
153
+ function calculatePlatformCoverage(metadata) {
154
+ const coverage = {};
155
+ for (const m of metadata) {
156
+ for (const p of m.platforms) {
157
+ coverage[p] = (coverage[p] || 0) + 1;
158
+ }
159
+ }
160
+ return coverage;
161
+ }
162
+ /**
163
+ * 计算功能单元间的交叉引用(被多个功能引用的接口)
164
+ */
165
+ function findCrossFeatureApis(metadata) {
166
+ const usageMap = new Map();
167
+ for (const m of metadata) {
168
+ for (const api of m.apis) {
169
+ const path = api.path;
170
+ if (!usageMap.has(path)) {
171
+ usageMap.set(path, []);
172
+ }
173
+ usageMap.get(path).push(m.feature);
174
+ }
175
+ }
176
+ return Array.from(usageMap.entries())
177
+ .filter(([, usedBy]) => usedBy.length > 1)
178
+ .map(([path, usedBy]) => ({ path, usedBy }));
179
+ }
180
+ //# sourceMappingURL=feature-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-metadata.js","sourceRoot":"","sources":["../../src/core/feature-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type HandoffStage = 'analyze' | 'split' | 'plan' | 'execute' | 'review' | 'done';
2
+ /**
3
+ * 生成阶段传递摘要
4
+ */
5
+ export declare function generateHandoff(from: HandoffStage, to: HandoffStage, iteration: string): Promise<string>;
6
+ /**
7
+ * 读取 handoff 文件路径
8
+ */
9
+ export declare function getHandoffPath(from: HandoffStage, to: HandoffStage): string;
10
+ /**
11
+ * 检查 handoff 是否存在
12
+ */
13
+ export declare function handoffExists(from: HandoffStage, to: HandoffStage): Promise<boolean>;
14
+ //# sourceMappingURL=handoff-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-generator.d.ts","sourceRoot":"","sources":["../../src/core/handoff-generator.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAexF;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AA+LD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,MAAM,CAE3E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1F"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateHandoff = generateHandoff;
4
+ exports.getHandoffPath = getHandoffPath;
5
+ exports.handoffExists = handoffExists;
6
+ /**
7
+ * handoff-generator — 阶段传递摘要生成器
8
+ *
9
+ * 每个 Pipeline 阶段完成后,生成精简的传递摘要给下一阶段 AI 使用。
10
+ * 核心原则:完整版存文件,传递版只给下一阶段 AI 看。
11
+ */
12
+ const fs_extra_1 = require("fs-extra");
13
+ const path_1 = require("path");
14
+ const HANDOFF_LIMITS = {
15
+ 'analyze-split': { maxLines: 60, requiredSections: ['modules', 'dependencies', 'constraints'] },
16
+ 'split-plan': { maxLines: 60, requiredSections: ['tasks', 'dependencies', 'staffing'] },
17
+ 'plan-execute': { maxLines: 150, requiredSections: ['currentTask', 'upstreamContracts', 'globalConstraints'] },
18
+ 'execute-review': { maxLines: 80, requiredSections: ['deliverables', 'acceptanceCriteria'] },
19
+ 'review-done': { maxLines: 40, requiredSections: ['reviewResults', 'openIssues'] },
20
+ };
21
+ /**
22
+ * 生成阶段传递摘要
23
+ */
24
+ async function generateHandoff(from, to, iteration) {
25
+ const iterDir = `Iteration-${iteration.replace(/^Iteration-/, '')}`;
26
+ const handoffDir = (0, path_1.join)('.speccore', 'local', 'handoffs');
27
+ await (0, fs_extra_1.ensureDir)(handoffDir);
28
+ const handoffKey = `${from}-${to}`;
29
+ const config = HANDOFF_LIMITS[handoffKey];
30
+ if (!config) {
31
+ throw new Error(`未知阶段传递: ${from} → ${to}`);
32
+ }
33
+ const summary = await buildHandoffContent(from, to, iterDir, config);
34
+ const handoffPath = (0, path_1.join)(handoffDir, `handoff-${handoffKey}.md`);
35
+ await (0, fs_extra_1.writeFile)(handoffPath, summary);
36
+ return handoffPath;
37
+ }
38
+ /**
39
+ * 构建传递摘要内容
40
+ */
41
+ async function buildHandoffContent(from, to, iterDir, config) {
42
+ const lines = [];
43
+ // 头部信息
44
+ lines.push(`# 阶段传递:${from} → ${to}`);
45
+ lines.push('');
46
+ lines.push('## 1. 核心信息');
47
+ lines.push('');
48
+ lines.push(`| 项目 | 内容 |`);
49
+ lines.push(`| :--- | :--- |`);
50
+ lines.push(`| 迭代 | ${iterDir} |`);
51
+ lines.push(`| 阶段 | ${from} → ${to} |`);
52
+ lines.push(`| 时间 | ${new Date().toISOString().split('T')[0]} |`);
53
+ lines.push('');
54
+ // 根据阶段组合生成不同内容
55
+ switch (`${from}-${to}`) {
56
+ case 'analyze-split':
57
+ await appendAnalyzeToSplit(lines, iterDir);
58
+ break;
59
+ case 'split-plan':
60
+ await appendSplitToPlan(lines, iterDir);
61
+ break;
62
+ case 'plan-execute':
63
+ await appendPlanToExecute(lines, iterDir);
64
+ break;
65
+ case 'execute-review':
66
+ await appendExecuteToReview(lines, iterDir);
67
+ break;
68
+ case 'review-done':
69
+ await appendReviewToDone(lines, iterDir);
70
+ break;
71
+ }
72
+ // 文件引用
73
+ lines.push('');
74
+ lines.push('## 文件引用(需要时自行读取)');
75
+ lines.push('');
76
+ lines.push('| 文件 | 路径 | 用途 |');
77
+ lines.push('| :--- | :--- | :--- |');
78
+ lines.push(`| 完整需求 | ${iterDir}/010-requirements/converted/ | 查看需求细节 |`);
79
+ lines.push(`| 功能单元 | ${iterDir}/010-requirements/features/ | 按模块查看需求 |`);
80
+ lines.push(`| 全局规格 | ${iterDir}/020-specs/overview/ | 查看分析结果 |`);
81
+ lines.push('');
82
+ const result = lines.join('\n');
83
+ // 校验行数上限
84
+ const lineCount = result.split('\n').length;
85
+ if (lineCount > config.maxLines) {
86
+ // 截断到上限
87
+ const truncated = result.split('\n').slice(0, config.maxLines).join('\n');
88
+ return truncated + `\n\n> ⚠️ 摘要已截断(原 ${lineCount} 行 > 上限 ${config.maxLines} 行)\n`;
89
+ }
90
+ return result;
91
+ }
92
+ /**
93
+ * analyze → split: 功能模块清单 + 依赖关系 + 关键约束
94
+ */
95
+ async function appendAnalyzeToSplit(lines, iterDir) {
96
+ const featuresDir = (0, path_1.join)(iterDir, '010-requirements', 'features');
97
+ lines.push('## 2. 功能模块清单');
98
+ lines.push('');
99
+ lines.push('| 模块 | 涉及端 | 优先级 | 依赖 | 摘要 |');
100
+ lines.push('| :--- | :--- | :--- | :--- | :--- |');
101
+ if (await (0, fs_extra_1.pathExists)(featuresDir)) {
102
+ const entries = await (0, fs_extra_1.readdir)(featuresDir, { withFileTypes: true });
103
+ const units = entries.filter(e => e.isDirectory() && !e.name.startsWith('.'));
104
+ for (const unit of units.slice(0, 20)) { // 限制行数
105
+ const readmePath = (0, path_1.join)(featuresDir, unit.name, 'README.md');
106
+ let summary = '';
107
+ if (await (0, fs_extra_1.pathExists)(readmePath)) {
108
+ const content = await (0, fs_extra_1.readFile)(readmePath, 'utf-8');
109
+ const firstLine = content.split('\n')[0] || '';
110
+ summary = firstLine.replace(/^#\s*/, '').slice(0, 30);
111
+ }
112
+ lines.push(`| ${unit.name} | 待分析 | 中 | 无 | ${summary} |`);
113
+ }
114
+ }
115
+ else {
116
+ lines.push('| (未拆分) | 全部 | 中 | 无 | 见 converted/ |');
117
+ }
118
+ lines.push('');
119
+ lines.push('## 3. 依赖关系');
120
+ lines.push('');
121
+ lines.push('```mermaid');
122
+ lines.push('flowchart LR');
123
+ lines.push(' A[需求分析] --> B[任务拆分]');
124
+ lines.push('```');
125
+ lines.push('');
126
+ lines.push('## 4. 关键约束(≤5条)');
127
+ lines.push('');
128
+ lines.push('- 待 analyze 阶段补充');
129
+ lines.push('');
130
+ }
131
+ /**
132
+ * split → plan: 任务清单 + 人员配置 + 关键路径
133
+ */
134
+ async function appendSplitToPlan(lines, iterDir) {
135
+ const tasksDir = (0, path_1.join)(iterDir, '030-tasks');
136
+ lines.push('## 2. 任务清单');
137
+ lines.push('');
138
+ lines.push('| 任务 ID | 名称 | 依赖 | 工时 | 涉及端 |');
139
+ lines.push('| :--- | :--- | :--- | :--- | :--- |');
140
+ if (await (0, fs_extra_1.pathExists)(tasksDir)) {
141
+ const entries = await (0, fs_extra_1.readdir)(tasksDir, { withFileTypes: true });
142
+ const tasks = entries.filter(e => e.isDirectory() && e.name.startsWith('Task-'));
143
+ for (const task of tasks.slice(0, 30)) {
144
+ lines.push(`| ${task.name} | 待填写 | 无 | 待评估 | 待分析 |`);
145
+ }
146
+ }
147
+ else {
148
+ lines.push('| Task-001 | 示例任务 | 无 | 8h | 全部 |');
149
+ }
150
+ lines.push('');
151
+ lines.push('## 3. 关键路径');
152
+ lines.push('');
153
+ lines.push('- 待 plan 阶段计算');
154
+ lines.push('');
155
+ }
156
+ /**
157
+ * plan → execute: 当前任务 Spec + 上游依赖契约
158
+ */
159
+ async function appendPlanToExecute(lines, iterDir) {
160
+ lines.push('## 2. 当前任务规格');
161
+ lines.push('');
162
+ lines.push('- 执行时由 CLI 动态加载当前任务的 REQ.md + TECH.md');
163
+ lines.push('- 只加载当前任务,不加载其他任务');
164
+ lines.push('');
165
+ lines.push('## 3. 上游依赖契约');
166
+ lines.push('');
167
+ lines.push('- 由 CLI 自动读取上游任务的 `_shared/API_CONTRACT.yaml`');
168
+ lines.push('- 只传契约,不传实现');
169
+ lines.push('');
170
+ lines.push('## 4. 全局约束');
171
+ lines.push('');
172
+ lines.push('- 技术栈见 CONSTITUTION.md');
173
+ lines.push('- 命名规范见 PROJECT.yaml');
174
+ lines.push('');
175
+ }
176
+ /**
177
+ * execute → review: 产出物清单 + 验收标准
178
+ */
179
+ async function appendExecuteToReview(lines, iterDir) {
180
+ lines.push('## 2. 产出物清单');
181
+ lines.push('');
182
+ lines.push('- 代码文件(CONSTITUTION.md 指定的源码路径)');
183
+ lines.push('- 测试用例(TEST.md)');
184
+ lines.push('- API 契约(_shared/API_CONTRACT.yaml)');
185
+ lines.push('');
186
+ lines.push('## 3. 验收标准');
187
+ lines.push('');
188
+ lines.push('- 编译通过');
189
+ lines.push('- 测试通过');
190
+ lines.push('- 无占位符');
191
+ lines.push('');
192
+ }
193
+ /**
194
+ * review → done: 审查结果 + 未解决问题
195
+ */
196
+ async function appendReviewToDone(lines, iterDir) {
197
+ lines.push('## 2. 审查结果');
198
+ lines.push('');
199
+ lines.push('- 待 review 阶段填写');
200
+ lines.push('');
201
+ lines.push('## 3. 未解决问题');
202
+ lines.push('');
203
+ lines.push('- [ ] 待确认');
204
+ lines.push('');
205
+ }
206
+ /**
207
+ * 读取 handoff 文件路径
208
+ */
209
+ function getHandoffPath(from, to) {
210
+ return (0, path_1.join)('.speccore', 'local', 'handoffs', `handoff-${from}-${to}.md`);
211
+ }
212
+ /**
213
+ * 检查 handoff 是否存在
214
+ */
215
+ async function handoffExists(from, to) {
216
+ return (0, fs_extra_1.pathExists)(getHandoffPath(from, to));
217
+ }
218
+ //# sourceMappingURL=handoff-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-generator.js","sourceRoot":"","sources":["../../src/core/handoff-generator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speccore",
3
- "version": "8.3.175",
3
+ "version": "8.3.177",
4
4
  "description": "SpecCore - Code by Spec, Not by Vibe.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",