speccore 8.3.341 → 8.3.346
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/README.en.md +11 -10
- package/README.md +11 -11
- package/dist/cli.js +14 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +53 -21
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.d.ts +1 -0
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +5 -18
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/help.d.ts +2 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +97 -8
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -24
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/taskify.d.ts.map +1 -1
- package/dist/commands/iteration/taskify.js +5 -147
- package/dist/commands/iteration/taskify.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +37 -36
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/command-visibility.d.ts +13 -0
- package/dist/core/command-visibility.d.ts.map +1 -0
- package/dist/core/command-visibility.js +27 -0
- package/dist/core/command-visibility.js.map +1 -0
- package/dist/core/function-map.d.ts +49 -0
- package/dist/core/function-map.d.ts.map +1 -0
- package/dist/core/function-map.js +280 -0
- package/dist/core/function-map.js.map +1 -0
- package/dist/core/help-panel.d.ts +1 -1
- package/dist/core/help-panel.d.ts.map +1 -1
- package/dist/core/help-panel.js +10 -10
- package/dist/core/page-bundle.d.ts +25 -0
- package/dist/core/page-bundle.d.ts.map +1 -0
- package/dist/core/page-bundle.js +144 -0
- package/dist/core/page-bundle.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +9 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +134 -2
- package/dist/core/prompt-builder.js.map +1 -1
- package/package.json +1 -1
- package/templates/html/speccore-ask-guide.html +1 -1
- package/templates/html/speccore-ask-pipeline.html +1 -1
- package/templates/html/speccore-ask-result.html +1 -1
- package/templates/html/speccore-help.html +34 -61
package/dist/core/help-panel.js
CHANGED
|
@@ -5,40 +5,40 @@ exports.HELP_PANEL = void 0;
|
|
|
5
5
|
exports.HELP_PANEL = `
|
|
6
6
|
┌──────────────────────────────────────────────────────────────┐
|
|
7
7
|
│ 🧠 = 协作式(支持 --interactive) ⚡ = 单次执行 │
|
|
8
|
-
│ 核心流水线: init → doc2spec →
|
|
9
|
-
│ →
|
|
8
|
+
│ 核心流水线: init → doc2spec → req-doc → unitize → analyze │
|
|
9
|
+
│ → taskify → plan → execute → verify → pipeline │
|
|
10
|
+
│ → pr → done → spec2doc │
|
|
10
11
|
├──────────────────────────────────────────────────────────────┤
|
|
11
12
|
│ 📥 资产接入 │
|
|
12
13
|
│ 🚀 init ⚡ 初始化项目 │
|
|
13
14
|
│ 📅 iteration ⚡ 迭代管理 │
|
|
14
15
|
│ 📝 doc2spec ⚡ 导入 PRD → Spec MD(AI 精炼推荐) │
|
|
15
16
|
│ 🔪 unitize ⚡ 切分需求文档 → 功能单元(features/) │
|
|
16
|
-
│ 📤 spec2doc ⚡ Spec MD → Word/PDF(AI 排版推荐) │
|
|
17
17
|
│ 📦 task new ⚡ 创建任务 │
|
|
18
|
+
│ 📤 spec2doc ⚡ Spec MD → Word/PDF(AI 排版推荐) │
|
|
18
19
|
├──────────────────────────────────────────────────────────────┤
|
|
19
20
|
│ 🤝 协作决策 │
|
|
20
21
|
│ 🔍 analyze 🧠 需求分析+代码审查+多端合成(--full) │
|
|
21
22
|
│ 📊 taskify 🧠 拆功能单元 → 开发任务(Task-*) │
|
|
22
23
|
│ 📋 plan 🧠 执行计划(--interactive) │
|
|
24
|
+
│ 📝 req-doc 🧠 需求文档化(口语化 → PRD) │
|
|
23
25
|
├──────────────────────────────────────────────────────────────┤
|
|
24
26
|
│ 🚀 执行交付 │
|
|
25
27
|
│ 💻 execute ⚡ 自动排序执行 │
|
|
28
|
+
│ ✅ verify ⚡ 编译+Lint+单测+UI 冒烟(质量门禁) │
|
|
29
|
+
│ 🚢 pipeline ⚡ 合并分支 → 构建 → 部署(环境驱动) │
|
|
26
30
|
│ 🔀 pr 🧠 创建PR(--interactive) │
|
|
27
31
|
│ ✅ done 🧠 收尾归档(--interactive) │
|
|
28
|
-
│ 🔄 change 🧠 需求变更(--interactive) │
|
|
29
|
-
├──────────────────────────────────────────────────────────────┤
|
|
30
|
-
│ 📊 治理 │
|
|
31
|
-
│ ✅ validate ⚡ 合规校验 │
|
|
32
|
-
│ 🗑 rename ⚡ 重命名 Task/迭代 │
|
|
33
32
|
├──────────────────────────────────────────────────────────────┤
|
|
34
33
|
│ 💡 智能入口 │
|
|
35
34
|
│ speccore 自适应面板(检测阶段 → 提示下一步) │
|
|
36
35
|
│ speccore ask "..." 自然语言意图识别 │
|
|
37
36
|
│ speccore next 检测进度:提示下一步(只指引) │
|
|
38
37
|
│ speccore run 端到端全自动流水线(13 阶段) │
|
|
39
|
-
│ speccore about 版本信息/功能说明/文档链接 │
|
|
40
38
|
│ speccore dashboard 可视化仪表盘(迭代/全局) │
|
|
41
|
-
│ speccore
|
|
39
|
+
│ speccore status 项目状态面板 │
|
|
40
|
+
│ speccore about 版本信息/功能说明/文档链接 │
|
|
41
|
+
│ 💡 speccore help --all 查看全部命令(含低频/运维命令) │
|
|
42
42
|
└──────────────────────────────────────────────────────────────┘
|
|
43
43
|
`;
|
|
44
44
|
//# sourceMappingURL=help-panel.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 包内 HTML 模板目录(dist/core → 包根 templates/html,与 ask/init 现有定位同源) */
|
|
2
|
+
export declare function htmlTemplateDir(): string;
|
|
3
|
+
/** ask 引导页跳转的四个模式页 */
|
|
4
|
+
export declare const ASK_MODE_PAGES: readonly string[];
|
|
5
|
+
/** 从包内模板复制单个 HTML 到项目 outputs/(存在才复制,幂等覆盖) */
|
|
6
|
+
export declare function copyHtmlTemplate(cwd: string, file: string): Promise<string>;
|
|
7
|
+
/** 联动生成提示词库页(失败不阻断主流程) */
|
|
8
|
+
export declare function ensurePromptsPage(cwd: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* 幂等生成 ask 引导页家族:
|
|
11
|
+
* onboarding 主页面 + 四个模式页 + 帮助页(onboarding 的跳转目标全部补齐)
|
|
12
|
+
* 返回 onboarding 页面路径,供 [SPECCORE_ONBOARD] 标记使用。
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureAskPages(cwd: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* 幂等生成项目配置引导页(setup-guide 内「查看提示词库」链接 → prompts,
|
|
17
|
+
* 两者一起补齐)。返回 setup-guide 页面路径。
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureSetupGuidePage(cwd: string, projectName?: string, pkgVersion?: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* 幂等补齐项目名片(welcome 页)的全部跳转目标:
|
|
22
|
+
* onboarding 家族(含帮助页 + 提示词库);已初始化项目再补配置引导页。
|
|
23
|
+
*/
|
|
24
|
+
export declare function ensureWelcomeTargets(cwd: string, isInit: boolean): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=page-bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-bundle.d.ts","sourceRoot":"","sources":["../../src/core/page-bundle.ts"],"names":[],"mappings":"AAiBA,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAK3C,CAAC;AAEF,8CAA8C;AAC9C,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjF;AAED,0BAA0B;AAC1B,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlH;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtF"}
|
|
@@ -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
|
-
|
|
2244
|
-
const
|
|
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';
|