speccore 8.3.14 → 8.3.16

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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"}
@@ -461,17 +461,35 @@ async function analyzeCommand(options) {
461
461
  return;
462
462
  }
463
463
  }
464
- // 模糊匹配端名
464
+ // v8.3.16+: 模糊匹配端名,支持多段指定(逗号分隔)
465
465
  if (options.platform) {
466
- const resolved = await (0, platform_registry_1.resolvePlatform)(options.platform);
467
- if (resolved.error) {
468
- logger_1.logger.error(`❌ ${resolved.error}`);
466
+ const allPlatforms = await (0, spec_paths_1.parsePlatformList)();
467
+ const inputPlatforms = options.platform.split(',').map(p => p.trim()).filter(Boolean);
468
+ const resolvedPlatforms = [];
469
+ for (const input of inputPlatforms) {
470
+ const resolved = await (0, platform_registry_1.resolvePlatform)(input);
471
+ if (resolved.error) {
472
+ logger_1.logger.error(`❌ ${resolved.error}`);
473
+ return;
474
+ }
475
+ if (!resolved.exact) {
476
+ logger_1.logger.info(`📍 --platform ${input} → 匹配 ${resolved.resolved}`);
477
+ }
478
+ if (resolved.resolved) {
479
+ resolvedPlatforms.push(resolved.resolved);
480
+ }
481
+ }
482
+ // 过滤只保留在 CONSTITUTION.md 端列表中的端
483
+ const validPlatforms = resolvedPlatforms.filter(p => allPlatforms.includes(p));
484
+ if (validPlatforms.length === 0) {
485
+ logger_1.logger.error(`❌ 指定的端均不在 CONSTITUTION.md 端列表中。可用端: ${allPlatforms.join(', ')}`);
469
486
  return;
470
487
  }
471
- if (!resolved.exact) {
472
- logger_1.logger.info(`📍 --platform ${options.platform} 匹配 ${resolved.resolved}`);
488
+ if (validPlatforms.length < resolvedPlatforms.length) {
489
+ const skipped = resolvedPlatforms.filter(p => !allPlatforms.includes(p));
490
+ logger_1.logger.warn(`⚠️ 跳过不在端列表中的端: ${skipped.join(', ')}`);
473
491
  }
474
- options.platform = resolved.resolved;
492
+ options.platform = validPlatforms.join(',');
475
493
  }
476
494
  // 命令前索引新鲜度检查(非阻塞)
477
495
  // v6.97.0+ 修复:全局分析时不检查迭代级索引,避免误导用户
@@ -656,8 +674,20 @@ async function analyzeCommand(options) {
656
674
  // v8.0.0+: 骨架优先架构 — CLI 预创建所有文件,AI 只覆盖内容
657
675
  const iterDirForSkeleton = await (0, context_1.getIterationDir)(iterForDirs);
658
676
  const specDir = (0, path_1.join)(iterDirForSkeleton, '020-specs');
659
- const platforms = await (0, spec_paths_1.parsePlatformList)();
677
+ let platforms = await (0, spec_paths_1.parsePlatformList)();
660
678
  const iterName = iterForDirs;
679
+ // v8.3.16+: 如果指定了 --platform,只创建指定端的骨架
680
+ if (options.platform) {
681
+ const specifiedPlatforms = options.platform.split(',').map(p => p.trim()).filter(Boolean);
682
+ const filtered = platforms.filter(p => specifiedPlatforms.includes(p));
683
+ if (filtered.length > 0) {
684
+ platforms = filtered;
685
+ logger_1.logger.info(`📍 按 --platform 过滤: 只为 ${platforms.join(', ')} 端创建骨架`);
686
+ }
687
+ else {
688
+ logger_1.logger.warn(`⚠️ --platform 指定的端不在 CONSTITUTION.md 列表中,将使用全部端`);
689
+ }
690
+ }
661
691
  // v7.4.3+ 兼容:先运行一次旧版 sanitize 迁移遗留文件(一次性)
662
692
  await sanitizeSpecDirectories(iterDirForSkeleton);
663
693
  // v8.0.0+: 计算 manifest 并生成骨架
@@ -1123,9 +1153,10 @@ async function analyzeCommand(options) {
1123
1153
  continue;
1124
1154
  }
1125
1155
  // 综合文档写入 overview/ 子目录,端专属文档写入 {端}/ 子目录
1156
+ // v8.3.16+: 多段指定时(如 api,web),不额外加目录前缀,由 AI 返回的路径决定
1126
1157
  const targetDir = globalSet.has(cleanFilename)
1127
1158
  ? (0, path_1.join)(specDir, spec_paths_1.GLOBAL_SPECS_DIR)
1128
- : options.platform ? (0, path_1.join)(specDir, options.platform) : specDir;
1159
+ : (options.platform && !options.platform.includes(',')) ? (0, path_1.join)(specDir, options.platform) : specDir;
1129
1160
  await (0, fs_extra_1.ensureDir)(targetDir);
1130
1161
  const fp = (0, path_1.join)(targetDir, cleanFilename);
1131
1162
  if (!(await (0, task_utils_1.shouldOverwrite)(fp, !!options.interactive))) {
@@ -1449,9 +1480,10 @@ async function analyzeCommand(options) {
1449
1480
  skippedCount++;
1450
1481
  continue;
1451
1482
  }
1483
+ // v8.3.16+: 多段指定时(如 api,web),不额外加目录前缀,由 AI 返回的路径决定
1452
1484
  const targetDir = globalSet.has(cleanFilename)
1453
1485
  ? (0, path_1.join)(specDir, spec_paths_1.GLOBAL_SPECS_DIR)
1454
- : options.platform ? (0, path_1.join)(specDir, options.platform) : specDir;
1486
+ : (options.platform && !options.platform.includes(',')) ? (0, path_1.join)(specDir, options.platform) : specDir;
1455
1487
  await (0, fs_extra_1.ensureDir)(targetDir);
1456
1488
  const fp = (0, path_1.join)(targetDir, cleanFilename);
1457
1489
  if (!(await (0, task_utils_1.shouldOverwrite)(fp, !!options.interactive))) {