spec-agent 2.0.5 → 2.0.7
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.
Potentially problematic release.
This version of spec-agent might be problematic. Click here for more details.
- package/.cursor/rules/spec-agent-assistant.mdc +14 -3
- package/.cursor/skills/spec-agent-execution-orchestrator/SKILL.md +16 -8
- package/.cursor/skills/spec-agent-onboarding-agent/SKILL.md +17 -5
- package/.cursor/skills/spec-agent-product-dev-agent/SKILL.md +26 -6
- package/{spec-agent-implementation.md → IMPLEMENTATION.md} +814 -814
- package/README.md +10 -2
- package/USAGE.md +75 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +98 -2
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +133 -7
- package/dist/commands/scan.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/commands/handoff.ts +135 -2
- package/src/commands/scan.ts +163 -10
- package/src/types.ts +12 -0
- package/CURSOR_AGENT_PACK.md +0 -66
- package/USAGE_FROM_NPM.md +0 -286
- package/orchestrator-v2-design.md +0 -193
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
如果你是通过 npm 公网安装并希望从零开始跑通,建议先阅读:
|
|
8
8
|
|
|
9
|
-
- `
|
|
9
|
+
- `USAGE.md`
|
|
10
|
+
- `IMPLEMENTATION.md`
|
|
10
11
|
|
|
11
12
|
## 在 Cursor 中使用
|
|
12
13
|
|
|
@@ -279,6 +280,13 @@ node dist/index.js doctor --workspace . --check-llm --format json
|
|
|
279
280
|
manifest.json chunk_*.json spec.json task_plan.json dispatch.json
|
|
280
281
|
```
|
|
281
282
|
|
|
283
|
+
原型图相关产物(当需求文档含图片时):
|
|
284
|
+
|
|
285
|
+
- `output/prototypes/*`:抽取后的原型图文件
|
|
286
|
+
- `output/prototype_index.json`:原型图索引(ID、路径、来源、摘要、sourceChunks)
|
|
287
|
+
- `output/prototype_index.md`:便于人工查看的原型总览
|
|
288
|
+
- `output/handoff/tasks/*.md`:任务提示词内自动附带匹配到的原型引用
|
|
289
|
+
|
|
282
290
|
### 6. 支持的文档格式
|
|
283
291
|
|
|
284
292
|
- `.md` - Markdown
|
|
@@ -322,4 +330,4 @@ npm run dev
|
|
|
322
330
|
|
|
323
331
|
如果你要把本工具作为“可直接调用的 Cursor 智能体”交付给其他人,请看:
|
|
324
332
|
|
|
325
|
-
- `
|
|
333
|
+
- `USAGE.md`
|
package/USAGE.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# SPEC-AGENT USAGE
|
|
2
|
+
|
|
3
|
+
本文件合并了原 `USAGE_FROM_NPM.md` 与 `CURSOR_AGENT_PACK.md` 的使用内容,作为统一操作手册。
|
|
4
|
+
|
|
5
|
+
## 1. 安装与检查
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g spec-agent@latest --registry=https://registry.npmjs.org/
|
|
9
|
+
spec-agent --version
|
|
10
|
+
spec-agent --help
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 2. LLM 配置(单模型)
|
|
14
|
+
|
|
15
|
+
PowerShell:
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
$env:LLM_API_KEY="your_api_key"
|
|
19
|
+
$env:LLM_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
20
|
+
$env:LLM_MODEL="qwen-plus"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
可选自检:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
spec-agent doctor --workspace ./output --check-llm
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 3. 最小跑通流程
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
spec-agent pipeline --input ./docs --output ./output
|
|
33
|
+
spec-agent handoff --workspace ./output --target cursor --include-summaries
|
|
34
|
+
spec-agent round --workspace ./output --input ./docs --target cursor --max-parallel 4
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 4. 原型图产物
|
|
38
|
+
|
|
39
|
+
当需求文档包含图片时,重点查看:
|
|
40
|
+
|
|
41
|
+
- `output/prototypes/*`
|
|
42
|
+
- `output/prototype_index.json`
|
|
43
|
+
- `output/prototype_index.md`
|
|
44
|
+
- `output/handoff/tasks/*.md`(含 `Prototype References` 与 `Prototype Candidates`)
|
|
45
|
+
|
|
46
|
+
前端交付建议:
|
|
47
|
+
|
|
48
|
+
- 优先按 `Prototype References`(高置信)实现页面
|
|
49
|
+
- `Prototype Candidates` 仅作为候选,必要时人工确认
|
|
50
|
+
|
|
51
|
+
## 5. 回填执行
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
spec-agent round --workspace ./output --input ./docs --complete T001,T002 --fail T003 --error "compile failed"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 6. Cursor Agent Pack 使用
|
|
58
|
+
|
|
59
|
+
需要在项目内放置:
|
|
60
|
+
|
|
61
|
+
- `.cursor/rules/spec-agent-assistant.mdc`
|
|
62
|
+
- `.cursor/skills/spec-agent-onboarding-agent/SKILL.md`
|
|
63
|
+
- `.cursor/skills/spec-agent-execution-orchestrator/SKILL.md`
|
|
64
|
+
- `.cursor/skills/spec-agent-product-dev-agent/SKILL.md`
|
|
65
|
+
|
|
66
|
+
推荐触发语句:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
请按 spec-agent-product-dev-agent 流程,从需求分析开始,产出并推进一轮开发。
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 7. 当前交付范围
|
|
73
|
+
|
|
74
|
+
- 默认前端优先(页面/路由/组件/交互/状态/假数据)
|
|
75
|
+
- 后端/API/数据库任务默认延期,除非明确要求
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuCD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgK7F"}
|
package/dist/commands/handoff.js
CHANGED
|
@@ -45,6 +45,7 @@ async function handoffCommand(options, command) {
|
|
|
45
45
|
const dispatchPath = path.join(workspacePath, 'dispatch_plan.json');
|
|
46
46
|
const taskPlanPath = path.join(workspacePath, 'task_plan.json');
|
|
47
47
|
const specPath = path.join(workspacePath, 'spec_summary.json');
|
|
48
|
+
const prototypeIndexPath = path.join(workspacePath, 'prototype_index.json');
|
|
48
49
|
if (!(await (0, file_1.fileExists)(dispatchPath))) {
|
|
49
50
|
logger.error(`dispatch_plan.json not found in workspace: ${workspacePath}`);
|
|
50
51
|
logger.info('Run spec-agent dispatch first.');
|
|
@@ -61,6 +62,10 @@ async function handoffCommand(options, command) {
|
|
|
61
62
|
const dispatch = await (0, file_1.readJson)(dispatchPath);
|
|
62
63
|
const taskPlan = await (0, file_1.readJson)(taskPlanPath);
|
|
63
64
|
const spec = (await (0, file_1.fileExists)(specPath)) ? await (0, file_1.readJson)(specPath) : null;
|
|
65
|
+
const prototypeIndex = (await (0, file_1.fileExists)(prototypeIndexPath))
|
|
66
|
+
? await (0, file_1.readJson)(prototypeIndexPath)
|
|
67
|
+
: null;
|
|
68
|
+
const prototypeAssets = prototypeIndex?.assets || [];
|
|
64
69
|
const taskById = new Map();
|
|
65
70
|
for (const group of taskPlan.parallelGroups) {
|
|
66
71
|
for (const task of group.tasks) {
|
|
@@ -77,6 +82,8 @@ async function handoffCommand(options, command) {
|
|
|
77
82
|
const task = taskById.get(taskId);
|
|
78
83
|
if (!task)
|
|
79
84
|
continue;
|
|
85
|
+
const sourceChunks = guessSourceChunks(task, sourceChunkMap);
|
|
86
|
+
const prototypeMatches = matchTaskPrototypes(task, sourceChunks, prototypeAssets);
|
|
80
87
|
const mapped = {
|
|
81
88
|
id: task.id,
|
|
82
89
|
name: task.name,
|
|
@@ -86,7 +93,9 @@ async function handoffCommand(options, command) {
|
|
|
86
93
|
assignedAgent: agent.agentId,
|
|
87
94
|
assignedType: agentType,
|
|
88
95
|
estimatedHours: task.estimatedHours,
|
|
89
|
-
sourceChunks
|
|
96
|
+
sourceChunks,
|
|
97
|
+
prototypeRefs: prototypeMatches.filter(match => match.level === 'high'),
|
|
98
|
+
prototypeCandidates: prototypeMatches.filter(match => match.level !== 'high'),
|
|
90
99
|
};
|
|
91
100
|
rows.push(mapped);
|
|
92
101
|
handoffTasks.push(mapped);
|
|
@@ -138,10 +147,12 @@ async function handoffCommand(options, command) {
|
|
|
138
147
|
taskPlan: 'task_plan.json',
|
|
139
148
|
dispatchPlan: 'dispatch_plan.json',
|
|
140
149
|
summariesDir: options.includeSummaries ? 'summaries/' : null,
|
|
150
|
+
prototypeIndex: prototypeAssets.length > 0 ? 'prototype_index.json' : null,
|
|
141
151
|
},
|
|
142
152
|
totals: {
|
|
143
153
|
agents: agentTaskMap.size,
|
|
144
154
|
tasks: handoffTasks.length,
|
|
155
|
+
prototypeAssets: prototypeAssets.length,
|
|
145
156
|
},
|
|
146
157
|
tasks: handoffTasks,
|
|
147
158
|
unassigned: dispatch.unassigned,
|
|
@@ -151,6 +162,7 @@ async function handoffCommand(options, command) {
|
|
|
151
162
|
target: normalizeTarget(options.target),
|
|
152
163
|
totalAgents: agentTaskMap.size,
|
|
153
164
|
totalTasks: handoffTasks.length,
|
|
165
|
+
totalPrototypeAssets: prototypeAssets.length,
|
|
154
166
|
includeSummaries: Boolean(options.includeSummaries),
|
|
155
167
|
}), 'utf-8');
|
|
156
168
|
logger.success('Handoff bundle generated');
|
|
@@ -160,6 +172,7 @@ async function handoffCommand(options, command) {
|
|
|
160
172
|
target: normalizeTarget(options.target),
|
|
161
173
|
totalAgents: agentTaskMap.size,
|
|
162
174
|
totalTasks: handoffTasks.length,
|
|
175
|
+
totalPrototypeAssets: prototypeAssets.length,
|
|
163
176
|
outputPath,
|
|
164
177
|
bundlePath,
|
|
165
178
|
indexPath,
|
|
@@ -215,6 +228,10 @@ function renderTaskPrompt(input) {
|
|
|
215
228
|
const sourceChunkText = row.sourceChunks && row.sourceChunks.length > 0
|
|
216
229
|
? row.sourceChunks.map(i => `chunk_${i}_summary.json`).join(', ')
|
|
217
230
|
: '未定位到明确 source chunk,请从 spec_summary.json 补充判断';
|
|
231
|
+
const prototypeLines = (row.prototypeRefs || [])
|
|
232
|
+
.map(ref => `- ${ref.id} | \`${ref.path}\` | ${ref.level} | score=${ref.score} | ${ref.reason}${ref.summary ? ` | ${ref.summary}` : ''}`);
|
|
233
|
+
const prototypeCandidateLines = (row.prototypeCandidates || [])
|
|
234
|
+
.map(ref => `- ${ref.id} | \`${ref.path}\` | ${ref.level} | score=${ref.score} | ${ref.reason}${ref.summary ? ` | ${ref.summary}` : ''}`);
|
|
218
235
|
return [
|
|
219
236
|
`# Task Handoff - ${row.id} ${row.name}`,
|
|
220
237
|
'',
|
|
@@ -238,11 +255,20 @@ function renderTaskPrompt(input) {
|
|
|
238
255
|
'- `task_plan.json`',
|
|
239
256
|
'- `dispatch_plan.json`',
|
|
240
257
|
includeSummaries ? '- `summaries/`' : '- (可选)`summaries/`',
|
|
258
|
+
'- (可选)`prototype_index.json` / `prototypes/*`',
|
|
241
259
|
'',
|
|
242
260
|
'## Suggested Evidence',
|
|
243
261
|
'',
|
|
244
262
|
`- ${sourceChunkText}`,
|
|
245
263
|
'',
|
|
264
|
+
'## Prototype References',
|
|
265
|
+
'',
|
|
266
|
+
...(prototypeLines.length > 0 ? prototypeLines : ['- 无 high 置信度匹配原型,必要时参考候选区']),
|
|
267
|
+
'',
|
|
268
|
+
'## Prototype Candidates (medium/low)',
|
|
269
|
+
'',
|
|
270
|
+
...(prototypeCandidateLines.length > 0 ? prototypeCandidateLines : ['- 无候选原型']),
|
|
271
|
+
'',
|
|
246
272
|
'## Execution Constraints',
|
|
247
273
|
'',
|
|
248
274
|
'- 只改与该任务直接相关文件;避免大范围重构',
|
|
@@ -281,18 +307,20 @@ function renderAgentPrompt(input) {
|
|
|
281
307
|
].join('\n');
|
|
282
308
|
}
|
|
283
309
|
function renderIndexMarkdown(input) {
|
|
284
|
-
const { target, totalAgents, totalTasks, includeSummaries } = input;
|
|
310
|
+
const { target, totalAgents, totalTasks, totalPrototypeAssets, includeSummaries } = input;
|
|
285
311
|
return [
|
|
286
312
|
'# Handoff Bundle Index',
|
|
287
313
|
'',
|
|
288
314
|
`- Target: ${target}`,
|
|
289
315
|
`- Total Agents: ${totalAgents}`,
|
|
290
316
|
`- Total Tasks: ${totalTasks}`,
|
|
317
|
+
`- Total Prototype Assets: ${totalPrototypeAssets}`,
|
|
291
318
|
`- Include Summaries: ${includeSummaries ? 'yes' : 'no'}`,
|
|
292
319
|
'',
|
|
293
320
|
'## Files',
|
|
294
321
|
'',
|
|
295
322
|
'- `handoff_bundle.json`: 机器可读任务总览',
|
|
323
|
+
'- `prototype_index.json`: 原型图索引(如存在)',
|
|
296
324
|
'- `agents/*.md`: 每个 agent 的任务队列',
|
|
297
325
|
'- `tasks/*.md`: 每个任务可直接投喂编码 Agent 的提示词模板',
|
|
298
326
|
'',
|
|
@@ -303,6 +331,74 @@ function renderIndexMarkdown(input) {
|
|
|
303
331
|
'3. 每完成一个任务后人工回填状态到你的任务系统',
|
|
304
332
|
].join('\n');
|
|
305
333
|
}
|
|
334
|
+
function matchTaskPrototypes(task, sourceChunks, assets) {
|
|
335
|
+
if (assets.length === 0) {
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
338
|
+
const taskName = normalizeName(task.name);
|
|
339
|
+
const taskTokens = new Set(taskName.split(' ').filter(token => token.length >= 2));
|
|
340
|
+
const matches = [];
|
|
341
|
+
const minBytes = Math.max(1024, parseInt(process.env.PROTOTYPE_MIN_BYTES || '12000', 10) || 12000);
|
|
342
|
+
for (const asset of assets) {
|
|
343
|
+
if (shouldSkipPrototypeForMatching(asset, minBytes)) {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
let score = 0;
|
|
347
|
+
const reasons = [];
|
|
348
|
+
const chunkHits = intersectCount(sourceChunks || [], asset.sourceChunks || []);
|
|
349
|
+
if (chunkHits > 0) {
|
|
350
|
+
score += 70 + Math.min(20, chunkHits * 5);
|
|
351
|
+
reasons.push(`chunk重合(${chunkHits})`);
|
|
352
|
+
}
|
|
353
|
+
const text = normalizeName(`${asset.alt || ''} ${asset.summary || ''} ${path.basename(asset.sourceFile || '')}`);
|
|
354
|
+
let tokenHits = 0;
|
|
355
|
+
for (const token of taskTokens) {
|
|
356
|
+
if (token.length >= 2 && text.includes(token)) {
|
|
357
|
+
tokenHits++;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (tokenHits > 0) {
|
|
361
|
+
score += Math.min(30, tokenHits * 8);
|
|
362
|
+
reasons.push(`关键词命中(${tokenHits})`);
|
|
363
|
+
}
|
|
364
|
+
if (score >= 35) {
|
|
365
|
+
const level = score >= 70 ? 'high' : score >= 45 ? 'medium' : 'low';
|
|
366
|
+
matches.push({
|
|
367
|
+
id: asset.id,
|
|
368
|
+
path: asset.path,
|
|
369
|
+
score,
|
|
370
|
+
level,
|
|
371
|
+
reason: reasons.join(' + ') || '弱匹配',
|
|
372
|
+
summary: asset.summary,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return matches
|
|
377
|
+
.sort((a, b) => b.score - a.score)
|
|
378
|
+
.slice(0, 5);
|
|
379
|
+
}
|
|
380
|
+
function shouldSkipPrototypeForMatching(asset, minBytes) {
|
|
381
|
+
const estimatedSize = asset.estimatedSize || 0;
|
|
382
|
+
if (estimatedSize > 0 && estimatedSize < minBytes) {
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
const text = normalizeName(`${asset.alt || ''} ${asset.summary || ''}`);
|
|
386
|
+
if (text.length < 8 && estimatedSize < minBytes * 2) {
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
function intersectCount(a, b) {
|
|
392
|
+
if (a.length === 0 || b.length === 0)
|
|
393
|
+
return 0;
|
|
394
|
+
const set = new Set(a);
|
|
395
|
+
let count = 0;
|
|
396
|
+
for (const value of b) {
|
|
397
|
+
if (set.has(value))
|
|
398
|
+
count++;
|
|
399
|
+
}
|
|
400
|
+
return count;
|
|
401
|
+
}
|
|
306
402
|
function normalizeName(input) {
|
|
307
403
|
return (input || '')
|
|
308
404
|
.toLowerCase()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmRvF"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.scanCommand = scanCommand;
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
39
|
const logger_1 = require("../utils/logger");
|
|
39
40
|
const file_1 = require("../utils/file");
|
|
40
41
|
const document_parser_1 = require("../services/document-parser");
|
|
@@ -99,6 +100,7 @@ async function scanCommand(options, command) {
|
|
|
99
100
|
let llmChunkingFallbackFiles = 0;
|
|
100
101
|
let imageAssetsDetected = 0;
|
|
101
102
|
let imageAssetsDescribed = 0;
|
|
103
|
+
const pendingPrototypeAssets = [];
|
|
102
104
|
if (useLLMChunking && llmConfig) {
|
|
103
105
|
// LLM chunking is enabled by default; fail fast so we don't silently degrade
|
|
104
106
|
// to regex-only behavior on complex documents.
|
|
@@ -110,22 +112,43 @@ async function scanCommand(options, command) {
|
|
|
110
112
|
process.exit(SCAN_EXIT_CODE.CONFIG_ERROR);
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
|
-
for (
|
|
115
|
+
for (let fileIdx = 0; fileIdx < inputFiles.length; fileIdx++) {
|
|
116
|
+
const filePath = inputFiles[fileIdx];
|
|
114
117
|
logger.info(`Parsing ${path.basename(filePath)}...`);
|
|
115
118
|
try {
|
|
116
119
|
const parsed = await (0, document_parser_1.parseDocument)(filePath);
|
|
117
120
|
let contentForChunking = parsed.content;
|
|
118
|
-
|
|
121
|
+
const parsedImages = (parsed.images || []).map(image => ({
|
|
122
|
+
...image,
|
|
123
|
+
id: scopeImageId(fileIdx, image.id),
|
|
124
|
+
}));
|
|
125
|
+
const idMapping = new Map();
|
|
126
|
+
for (let i = 0; i < (parsed.images || []).length; i++) {
|
|
127
|
+
idMapping.set(parsed.images[i].id, parsedImages[i].id);
|
|
128
|
+
}
|
|
129
|
+
contentForChunking = replaceImageIds(contentForChunking, idMapping);
|
|
130
|
+
imageAssetsDetected += parsedImages.length;
|
|
119
131
|
let imageSummaries = {};
|
|
120
|
-
if (
|
|
121
|
-
logger.info(` 检测到 ${
|
|
132
|
+
if (parsedImages.length > 0) {
|
|
133
|
+
logger.info(` 检测到 ${parsedImages.length} 张嵌入图片`);
|
|
122
134
|
if (llmConfig && llmConfig.apiKey) {
|
|
123
|
-
imageSummaries = await (0, llm_1.describeEmbeddedImages)(
|
|
135
|
+
imageSummaries = await (0, llm_1.describeEmbeddedImages)(parsedImages, llmConfig, logger);
|
|
124
136
|
imageAssetsDescribed += Object.keys(imageSummaries).length;
|
|
125
137
|
}
|
|
126
138
|
else {
|
|
127
139
|
logger.warn(' 未配置 LLM,图片仅保留占位信息,不含语义摘要');
|
|
128
140
|
}
|
|
141
|
+
for (const image of parsedImages) {
|
|
142
|
+
pendingPrototypeAssets.push({
|
|
143
|
+
id: image.id,
|
|
144
|
+
sourceFile: filePath,
|
|
145
|
+
alt: image.alt,
|
|
146
|
+
mimeType: image.mimeType,
|
|
147
|
+
estimatedSize: image.estimatedSize,
|
|
148
|
+
dataUri: image.dataUri,
|
|
149
|
+
summary: imageSummaries[image.id],
|
|
150
|
+
});
|
|
151
|
+
}
|
|
129
152
|
}
|
|
130
153
|
// Log if base64 images were found and removed
|
|
131
154
|
const base64Info = (0, document_parser_1.analyzeBase64Images)(contentForChunking);
|
|
@@ -207,14 +230,16 @@ async function scanCommand(options, command) {
|
|
|
207
230
|
// Prepare chunks directory
|
|
208
231
|
const outputDir = path.dirname(path.resolve(options.output));
|
|
209
232
|
const chunksDir = path.join(outputDir, 'chunks');
|
|
233
|
+
const prototypesDir = path.join(outputDir, 'prototypes');
|
|
210
234
|
await (0, file_1.ensureDir)(chunksDir);
|
|
235
|
+
await (0, file_1.ensureDir)(prototypesDir);
|
|
211
236
|
// Write chunks to files
|
|
212
237
|
const chunks = [];
|
|
213
238
|
for (let i = 0; i < rawChunks.length; i++) {
|
|
214
239
|
const rawChunk = rawChunks[i];
|
|
215
240
|
const chunkFileName = `chunk_${i}.txt`;
|
|
216
241
|
const chunkFilePath = path.join(chunksDir, chunkFileName);
|
|
217
|
-
await
|
|
242
|
+
await fs.writeFile(chunkFilePath, rawChunk.content, 'utf-8');
|
|
218
243
|
chunks.push({
|
|
219
244
|
id: i,
|
|
220
245
|
sourceFiles: rawChunk.sourceFiles,
|
|
@@ -222,6 +247,12 @@ async function scanCommand(options, command) {
|
|
|
222
247
|
contentPath: chunkFilePath,
|
|
223
248
|
});
|
|
224
249
|
}
|
|
250
|
+
const prototypeAssets = await writePrototypeAssets({
|
|
251
|
+
outputDir,
|
|
252
|
+
prototypesDir,
|
|
253
|
+
rawChunks,
|
|
254
|
+
pendingAssets: pendingPrototypeAssets,
|
|
255
|
+
});
|
|
225
256
|
// Create manifest
|
|
226
257
|
const manifest = {
|
|
227
258
|
version: '1.0.0',
|
|
@@ -230,12 +261,16 @@ async function scanCommand(options, command) {
|
|
|
230
261
|
totalSize: totalSize,
|
|
231
262
|
chunkSize: chunkSizeBytes,
|
|
232
263
|
chunks: chunks,
|
|
264
|
+
prototypeAssets,
|
|
233
265
|
};
|
|
234
266
|
// Write manifest
|
|
235
267
|
const outputPath = path.resolve(options.output);
|
|
236
268
|
await (0, file_1.ensureDir)(path.dirname(outputPath));
|
|
237
269
|
await (0, file_1.writeJson)(outputPath, manifest);
|
|
238
270
|
logger.success(`Manifest created: ${outputPath}`);
|
|
271
|
+
if (prototypeAssets.length > 0) {
|
|
272
|
+
logger.info(`Prototype index: ${path.join(outputDir, 'prototype_index.json')}`);
|
|
273
|
+
}
|
|
239
274
|
logger.json({
|
|
240
275
|
status: 'success',
|
|
241
276
|
totalFiles: inputFiles.length,
|
|
@@ -247,6 +282,7 @@ async function scanCommand(options, command) {
|
|
|
247
282
|
llmChunkingFallbackFiles,
|
|
248
283
|
imageAssetsDetected,
|
|
249
284
|
imageAssetsDescribed,
|
|
285
|
+
prototypeAssets: prototypeAssets.length,
|
|
250
286
|
manifestPath: outputPath,
|
|
251
287
|
});
|
|
252
288
|
}
|
|
@@ -452,7 +488,7 @@ function appendImageSummariesToChunk(content, imageSummaries) {
|
|
|
452
488
|
if (!imageSummaries || Object.keys(imageSummaries).length === 0) {
|
|
453
489
|
return content;
|
|
454
490
|
}
|
|
455
|
-
const idMatches = content.match(/图片引用\s+(
|
|
491
|
+
const idMatches = content.match(/图片引用\s+([A-Z0-9_]+)/g) || [];
|
|
456
492
|
const imageIds = Array.from(new Set(idMatches.map(item => item.replace(/.*\s+/, '').trim())));
|
|
457
493
|
if (imageIds.length === 0) {
|
|
458
494
|
return content;
|
|
@@ -469,6 +505,96 @@ function appendImageSummariesToChunk(content, imageSummaries) {
|
|
|
469
505
|
}
|
|
470
506
|
return `${content}\n\n### 图片语义补充\n${summaryLines.join('\n')}`;
|
|
471
507
|
}
|
|
508
|
+
async function writePrototypeAssets(input) {
|
|
509
|
+
const { outputDir, prototypesDir, rawChunks, pendingAssets } = input;
|
|
510
|
+
if (pendingAssets.length === 0) {
|
|
511
|
+
return [];
|
|
512
|
+
}
|
|
513
|
+
const prototypeAssets = [];
|
|
514
|
+
for (const asset of pendingAssets) {
|
|
515
|
+
const ext = extFromMimeType(asset.mimeType);
|
|
516
|
+
const fileName = `${asset.id}.${ext}`;
|
|
517
|
+
const absolutePath = path.join(prototypesDir, fileName);
|
|
518
|
+
const written = await writeDataUriToFile(asset.dataUri, absolutePath);
|
|
519
|
+
if (!written) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
const sourceChunks = collectSourceChunks(rawChunks, asset.id);
|
|
523
|
+
prototypeAssets.push({
|
|
524
|
+
id: asset.id,
|
|
525
|
+
sourceFile: asset.sourceFile,
|
|
526
|
+
alt: asset.alt,
|
|
527
|
+
mimeType: asset.mimeType,
|
|
528
|
+
estimatedSize: asset.estimatedSize,
|
|
529
|
+
path: path.join('prototypes', fileName).replace(/\\/g, '/'),
|
|
530
|
+
summary: asset.summary,
|
|
531
|
+
sourceChunks,
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
const indexJsonPath = path.join(outputDir, 'prototype_index.json');
|
|
535
|
+
await (0, file_1.writeJson)(indexJsonPath, {
|
|
536
|
+
version: '1.0.0',
|
|
537
|
+
createdAt: new Date().toISOString(),
|
|
538
|
+
total: prototypeAssets.length,
|
|
539
|
+
assets: prototypeAssets,
|
|
540
|
+
});
|
|
541
|
+
const indexMarkdownPath = path.join(outputDir, 'prototype_index.md');
|
|
542
|
+
const lines = [
|
|
543
|
+
'# Prototype Index',
|
|
544
|
+
'',
|
|
545
|
+
`- Total: ${prototypeAssets.length}`,
|
|
546
|
+
'',
|
|
547
|
+
'| ID | Path | Source File | Chunks | Summary |',
|
|
548
|
+
'| --- | --- | --- | --- | --- |',
|
|
549
|
+
];
|
|
550
|
+
for (const asset of prototypeAssets) {
|
|
551
|
+
lines.push(`| ${asset.id} | \`${asset.path}\` | \`${path.basename(asset.sourceFile)}\` | ${asset.sourceChunks.join(', ') || '-'} | ${(asset.summary || '').replace(/\|/g, '\\|')} |`);
|
|
552
|
+
}
|
|
553
|
+
await fs.writeFile(indexMarkdownPath, `${lines.join('\n')}\n`, 'utf-8');
|
|
554
|
+
return prototypeAssets;
|
|
555
|
+
}
|
|
556
|
+
function collectSourceChunks(rawChunks, imageId) {
|
|
557
|
+
const results = [];
|
|
558
|
+
for (let i = 0; i < rawChunks.length; i++) {
|
|
559
|
+
if (rawChunks[i].content.includes(imageId)) {
|
|
560
|
+
results.push(i);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return results;
|
|
564
|
+
}
|
|
565
|
+
function scopeImageId(fileIdx, imageId) {
|
|
566
|
+
return `F${String(fileIdx + 1).padStart(3, '0')}_${imageId}`;
|
|
567
|
+
}
|
|
568
|
+
function replaceImageIds(content, idMapping) {
|
|
569
|
+
let next = content;
|
|
570
|
+
for (const [fromId, toId] of idMapping.entries()) {
|
|
571
|
+
next = next.replace(new RegExp(`\\b${escapeRegExp(fromId)}\\b`, 'g'), toId);
|
|
572
|
+
}
|
|
573
|
+
return next;
|
|
574
|
+
}
|
|
575
|
+
function escapeRegExp(input) {
|
|
576
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
577
|
+
}
|
|
578
|
+
function extFromMimeType(mimeType) {
|
|
579
|
+
if (mimeType.includes('png'))
|
|
580
|
+
return 'png';
|
|
581
|
+
if (mimeType.includes('jpeg') || mimeType.includes('jpg'))
|
|
582
|
+
return 'jpg';
|
|
583
|
+
if (mimeType.includes('webp'))
|
|
584
|
+
return 'webp';
|
|
585
|
+
if (mimeType.includes('gif'))
|
|
586
|
+
return 'gif';
|
|
587
|
+
return 'img';
|
|
588
|
+
}
|
|
589
|
+
async function writeDataUriToFile(dataUri, filePath) {
|
|
590
|
+
const match = dataUri.match(/^data:image\/[a-zA-Z0-9.+-]+;base64,([A-Za-z0-9+/=]+)$/);
|
|
591
|
+
if (!match) {
|
|
592
|
+
return false;
|
|
593
|
+
}
|
|
594
|
+
const buffer = Buffer.from(match[1], 'base64');
|
|
595
|
+
await fs.writeFile(filePath, buffer);
|
|
596
|
+
return true;
|
|
597
|
+
}
|
|
472
598
|
function readStdin() {
|
|
473
599
|
return new Promise((resolve) => {
|
|
474
600
|
let data = '';
|