speccore 8.3.20 → 8.3.21
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 +22 -42
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/execute.js +17 -87
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +78 -142
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +3 -12
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +26 -72
- package/dist/core/prompt-builder.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":"AAoEA,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,CAAC;IACxC,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;IAElB,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;IAErB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,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
|
@@ -690,27 +690,17 @@ async function analyzeCommand(options) {
|
|
|
690
690
|
}
|
|
691
691
|
// v7.4.3+ 兼容:先运行一次旧版 sanitize 迁移遗留文件(一次性)
|
|
692
692
|
await sanitizeSpecDirectories(iterDirForSkeleton);
|
|
693
|
-
// v8.3.
|
|
693
|
+
// v8.3.21+: 按需求文档名组织(020-specs/{需求名}/)
|
|
694
694
|
const phase = options.phase;
|
|
695
|
-
const
|
|
695
|
+
const features = await (0, spec_paths_1.parseFeatureList)(iterDirForSkeleton);
|
|
696
696
|
let manifest;
|
|
697
|
-
if (
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
logger_1.logger.info(`📂 使用旧结构(端平铺): 020-specs/{端}/`);
|
|
697
|
+
if (features.length > 0) {
|
|
698
|
+
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName);
|
|
699
|
+
logger_1.logger.info(`📂 按需求文档组织: ${features.length} 个功能模块`);
|
|
701
700
|
}
|
|
702
701
|
else {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
if (features.length > 0) {
|
|
706
|
-
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName);
|
|
707
|
-
logger_1.logger.info(`📂 使用新结构(按需求文档组织): ${features.length} 个功能模块`);
|
|
708
|
-
}
|
|
709
|
-
else {
|
|
710
|
-
// 未检测到需求文档,回退到旧结构
|
|
711
|
-
manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, phase, iterName);
|
|
712
|
-
logger_1.logger.info(`📂 未检测到需求文档,回退到旧结构(端平铺)`);
|
|
713
|
-
}
|
|
702
|
+
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)([], platforms, phase, iterName);
|
|
703
|
+
logger_1.logger.info(`📂 未检测到需求文档,仅创建全局 overview/`);
|
|
714
704
|
}
|
|
715
705
|
const skeletonResult = await (0, spec_skeleton_1.generateSkeleton)(specDir, manifest);
|
|
716
706
|
if (skeletonResult.created.length > 0) {
|
|
@@ -1098,11 +1088,10 @@ async function analyzeCommand(options) {
|
|
|
1098
1088
|
await (0, fs_extra_1.ensureDir)(specDir);
|
|
1099
1089
|
const globalSet = new Set(spec_paths_1.GLOBAL_SPEC_FILES);
|
|
1100
1090
|
const validPlatforms = new Set([spec_paths_1.GLOBAL_SPECS_DIR, ...(await (0, spec_paths_1.parsePlatformList)())]);
|
|
1101
|
-
// v8.3.
|
|
1102
|
-
const
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
logger_1.logger.info(` 📂 新结构检测到 ${features.length} 个功能模块,按需求文档名路由文档`);
|
|
1091
|
+
// v8.3.21+: 按需求文档名组织
|
|
1092
|
+
const features = await (0, spec_paths_1.parseFeatureList)(iterDir);
|
|
1093
|
+
if (features.length > 0) {
|
|
1094
|
+
logger_1.logger.info(` 📂 检测到 ${features.length} 个功能模块,按需求文档名路由文档`);
|
|
1106
1095
|
}
|
|
1107
1096
|
let skippedCount = 0;
|
|
1108
1097
|
for (const [filename, content] of Object.entries(docs)) {
|
|
@@ -1160,8 +1149,8 @@ async function analyzeCommand(options) {
|
|
|
1160
1149
|
if (cleanFilename.startsWith(`${spec_paths_1.GLOBAL_SPECS_DIR}/`)) {
|
|
1161
1150
|
cleanFilename = cleanFilename.slice(`${spec_paths_1.GLOBAL_SPECS_DIR}/`.length);
|
|
1162
1151
|
}
|
|
1163
|
-
// v8.3.
|
|
1164
|
-
if (
|
|
1152
|
+
// v8.3.21+: 按需求文档名组织的目录结构路由
|
|
1153
|
+
if (cleanFilename.includes('/')) {
|
|
1165
1154
|
const parts = cleanFilename.split('/');
|
|
1166
1155
|
const firstPart = parts[0];
|
|
1167
1156
|
// 全局文档:overview/xxx → 写入 020-specs/overview/
|
|
@@ -1945,26 +1934,17 @@ async function sanitizeSpecDirectories(iterDir) {
|
|
|
1945
1934
|
legacyGlobalMigrated = true;
|
|
1946
1935
|
continue;
|
|
1947
1936
|
}
|
|
1948
|
-
// 白名单校验:非 overview/ 且非端名的目录 →
|
|
1937
|
+
// 白名单校验:非 overview/ 且非端名的目录 → 检查是否合法功能模块名
|
|
1949
1938
|
if (!validDirs.has(entry)) {
|
|
1950
|
-
// v8.3.
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
await (0, fs_extra_1.rename)(entryPath, (0, path_1.join)(specDir, archivedName));
|
|
1957
|
-
logger_1.logger.warn(`⚠️ 非法目录已归档: 020-specs/${entry}/ → ${archivedName}/`);
|
|
1958
|
-
illegalDirCount++;
|
|
1959
|
-
}
|
|
1960
|
-
// 其他目录允许存在(功能模块目录)
|
|
1961
|
-
continue;
|
|
1939
|
+
// v8.3.21+: 只归档明显非法的目录名(纯数字、特殊符号等),其他目录视为功能模块
|
|
1940
|
+
if (/^\d+$/.test(entry) || /^[\.\-\*_\s]+$/.test(entry)) {
|
|
1941
|
+
const archivedName = `${entry}.invalid-${Date.now()}`;
|
|
1942
|
+
await (0, fs_extra_1.rename)(entryPath, (0, path_1.join)(specDir, archivedName));
|
|
1943
|
+
logger_1.logger.warn(`⚠️ 非法目录已归档: 020-specs/${entry}/ → ${archivedName}/`);
|
|
1944
|
+
illegalDirCount++;
|
|
1962
1945
|
}
|
|
1963
|
-
//
|
|
1964
|
-
|
|
1965
|
-
await (0, fs_extra_1.rename)(entryPath, (0, path_1.join)(specDir, archivedName));
|
|
1966
|
-
logger_1.logger.warn(`⚠️ 非法目录已归档: 020-specs/${entry}/ → ${archivedName}/`);
|
|
1967
|
-
illegalDirCount++;
|
|
1946
|
+
// 其他目录允许存在(功能模块目录)
|
|
1947
|
+
continue;
|
|
1968
1948
|
}
|
|
1969
1949
|
}
|
|
1970
1950
|
else if (entryStat.isFile()) {
|