speccore 8.3.341 → 8.3.345

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.
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ASK_MODE_PAGES = void 0;
37
+ exports.htmlTemplateDir = htmlTemplateDir;
38
+ exports.copyHtmlTemplate = copyHtmlTemplate;
39
+ exports.ensurePromptsPage = ensurePromptsPage;
40
+ exports.ensureAskPages = ensureAskPages;
41
+ exports.ensureSetupGuidePage = ensureSetupGuidePage;
42
+ exports.ensureWelcomeTargets = ensureWelcomeTargets;
43
+ /**
44
+ * HTML 页面家族联动生成(v8.3.342+)
45
+ *
46
+ * 背景:welcome / ask / init 等命令弹出的 HTML 页面之间存在相对跳转
47
+ * (如项目名片 → ask 引导页 → 四个模式页 → 帮助页),此前各命令只生成
48
+ * 自己的主页面,跳转目标依赖其他命令跑过——首次使用某个命令时点击
49
+ * 链接即 404,或 outputs/ 被清理后链路永久断掉(ask 的版本 marker 还在)。
50
+ *
51
+ * 本模块提供幂等的页面家族补齐:任何入口命令生成主页面后调用
52
+ * ensureXxx,保证跳转目标必达。所有联动失败均不阻断主流程。
53
+ *
54
+ * 注意:对 ask.ts 采用运行时动态 import,避免 static 循环依赖
55
+ * (ask.ts 会静态 import 本模块)。
56
+ */
57
+ const path_1 = require("path");
58
+ const fs_extra_1 = require("fs-extra");
59
+ /** 包内 HTML 模板目录(dist/core → 包根 templates/html,与 ask/init 现有定位同源) */
60
+ function htmlTemplateDir() {
61
+ return (0, path_1.join)(__dirname, '..', '..', 'templates', 'html');
62
+ }
63
+ /** ask 引导页跳转的四个模式页 */
64
+ exports.ASK_MODE_PAGES = [
65
+ 'speccore-ask-explain.html',
66
+ 'speccore-ask-guide.html',
67
+ 'speccore-ask-match.html',
68
+ 'speccore-ask-pipeline.html',
69
+ ];
70
+ /** 从包内模板复制单个 HTML 到项目 outputs/(存在才复制,幂等覆盖) */
71
+ async function copyHtmlTemplate(cwd, file) {
72
+ const src = (0, path_1.join)(htmlTemplateDir(), file);
73
+ const dest = (0, path_1.join)(cwd, 'outputs', file);
74
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(cwd, 'outputs'));
75
+ if (await (0, fs_extra_1.pathExists)(src))
76
+ await (0, fs_extra_1.copy)(src, dest);
77
+ return dest;
78
+ }
79
+ /** 联动生成提示词库页(失败不阻断主流程) */
80
+ async function ensurePromptsPage(cwd) {
81
+ try {
82
+ const { generatePromptsPage } = await Promise.resolve().then(() => __importStar(require('../commands/prompts')));
83
+ await generatePromptsPage((0, path_1.join)(cwd, 'outputs', 'speccore-prompts.html'));
84
+ }
85
+ catch { /* 联动失败不阻断 */ }
86
+ }
87
+ /**
88
+ * 幂等生成 ask 引导页家族:
89
+ * onboarding 主页面 + 四个模式页 + 帮助页(onboarding 的跳转目标全部补齐)
90
+ * 返回 onboarding 页面路径,供 [SPECCORE_ONBOARD] 标记使用。
91
+ */
92
+ async function ensureAskPages(cwd) {
93
+ const { renderOnboardingHtml } = await Promise.resolve().then(() => __importStar(require('../commands/ask')));
94
+ const html = renderOnboardingHtml();
95
+ const outPath = (0, path_1.join)(cwd, 'outputs', 'speccore-ask-onboarding.html');
96
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(cwd, 'outputs'));
97
+ await (0, fs_extra_1.writeFile)(outPath, html);
98
+ for (const f of [...exports.ASK_MODE_PAGES, 'speccore-help.html']) {
99
+ await copyHtmlTemplate(cwd, f);
100
+ }
101
+ await ensurePromptsPage(cwd);
102
+ return outPath;
103
+ }
104
+ /**
105
+ * 幂等生成项目配置引导页(setup-guide 内「查看提示词库」链接 → prompts,
106
+ * 两者一起补齐)。返回 setup-guide 页面路径。
107
+ */
108
+ async function ensureSetupGuidePage(cwd, projectName, pkgVersion) {
109
+ const name = projectName || (0, path_1.basename)(cwd);
110
+ const templatePath = (0, path_1.join)(htmlTemplateDir(), 'speccore-setup-guide.html');
111
+ let template;
112
+ if (await (0, fs_extra_1.pathExists)(templatePath)) {
113
+ template = await (0, fs_extra_1.readFile)(templatePath, 'utf-8');
114
+ }
115
+ else {
116
+ // 降级:模板缺失时给出可读提示(不应该发生)
117
+ template = '<!DOCTYPE html><html><body><h1>SpecCore 配置引导</h1><p>模板文件缺失,请检查包内 templates/html/speccore-setup-guide.html</p></body></html>';
118
+ }
119
+ const html = template
120
+ .replace(/\{\{PROJECT_NAME\}\}/g, name)
121
+ .replace(/\{\{VERSION\}\}/g, pkgVersion || '0.0.0');
122
+ const outputPath = (0, path_1.join)(cwd, 'outputs', 'speccore-setup-guide.html');
123
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(cwd, 'outputs'));
124
+ await (0, fs_extra_1.writeFile)(outputPath, html);
125
+ await ensurePromptsPage(cwd);
126
+ return outputPath;
127
+ }
128
+ /**
129
+ * 幂等补齐项目名片(welcome 页)的全部跳转目标:
130
+ * onboarding 家族(含帮助页 + 提示词库);已初始化项目再补配置引导页。
131
+ */
132
+ async function ensureWelcomeTargets(cwd, isInit) {
133
+ await ensureAskPages(cwd);
134
+ if (isInit) {
135
+ let pkgVersion = '0.0.0';
136
+ try {
137
+ const pkg = await (0, fs_extra_1.readFile)((0, path_1.join)(cwd, 'package.json'), 'utf-8');
138
+ pkgVersion = JSON.parse(pkg).version || pkgVersion;
139
+ }
140
+ catch { /* 读不到用默认 */ }
141
+ await ensureSetupGuidePage(cwd, (0, path_1.basename)(cwd), pkgVersion);
142
+ }
143
+ }
144
+ //# sourceMappingURL=page-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-bundle.js","sourceRoot":"","sources":["../../src/core/page-bundle.ts"],"names":[],"mappings":"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"}
@@ -165,4 +165,13 @@ export declare function processMarkdownContent(content: string, filePath: string
165
165
  maxLinkChars?: number;
166
166
  maxSvgChars?: number;
167
167
  }): Promise<string>;
168
+ /**
169
+ * v8.3.344+: 扫描迭代素材资产(原型 HTML + 参考截图/设计稿/提取图片)。
170
+ * 补齐盲区:此前只有「被已加载文档以 Markdown 链接引用」的资产会进入上下文,
171
+ * 010-requirements/prototypes/ 与 assets/ 下未被引用的原型/截图完全无通道。
172
+ * 策略:CLI 渲染 HTML 原型语义结构(ARIA 树 + 截图)与视觉描述关键图片,
173
+ * 其余列路径清单——宿主 AI 按需打开原文件。限额防撑爆上下文。
174
+ * 导出供单测直接调用(构造临时迭代目录即可验证注入行为)。
175
+ */
176
+ export declare function collectIterationMediaAssets(iterDir: string, visionConfig?: VisionModelConfig): Promise<TaskExtraSpec | null>;
168
177
  //# sourceMappingURL=prompt-builder.d.ts.map
@@ -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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"}
@@ -44,6 +44,7 @@ exports.outputNeedsInfo = outputNeedsInfo;
44
44
  exports.resetAssetAudit = resetAssetAudit;
45
45
  exports.getAssetAuditText = getAssetAuditText;
46
46
  exports.processMarkdownContent = processMarkdownContent;
47
+ exports.collectIterationMediaAssets = collectIterationMediaAssets;
47
48
  /**
48
49
  * prompt-builder — 统一的 Spec → AI Prompt 构建引擎
49
50
  *
@@ -2189,6 +2190,22 @@ async function buildPrompt(command, options) {
2189
2190
  }
2190
2191
  catch { /* 忽略读取失败 */ }
2191
2192
  }
2193
+ // v8.3.344+: 注入迭代素材资产(原型 HTML + 参考截图/设计稿)。
2194
+ // 补齐盲区:010-requirements/prototypes/ 与 assets/ 下未被文档引用的素材此前完全无通道。
2195
+ if ((command === 'execute' || command === 'analyze') && options.iteration) {
2196
+ try {
2197
+ const mediaIterDir = await (0, context_1.getIterationDir)(options.iteration);
2198
+ if (mediaIterDir) {
2199
+ const mediaVision = await (0, vision_engine_1.loadVisionConfig)(cwd);
2200
+ const mediaSpec = await collectIterationMediaAssets(mediaIterDir, mediaVision);
2201
+ if (mediaSpec) {
2202
+ extraSpecs.push(mediaSpec);
2203
+ logger_1.logger?.info?.(` 🖼️ 迭代素材: 原型/截图已注入上下文(${Math.round(mediaSpec.content.length / 1000)}K 字符)`);
2204
+ }
2205
+ }
2206
+ }
2207
+ catch { /* 素材扫描失败不阻断 */ }
2208
+ }
2192
2209
  // 加载全局上下文(智能注入)
2193
2210
  const globalContext = await loadGlobalContext(cwd, command, options.platform);
2194
2211
  // 加载知识图谱 → 生成任务关联链(< 500 tokens)
@@ -2240,8 +2257,11 @@ async function buildPrompt(command, options) {
2240
2257
  };
2241
2258
  const rawPrompt = await buildMultiDocPrompt('analyze', ctx, options.analyzeOptions);
2242
2259
  // v8.3.3xx+: rawPrompt 路由会丢弃常规 extraSpecs,阅读清单(CLI 导航 + 宿主 AI 深读)单独追加
2243
- const readingList = extraSpecs.find(s => s.name === '📖 相关源码阅读清单');
2244
- const finalRawPrompt = readingList ? `${rawPrompt}\n\n${readingList.content}` : rawPrompt;
2260
+ // v8.3.344+: 素材资产(原型/截图)同样随路由追加,保证 analyze 阶段也能看到视觉素材
2261
+ const carryOver = extraSpecs.filter(s => s.name === '📖 相关源码阅读清单' || s.name.startsWith('🖼️ 迭代素材资产'));
2262
+ const finalRawPrompt = carryOver.length > 0
2263
+ ? `${rawPrompt}\n\n${carryOver.map(s => s.content).join('\n\n')}`
2264
+ : rawPrompt;
2245
2265
  return {
2246
2266
  marker: '[SPECCORE_PROMPT]',
2247
2267
  version: '1.0',
@@ -3004,6 +3024,118 @@ async function processMarkdownContent(content, filePath, seenPaths, visionConfig
3004
3024
  processed = await inlineMarkdownImages(processed, baseDir, seenPaths, visionConfig, options?.maxSvgChars ?? 2000);
3005
3025
  return processed;
3006
3026
  }
3027
+ /**
3028
+ * v8.3.344+: 扫描迭代素材资产(原型 HTML + 参考截图/设计稿/提取图片)。
3029
+ * 补齐盲区:此前只有「被已加载文档以 Markdown 链接引用」的资产会进入上下文,
3030
+ * 010-requirements/prototypes/ 与 assets/ 下未被引用的原型/截图完全无通道。
3031
+ * 策略:CLI 渲染 HTML 原型语义结构(ARIA 树 + 截图)与视觉描述关键图片,
3032
+ * 其余列路径清单——宿主 AI 按需打开原文件。限额防撑爆上下文。
3033
+ * 导出供单测直接调用(构造临时迭代目录即可验证注入行为)。
3034
+ */
3035
+ async function collectIterationMediaAssets(iterDir, visionConfig) {
3036
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
3037
+ const scanRoots = [
3038
+ (0, path_1.join)(reqDir, 'prototypes'),
3039
+ (0, path_1.join)(reqDir, 'assets'),
3040
+ ];
3041
+ const htmlFiles = [];
3042
+ const imageFiles = [];
3043
+ for (const root of scanRoots) {
3044
+ if (!(await (0, fs_extra_1.pathExists)(root)))
3045
+ continue;
3046
+ await walkMediaFiles(root, htmlFiles, imageFiles, 3);
3047
+ }
3048
+ if (htmlFiles.length === 0 && imageFiles.length === 0)
3049
+ return null;
3050
+ const lines = [];
3051
+ lines.push('## 🖼️ 迭代素材资产(原型 HTML + 参考截图/设计稿)');
3052
+ lines.push('');
3053
+ lines.push('> 以下素材来自迭代需求目录(010-requirements/prototypes/ 与 assets/)。');
3054
+ lines.push('> CLI 已渲染 HTML 原型语义结构与截图、描述关键图片;');
3055
+ lines.push('> 宿主 AI 请按需打开原文件/截图查看完整视觉细节(多模态宿主可直接读截图 PNG)。');
3056
+ lines.push('');
3057
+ // 1. HTML 原型:ARIA 语义树 + 截图路径,渲染失败降级纯文本
3058
+ const MAX_HTML = 3;
3059
+ const MAX_ARIA_CHARS = 1200;
3060
+ for (const htmlPath of htmlFiles.slice(0, MAX_HTML)) {
3061
+ const rel = (0, path_1.relative)(iterDir, htmlPath);
3062
+ const proto = await (0, html_prototype_1.renderHtmlPrototype)(htmlPath);
3063
+ lines.push(`### 原型: \`${rel}\``);
3064
+ lines.push('');
3065
+ if (proto?.accessibilityTree) {
3066
+ const tree = proto.accessibilityTree.length > MAX_ARIA_CHARS
3067
+ ? proto.accessibilityTree.slice(0, MAX_ARIA_CHARS) + '\n…(结构截断)'
3068
+ : proto.accessibilityTree;
3069
+ lines.push('```yaml');
3070
+ lines.push(tree);
3071
+ lines.push('```');
3072
+ if (proto.screenshotPath) {
3073
+ lines.push(`> 📷 截图: \`${proto.screenshotPath}\`(多模态宿主可直接查看)`);
3074
+ }
3075
+ recordAssetAudit(rel, '原型已渲染(ARIA 结构 + 截图)');
3076
+ }
3077
+ else {
3078
+ const htmlContent = await (0, fs_extra_1.readFile)(htmlPath, 'utf-8').catch(() => '');
3079
+ lines.push('> ⚠️ Playwright 渲染失败,以下为纯文本降级提取;宿主 AI 请直接打开 HTML 查看。');
3080
+ lines.push('');
3081
+ lines.push((0, rag_engine_1.extractHtmlText)(htmlContent).slice(0, MAX_ARIA_CHARS));
3082
+ recordAssetAudit(rel, '原型纯文本降级(请宿主打开原文件)');
3083
+ }
3084
+ lines.push('');
3085
+ }
3086
+ if (htmlFiles.length > MAX_HTML) {
3087
+ const rest = htmlFiles.slice(MAX_HTML).map(p => `\`${(0, path_1.relative)(iterDir, p)}\``).join(', ');
3088
+ lines.push(`> 其余 ${htmlFiles.length - MAX_HTML} 个原型未注入(宿主 AI 可按需打开): ${rest}`);
3089
+ lines.push('');
3090
+ }
3091
+ // 2. 参考图片:视觉模型描述前 N 张,其余列路径 + 大小
3092
+ const MAX_IMAGES = 10;
3093
+ const MAX_VISION = 3;
3094
+ lines.push('### 参考图片(截图/设计稿/提取素材)');
3095
+ lines.push('');
3096
+ let visionUsed = 0;
3097
+ for (const imgPath of imageFiles.slice(0, MAX_IMAGES)) {
3098
+ const rel = (0, path_1.relative)(iterDir, imgPath);
3099
+ if ((0, vision_engine_1.isVisionEnabled)(visionConfig) && visionUsed < MAX_VISION) {
3100
+ const result = await (0, vision_engine_1.describeImage)(imgPath, visionConfig);
3101
+ if (result.success) {
3102
+ visionUsed++;
3103
+ lines.push(`- **${rel}**(视觉描述): ${result.description.slice(0, 300)}`);
3104
+ recordAssetAudit(rel, '视觉模型已描述');
3105
+ continue;
3106
+ }
3107
+ }
3108
+ const size = await (0, fs_extra_1.stat)(imgPath).then(s => `${(s.size / 1024).toFixed(1)}KB`).catch(() => '?');
3109
+ lines.push(`- \`${rel}\`(${size},宿主 AI 请打开查看)`);
3110
+ recordAssetAudit(rel, '图片已列入清单(宿主 AI 请打开查看)');
3111
+ }
3112
+ if (imageFiles.length > MAX_IMAGES) {
3113
+ lines.push(`> 其余 ${imageFiles.length - MAX_IMAGES} 张图片未列出。`);
3114
+ }
3115
+ return {
3116
+ name: '🖼️ 迭代素材资产(原型/截图/设计稿)',
3117
+ path: 'iteration-media-assets.md',
3118
+ content: lines.join('\n'),
3119
+ };
3120
+ }
3121
+ /** 递归收集素材文件(HTML 原型 + 图片),限深度防爆炸 */
3122
+ async function walkMediaFiles(dir, htmlOut, imgOut, maxDepth, depth = 0) {
3123
+ if (depth > maxDepth)
3124
+ return;
3125
+ const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true }).catch(() => []);
3126
+ for (const e of entries) {
3127
+ const p = (0, path_1.join)(dir, e.name);
3128
+ if (e.isDirectory()) {
3129
+ await walkMediaFiles(p, htmlOut, imgOut, maxDepth, depth + 1);
3130
+ }
3131
+ else if (/\.html?$/i.test(e.name)) {
3132
+ htmlOut.push(p);
3133
+ }
3134
+ else if (/\.(png|jpe?g|gif|webp|svg)$/i.test(e.name)) {
3135
+ imgOut.push(p);
3136
+ }
3137
+ }
3138
+ }
3007
3139
  function generateExamples(command, req) {
3008
3140
  const iter = req.provided.iteration || 'Q1';
3009
3141
  const task = req.availableOptions?.tasks?.[0] || 'Task-001';