speccore 8.3.181 → 8.3.182
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":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -415,7 +415,12 @@ async function loadExtraSpecs(cwd, taskDir, platform, iteration, options) {
|
|
|
415
415
|
const budget = getFileBudget(fileName);
|
|
416
416
|
if (content.length > budget.limit) {
|
|
417
417
|
if (budget.mode === 'error') {
|
|
418
|
-
logger_1.logger.error(`[prompt-builder] ${fileName} 超过预算上限 (${content.length} > ${budget.limit})
|
|
418
|
+
logger_1.logger.error(`[prompt-builder] ${fileName} 超过预算上限 (${content.length} > ${budget.limit})。`);
|
|
419
|
+
logger_1.logger.error(` 该文件属于"必须完整"类型,不会被截断。建议精简方式:`);
|
|
420
|
+
logger_1.logger.error(` - 删除过时的注释和示例代码`);
|
|
421
|
+
logger_1.logger.error(` - 将详细说明链接到外部文档`);
|
|
422
|
+
logger_1.logger.error(` - 使用表格代替冗长的列表`);
|
|
423
|
+
logger_1.logger.error(` - 精简后重新执行: speccore execute --resume`);
|
|
419
424
|
// 不截断,保留完整内容
|
|
420
425
|
}
|
|
421
426
|
else {
|
|
@@ -537,14 +542,28 @@ async function loadExtraSpecs(cwd, taskDir, platform, iteration, options) {
|
|
|
537
542
|
* 只加载 ALLOWED_EXTRA_FILES 白名单内的文件,防止上下文污染
|
|
538
543
|
* 白名单外文件将被忽略并输出提示
|
|
539
544
|
*/
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
'
|
|
545
|
+
// v8.3.182+: 白名单分两级(核心 + 条件)
|
|
546
|
+
// 核心白名单:所有任务都需要
|
|
547
|
+
const CORE_EXTRA_FILES = new Set([
|
|
548
|
+
'CONTEXT.md', // 任务上下文(来源追溯 + 关联任务)
|
|
549
|
+
'ERROR_CODES.md', // 错误码定义
|
|
544
550
|
]);
|
|
551
|
+
// 条件白名单:按平台类型加载
|
|
552
|
+
function getPlatformExtraFiles(platform) {
|
|
553
|
+
if (!platform)
|
|
554
|
+
return new Set();
|
|
555
|
+
const p = platform.toLowerCase();
|
|
556
|
+
if (p.includes('backend') || p.includes('service') || p.includes('api') || p.includes('server')) {
|
|
557
|
+
return new Set(['SCHEMA.md']);
|
|
558
|
+
}
|
|
559
|
+
if (p.includes('web') || p.includes('mobile') || p.includes('h5') || p.includes('frontend') || p.includes('admin')) {
|
|
560
|
+
return new Set(['COMPONENT_TREE.md', 'ROUTES.md', 'STATE.md']);
|
|
561
|
+
}
|
|
562
|
+
return new Set();
|
|
563
|
+
}
|
|
545
564
|
// v8.3.181+: 按文件类型细分预算(必须完整 vs 可以截断)
|
|
546
565
|
const FILE_BUDGETS = {
|
|
547
|
-
'CONSTITUTION.md': { limit:
|
|
566
|
+
'CONSTITUTION.md': { limit: 6000, mode: 'error' },
|
|
548
567
|
'REQ.md': { limit: 2000, mode: 'error' },
|
|
549
568
|
'API_CONTRACT.yaml': { limit: 2000, mode: 'error' },
|
|
550
569
|
'TASK.md': { limit: 1500, mode: 'truncate' },
|
|
@@ -560,6 +579,9 @@ async function scanUserCustomFiles(cwd, taskDir, platform, seenPaths) {
|
|
|
560
579
|
const validExts = ['.md', '.yaml', '.yml', '.json', '.html', '.htm'];
|
|
561
580
|
const skipDirs = new Set(['.meta', '.git', 'node_modules', 'tests', 'src', 'dist', 'build']);
|
|
562
581
|
const ignoredFiles = [];
|
|
582
|
+
// v8.3.182+: 合并核心白名单 + 条件白名单
|
|
583
|
+
const platformExtras = getPlatformExtraFiles(platform);
|
|
584
|
+
const allowedFiles = new Set([...CORE_EXTRA_FILES, ...platformExtras]);
|
|
563
585
|
// 1. 扫描 00-specs/ 下白名单内的文件
|
|
564
586
|
const specsDir = (0, path_1.join)(cwd, taskDir, '00-specs');
|
|
565
587
|
try {
|
|
@@ -571,7 +593,7 @@ async function scanUserCustomFiles(cwd, taskDir, platform, seenPaths) {
|
|
|
571
593
|
const ext = e.name.slice(e.name.lastIndexOf('.'));
|
|
572
594
|
if (!validExts.includes(ext))
|
|
573
595
|
continue;
|
|
574
|
-
if (!
|
|
596
|
+
if (!allowedFiles.has(e.name)) {
|
|
575
597
|
ignoredFiles.push(`00-specs/${e.name}`);
|
|
576
598
|
continue;
|
|
577
599
|
}
|
|
@@ -594,7 +616,7 @@ async function scanUserCustomFiles(cwd, taskDir, platform, seenPaths) {
|
|
|
594
616
|
if (!subE.isDirectory() || subE.name.startsWith('.'))
|
|
595
617
|
continue;
|
|
596
618
|
const subtaskDir = (0, path_1.join)(platformBase, subE.name);
|
|
597
|
-
await scanDirRecursive(subtaskDir, (0, path_1.join)(platform, subE.name), results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles);
|
|
619
|
+
await scanDirRecursive(subtaskDir, (0, path_1.join)(platform, subE.name), results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles, allowedFiles);
|
|
598
620
|
}
|
|
599
621
|
}
|
|
600
622
|
}
|
|
@@ -613,7 +635,7 @@ async function scanUserCustomFiles(cwd, taskDir, platform, seenPaths) {
|
|
|
613
635
|
return results;
|
|
614
636
|
}
|
|
615
637
|
/** 递归扫描目录,收集用户自定义文档(白名单模式) */
|
|
616
|
-
async function scanDirRecursive(dir, relPrefix, results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles) {
|
|
638
|
+
async function scanDirRecursive(dir, relPrefix, results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles, allowedFiles) {
|
|
617
639
|
try {
|
|
618
640
|
const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
|
|
619
641
|
for (const e of entries) {
|
|
@@ -622,13 +644,13 @@ async function scanDirRecursive(dir, relPrefix, results, seenPaths, skipDirs, va
|
|
|
622
644
|
if (e.isDirectory()) {
|
|
623
645
|
if (skipDirs.has(e.name) || e.name.startsWith('.'))
|
|
624
646
|
continue;
|
|
625
|
-
await scanDirRecursive((0, path_1.join)(dir, e.name), relPath, results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles);
|
|
647
|
+
await scanDirRecursive((0, path_1.join)(dir, e.name), relPath, results, seenPaths, skipDirs, validExts, cwd, taskDir, ignoredFiles, allowedFiles);
|
|
626
648
|
}
|
|
627
649
|
else if (e.isFile()) {
|
|
628
650
|
const ext = e.name.slice(e.name.lastIndexOf('.'));
|
|
629
651
|
if (!validExts.includes(ext))
|
|
630
652
|
continue;
|
|
631
|
-
if (!
|
|
653
|
+
if (!allowedFiles.has(e.name)) {
|
|
632
654
|
ignoredFiles.push(relPath);
|
|
633
655
|
continue;
|
|
634
656
|
}
|
|
@@ -676,7 +698,12 @@ async function loadAllTaskContext(cwd, taskDir, platform, iteration, graph) {
|
|
|
676
698
|
const fallbackLimit = budget.limit * 2;
|
|
677
699
|
if (content.length > fallbackLimit) {
|
|
678
700
|
if (budget.mode === 'error') {
|
|
679
|
-
logger_1.logger.error(`[prompt-builder] ${fileName} 超过兜底预算上限 (${content.length} > ${fallbackLimit})
|
|
701
|
+
logger_1.logger.error(`[prompt-builder] ${fileName} 超过兜底预算上限 (${content.length} > ${fallbackLimit})。`);
|
|
702
|
+
logger_1.logger.error(` 该文件属于"必须完整"类型,不会被截断。建议精简方式:`);
|
|
703
|
+
logger_1.logger.error(` - 删除过时的注释和示例代码`);
|
|
704
|
+
logger_1.logger.error(` - 将详细说明链接到外部文档`);
|
|
705
|
+
logger_1.logger.error(` - 使用表格代替冗长的列表`);
|
|
706
|
+
logger_1.logger.error(` - 精简后重新执行: speccore execute --resume`);
|
|
680
707
|
// 不截断
|
|
681
708
|
}
|
|
682
709
|
else {
|