speccore 8.3.249 → 8.3.251
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-once/SKILL.md +3 -2
- package/.agents/skills/speccore-router/SKILL.md +3 -3
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +62 -6
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +66 -6
- package/dist/commands/iteration/split.js.map +1 -1
- package/package.json +1 -1
|
@@ -25,7 +25,8 @@ disable-model-invocation: false
|
|
|
25
25
|
先识别用户给了什么,按入口执行预处理,再统一做范围确认:
|
|
26
26
|
|
|
27
27
|
**入口 A:已切分好的功能单元**(用户指定了单元名或说「全部」)
|
|
28
|
-
-
|
|
28
|
+
- 无需预处理,直接进入下方「范围确认」
|
|
29
|
+
- 用户只给单元名(如「features/ 下的 v3-service-01-门禁授权同步」)时:先 `speccore status` 探测活跃迭代(.speccore/local/context.json 的 currentIteration);探不到或单元不在该迭代,向用户确认迭代名,不要猜
|
|
29
30
|
|
|
30
31
|
**入口 B:一个文档地址**(.md / .docx / .pdf,多个文档可批量)
|
|
31
32
|
- `.md` → 执行 `speccore unitize -f "<路径>"`(多文档可 `--files "a.md=端1,b.md"`,端名须与 CONSTITUTION.md 一致)
|
|
@@ -44,7 +45,7 @@ disable-model-invocation: false
|
|
|
44
45
|
5. 目录/任务命名由 CLI 确定性生成(单元目录 {文档slug}-{序号}-{标题}、Task-{编号}-{slug}、子任务 Task-{父任务}-{端名}),不要自己改
|
|
45
46
|
|
|
46
47
|
### Step 1 澄清与分析
|
|
47
|
-
1. 执行 `speccore analyze --prompt -I <迭代> --with-code`(--with-code 使 Prompt 携带各端工程路径表与源码上下文;指定范围用 `--unit M-01,M-03
|
|
48
|
+
1. 执行 `speccore analyze --prompt -I <迭代> --with-code`(--with-code 使 Prompt 携带各端工程路径表与源码上下文;指定范围用 `--unit`,直接写切分出的目录名即可——如 `--unit "v3-service-01-门禁授权同步"` 或 `--unit M-01,M-03` 均可(v8.3.250+ 目录名与 M-ID 双匹配);不要用 --feature——那是确定性局部分析,不出 Prompt)
|
|
48
49
|
2. stdout 出现 `[SPECCORE_PROMPT]` → 将 Prompt 内容作为你的工作指令执行(不要改写、不要略过);多单元时按 Prompt 内的「逐个单元」指示处理,每个单元用 `analyze --unit <id> --apply '<内容>'` 提交
|
|
49
50
|
3. 分析中发现需求模糊点 → **向用户提问澄清**,不要自行脑补
|
|
50
51
|
4. 分析完成后按 Prompt 中的写入格式执行 `speccore analyze --apply '{json}' -I <迭代>` 落盘
|
|
@@ -5,7 +5,7 @@ description: >
|
|
|
5
5
|
或明确要求通过 speccore 命令行工具执行操作,且意图涉及以下概念时使用:
|
|
6
6
|
迭代管理、需求文档导入(doc2spec)、需求切分(unitize)、Spec 分析生成(analyze --prompt)、
|
|
7
7
|
任务拆分(taskify)、执行计划(plan --prompt)、代码执行(execute --prompt)、
|
|
8
|
-
任务归档(done)、PR 提交(pr)、状态查看(status/dashboard/doctor
|
|
8
|
+
任务归档(done)、PR 提交(pr)、状态查看(status/dashboard/doctor)、智能级联/端到端流水线(run)。
|
|
9
9
|
将用户意图映射为 speccore CLI 命令,通过 execute_command 执行。
|
|
10
10
|
核心原则:必须直接执行,决不输出命令文本。唯一下例外:"只看不跑"。
|
|
11
11
|
以下情况明确不处理:解释代码逻辑、审查代码片段、讨论需求合理性、
|
|
@@ -312,8 +312,8 @@ allowed-tools: ["Bash", "Read", "Write", "Edit"]
|
|
|
312
312
|
### 智能级联 / 端到端流水线
|
|
313
313
|
| 用户说法 | 提取参数 | CLI 命令 |
|
|
314
314
|
| :--- | :--- | :--- |
|
|
315
|
-
| 智能级联/全流程推进 | - | `speccore
|
|
316
|
-
| 推进项目/继续开发 | - | `speccore
|
|
315
|
+
| 智能级联/全流程推进 | - | `speccore run` |
|
|
316
|
+
| 推进项目/继续开发 | - | `speccore run --auto` |
|
|
317
317
|
| 全自动推进/跑流水线 | - | `speccore run` |
|
|
318
318
|
| 端到端/一键开发/自动开发 | demand? | `speccore run "{demand}"` |
|
|
319
319
|
| {一句话需求描述}(如"做积分功能") | demand | `speccore run "{demand}"` |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAkFA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6ND,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAkFA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6ND,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA43E3E;AA68BD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuzEvW;AAmoBD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,kCAAkC,CAAC;AAE/D,oBAAoB;AACpB,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAqFrF;AAED,kBAAkB;AAClB,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F;AAED,iBAAiB;AACjB,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBjF;AAED,iBAAiB;AACjB,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAe/G;AAcD,oCAAoC;AACpC,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EAAE,EACtB,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CAmFjB;AAkBD,2BAA2B;AAC3B,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CA0EjB;AAiRD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8D7H"}
|
package/dist/commands/analyze.js
CHANGED
|
@@ -754,7 +754,22 @@ async function analyzeCommand(options) {
|
|
|
754
754
|
// 3c. --unit: 指定单元(支持逗号分隔多个,如 M-01,M-03)
|
|
755
755
|
if (options.unit) {
|
|
756
756
|
targetUnitIds = options.unit.split(',').map(s => s.trim()).filter(Boolean);
|
|
757
|
-
|
|
757
|
+
// v8.3.249+: 支持目录名直接指定——unitize 切分的目录名(如 v3-service-01-门禁授权同步)
|
|
758
|
+
// 与缓存 M-ID 体系无映射,仅按 u.id 匹配会让用户面对目录名无法指定单元
|
|
759
|
+
const matchUnit = (q, list) => list.some(u => u.id === q || u.name === q);
|
|
760
|
+
let invalid = targetUnitIds.filter(id => !matchUnit(id, units));
|
|
761
|
+
// v8.3.249+: unitize/doc2spec 切分不写 units.json 缓存,新切分的单元不在缓存清单中——
|
|
762
|
+
// 回退磁盘提取(features/ 目录)合并后再匹配,避免「刚切完就找不到」的断层
|
|
763
|
+
if (invalid.length > 0) {
|
|
764
|
+
const diskUnits = await extractIterationUnits(iterDir);
|
|
765
|
+
if (diskUnits.length > units.length) {
|
|
766
|
+
units = diskUnits;
|
|
767
|
+
await (0, fs_extra_1.ensureDir)((0, path_1.dirname)(unitsCachePath));
|
|
768
|
+
await (0, fs_extra_1.writeFile)(unitsCachePath, JSON.stringify(units, null, 2));
|
|
769
|
+
logger_1.logger.info(`📋 检测到新切分单元,清单已刷新: ${units.length} 个`);
|
|
770
|
+
invalid = targetUnitIds.filter(id => !matchUnit(id, units));
|
|
771
|
+
}
|
|
772
|
+
}
|
|
758
773
|
if (invalid.length > 0) {
|
|
759
774
|
logger_1.logger.error(`未找到功能单元: ${invalid.join(', ')}`);
|
|
760
775
|
logger_1.logger.info(` 可用单元: ${units.map(u => u.id).join(', ')}`);
|
|
@@ -762,7 +777,7 @@ async function analyzeCommand(options) {
|
|
|
762
777
|
}
|
|
763
778
|
}
|
|
764
779
|
const targetUnits = targetUnitIds
|
|
765
|
-
.map(id => units.find(u => u.id === id))
|
|
780
|
+
.map(id => units.find(u => u.id === id || u.name === id))
|
|
766
781
|
.filter((u) => !!u);
|
|
767
782
|
// 单单元:保持原有行为
|
|
768
783
|
if (targetUnits.length === 1) {
|
|
@@ -774,9 +789,29 @@ async function analyzeCommand(options) {
|
|
|
774
789
|
return;
|
|
775
790
|
}
|
|
776
791
|
if (options.apply) {
|
|
777
|
-
//
|
|
778
|
-
|
|
779
|
-
|
|
792
|
+
// v8.3.249+: 此前为“空实现”——只打印「已接收」但 [DOC:xxx] 内容从不落盘,
|
|
793
|
+
// AI 认真提交后产物丢失,taskify 拿不到分析结果。现在真正解析写入。
|
|
794
|
+
const docBlocks = parseDocMarkers(options.apply);
|
|
795
|
+
if (docBlocks.size === 0) {
|
|
796
|
+
logger_1.logger.warn('⚠️ 未检测到 [DOC:xxx] 标记,请按 prompt 格式输出');
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
const specDir = getUnitSpecDir(iterDir, targetUnit);
|
|
800
|
+
await (0, fs_extra_1.ensureDir)(specDir);
|
|
801
|
+
let written = 0;
|
|
802
|
+
for (const [docName, content] of docBlocks) {
|
|
803
|
+
const safeName = (0, path_1.basename)(docName);
|
|
804
|
+
if (!/^[A-Za-z_][A-Za-z0-9_-]*\.(md|yaml)$/.test(safeName))
|
|
805
|
+
continue;
|
|
806
|
+
if (content.trim().length < 50) {
|
|
807
|
+
logger_1.logger.warn(` ⏭️ 跳过 ${safeName}(内容过短)`);
|
|
808
|
+
continue;
|
|
809
|
+
}
|
|
810
|
+
await (0, fs_extra_1.writeFile)((0, path_1.join)(specDir, safeName), content.trim());
|
|
811
|
+
written++;
|
|
812
|
+
}
|
|
813
|
+
logger_1.logger.success(`✅ 功能单元 ${targetUnit.id} 分析结果已写入 ${written} 个文档`);
|
|
814
|
+
logger_1.logger.info(` 📂 020-specs/${sanitizeUnitDirName(targetUnit.name)}/overview/`);
|
|
780
815
|
return;
|
|
781
816
|
}
|
|
782
817
|
logger_1.logger.info(`📋 功能单元: ${targetUnit.id} ${targetUnit.name}`);
|
|
@@ -6834,9 +6869,27 @@ async function consolidateUnitAnalyses(iteration, units, analyses) {
|
|
|
6834
6869
|
lines.push('');
|
|
6835
6870
|
return lines.join('\n');
|
|
6836
6871
|
}
|
|
6872
|
+
/**
|
|
6873
|
+
* v8.3.249+: 构建「各端工程路径」段——从 CONSTITUTION.md 工程表解析各端源码路径。
|
|
6874
|
+
* 单元级/全量分析 prompt 共用,避免 AI 自行翻表定位源码。解析失败时返回空串不阻断。
|
|
6875
|
+
*/
|
|
6876
|
+
async function buildProjectPathsSection() {
|
|
6877
|
+
try {
|
|
6878
|
+
const projectInfoMap = await (0, spec_paths_1.parseProjectInfo)();
|
|
6879
|
+
if (projectInfoMap.size === 0)
|
|
6880
|
+
return '';
|
|
6881
|
+
const lines = [];
|
|
6882
|
+
for (const [identifier, info] of projectInfoMap) {
|
|
6883
|
+
lines.push(`- \`${identifier}\`(${info.projectType || '-'})→ \`${info.srcPath}\``);
|
|
6884
|
+
}
|
|
6885
|
+
return lines.join('\n') + '\n';
|
|
6886
|
+
}
|
|
6887
|
+
catch { /* 路径解析失败不阻断分析 */
|
|
6888
|
+
return '';
|
|
6889
|
+
}
|
|
6890
|
+
}
|
|
6837
6891
|
/** 构建单个功能单元的深度分析 Prompt */
|
|
6838
6892
|
async function buildUnitAnalysisPrompt(iterDir, iteration, unit, allUnits) {
|
|
6839
|
-
// 使用智能上下文组装引擎(三层上下文模型)
|
|
6840
6893
|
const unitRef = { id: unit.id, name: unit.name, content: unit.content };
|
|
6841
6894
|
const allUnitRefs = allUnits.map(u => ({ id: u.id, name: u.name, content: u.content }));
|
|
6842
6895
|
const ctxResult = await (0, unit_context_assembler_1.assembleUnitContext)(iterDir, iteration, unitRef, allUnitRefs, {
|
|
@@ -6855,6 +6908,9 @@ async function buildUnitAnalysisPrompt(iterDir, iteration, unit, allUnits) {
|
|
|
6855
6908
|
- 全迭代共 ${allUnits.length} 个功能单元
|
|
6856
6909
|
- 上下文预算: ${ctxResult.stats.estimatedTokens} tokens (核心${ctxResult.stats.coreChars}字符 + 关联${ctxResult.stats.relatedUnitChars + ctxResult.stats.codeChars}字符 + 全局${ctxResult.stats.globalChars}字符)
|
|
6857
6910
|
|
|
6911
|
+
## 各端工程路径(结合源码分析时按此定位)
|
|
6912
|
+
${await buildProjectPathsSection()}
|
|
6913
|
+
|
|
6858
6914
|
## 需求上下文
|
|
6859
6915
|
${ctxResult.context}
|
|
6860
6916
|
|