speccore 8.3.277 → 8.3.278
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 +28 -4
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +45 -10
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/core/feature-metadata.d.ts.map +1 -1
- package/dist/core/feature-metadata.js +7 -1
- package/dist/core/feature-metadata.js.map +1 -1
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +5 -0
- package/dist/core/spec-paths.js.map +1 -1
- package/dist/core/spec-skeleton.d.ts +26 -1
- package/dist/core/spec-skeleton.d.ts.map +1 -1
- package/dist/core/spec-skeleton.js +110 -3
- package/dist/core/spec-skeleton.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":"AA2FA,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,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,UAAU,CAAC;IAC5C,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,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;AAiPD,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
|
@@ -1242,7 +1242,8 @@ async function analyzeCommand(options) {
|
|
|
1242
1242
|
// v8.0.0+: 骨架优先架构 — CLI 预创建所有文件,AI 只覆盖内容
|
|
1243
1243
|
const iterDirForSkeleton = await (0, context_1.getIterationDir)(iterForDirs);
|
|
1244
1244
|
const specDir = (0, path_1.join)(iterDirForSkeleton, '020-specs');
|
|
1245
|
-
|
|
1245
|
+
const allPlatforms = await (0, spec_paths_2.parsePlatformList)();
|
|
1246
|
+
let platforms = [...allPlatforms];
|
|
1246
1247
|
const iterName = iterForDirs;
|
|
1247
1248
|
// v8.3.16+: 如果指定了 --platform,只创建指定端的骨架
|
|
1248
1249
|
if (options.platform) {
|
|
@@ -1260,16 +1261,31 @@ async function analyzeCommand(options) {
|
|
|
1260
1261
|
// v8.3.21+: 按需求文档名组织(020-specs/{需求名}/)
|
|
1261
1262
|
const phase = options.phase;
|
|
1262
1263
|
const features = await (0, spec_paths_2.parseFeatureList)(iterDirForSkeleton);
|
|
1264
|
+
// v8.3.278+: 读 _matrix.md 端声明,按「单元 × 声明端」收敛骨架生成——
|
|
1265
|
+
// 不涉及的端不再预建空骨架(旧笛卡尔积产物由 pruneUninvolvedPlatformSkeletons 清理)
|
|
1266
|
+
const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDirForSkeleton, '010-requirements', 'features'), features, allPlatforms);
|
|
1263
1267
|
let manifest;
|
|
1264
1268
|
if (features.length > 0) {
|
|
1265
|
-
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName);
|
|
1269
|
+
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName, featurePlatforms);
|
|
1266
1270
|
logger_1.logger.info(`📂 按需求文档组织: ${features.length} 个功能模块`);
|
|
1271
|
+
if (featurePlatforms.size > 0) {
|
|
1272
|
+
const declared = [...featurePlatforms.entries()].map(([f, ps]) => `${f}→[${ps.join(',')}]`).join(';');
|
|
1273
|
+
logger_1.logger.info(`📍 端覆盖矩阵收敛: ${declared}`);
|
|
1274
|
+
}
|
|
1267
1275
|
}
|
|
1268
1276
|
else {
|
|
1269
1277
|
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)([], platforms, phase, iterName);
|
|
1270
1278
|
logger_1.logger.info(`📂 未检测到需求文档,仅创建全局 overview/`);
|
|
1271
1279
|
}
|
|
1272
1280
|
const skeletonResult = await (0, spec_skeleton_1.generateSkeleton)(specDir, manifest);
|
|
1281
|
+
// v8.3.278+: 清理「未涉及端」的旧空骨架目录(v8.3.277 及以前的全端笛卡尔积残留)
|
|
1282
|
+
const pruneResult = await (0, spec_skeleton_1.pruneUninvolvedPlatformSkeletons)(specDir, features, featurePlatforms);
|
|
1283
|
+
if (pruneResult.removed.length > 0) {
|
|
1284
|
+
logger_1.logger.info(`🧹 已清理 ${pruneResult.removed.length} 个未涉及端的空骨架目录: ${pruneResult.removed.join(', ')}`);
|
|
1285
|
+
}
|
|
1286
|
+
if (pruneResult.kept.length > 0) {
|
|
1287
|
+
logger_1.logger.warn(`⚠️ 以下端目录不在 _matrix.md 声明中但已有真实内容,保留未删(请确认声明完整性): ${pruneResult.kept.join(', ')}`);
|
|
1288
|
+
}
|
|
1273
1289
|
if (skeletonResult.created.length > 0) {
|
|
1274
1290
|
logger_1.logger.info(`🦴 已创建 ${skeletonResult.created.length} 个文件骨架: ${skeletonResult.created.join(', ')}`);
|
|
1275
1291
|
}
|
|
@@ -4908,8 +4924,11 @@ sequenceDiagram
|
|
|
4908
4924
|
// 全局 overview/ 只含索引类),避免旧 manifest 把 overview/REQUIREMENT.md 当
|
|
4909
4925
|
// 「下一个待填充」但 --apply 又按路由表拦截 → 单文档模式死锁。
|
|
4910
4926
|
const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
|
|
4927
|
+
// v8.3.278+: 进度检测同样按端声明收敛,与骨架生成口径一致,
|
|
4928
|
+
// 避免把不涉及端的旧骨架目录误判为「下一个待填充」
|
|
4929
|
+
const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
|
|
4911
4930
|
const manifest = features.length > 0
|
|
4912
|
-
? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
|
|
4931
|
+
? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration, featurePlatforms)
|
|
4913
4932
|
: (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4914
4933
|
perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
|
|
4915
4934
|
if (perDocStatus.nextUnfilled) {
|
|
@@ -7091,8 +7110,13 @@ async function countPlatformSkeletons(iterDir) {
|
|
|
7091
7110
|
return { skeleton, total };
|
|
7092
7111
|
const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
|
|
7093
7112
|
const platforms = await (0, spec_paths_2.parsePlatformList)();
|
|
7113
|
+
// v8.3.278+: 统计口径与骨架生成一致——只统计声明端(未声明单元全端兜底),
|
|
7114
|
+
// 避免把不涉及端的旧残留目录计入骨架提示
|
|
7115
|
+
const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
|
|
7094
7116
|
for (const feature of features) {
|
|
7095
|
-
|
|
7117
|
+
const declared = featurePlatforms.get(feature);
|
|
7118
|
+
const unitPlatforms = declared && declared.length > 0 ? declared : platforms;
|
|
7119
|
+
for (const platform of unitPlatforms) {
|
|
7096
7120
|
const pDir = (0, path_1.join)(specDir, feature, platform);
|
|
7097
7121
|
if (!(await (0, fs_extra_1.pathExists)(pDir)))
|
|
7098
7122
|
continue;
|