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.
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -690,27 +690,17 @@ async function analyzeCommand(options) {
690
690
  }
691
691
  // v7.4.3+ 兼容:先运行一次旧版 sanitize 迁移遗留文件(一次性)
692
692
  await sanitizeSpecDirectories(iterDirForSkeleton);
693
- // v8.3.17+: 检测新旧结构,自动选择 manifest 生成方式
693
+ // v8.3.21+: 按需求文档名组织(020-specs/{需求名}/)
694
694
  const phase = options.phase;
695
- const isLegacy = await (0, spec_paths_1.isLegacySpecDir)(specDir);
695
+ const features = await (0, spec_paths_1.parseFeatureList)(iterDirForSkeleton);
696
696
  let manifest;
697
- if (isLegacy) {
698
- // 旧结构:端平铺(020-specs/{端}/)
699
- manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, phase, iterName);
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
- // 新结构:按需求文档名组织(020-specs/{需求名}/)
704
- const features = await (0, spec_paths_1.parseFeatureList)(iterDirForSkeleton);
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.17+: 检测是否为新结构(按需求文档组织)
1102
- const isFeatureBased = !await (0, spec_paths_1.isLegacySpecDir)(specDir);
1103
- const features = isFeatureBased ? await (0, spec_paths_1.parseFeatureList)(iterDir) : [];
1104
- if (isFeatureBased && features.length > 0) {
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.17+: 新结构路由 — 按需求文档名组织的目录结构
1164
- if (isFeatureBased && cleanFilename.includes('/')) {
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.17+: 新结构下允许功能模块目录存在
1951
- const isLegacy = await (0, spec_paths_1.isLegacySpecDir)(specDir);
1952
- if (!isLegacy) {
1953
- // 新结构:只归档明显非法的目录名(纯数字、特殊符号等)
1954
- if (/^\d+$/.test(entry) || /^[\.\-\*_\s]+$/.test(entry)) {
1955
- const archivedName = `${entry}.invalid-${Date.now()}`;
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
- // 旧结构:非 overview/ 且非端名的目录 → 非法
1964
- const archivedName = `${entry}.invalid-${Date.now()}`;
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()) {