speccore 8.3.248 → 8.3.250
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +62 -6
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +87 -7
- package/dist/commands/iteration/split.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAkFA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6ND,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/analyze.js
CHANGED
|
@@ -754,7 +754,22 @@ async function analyzeCommand(options) {
|
|
|
754
754
|
// 3c. --unit: 指定单元(支持逗号分隔多个,如 M-01,M-03)
|
|
755
755
|
if (options.unit) {
|
|
756
756
|
targetUnitIds = options.unit.split(',').map(s => s.trim()).filter(Boolean);
|
|
757
|
-
|
|
757
|
+
// v8.3.249+: 支持目录名直接指定——unitize 切分的目录名(如 v3-service-01-门禁授权同步)
|
|
758
|
+
// 与缓存 M-ID 体系无映射,仅按 u.id 匹配会让用户面对目录名无法指定单元
|
|
759
|
+
const matchUnit = (q, list) => list.some(u => u.id === q || u.name === q);
|
|
760
|
+
let invalid = targetUnitIds.filter(id => !matchUnit(id, units));
|
|
761
|
+
// v8.3.249+: unitize/doc2spec 切分不写 units.json 缓存,新切分的单元不在缓存清单中——
|
|
762
|
+
// 回退磁盘提取(features/ 目录)合并后再匹配,避免「刚切完就找不到」的断层
|
|
763
|
+
if (invalid.length > 0) {
|
|
764
|
+
const diskUnits = await extractIterationUnits(iterDir);
|
|
765
|
+
if (diskUnits.length > units.length) {
|
|
766
|
+
units = diskUnits;
|
|
767
|
+
await (0, fs_extra_1.ensureDir)((0, path_1.dirname)(unitsCachePath));
|
|
768
|
+
await (0, fs_extra_1.writeFile)(unitsCachePath, JSON.stringify(units, null, 2));
|
|
769
|
+
logger_1.logger.info(`📋 检测到新切分单元,清单已刷新: ${units.length} 个`);
|
|
770
|
+
invalid = targetUnitIds.filter(id => !matchUnit(id, units));
|
|
771
|
+
}
|
|
772
|
+
}
|
|
758
773
|
if (invalid.length > 0) {
|
|
759
774
|
logger_1.logger.error(`未找到功能单元: ${invalid.join(', ')}`);
|
|
760
775
|
logger_1.logger.info(` 可用单元: ${units.map(u => u.id).join(', ')}`);
|
|
@@ -762,7 +777,7 @@ async function analyzeCommand(options) {
|
|
|
762
777
|
}
|
|
763
778
|
}
|
|
764
779
|
const targetUnits = targetUnitIds
|
|
765
|
-
.map(id => units.find(u => u.id === id))
|
|
780
|
+
.map(id => units.find(u => u.id === id || u.name === id))
|
|
766
781
|
.filter((u) => !!u);
|
|
767
782
|
// 单单元:保持原有行为
|
|
768
783
|
if (targetUnits.length === 1) {
|
|
@@ -774,9 +789,29 @@ async function analyzeCommand(options) {
|
|
|
774
789
|
return;
|
|
775
790
|
}
|
|
776
791
|
if (options.apply) {
|
|
777
|
-
//
|
|
778
|
-
|
|
779
|
-
|
|
792
|
+
// v8.3.249+: 此前为“空实现”——只打印「已接收」但 [DOC:xxx] 内容从不落盘,
|
|
793
|
+
// AI 认真提交后产物丢失,taskify 拿不到分析结果。现在真正解析写入。
|
|
794
|
+
const docBlocks = parseDocMarkers(options.apply);
|
|
795
|
+
if (docBlocks.size === 0) {
|
|
796
|
+
logger_1.logger.warn('⚠️ 未检测到 [DOC:xxx] 标记,请按 prompt 格式输出');
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
const specDir = getUnitSpecDir(iterDir, targetUnit);
|
|
800
|
+
await (0, fs_extra_1.ensureDir)(specDir);
|
|
801
|
+
let written = 0;
|
|
802
|
+
for (const [docName, content] of docBlocks) {
|
|
803
|
+
const safeName = (0, path_1.basename)(docName);
|
|
804
|
+
if (!/^[A-Za-z_][A-Za-z0-9_-]*\.(md|yaml)$/.test(safeName))
|
|
805
|
+
continue;
|
|
806
|
+
if (content.trim().length < 50) {
|
|
807
|
+
logger_1.logger.warn(` ⏭️ 跳过 ${safeName}(内容过短)`);
|
|
808
|
+
continue;
|
|
809
|
+
}
|
|
810
|
+
await (0, fs_extra_1.writeFile)((0, path_1.join)(specDir, safeName), content.trim());
|
|
811
|
+
written++;
|
|
812
|
+
}
|
|
813
|
+
logger_1.logger.success(`✅ 功能单元 ${targetUnit.id} 分析结果已写入 ${written} 个文档`);
|
|
814
|
+
logger_1.logger.info(` 📂 020-specs/${sanitizeUnitDirName(targetUnit.name)}/overview/`);
|
|
780
815
|
return;
|
|
781
816
|
}
|
|
782
817
|
logger_1.logger.info(`📋 功能单元: ${targetUnit.id} ${targetUnit.name}`);
|
|
@@ -6834,9 +6869,27 @@ async function consolidateUnitAnalyses(iteration, units, analyses) {
|
|
|
6834
6869
|
lines.push('');
|
|
6835
6870
|
return lines.join('\n');
|
|
6836
6871
|
}
|
|
6872
|
+
/**
|
|
6873
|
+
* v8.3.249+: 构建「各端工程路径」段——从 CONSTITUTION.md 工程表解析各端源码路径。
|
|
6874
|
+
* 单元级/全量分析 prompt 共用,避免 AI 自行翻表定位源码。解析失败时返回空串不阻断。
|
|
6875
|
+
*/
|
|
6876
|
+
async function buildProjectPathsSection() {
|
|
6877
|
+
try {
|
|
6878
|
+
const projectInfoMap = await (0, spec_paths_1.parseProjectInfo)();
|
|
6879
|
+
if (projectInfoMap.size === 0)
|
|
6880
|
+
return '';
|
|
6881
|
+
const lines = [];
|
|
6882
|
+
for (const [identifier, info] of projectInfoMap) {
|
|
6883
|
+
lines.push(`- \`${identifier}\`(${info.projectType || '-'})→ \`${info.srcPath}\``);
|
|
6884
|
+
}
|
|
6885
|
+
return lines.join('\n') + '\n';
|
|
6886
|
+
}
|
|
6887
|
+
catch { /* 路径解析失败不阻断分析 */
|
|
6888
|
+
return '';
|
|
6889
|
+
}
|
|
6890
|
+
}
|
|
6837
6891
|
/** 构建单个功能单元的深度分析 Prompt */
|
|
6838
6892
|
async function buildUnitAnalysisPrompt(iterDir, iteration, unit, allUnits) {
|
|
6839
|
-
// 使用智能上下文组装引擎(三层上下文模型)
|
|
6840
6893
|
const unitRef = { id: unit.id, name: unit.name, content: unit.content };
|
|
6841
6894
|
const allUnitRefs = allUnits.map(u => ({ id: u.id, name: u.name, content: u.content }));
|
|
6842
6895
|
const ctxResult = await (0, unit_context_assembler_1.assembleUnitContext)(iterDir, iteration, unitRef, allUnitRefs, {
|
|
@@ -6855,6 +6908,9 @@ async function buildUnitAnalysisPrompt(iterDir, iteration, unit, allUnits) {
|
|
|
6855
6908
|
- 全迭代共 ${allUnits.length} 个功能单元
|
|
6856
6909
|
- 上下文预算: ${ctxResult.stats.estimatedTokens} tokens (核心${ctxResult.stats.coreChars}字符 + 关联${ctxResult.stats.relatedUnitChars + ctxResult.stats.codeChars}字符 + 全局${ctxResult.stats.globalChars}字符)
|
|
6857
6910
|
|
|
6911
|
+
## 各端工程路径(结合源码分析时按此定位)
|
|
6912
|
+
${await buildProjectPathsSection()}
|
|
6913
|
+
|
|
6858
6914
|
## 需求上下文
|
|
6859
6915
|
${ctxResult.context}
|
|
6860
6916
|
|