speccore 8.3.182 → 8.3.189
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/.agents/skills/spec-analyze/SKILL.md +2 -169
- package/.agents/skills/spec-ask/SKILL.md +2 -177
- package/.agents/skills/spec-change/SKILL.md +2 -214
- package/.agents/skills/spec-dashboard/SKILL.md +1 -76
- package/.agents/skills/spec-deploy/SKILL.md +2 -298
- package/.agents/skills/spec-doc2spec/SKILL.md +2 -116
- package/.agents/skills/spec-done/SKILL.md +2 -203
- package/.agents/skills/spec-execute/SKILL.md +2 -178
- package/.agents/skills/spec-help/SKILL.md +1 -75
- package/.agents/skills/spec-iteration-create/SKILL.md +2 -123
- package/.agents/skills/spec-plan/SKILL.md +2 -117
- package/.agents/skills/spec-pr/SKILL.md +2 -203
- package/.agents/skills/spec-run/SKILL.md +16 -0
- package/.agents/skills/spec-spec2doc/SKILL.md +2 -121
- package/.agents/skills/spec-split/SKILL.md +2 -208
- package/.agents/skills/spec-task-create/SKILL.md +2 -151
- package/.agents/skills/spec-verify/SKILL.md +2 -214
- package/.agents/skills/spec-welcome/SKILL.md +1 -67
- package/.agents/skills/speccore-router/SKILL.md +14 -2
- package/README.en.md +9 -9
- package/README.md +2 -1
- package/dist/cli.js +24 -25
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.js +1 -1
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +38 -5
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.js +6 -6
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +102 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +28 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/execute.js +3 -3
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +31 -52
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +12 -39
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/knowledge.d.ts +0 -12
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +0 -80
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +10 -0
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +38 -0
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +13 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +6 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +56 -172
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/agents/defaults/code-generator.md +64 -0
- package/dist/core/agents/defaults/code-reviewer.md +5 -0
- package/dist/core/agents/defaults/compiler.md +7 -0
- package/dist/core/agents/defaults/compliance-checker.md +2 -0
- package/dist/core/agents/defaults/dependency-analyst.md +5 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +5 -0
- package/dist/core/agents/defaults/effort-estimator.md +28 -0
- package/dist/core/agents/defaults/global-analyzer.md +66 -0
- package/dist/core/agents/defaults/impact-analyst.md +5 -0
- package/dist/core/agents/defaults/interaction-designer.md +5 -0
- package/dist/core/agents/defaults/performance-expert.md +2 -0
- package/dist/core/agents/defaults/product-analyst-backend.md +6 -0
- package/dist/core/agents/defaults/product-analyst-frontend.md +6 -0
- package/dist/core/agents/defaults/product-analyst.md +5 -0
- package/dist/core/agents/defaults/regression-tester.md +5 -0
- package/dist/core/agents/defaults/requirement-analyzer.md +72 -0
- package/dist/core/agents/defaults/risk-assessor.md +5 -0
- package/dist/core/agents/defaults/schedule-planner.md +5 -0
- package/dist/core/agents/defaults/security-reviewer-finance.md +6 -0
- package/dist/core/agents/defaults/security-reviewer.md +7 -0
- package/dist/core/agents/defaults/task-decomposer.md +5 -0
- package/dist/core/agents/defaults/test-engineer.md +2 -0
- package/dist/core/agents/defaults/test-reviewer.md +5 -0
- package/dist/core/agents/engine/agent-loader.d.ts.map +1 -1
- package/dist/core/agents/engine/agent-loader.js +76 -6
- package/dist/core/agents/engine/agent-loader.js.map +1 -1
- package/dist/core/agents/engine/types.d.ts +5 -0
- package/dist/core/agents/engine/types.d.ts.map +1 -1
- package/dist/core/analyze-engine.d.ts.map +1 -1
- package/dist/core/analyze-engine.js +73 -82
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/ask-engine.d.ts +0 -58
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +63 -361
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/business-rules.d.ts +36 -0
- package/dist/core/business-rules.d.ts.map +1 -0
- package/dist/core/business-rules.js +109 -0
- package/dist/core/business-rules.js.map +1 -0
- package/dist/core/change-impact-global.d.ts.map +1 -1
- package/dist/core/change-impact-global.js +4 -3
- package/dist/core/change-impact-global.js.map +1 -1
- package/dist/core/code-scanner.d.ts +1 -0
- package/dist/core/code-scanner.d.ts.map +1 -1
- package/dist/core/code-scanner.js +32 -3
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/content-delivery.d.ts +59 -0
- package/dist/core/content-delivery.d.ts.map +1 -0
- package/dist/core/content-delivery.js +219 -0
- package/dist/core/content-delivery.js.map +1 -0
- package/dist/core/global-artifacts.d.ts.map +1 -1
- package/dist/core/global-artifacts.js +262 -19
- package/dist/core/global-artifacts.js.map +1 -1
- package/dist/core/global-retrieval.d.ts +38 -0
- package/dist/core/global-retrieval.d.ts.map +1 -0
- package/dist/core/global-retrieval.js +100 -0
- package/dist/core/global-retrieval.js.map +1 -0
- package/dist/core/html-prototype.d.ts +22 -0
- package/dist/core/html-prototype.d.ts.map +1 -0
- package/dist/core/html-prototype.js +103 -0
- package/dist/core/html-prototype.js.map +1 -0
- package/dist/core/multi-lang-parser.d.ts +43 -0
- package/dist/core/multi-lang-parser.d.ts.map +1 -0
- package/dist/core/multi-lang-parser.js +317 -0
- package/dist/core/multi-lang-parser.js.map +1 -0
- package/dist/core/pipeline-engine.js +16 -16
- package/dist/core/pipeline-engine.js.map +1 -1
- package/dist/core/platform-inference.d.ts +35 -0
- package/dist/core/platform-inference.d.ts.map +1 -0
- package/dist/core/platform-inference.js +205 -0
- package/dist/core/platform-inference.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +62 -63
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/refresh-scheduler.d.ts +50 -0
- package/dist/core/refresh-scheduler.d.ts.map +1 -0
- package/dist/core/refresh-scheduler.js +139 -0
- package/dist/core/refresh-scheduler.js.map +1 -0
- package/dist/core/reverse-requirement.d.ts +54 -0
- package/dist/core/reverse-requirement.d.ts.map +1 -0
- package/dist/core/reverse-requirement.js +277 -0
- package/dist/core/reverse-requirement.js.map +1 -0
- package/dist/core/schemas/task.schema.d.ts +2 -2
- package/dist/core/spec-skeleton.d.ts.map +1 -1
- package/dist/core/spec-skeleton.js +123 -0
- package/dist/core/spec-skeleton.js.map +1 -1
- package/dist/core/unified-config.d.ts +14 -0
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +94 -10
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/unified-retrieval.d.ts.map +1 -1
- package/dist/core/unified-retrieval.js +34 -8
- package/dist/core/unified-retrieval.js.map +1 -1
- package/dist/utils/task-utils.d.ts +4 -0
- package/dist/utils/task-utils.d.ts.map +1 -1
- package/dist/utils/task-utils.js +18 -0
- package/dist/utils/task-utils.js.map +1 -1
- package/package.json +6 -4
- package/vendor/tree-sitter/tree-sitter-go.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-java.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-python.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-rust.wasm +0 -0
- package/.agents/agents/README.md +0 -79
- package/.agents/agents/spec-analyzer.md +0 -41
- package/.agents/agents/spec-architect.md +0 -57
- package/.agents/agents/spec-change-detector.md +0 -55
- package/.agents/agents/spec-clarifier.md +0 -83
- package/.agents/agents/spec-executor.md +0 -41
- package/.agents/agents/spec-gatekeeper.md +0 -84
- package/.agents/agents/spec-global-analyzer.md +0 -111
- package/.agents/agents/spec-knowledge-curator.md +0 -54
- package/.agents/agents/spec-reviewer.md +0 -46
- package/.agents/agents/spec-security-auditor.md +0 -56
- package/.agents/agents/spec-tester.md +0 -120
- package/.agents/skills/spec-analyze/references/analysis-report.md +0 -9
- package/.agents/skills/spec-execute/references/code-output.md +0 -13
- package/.agents/skills/spec-plan/references/plan-template.md +0 -29
- package/.agents/skills/spec-task-create/references/requirement-template.md +0 -23
- package/dist/commands/bugfix.d.ts +0 -17
- package/dist/commands/bugfix.d.ts.map +0 -1
- package/dist/commands/bugfix.js +0 -301
- package/dist/commands/bugfix.js.map +0 -1
- package/dist/commands/help-quick.d.ts +0 -3
- package/dist/commands/help-quick.d.ts.map +0 -1
- package/dist/commands/help-quick.js +0 -66
- package/dist/commands/help-quick.js.map +0 -1
- package/dist/commands/index-update.d.ts +0 -8
- package/dist/commands/index-update.d.ts.map +0 -1
- package/dist/commands/index-update.js +0 -180
- package/dist/commands/index-update.js.map +0 -1
- package/dist/commands/schedule.d.ts +0 -26
- package/dist/commands/schedule.d.ts.map +0 -1
- package/dist/commands/schedule.js +0 -182
- package/dist/commands/schedule.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -11
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -166
- package/dist/commands/watch.js.map +0 -1
- package/dist/core/agents/defaults/_INDEX.md +0 -68
- package/dist/core/ai-markdown.d.ts +0 -5
- package/dist/core/ai-markdown.d.ts.map +0 -1
- package/dist/core/ai-markdown.js +0 -29
- package/dist/core/ai-markdown.js.map +0 -1
- package/dist/core/schedule-engine.d.ts +0 -25
- package/dist/core/schedule-engine.d.ts.map +0 -1
- package/dist/core/schedule-engine.js +0 -281
- package/dist/core/schedule-engine.js.map +0 -1
- package/dist/core/schedule-store.d.ts +0 -119
- package/dist/core/schedule-store.d.ts.map +0 -1
- package/dist/core/schedule-store.js +0 -216
- package/dist/core/schedule-store.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* html-prototype.ts — HTML 原型渲染(Playwright 截图 + aria snapshot)
|
|
4
|
+
*
|
|
5
|
+
* 目的:把 HTML 原型变成「视觉产物」+「语义结构」两条产物,替代 extractHtmlText 纯文本。
|
|
6
|
+
* - 截图 PNG → 多模态宿主直看(CSS 样式、空间布局都在)
|
|
7
|
+
* - aria snapshot → 纯文本宿主读(YAML 格式的 ARIA 树:role + name + 层级)
|
|
8
|
+
*
|
|
9
|
+
* 失败兜底:Playwright 浏览器未安装 / 渲染异常时返回 null,调用方降级 extractHtmlText。
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.renderHtmlPrototype = renderHtmlPrototype;
|
|
13
|
+
const playwright_1 = require("playwright");
|
|
14
|
+
const url_1 = require("url");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const fs_extra_1 = require("fs-extra");
|
|
17
|
+
const fs_1 = require("fs");
|
|
18
|
+
/**
|
|
19
|
+
* 渲染 HTML 原型:截图 + aria snapshot。
|
|
20
|
+
* @param htmlPath 本地 HTML 文件路径
|
|
21
|
+
* @param outputDir 截图输出目录(默认 .speccore/cache/prototypes/)
|
|
22
|
+
*/
|
|
23
|
+
async function renderHtmlPrototype(htmlPath, outputDir) {
|
|
24
|
+
if (!(await (0, fs_extra_1.pathExists)(htmlPath)))
|
|
25
|
+
return null;
|
|
26
|
+
const dir = outputDir || (0, path_1.join)(process.cwd(), '.speccore', 'cache', 'prototypes');
|
|
27
|
+
await (0, fs_extra_1.ensureDir)(dir);
|
|
28
|
+
let browser = null;
|
|
29
|
+
try {
|
|
30
|
+
browser = await launchChromium();
|
|
31
|
+
if (!browser)
|
|
32
|
+
return null;
|
|
33
|
+
const context = await browser.newContext({ viewport: { width: 1280, height: 800 } });
|
|
34
|
+
const page = await context.newPage();
|
|
35
|
+
await page.goto((0, url_1.pathToFileURL)(htmlPath).toString(), { waitUntil: 'load' });
|
|
36
|
+
// 截图(全页)
|
|
37
|
+
const shotPath = (0, path_1.join)(dir, `${(0, path_1.basename)(htmlPath).replace(/\.html?$/i, '')}.png`);
|
|
38
|
+
await page.screenshot({ path: shotPath, fullPage: true });
|
|
39
|
+
// ARIA 树(YAML 字符串:role + name + 层级)
|
|
40
|
+
let tree = null;
|
|
41
|
+
try {
|
|
42
|
+
const snapshot = await page.locator('html').ariaSnapshot();
|
|
43
|
+
tree = snapshot || null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
tree = null;
|
|
47
|
+
}
|
|
48
|
+
await context.close();
|
|
49
|
+
return { screenshotPath: shotPath, accessibilityTree: tree };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (browser)
|
|
56
|
+
await browser.close().catch(() => { });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** 启动 chromium(Playwright 自带 → 环境变量 → 系统浏览器 → null) */
|
|
60
|
+
async function launchChromium() {
|
|
61
|
+
// 1. Playwright 自带浏览器
|
|
62
|
+
try {
|
|
63
|
+
playwright_1.chromium.executablePath();
|
|
64
|
+
return await playwright_1.chromium.launch({ headless: true });
|
|
65
|
+
}
|
|
66
|
+
catch { /* 未安装,继续 */ }
|
|
67
|
+
// 2. 环境变量指定路径
|
|
68
|
+
const envPath = process.env.SPECCORE_BROWSER_PATH;
|
|
69
|
+
if (envPath) {
|
|
70
|
+
try {
|
|
71
|
+
return await playwright_1.chromium.launch({ headless: true, executablePath: envPath });
|
|
72
|
+
}
|
|
73
|
+
catch { /* 继续 */ }
|
|
74
|
+
}
|
|
75
|
+
// 3. 系统浏览器(Chrome/Edge)
|
|
76
|
+
const system = findSystemBrowser();
|
|
77
|
+
if (system) {
|
|
78
|
+
try {
|
|
79
|
+
return await playwright_1.chromium.launch({ headless: true, executablePath: system });
|
|
80
|
+
}
|
|
81
|
+
catch { /* 继续 */ }
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/** 探测本机系统浏览器路径 */
|
|
86
|
+
function findSystemBrowser() {
|
|
87
|
+
const candidates = [];
|
|
88
|
+
if (process.platform === 'win32') {
|
|
89
|
+
candidates.push('C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', 'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe', 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe');
|
|
90
|
+
}
|
|
91
|
+
else if (process.platform === 'darwin') {
|
|
92
|
+
candidates.push('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
candidates.push('/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium', '/usr/bin/chromium-browser', '/usr/bin/microsoft-edge');
|
|
96
|
+
}
|
|
97
|
+
for (const c of candidates) {
|
|
98
|
+
if ((0, fs_1.existsSync)(c))
|
|
99
|
+
return c;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=html-prototype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-prototype.js","sourceRoot":"","sources":["../../src/core/html-prototype.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* multi-lang-parser.ts — 多语言 AST 解析(tree-sitter WASM)
|
|
3
|
+
*
|
|
4
|
+
* 替代 code-scanner.ts 中脆弱的正则提取(extractExports/extractApis/extractImports)。
|
|
5
|
+
* 用 tree-sitter 精确解析 Java / Go / Python / Rust,其余语言回退正则。
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - 零 LLM Token,代码不出本机
|
|
9
|
+
* - 惰性初始化:首次调用才加载 WASM 引擎 + 语法
|
|
10
|
+
* - 语法 .wasm 随包发布(vendor/tree-sitter/),不依赖远程服务
|
|
11
|
+
* - 单语言加载失败(如 rust 未 vendor)自动降级正则,不影响主流程
|
|
12
|
+
*
|
|
13
|
+
* 覆盖:
|
|
14
|
+
* java / go / python / rust → tree-sitter
|
|
15
|
+
* vue → 抽取 <script> 块后按 js 正则处理
|
|
16
|
+
* typescript / javascript → 保留正则(code-graph/parser.ts 已有 Compiler API 精确解析)
|
|
17
|
+
*/
|
|
18
|
+
export interface ExtractedCode {
|
|
19
|
+
exports: string[];
|
|
20
|
+
apis: string[];
|
|
21
|
+
apiDetails: string[];
|
|
22
|
+
imports: string[];
|
|
23
|
+
}
|
|
24
|
+
/** 判断某语言是否走 tree-sitter */
|
|
25
|
+
export declare function isTreeSitterLang(lang: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 用 tree-sitter 精确提取 imports / exports / apis。
|
|
28
|
+
* 不支持的 lang 返回 null,由调用方回退正则。
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractWithTreeSitter(content: string, lang: string): Promise<ExtractedCode | null>;
|
|
31
|
+
/**
|
|
32
|
+
* 用 tree-sitter 生成「结构化摘要」——只保留 imports / 符号 / 接口,
|
|
33
|
+
* 丢弃方法体,作为注入 AI 上下文的轻量替代,避免原文被按字符腰斩。
|
|
34
|
+
* 不支持的 lang 返回 null,调用方回退原文截断。
|
|
35
|
+
*/
|
|
36
|
+
export declare function summarizeCode(content: string, lang: string): Promise<string | null>;
|
|
37
|
+
/**
|
|
38
|
+
* 批量生成结构化摘要:path→content 映射 → path→summary 映射。
|
|
39
|
+
* 只覆盖 tree-sitter 语言(java/go/python/rust),其余跳过(返回不含该 path)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function summarizeSources(contents: Record<string, string>): Promise<Record<string, string>>;
|
|
42
|
+
export declare function extractVueScript(content: string): string;
|
|
43
|
+
//# sourceMappingURL=multi-lang-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-lang-parser.d.ts","sourceRoot":"","sources":["../../src/core/multi-lang-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA2DH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuBxG;AA+JD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUzF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CASxG;AAYD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* multi-lang-parser.ts — 多语言 AST 解析(tree-sitter WASM)
|
|
4
|
+
*
|
|
5
|
+
* 替代 code-scanner.ts 中脆弱的正则提取(extractExports/extractApis/extractImports)。
|
|
6
|
+
* 用 tree-sitter 精确解析 Java / Go / Python / Rust,其余语言回退正则。
|
|
7
|
+
*
|
|
8
|
+
* 设计:
|
|
9
|
+
* - 零 LLM Token,代码不出本机
|
|
10
|
+
* - 惰性初始化:首次调用才加载 WASM 引擎 + 语法
|
|
11
|
+
* - 语法 .wasm 随包发布(vendor/tree-sitter/),不依赖远程服务
|
|
12
|
+
* - 单语言加载失败(如 rust 未 vendor)自动降级正则,不影响主流程
|
|
13
|
+
*
|
|
14
|
+
* 覆盖:
|
|
15
|
+
* java / go / python / rust → tree-sitter
|
|
16
|
+
* vue → 抽取 <script> 块后按 js 正则处理
|
|
17
|
+
* typescript / javascript → 保留正则(code-graph/parser.ts 已有 Compiler API 精确解析)
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.isTreeSitterLang = isTreeSitterLang;
|
|
21
|
+
exports.extractWithTreeSitter = extractWithTreeSitter;
|
|
22
|
+
exports.summarizeCode = summarizeCode;
|
|
23
|
+
exports.summarizeSources = summarizeSources;
|
|
24
|
+
exports.extractVueScript = extractVueScript;
|
|
25
|
+
const path_1 = require("path");
|
|
26
|
+
const fs_1 = require("fs");
|
|
27
|
+
// ── 语言 → wasm 语法文件映射 ──
|
|
28
|
+
const LANG_WASM = {
|
|
29
|
+
java: 'tree-sitter-java.wasm',
|
|
30
|
+
go: 'tree-sitter-go.wasm',
|
|
31
|
+
python: 'tree-sitter-python.wasm',
|
|
32
|
+
rust: 'tree-sitter-rust.wasm',
|
|
33
|
+
};
|
|
34
|
+
// ── 惰性初始化状态 ──
|
|
35
|
+
let ParserCtor = null;
|
|
36
|
+
let initPromise = null;
|
|
37
|
+
const parserCache = new Map();
|
|
38
|
+
/** 定位 vendor 目录(兼容 dev 仓库根 与 published 包根) */
|
|
39
|
+
function vendorDir() {
|
|
40
|
+
// dist/core/ 下的 __dirname → 上溯到包根
|
|
41
|
+
return (0, path_1.join)(__dirname, '..', '..', 'vendor', 'tree-sitter');
|
|
42
|
+
}
|
|
43
|
+
async function ensureParser() {
|
|
44
|
+
if (initPromise)
|
|
45
|
+
return initPromise;
|
|
46
|
+
initPromise = (async () => {
|
|
47
|
+
// web-tree-sitter@0.20.8 CJS:module.exports 即 Parser 类
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
49
|
+
ParserCtor = require('web-tree-sitter');
|
|
50
|
+
await ParserCtor.init();
|
|
51
|
+
})();
|
|
52
|
+
return initPromise;
|
|
53
|
+
}
|
|
54
|
+
/** 获取某语言的 parser(失败返回 null,供调用方降级正则) */
|
|
55
|
+
async function getParser(lang) {
|
|
56
|
+
if (!LANG_WASM[lang])
|
|
57
|
+
return null;
|
|
58
|
+
if (parserCache.has(lang))
|
|
59
|
+
return parserCache.get(lang);
|
|
60
|
+
const wasmPath = (0, path_1.join)(vendorDir(), LANG_WASM[lang]);
|
|
61
|
+
if (!(0, fs_1.existsSync)(wasmPath))
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
await ensureParser();
|
|
65
|
+
const Language = await ParserCtor.Language.load(wasmPath);
|
|
66
|
+
const parser = new ParserCtor();
|
|
67
|
+
parser.setLanguage(Language);
|
|
68
|
+
parserCache.set(lang, parser);
|
|
69
|
+
return parser;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null; // 语法加载失败 → 降级
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** 判断某语言是否走 tree-sitter */
|
|
76
|
+
function isTreeSitterLang(lang) {
|
|
77
|
+
return lang in LANG_WASM;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 用 tree-sitter 精确提取 imports / exports / apis。
|
|
81
|
+
* 不支持的 lang 返回 null,由调用方回退正则。
|
|
82
|
+
*/
|
|
83
|
+
async function extractWithTreeSitter(content, lang) {
|
|
84
|
+
const parser = await getParser(lang);
|
|
85
|
+
if (!parser)
|
|
86
|
+
return null;
|
|
87
|
+
try {
|
|
88
|
+
const tree = parser.parse(content);
|
|
89
|
+
const root = tree.rootNode;
|
|
90
|
+
const exportsSet = new Set();
|
|
91
|
+
const importsSet = new Set();
|
|
92
|
+
const apisSet = new Set();
|
|
93
|
+
const apiDetailsSet = new Set();
|
|
94
|
+
walk(root, content, lang, exportsSet, importsSet, apisSet, apiDetailsSet);
|
|
95
|
+
return {
|
|
96
|
+
exports: [...exportsSet].slice(0, 20),
|
|
97
|
+
apis: [...apisSet],
|
|
98
|
+
apiDetails: [...apiDetailsSet],
|
|
99
|
+
imports: [...importsSet].slice(0, 30),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ─────────────────────────────────────────────────────────────
|
|
107
|
+
// 通用遍历
|
|
108
|
+
// ─────────────────────────────────────────────────────────────
|
|
109
|
+
function walk(node, src, lang, exportsSet, importsSet, apisSet, apiDetailsSet, classPrefix = '') {
|
|
110
|
+
const t = node.type;
|
|
111
|
+
// 进入类声明时,提取类级 @RequestMapping 前缀(如 /api/auth),供方法级注解合并完整路径
|
|
112
|
+
let currentPrefix = classPrefix;
|
|
113
|
+
if (lang === 'java' && t === 'class_declaration') {
|
|
114
|
+
const prefix = extractClassPathPrefix(node, src);
|
|
115
|
+
if (prefix)
|
|
116
|
+
currentPrefix = prefix;
|
|
117
|
+
}
|
|
118
|
+
collectExport(t, node, src, lang, exportsSet);
|
|
119
|
+
collectImport(t, node, src, lang, importsSet);
|
|
120
|
+
collectApi(t, node, src, lang, apisSet, apiDetailsSet, currentPrefix);
|
|
121
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
122
|
+
walk(node.child(i), src, lang, exportsSet, importsSet, apisSet, apiDetailsSet, currentPrefix);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** 提取类级 @RequestMapping 前缀(class_declaration 头部,方法体之前) */
|
|
126
|
+
function extractClassPathPrefix(node, src) {
|
|
127
|
+
const txt = src.slice(node.startIndex, node.endIndex);
|
|
128
|
+
const m = txt.match(/@RequestMapping\s*\(\s*(?:value\s*=\s*)?"(\/[^"]*)"/);
|
|
129
|
+
return m ? m[1] : '';
|
|
130
|
+
}
|
|
131
|
+
/** 从节点文本中取名字(首个 identifier 类子节点) */
|
|
132
|
+
function nameOf(node) {
|
|
133
|
+
for (const c of node.namedChildren || []) {
|
|
134
|
+
if (['identifier', 'type_identifier', 'field_identifier', 'constant'].includes(c.type)) {
|
|
135
|
+
return c.text;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
function collectExport(t, node, src, lang, out) {
|
|
141
|
+
let name = '';
|
|
142
|
+
if (lang === 'java' && ['class_declaration', 'interface_declaration', 'enum_declaration'].includes(t)) {
|
|
143
|
+
name = nameOf(node);
|
|
144
|
+
}
|
|
145
|
+
else if (lang === 'go' && t === 'type_declaration') {
|
|
146
|
+
// type_declaration 含 type_spec,取其 type_identifier
|
|
147
|
+
for (const c of node.namedChildren || []) {
|
|
148
|
+
if (c.type === 'type_spec') {
|
|
149
|
+
name = nameOf(c);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else if (lang === 'go' && (t === 'function_declaration' || t === 'method_declaration')) {
|
|
155
|
+
name = nameOf(node);
|
|
156
|
+
if (name && name[0] !== name[0].toUpperCase())
|
|
157
|
+
name = ''; // 仅导出(首字母大写)
|
|
158
|
+
}
|
|
159
|
+
else if (lang === 'python' && ['class_definition', 'function_definition'].includes(t)) {
|
|
160
|
+
name = nameOf(node);
|
|
161
|
+
}
|
|
162
|
+
else if (lang === 'rust' && ['struct_item', 'enum_item', 'trait_item', 'function_item', 'impl_item'].includes(t)) {
|
|
163
|
+
name = nameOf(node);
|
|
164
|
+
}
|
|
165
|
+
if (name && !name.startsWith('_'))
|
|
166
|
+
out.add(name);
|
|
167
|
+
}
|
|
168
|
+
function collectImport(t, node, src, lang, out) {
|
|
169
|
+
if (lang === 'java' && t === 'import_declaration') {
|
|
170
|
+
// 去掉 import 与 ; 和 .* 通配
|
|
171
|
+
const txt = src.slice(node.startIndex, node.endIndex).replace(/^import\s+/, '').replace(/;\s*$/, '').trim();
|
|
172
|
+
if (txt)
|
|
173
|
+
out.add(txt);
|
|
174
|
+
}
|
|
175
|
+
else if (lang === 'go' && t === 'import_spec') {
|
|
176
|
+
const txt = src.slice(node.startIndex, node.endIndex).replace(/["`]/g, '').trim();
|
|
177
|
+
if (txt && !txt.includes('('))
|
|
178
|
+
out.add(txt);
|
|
179
|
+
}
|
|
180
|
+
else if (lang === 'python' && t === 'import_statement') {
|
|
181
|
+
// import a.b.c
|
|
182
|
+
for (const c of node.namedChildren || []) {
|
|
183
|
+
if (c.type === 'dotted_name') {
|
|
184
|
+
out.add(c.text);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (lang === 'python' && t === 'import_from_statement') {
|
|
190
|
+
// from X import Y → 提取模块 X(而非符号 Y),避免把 Y 误当依赖
|
|
191
|
+
const txt = src.slice(node.startIndex, node.endIndex);
|
|
192
|
+
const m = txt.match(/^from\s+([\w.]+)\s+import\b/);
|
|
193
|
+
if (m)
|
|
194
|
+
out.add(m[1]);
|
|
195
|
+
}
|
|
196
|
+
else if (lang === 'rust' && t === 'use_declaration') {
|
|
197
|
+
const txt = src.slice(node.startIndex, node.endIndex).replace(/^use\s+/, '').replace(/;\s*$/, '').trim();
|
|
198
|
+
if (txt)
|
|
199
|
+
out.add(txt.split('::')[0]);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function collectApi(t, node, src, lang, out, detailOut, classPrefix = '') {
|
|
203
|
+
if (lang === 'java' && t === 'annotation') {
|
|
204
|
+
const txt = src.slice(node.startIndex, node.endIndex);
|
|
205
|
+
// @GetMapping("/path") / @RequestMapping("/path") / @RequestMapping(value="/path", method=POST)
|
|
206
|
+
const m = txt.match(/@(Get|Post|Put|Delete|Patch|Request)Mapping\s*\(\s*(?:value\s*=\s*)?"(\/[^"]*)"/);
|
|
207
|
+
if (m) {
|
|
208
|
+
const kind = m[1];
|
|
209
|
+
const rawPath = m[2];
|
|
210
|
+
if (kind === 'Request') {
|
|
211
|
+
// @RequestMapping:类级(路径==前缀,method=ANY)或方法级(method=XXX)
|
|
212
|
+
const isClassLevel = classPrefix && rawPath === classPrefix;
|
|
213
|
+
if (isClassLevel) {
|
|
214
|
+
out.add(rawPath);
|
|
215
|
+
detailOut.add(`ANY ${rawPath}`);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const merged = mergePath(classPrefix, rawPath);
|
|
219
|
+
const methodMatch = txt.match(/method\s*=\s*\{?([A-Za-z.]+)/);
|
|
220
|
+
const method = methodMatch ? normalizeMethod(methodMatch[1]) : 'ANY';
|
|
221
|
+
out.add(merged);
|
|
222
|
+
detailOut.add(`${method} ${merged}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// @GetMapping 等方法级注解:合并类级前缀
|
|
227
|
+
const merged = mergePath(classPrefix, rawPath);
|
|
228
|
+
out.add(merged);
|
|
229
|
+
detailOut.add(`${kind.toUpperCase()} ${merged}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else if (lang === 'python' && t === 'decorated_definition') {
|
|
234
|
+
const txt = src.slice(node.startIndex, node.endIndex);
|
|
235
|
+
const m = txt.match(/(?:router|app)\.(get|post|put|delete|patch|route)\s*\(\s*["'](\/[^"']*)["']/);
|
|
236
|
+
if (m) {
|
|
237
|
+
out.add(m[2]);
|
|
238
|
+
detailOut.add(`${m[1].toUpperCase()} ${m[2]}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else if (lang === 'go' && t === 'call_expression') {
|
|
242
|
+
const txt = src.slice(node.startIndex, node.endIndex);
|
|
243
|
+
const m = txt.match(/\.(GET|POST|PUT|DELETE|PATCH)\s*\(\s*"(\/[^"]*)"/);
|
|
244
|
+
if (m) {
|
|
245
|
+
out.add(m[2]);
|
|
246
|
+
detailOut.add(`${m[1]} ${m[2]}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// rust: actix 的 #[get("/path")] 少见,暂不处理
|
|
250
|
+
}
|
|
251
|
+
/** 合并类级前缀 + 方法级路径:/api/auth + /login → /api/auth/login */
|
|
252
|
+
function mergePath(prefix, path) {
|
|
253
|
+
if (!prefix)
|
|
254
|
+
return path;
|
|
255
|
+
if (!path)
|
|
256
|
+
return prefix;
|
|
257
|
+
if (path.startsWith(prefix))
|
|
258
|
+
return path; // 已是完整路径
|
|
259
|
+
return prefix.replace(/\/$/, '') + (path.startsWith('/') ? path : '/' + path);
|
|
260
|
+
}
|
|
261
|
+
/** 规范化 HTTP 方法:RequestMethod.POST → POST */
|
|
262
|
+
function normalizeMethod(m) {
|
|
263
|
+
const parts = m.split('.');
|
|
264
|
+
return parts[parts.length - 1].toUpperCase();
|
|
265
|
+
}
|
|
266
|
+
// ─────────────────────────────────────────────────────────────
|
|
267
|
+
// 结构化摘要(替代 analyze 里的 slice(0,N) 硬切原文)
|
|
268
|
+
// ─────────────────────────────────────────────────────────────
|
|
269
|
+
/**
|
|
270
|
+
* 用 tree-sitter 生成「结构化摘要」——只保留 imports / 符号 / 接口,
|
|
271
|
+
* 丢弃方法体,作为注入 AI 上下文的轻量替代,避免原文被按字符腰斩。
|
|
272
|
+
* 不支持的 lang 返回 null,调用方回退原文截断。
|
|
273
|
+
*/
|
|
274
|
+
async function summarizeCode(content, lang) {
|
|
275
|
+
const ext = await extractWithTreeSitter(content, lang);
|
|
276
|
+
if (!ext)
|
|
277
|
+
return null;
|
|
278
|
+
const lines = [];
|
|
279
|
+
const lineCount = content.split(/\r?\n/).length;
|
|
280
|
+
lines.push(`# ${lang} · ${lineCount} 行`);
|
|
281
|
+
if (ext.imports.length)
|
|
282
|
+
lines.push(`imports: ${ext.imports.slice(0, 15).join(', ')}`);
|
|
283
|
+
if (ext.exports.length)
|
|
284
|
+
lines.push(`symbols: ${ext.exports.join(', ')}`);
|
|
285
|
+
if (ext.apiDetails.length)
|
|
286
|
+
lines.push(`apis: ${ext.apiDetails.join(', ')}`);
|
|
287
|
+
return lines.join('\n');
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 批量生成结构化摘要:path→content 映射 → path→summary 映射。
|
|
291
|
+
* 只覆盖 tree-sitter 语言(java/go/python/rust),其余跳过(返回不含该 path)。
|
|
292
|
+
*/
|
|
293
|
+
async function summarizeSources(contents) {
|
|
294
|
+
const result = {};
|
|
295
|
+
for (const [path, content] of Object.entries(contents)) {
|
|
296
|
+
const lang = langFromPath(path);
|
|
297
|
+
if (!lang)
|
|
298
|
+
continue;
|
|
299
|
+
const summary = await summarizeCode(content, lang);
|
|
300
|
+
if (summary)
|
|
301
|
+
result[path] = summary;
|
|
302
|
+
}
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
function langFromPath(path) {
|
|
306
|
+
const ext = (path.split('.').pop() || '').toLowerCase();
|
|
307
|
+
const map = { java: 'java', go: 'go', py: 'python', rs: 'rust' };
|
|
308
|
+
return map[ext] || '';
|
|
309
|
+
}
|
|
310
|
+
// ─────────────────────────────────────────────────────────────
|
|
311
|
+
// vue:抽取 <script> 块(供调用方按 js 处理)
|
|
312
|
+
// ─────────────────────────────────────────────────────────────
|
|
313
|
+
function extractVueScript(content) {
|
|
314
|
+
const m = content.match(/<script\b[^>]*>([\s\S]*?)<\/script>/i);
|
|
315
|
+
return m ? m[1] : '';
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=multi-lang-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-lang-parser.js","sourceRoot":"","sources":["../../src/core/multi-lang-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -381,7 +381,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
381
381
|
id: 'phase1-prompt',
|
|
382
382
|
name: useFeatureBatches ? 'Phase 1: 全局索引文档生成' : 'Phase 1: 全局文档生成',
|
|
383
383
|
next: 'phase1-done',
|
|
384
|
-
subagent: '
|
|
384
|
+
subagent: 'requirement-analyzer',
|
|
385
385
|
contextType: 'full',
|
|
386
386
|
// v8.3.167+: 大项目降低预算(只生成索引),小项目保持 10K
|
|
387
387
|
contextBudget: useFeatureBatches ? 6000 : 10000,
|
|
@@ -389,7 +389,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
389
389
|
id: 'phase1-done',
|
|
390
390
|
name: 'Phase 1 完成检查',
|
|
391
391
|
next: phase1NextId,
|
|
392
|
-
subagent: '
|
|
392
|
+
subagent: 'requirement-analyzer',
|
|
393
393
|
contextType: 'incremental',
|
|
394
394
|
contextBudget: 4000,
|
|
395
395
|
});
|
|
@@ -407,7 +407,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
407
407
|
name: `Phase 1b-${i + 1}: ${feature} 功能模块分析`,
|
|
408
408
|
next: `feature-${feature}-done`,
|
|
409
409
|
// v8.3.167+: 功能模块级 Subagent
|
|
410
|
-
subagent: '
|
|
410
|
+
subagent: 'requirement-analyzer',
|
|
411
411
|
contextType: 'full',
|
|
412
412
|
contextBudget: 10000,
|
|
413
413
|
});
|
|
@@ -415,7 +415,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
415
415
|
id: `feature-${feature}-done`,
|
|
416
416
|
name: `${feature} 模块完成检查`,
|
|
417
417
|
next: featureNextPromptId,
|
|
418
|
-
subagent: '
|
|
418
|
+
subagent: 'requirement-analyzer',
|
|
419
419
|
contextType: 'incremental',
|
|
420
420
|
contextBudget: 4000,
|
|
421
421
|
});
|
|
@@ -428,7 +428,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
428
428
|
id: 'contract-prompt',
|
|
429
429
|
name: '契约先行: 跨端 API 契约定义',
|
|
430
430
|
next: 'contract-done',
|
|
431
|
-
subagent: '
|
|
431
|
+
subagent: 'requirement-analyzer',
|
|
432
432
|
contextType: 'contract-only',
|
|
433
433
|
contextBudget: 6000,
|
|
434
434
|
});
|
|
@@ -436,7 +436,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
436
436
|
id: 'contract-done',
|
|
437
437
|
name: '契约定义完成检查',
|
|
438
438
|
next: platforms.length > 0 ? `platform-${platforms[0]}-prompt` : 'done',
|
|
439
|
-
subagent: '
|
|
439
|
+
subagent: 'requirement-analyzer',
|
|
440
440
|
contextType: 'incremental',
|
|
441
441
|
contextBudget: 4000,
|
|
442
442
|
});
|
|
@@ -451,7 +451,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
451
451
|
name: `Phase 2-${i + 1}: ${platform} 端专属文档生成`,
|
|
452
452
|
next: `platform-${platform}-done`,
|
|
453
453
|
// v8.3.166+: 端级 Subagent,每个端有独立的分析角色
|
|
454
|
-
subagent: `
|
|
454
|
+
subagent: `requirement-analyzer-${platform}`,
|
|
455
455
|
contextType: 'platform-only',
|
|
456
456
|
contextBudget: 8000,
|
|
457
457
|
});
|
|
@@ -459,7 +459,7 @@ async function createAnalyzePipeline(iteration, cwd, options) {
|
|
|
459
459
|
id: `platform-${platform}-done`,
|
|
460
460
|
name: `${platform} 端完成检查`,
|
|
461
461
|
next: nextId,
|
|
462
|
-
subagent: `
|
|
462
|
+
subagent: `requirement-analyzer-${platform}`,
|
|
463
463
|
contextType: 'incremental',
|
|
464
464
|
contextBudget: 4000,
|
|
465
465
|
});
|
|
@@ -561,7 +561,7 @@ async function createExecutePipeline(iteration, task, cwd) {
|
|
|
561
561
|
id: 'init',
|
|
562
562
|
name: '初始化执行环境',
|
|
563
563
|
next: 'prompt-analysis',
|
|
564
|
-
subagent: '
|
|
564
|
+
subagent: 'code-generator',
|
|
565
565
|
contextType: 'incremental',
|
|
566
566
|
contextBudget: 4000,
|
|
567
567
|
},
|
|
@@ -569,7 +569,7 @@ async function createExecutePipeline(iteration, task, cwd) {
|
|
|
569
569
|
id: 'prompt-analysis',
|
|
570
570
|
name: 'AI分析任务需求,生成代码实现方案',
|
|
571
571
|
next: 'code-generation',
|
|
572
|
-
subagent: '
|
|
572
|
+
subagent: 'code-generator',
|
|
573
573
|
contextType: 'full',
|
|
574
574
|
// v8.3.160+: 降为 10K(配合按需加载 REQ.md)
|
|
575
575
|
contextBudget: 10000,
|
|
@@ -578,7 +578,7 @@ async function createExecutePipeline(iteration, task, cwd) {
|
|
|
578
578
|
id: 'code-generation',
|
|
579
579
|
name: '生成代码文件',
|
|
580
580
|
next: 'quality-gate-build',
|
|
581
|
-
subagent: '
|
|
581
|
+
subagent: 'code-generator',
|
|
582
582
|
contextType: 'incremental',
|
|
583
583
|
contextBudget: 10000,
|
|
584
584
|
},
|
|
@@ -630,7 +630,7 @@ async function createGlobalAnalyzePipeline(cwd) {
|
|
|
630
630
|
id: 'init',
|
|
631
631
|
name: '初始化全局分析环境',
|
|
632
632
|
next: 'discovery',
|
|
633
|
-
subagent: '
|
|
633
|
+
subagent: 'global-analyzer',
|
|
634
634
|
contextType: 'full',
|
|
635
635
|
contextBudget: 6000,
|
|
636
636
|
},
|
|
@@ -638,7 +638,7 @@ async function createGlobalAnalyzePipeline(cwd) {
|
|
|
638
638
|
id: 'discovery',
|
|
639
639
|
name: '发现所有迭代和项目',
|
|
640
640
|
next: 'global-analysis',
|
|
641
|
-
subagent: '
|
|
641
|
+
subagent: 'global-analyzer',
|
|
642
642
|
contextType: 'full',
|
|
643
643
|
contextBudget: 8000,
|
|
644
644
|
},
|
|
@@ -646,7 +646,7 @@ async function createGlobalAnalyzePipeline(cwd) {
|
|
|
646
646
|
id: 'global-analysis',
|
|
647
647
|
name: '分析跨迭代依赖关系',
|
|
648
648
|
next: 'consistency-check',
|
|
649
|
-
subagent: '
|
|
649
|
+
subagent: 'global-analyzer',
|
|
650
650
|
contextType: 'full',
|
|
651
651
|
// v8.3.160+: 降为 10K(discovery 已提供迭代摘要,无需全量加载)
|
|
652
652
|
contextBudget: 10000,
|
|
@@ -655,7 +655,7 @@ async function createGlobalAnalyzePipeline(cwd) {
|
|
|
655
655
|
id: 'consistency-check',
|
|
656
656
|
name: '检查全局一致性',
|
|
657
657
|
next: 'report-generation',
|
|
658
|
-
subagent: '
|
|
658
|
+
subagent: 'global-analyzer',
|
|
659
659
|
contextType: 'incremental',
|
|
660
660
|
contextBudget: 8000,
|
|
661
661
|
},
|
|
@@ -663,7 +663,7 @@ async function createGlobalAnalyzePipeline(cwd) {
|
|
|
663
663
|
id: 'report-generation',
|
|
664
664
|
name: '生成全局报告',
|
|
665
665
|
next: 'done',
|
|
666
|
-
subagent: '
|
|
666
|
+
subagent: 'global-analyzer',
|
|
667
667
|
contextType: 'incremental',
|
|
668
668
|
contextBudget: 8000,
|
|
669
669
|
},
|