speccore 8.3.277 → 8.3.279
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 +42 -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/platform-inference.d.ts +21 -0
- package/dist/core/platform-inference.d.ts.map +1 -1
- package/dist/core/platform-inference.js +98 -5
- package/dist/core/platform-inference.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 +111 -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,45 @@ 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 featuresDir = (0, path_1.join)(iterDirForSkeleton, '010-requirements', 'features');
|
|
1267
|
+
let featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)(featuresDir, features, allPlatforms);
|
|
1268
|
+
// v8.3.279+: 声明为空的单元跑六层端推断,高置信度结果写回 _matrix.md 并参与本轮收敛,
|
|
1269
|
+
// 兑现 doc2spec「空数组由 analyze 端推断填充」的承诺(此前从未实现)
|
|
1270
|
+
const { inferAndPersistFeaturePlatforms } = await Promise.resolve().then(() => __importStar(require('../core/platform-inference')));
|
|
1271
|
+
const inferResult = await inferAndPersistFeaturePlatforms(featuresDir, features, allPlatforms, featurePlatforms);
|
|
1272
|
+
featurePlatforms = inferResult.map;
|
|
1273
|
+
if (inferResult.inferred.length > 0) {
|
|
1274
|
+
const detail = inferResult.inferred.map(i => `${i.feature}→[${i.platforms.join(',')}](${i.source} ${i.confidence})`).join(';');
|
|
1275
|
+
logger_1.logger.info(`🤖 端推断填充 ${inferResult.inferred.length} 个单元声明: ${detail}`);
|
|
1276
|
+
}
|
|
1277
|
+
if (inferResult.pending.length > 0) {
|
|
1278
|
+
logger_1.logger.info(`💡 ${inferResult.pending.length} 个单元无法推断涉及端,按全端兜底: ${inferResult.pending.join(', ')}`);
|
|
1279
|
+
logger_1.logger.info(` 分析完成后可人工确认/更新各单元 _matrix.md 的 platforms 声明,重跑 analyze 即收敛`);
|
|
1280
|
+
}
|
|
1263
1281
|
let manifest;
|
|
1264
1282
|
if (features.length > 0) {
|
|
1265
|
-
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName);
|
|
1283
|
+
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName, featurePlatforms);
|
|
1266
1284
|
logger_1.logger.info(`📂 按需求文档组织: ${features.length} 个功能模块`);
|
|
1285
|
+
if (featurePlatforms.size > 0) {
|
|
1286
|
+
const declared = [...featurePlatforms.entries()].map(([f, ps]) => `${f}→[${ps.join(',')}]`).join(';');
|
|
1287
|
+
logger_1.logger.info(`📍 端覆盖矩阵收敛: ${declared}`);
|
|
1288
|
+
}
|
|
1267
1289
|
}
|
|
1268
1290
|
else {
|
|
1269
1291
|
manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)([], platforms, phase, iterName);
|
|
1270
1292
|
logger_1.logger.info(`📂 未检测到需求文档,仅创建全局 overview/`);
|
|
1271
1293
|
}
|
|
1272
1294
|
const skeletonResult = await (0, spec_skeleton_1.generateSkeleton)(specDir, manifest);
|
|
1295
|
+
// v8.3.278+: 清理「未涉及端」的旧空骨架目录(v8.3.277 及以前的全端笛卡尔积残留)
|
|
1296
|
+
const pruneResult = await (0, spec_skeleton_1.pruneUninvolvedPlatformSkeletons)(specDir, features, featurePlatforms);
|
|
1297
|
+
if (pruneResult.removed.length > 0) {
|
|
1298
|
+
logger_1.logger.info(`🧹 已清理 ${pruneResult.removed.length} 个未涉及端的空骨架目录: ${pruneResult.removed.join(', ')}`);
|
|
1299
|
+
}
|
|
1300
|
+
if (pruneResult.kept.length > 0) {
|
|
1301
|
+
logger_1.logger.warn(`⚠️ 以下端目录不在 _matrix.md 声明中但已有真实内容,保留未删(请确认声明完整性): ${pruneResult.kept.join(', ')}`);
|
|
1302
|
+
}
|
|
1273
1303
|
if (skeletonResult.created.length > 0) {
|
|
1274
1304
|
logger_1.logger.info(`🦴 已创建 ${skeletonResult.created.length} 个文件骨架: ${skeletonResult.created.join(', ')}`);
|
|
1275
1305
|
}
|
|
@@ -4908,8 +4938,11 @@ sequenceDiagram
|
|
|
4908
4938
|
// 全局 overview/ 只含索引类),避免旧 manifest 把 overview/REQUIREMENT.md 当
|
|
4909
4939
|
// 「下一个待填充」但 --apply 又按路由表拦截 → 单文档模式死锁。
|
|
4910
4940
|
const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
|
|
4941
|
+
// v8.3.278+: 进度检测同样按端声明收敛,与骨架生成口径一致,
|
|
4942
|
+
// 避免把不涉及端的旧骨架目录误判为「下一个待填充」
|
|
4943
|
+
const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
|
|
4911
4944
|
const manifest = features.length > 0
|
|
4912
|
-
? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
|
|
4945
|
+
? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration, featurePlatforms)
|
|
4913
4946
|
: (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4914
4947
|
perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
|
|
4915
4948
|
if (perDocStatus.nextUnfilled) {
|
|
@@ -7091,8 +7124,13 @@ async function countPlatformSkeletons(iterDir) {
|
|
|
7091
7124
|
return { skeleton, total };
|
|
7092
7125
|
const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
|
|
7093
7126
|
const platforms = await (0, spec_paths_2.parsePlatformList)();
|
|
7127
|
+
// v8.3.278+: 统计口径与骨架生成一致——只统计声明端(未声明单元全端兜底),
|
|
7128
|
+
// 避免把不涉及端的旧残留目录计入骨架提示
|
|
7129
|
+
const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
|
|
7094
7130
|
for (const feature of features) {
|
|
7095
|
-
|
|
7131
|
+
const declared = featurePlatforms.get(feature);
|
|
7132
|
+
const unitPlatforms = declared && declared.length > 0 ? declared : platforms;
|
|
7133
|
+
for (const platform of unitPlatforms) {
|
|
7096
7134
|
const pDir = (0, path_1.join)(specDir, feature, platform);
|
|
7097
7135
|
if (!(await (0, fs_extra_1.pathExists)(pDir)))
|
|
7098
7136
|
continue;
|