speccore 6.18.3 → 6.30.0

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.
Files changed (73) hide show
  1. package/.agents/skills/spec-execute/SKILL.md +7 -3
  2. package/dist/cli.js +1 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/analyze.d.ts +1 -0
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +234 -47
  7. package/dist/commands/analyze.js.map +1 -1
  8. package/dist/commands/context-output.d.ts.map +1 -1
  9. package/dist/commands/context-output.js +19 -10
  10. package/dist/commands/context-output.js.map +1 -1
  11. package/dist/commands/doc2spec.js +1 -1
  12. package/dist/commands/doc2spec.js.map +1 -1
  13. package/dist/commands/execute.d.ts.map +1 -1
  14. package/dist/commands/execute.js +383 -101
  15. package/dist/commands/execute.js.map +1 -1
  16. package/dist/commands/global-status.js +2 -2
  17. package/dist/commands/global-status.js.map +1 -1
  18. package/dist/commands/import.d.ts +1 -1
  19. package/dist/commands/import.js +2 -4
  20. package/dist/commands/import.js.map +1 -1
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +36 -282
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/iteration/create.js +7 -10
  25. package/dist/commands/iteration/create.js.map +1 -1
  26. package/dist/commands/iteration/split.js +296 -131
  27. package/dist/commands/iteration/split.js.map +1 -1
  28. package/dist/commands/iteration-from-global.js +1 -1
  29. package/dist/commands/retro.d.ts.map +1 -1
  30. package/dist/commands/retro.js +60 -3
  31. package/dist/commands/retro.js.map +1 -1
  32. package/dist/commands/status-panel.d.ts.map +1 -1
  33. package/dist/commands/status-panel.js +24 -8
  34. package/dist/commands/status-panel.js.map +1 -1
  35. package/dist/commands/synthesize.d.ts +2 -2
  36. package/dist/commands/synthesize.js +146 -196
  37. package/dist/commands/synthesize.js.map +1 -1
  38. package/dist/commands/task/new.js +43 -26
  39. package/dist/commands/task/new.js.map +1 -1
  40. package/dist/core/ai-context-generator.js +1 -1
  41. package/dist/core/analyze-engine.d.ts.map +1 -1
  42. package/dist/core/analyze-engine.js +307 -9
  43. package/dist/core/analyze-engine.js.map +1 -1
  44. package/dist/core/execution-state.d.ts +24 -0
  45. package/dist/core/execution-state.d.ts.map +1 -1
  46. package/dist/core/execution-state.js +135 -0
  47. package/dist/core/execution-state.js.map +1 -1
  48. package/dist/core/knowledge-graph.d.ts.map +1 -1
  49. package/dist/core/knowledge-graph.js +190 -65
  50. package/dist/core/knowledge-graph.js.map +1 -1
  51. package/dist/core/next-steps.js +2 -2
  52. package/dist/core/next-steps.js.map +1 -1
  53. package/dist/core/prompt-builder.d.ts.map +1 -1
  54. package/dist/core/prompt-builder.js +43 -22
  55. package/dist/core/prompt-builder.js.map +1 -1
  56. package/dist/core/quality-audit.d.ts +41 -0
  57. package/dist/core/quality-audit.d.ts.map +1 -0
  58. package/dist/core/quality-audit.js +345 -0
  59. package/dist/core/quality-audit.js.map +1 -0
  60. package/dist/core/rag-engine.d.ts.map +1 -1
  61. package/dist/core/rag-engine.js +38 -6
  62. package/dist/core/rag-engine.js.map +1 -1
  63. package/dist/core/spec-merger.d.ts.map +1 -1
  64. package/dist/core/spec-merger.js +22 -27
  65. package/dist/core/spec-merger.js.map +1 -1
  66. package/dist/core/validator.d.ts.map +1 -1
  67. package/dist/core/validator.js +43 -0
  68. package/dist/core/validator.js.map +1 -1
  69. package/dist/core/verify-engine.d.ts +1 -1
  70. package/dist/core/verify-engine.d.ts.map +1 -1
  71. package/dist/core/verify-engine.js +71 -8
  72. package/dist/core/verify-engine.js.map +1 -1
  73. package/package.json +1 -1
@@ -150,42 +150,59 @@ async function createSingleTask(options) {
150
150
  spinner.fail(`Task already exists: Task-${taskId}`);
151
151
  return;
152
152
  }
153
- // Create directories — 新任务目录结构
153
+ // Create directories — 三级嵌套目录结构
154
154
  const today = new Date().toISOString().split('T')[0];
155
+ const status = options.schedule === 'night' ? 'queue' : 'todo';
155
156
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '.meta'));
156
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '_shared'));
157
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '99-artifacts'));
158
- if (!options.frontendOnly) {
159
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '10-backend', 'src'));
160
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '10-backend', 'tests'));
161
- }
162
- if (!options.backendOnly) {
163
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '20-frontend', 'src'));
164
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '20-frontend', 'tests'));
157
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '00-specs'));
158
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '_shared')); // 共享契约(API_CONTRACT.yaml 等)
159
+ // 创建子任务目录(新结构: 10-backend/{服务}/{子任务}/ + 20-frontend/{端}/{子任务}/)
160
+ const isResearch = taskType === 'research';
161
+ if (!isResearch) {
162
+ if (!options.frontendOnly) {
163
+ const backendSubtaskDir = (0, path_1.join)(taskDir, '10-backend', 'api', 'impl');
164
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(backendSubtaskDir, '.meta'));
165
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(backendSubtaskDir, 'src'));
166
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(backendSubtaskDir, 'tests'));
167
+ // 子任务元信息
168
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(backendSubtaskDir, '.meta', 'type'), options.type || 'feature');
169
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(backendSubtaskDir, '.meta', 'status'), status);
170
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(backendSubtaskDir, '.meta', 'owner'), '未分配');
171
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(backendSubtaskDir, '.meta', 'created-at'), today);
172
+ }
173
+ if (!options.backendOnly) {
174
+ const frontendSubtaskDir = (0, path_1.join)(taskDir, '20-frontend', 'web', 'impl');
175
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(frontendSubtaskDir, '.meta'));
176
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(frontendSubtaskDir, 'src'));
177
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(frontendSubtaskDir, 'tests'));
178
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSubtaskDir, '.meta', 'type'), options.type || 'feature');
179
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSubtaskDir, '.meta', 'status'), status);
180
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSubtaskDir, '.meta', 'owner'), '未分配');
181
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSubtaskDir, '.meta', 'created-at'), today);
182
+ }
165
183
  }
166
184
  // Write task meta
167
185
  await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.meta', 'type'), options.type || 'feature');
168
- const status = options.schedule === 'night' ? 'queue' : 'todo';
169
186
  await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.meta', 'status'), status);
170
187
  await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.meta', 'owner'), '未分配');
171
188
  await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.meta', 'created-at'), today);
172
189
  // Generate task content
173
190
  const taskContent = await generateTaskContent(options);
174
- // Write core specs to _shared/
175
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '_shared', 'REQ.md'), taskContent.req);
176
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '_shared', 'TECH.md'), taskContent.tech);
177
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '_shared', 'CHANGELOG.md'), `# ${options.name} - 变更记录\n\n| 时间 | 版本 | 变更内容 | 变更人 |\n| :--- | :--- | :--- | :--- |\n| ${today} | v1.0 | 初始创建 | CLI |\n`);
178
- // Write per-platform TASK.md (each platform gets its own sub-task)
179
- if (!options.frontendOnly) {
180
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'backend', 'src'));
181
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'backend', 'tests'));
182
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TASK.md'), taskContent.task);
183
- }
184
- if (!options.backendOnly) {
185
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'frontend', 'src'));
186
- await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'frontend', 'tests'));
187
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'frontend', 'TASK.md'), taskContent.task);
188
- await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'frontend', 'README.md'), `# ${options.name}\n\n前端实现目录。\n`);
191
+ // Write core specs to 00-specs/
192
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '00-specs', 'REQ.md'), taskContent.req);
193
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '00-specs', 'TECH.md'), taskContent.tech);
194
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '00-specs', 'CHANGELOG.md'), `# ${options.name} - 变更记录\n\n| 时间 | 版本 | 变更内容 | 变更人 |\n| :--- | :--- | :--- | :--- |\n| ${today} | v1.0 | 初始创建 | CLI |\n`);
195
+ // Write per-platform TASK.md + 执行产出文档(新结构: 子任务目录下)
196
+ if (!isResearch) {
197
+ if (!options.frontendOnly) {
198
+ const backendSub = (0, path_1.join)(taskDir, '10-backend', 'api', 'impl');
199
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(backendSub, 'TASK.md'), taskContent.task);
200
+ }
201
+ if (!options.backendOnly) {
202
+ const frontendSub = (0, path_1.join)(taskDir, '20-frontend', 'web', 'impl');
203
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSub, 'TASK.md'), taskContent.task);
204
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(frontendSub, 'README.md'), `# ${options.name}\n\n前端实现目录。\n`);
205
+ }
189
206
  }
190
207
  // Pre-create issues tracker
191
208
  await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.issues.md'), `# ${options.name} - 问题追踪\n\n> 执行过程中发现的问题记录于此。\n\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"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"}
@@ -174,7 +174,7 @@ ${Object.entries(modules).map(([name, files]) => `**${name}** (${files.length}
174
174
  ? `Iteration-${iteration}/030-tasks/${taskId}/00-specs/ANALYSIS.md`
175
175
  : `Iteration-${iteration || 'current'}/020-specs/ANALYSIS.md`}**
176
176
 
177
- 同时参考填充同目录下的 TECH.md、TEST.md、REVIEW.md、RISK.md、DEPS.md、MONITOR.md 模板文件。
177
+ 同时参考填充同目录下的 TECH.md、TEST.md、REVIEW.md、RISK.md、DEPS.md、MONITOR.md、UI_SPEC.md 模板文件。
178
178
  `;
179
179
  }
180
180
  // ── 文件树构建 ──
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-engine.d.ts","sourceRoot":"","sources":["../../src/core/analyze-engine.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAMD,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoI9E;AAmqCD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoDxD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA8CxD;AA+GD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsJnC;AAsBD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,CA2F/B"}
1
+ {"version":3,"file":"analyze-engine.d.ts","sourceRoot":"","sources":["../../src/core/analyze-engine.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAMD,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoI9E;AA4wCD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoDxD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA8CxD;AA+GD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsJnC;AAsBD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,CAkG/B"}
@@ -29,6 +29,7 @@ const ai_context_generator_1 = require("./ai-context-generator");
29
29
  const git_integration_1 = require("./git-integration");
30
30
  const rag_engine_1 = require("./rag-engine");
31
31
  const knowledge_graph_1 = require("./knowledge-graph");
32
+ const quality_audit_1 = require("./quality-audit");
32
33
  // ================================================================
33
34
  // 主入口
34
35
  // ================================================================
@@ -220,6 +221,13 @@ async function analyzeRequirements(input) {
220
221
  await writePerFeature(iterDir, report, input.output || 'ANALYSIS.md');
221
222
  // 按类型输出扁平文件到 020-specs/{bugs,refactors,research}/
222
223
  await writePerTypedDoc(iterDir, report, input.output || 'ANALYSIS.md');
224
+ // ── 质量核验:检查 AI 生成文档的端专业性 ──
225
+ try {
226
+ const platforms = await detectPlatformsFromConstitution();
227
+ const specDir = (0, path_1.join)(iterDir, '020-specs');
228
+ await (0, quality_audit_1.generateQualityAudit)(specDir, platforms);
229
+ }
230
+ catch { } // 非关键,静默失败
223
231
  }
224
232
  // ── 生成 AI 上下文(传入已读取的需求内容,避免重复 readFile) ──
225
233
  try {
@@ -1119,10 +1127,12 @@ async function buildAIEnhancedReport(input, scope, params) {
1119
1127
  r += `### 必须完成\n`;
1120
1128
  r += `- [ ] **需求完整性分析**: 功能点覆盖、边界条件、异常处理、非功能需求\n`;
1121
1129
  r += `- [ ] **需求-代码对标**: 将每个功能点映射到具体源码文件和方法\n`;
1130
+ r += `- [ ] **前后端契约对标**: 每个 API 的请求/响应字段与前端页面字段一一映射,确保无遗漏\n`;
1122
1131
  r += `- [ ] **变更影响范围**: 评估每个变更的波及面和级联影响\n`;
1123
1132
  r += `- [ ] **风险矩阵填充**: 补充技术/业务/依赖/安全/性能风险详情\n`;
1124
1133
  r += `- [ ] **文件级变更清单**: 列出所有需要修改的文件及修改类型\n`;
1125
1134
  r += `### 可选\n`;
1135
+ r += `- [ ] **UI 规格补充**: 根据 UI_SPEC.md 校验页面/组件/字段映射完整性\n`;
1126
1136
  r += `- [ ] **任务拆分建议**: 推荐任务粒度和依赖关系\n`;
1127
1137
  r += `- [ ] **技术方案推荐**: 架构方案、DB 设计、API 设计建议\n`;
1128
1138
  r += `- [ ] **工时评估**: 基于改动范围的工时估算\n`;
@@ -1135,7 +1145,7 @@ async function buildAIEnhancedReport(input, scope, params) {
1135
1145
  }
1136
1146
  // 8. 确认清单
1137
1147
  r += `\n---\n\n## ✅ 确认清单\n\n`;
1138
- r += `- [ ] AI 分析完成\n- [ ] 需求确认无遗漏\n- [ ] 改动范围达成共识\n- [ ] 风险评估无遗漏\n- [ ] 技术方案评审通过\n- [ ] 可以开始拆分任务\n`;
1148
+ r += `- [ ] AI 分析完成\n- [ ] 需求确认无遗漏\n- [ ] 前后端契约对齐(API 字段↔ UI 字段)\n- [ ] UI 规格审查通过\n- [ ] 改动范围达成共识\n- [ ] 风险评估无遗漏\n- [ ] 技术方案评审通过\n- [ ] 可以开始拆分任务\n`;
1139
1149
  return r;
1140
1150
  }
1141
1151
  // ================================================================
@@ -1149,7 +1159,7 @@ function icon(severity) {
1149
1159
  default: return '⚪';
1150
1160
  }
1151
1161
  }
1152
- /** 按需求功能 × 端 分目录写入分析报告 */
1162
+ /** 按需求功能 × 端 分目录写入分析报告(按端提取差异化内容) */
1153
1163
  async function writePerPlatform(iterDir, report, filename) {
1154
1164
  const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1155
1165
  const specsBase = (0, path_1.join)(iterDir, '020-specs');
@@ -1158,7 +1168,7 @@ async function writePerPlatform(iterDir, report, filename) {
1158
1168
  // 检测需求功能目录(非 assets/sources/_开头的子目录)
1159
1169
  const features = entries
1160
1170
  .filter(e => e.isDirectory() && !e.name.startsWith('_') && !e.name.startsWith('.')
1161
- && e.name !== 'sources' && e.name !== 'assets')
1171
+ && e.name !== 'sources' && e.name !== 'assets' && e.name !== 'prototypes')
1162
1172
  .map(e => e.name);
1163
1173
  if (features.length === 0)
1164
1174
  return;
@@ -1167,10 +1177,13 @@ async function writePerPlatform(iterDir, report, filename) {
1167
1177
  for (const platform of platforms) {
1168
1178
  const platformDir = (0, path_1.join)(specsBase, platform);
1169
1179
  await (0, fs_extra_1.ensureDir)(platformDir);
1170
- // 写合并报告 + 每个 feature 独立文件
1171
- await (0, fs_extra_1.writeFile)((0, path_1.join)(platformDir, filename), report);
1180
+ // 按端提取差异化内容(而非写入同一份报告)
1181
+ const platformReport = extractPlatformContent(report, platform);
1182
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(platformDir, filename), platformReport);
1172
1183
  for (const feature of features) {
1173
- await (0, fs_extra_1.writeFile)((0, path_1.join)(platformDir, `${feature}.md`), report);
1184
+ // 每个 feature 文件也按端提取
1185
+ const featureContent = extractFeatureForPlatform(report, feature, platform);
1186
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(platformDir, `${feature}.md`), featureContent);
1174
1187
  }
1175
1188
  }
1176
1189
  }
@@ -1178,6 +1191,89 @@ async function writePerPlatform(iterDir, report, filename) {
1178
1191
  // 目录不存在,静默跳过
1179
1192
  }
1180
1193
  }
1194
+ /** 端关键词映射表(用于从合并报告中提取特定端的内容) */
1195
+ const PLATFORM_KEYWORDS = {
1196
+ admin: ['后台管理', '管理端', 'admin', 'Admin', 'Web管理', '后台'],
1197
+ h5: ['H5', 'h5', '移动端', 'mobile', 'Mobile', 'H5移动'],
1198
+ miniapp: ['小程序', 'miniapp', 'MiniApp', '微信'],
1199
+ app: ['后端服务', 'app', 'App', '服务端', '后端'],
1200
+ web: ['Web', 'web', '桌面端', 'PC'],
1201
+ android: ['Android', 'android', '安卓'],
1202
+ ios: ['iOS', 'ios', '苹果'],
1203
+ };
1204
+ /** 从合并报告中提取特定端的内容 */
1205
+ function extractPlatformContent(report, platform) {
1206
+ const keywords = PLATFORM_KEYWORDS[platform] || [platform];
1207
+ const lines = report.split('\n');
1208
+ // 按 Markdown 二级标题拆分
1209
+ const sections = [];
1210
+ let current = { heading: '', content: [] };
1211
+ for (const line of lines) {
1212
+ const hm = line.match(/^(#{1,3})\s+(.+)/);
1213
+ if (hm) {
1214
+ if (current.heading || current.content.length > 0) {
1215
+ sections.push({ heading: current.heading, content: current.content });
1216
+ }
1217
+ current = { heading: line, content: [] };
1218
+ }
1219
+ else {
1220
+ current.content.push(line);
1221
+ }
1222
+ }
1223
+ if (current.heading || current.content.length > 0) {
1224
+ sections.push({ heading: current.heading, content: current.content });
1225
+ }
1226
+ // 提取与该端相关的段落
1227
+ const matched = sections.filter(s => {
1228
+ const text = s.heading + ' ' + s.content.join(' ');
1229
+ return keywords.some(kw => text.includes(kw));
1230
+ });
1231
+ if (matched.length > 0) {
1232
+ const platformLabel = platform.charAt(0).toUpperCase() + platform.slice(1);
1233
+ const header = `<!-- 以下为 ${platformLabel} 端相关内容(从合并报告中自动提取) -->\n\n`;
1234
+ return header + matched.map(s => s.heading + '\n' + s.content.join('\n')).join('\n\n');
1235
+ }
1236
+ // 无匹配段落时,返回完整报告 + 标注
1237
+ return `<!-- ⚠️ 未找到 ${platform} 端专属内容,以下为完整报告,建议补充该端专属章节 -->\n\n${report}`;
1238
+ }
1239
+ /** 从报告中提取特定功能 × 特定端的内容 */
1240
+ function extractFeatureForPlatform(report, feature, platform) {
1241
+ // 先提取该功能的段落
1242
+ const featureKeywords = [feature, feature.replace(/-/g, ' ')];
1243
+ const lines = report.split('\n');
1244
+ const sections = [];
1245
+ let current = { heading: '', content: [] };
1246
+ for (const line of lines) {
1247
+ const hm = line.match(/^(#{1,4})\s+(.+)/);
1248
+ if (hm) {
1249
+ if (current.heading || current.content.length > 0) {
1250
+ sections.push({ heading: current.heading, content: current.content });
1251
+ }
1252
+ current = { heading: line, content: [] };
1253
+ }
1254
+ else {
1255
+ current.content.push(line);
1256
+ }
1257
+ }
1258
+ if (current.heading || current.content.length > 0) {
1259
+ sections.push({ heading: current.heading, content: current.content });
1260
+ }
1261
+ // 先按功能名匹配,再按端关键词过滤
1262
+ const featureSections = sections.filter(s => {
1263
+ const text = (s.heading + ' ' + s.content.join(' ')).toLowerCase();
1264
+ return featureKeywords.some(kw => text.includes(kw.toLowerCase()));
1265
+ });
1266
+ if (featureSections.length > 0) {
1267
+ const platformKws = PLATFORM_KEYWORDS[platform] || [platform];
1268
+ const platformMatched = featureSections.filter(s => {
1269
+ const text = s.heading + ' ' + s.content.join(' ');
1270
+ return platformKws.some(kw => text.includes(kw));
1271
+ });
1272
+ const result = platformMatched.length > 0 ? platformMatched : featureSections;
1273
+ return result.map(s => s.heading + '\n' + s.content.join('\n')).join('\n\n');
1274
+ }
1275
+ return `# ${feature} (${platform})\n\n_该功能在 ${platform} 端暂无独立分析内容,请参考完整报告。_\n`;
1276
+ }
1181
1277
  /**
1182
1278
  * 局部分析:只分析单个功能模块,写入 020-specs/features/{feature}.md
1183
1279
  * 用于 --feature 模式,避免全量重跑
@@ -1285,7 +1381,7 @@ async function writePerFeature(iterDir, report, filename) {
1285
1381
  const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1286
1382
  const featuresDir = (0, path_1.join)(iterDir, '020-specs', 'features');
1287
1383
  // 非 feature 型目录的排除名单
1288
- const EXCLUDED_DIRS = new Set(['sources', 'assets', 'converted', 'staging', 'bugs', 'refactors', 'research']);
1384
+ const EXCLUDED_DIRS = new Set(['sources', 'assets', 'converted', 'staging', 'bugs', 'refactors', 'research', 'prototypes']);
1289
1385
  try {
1290
1386
  const entries = await (0, fs_extra_1.readdir)(reqDir, { withFileTypes: true });
1291
1387
  const features = entries
@@ -1563,6 +1659,7 @@ async function generateSpecsFromRequirements(reqPaths, iteration, specDir) {
1563
1659
  const features = extractFeatures(fullContent);
1564
1660
  const dataModels = extractDataModels(fullContent);
1565
1661
  const businessRules = extractBusinessRules(fullContent);
1662
+ const uiPatterns = extractUIPatterns(fullContent);
1566
1663
  const archImpact = await analyzeArchitectureImpact(fullContent);
1567
1664
  const platforms = await detectPlatformsFromConstitution();
1568
1665
  const now = new Date().toISOString().split('T')[0];
@@ -1576,7 +1673,7 @@ async function generateSpecsFromRequirements(reqPaths, iteration, specDir) {
1576
1673
  // TECH.md — 技术方案
1577
1674
  files.push({
1578
1675
  filename: 'TECH.md',
1579
- content: buildTechSpec(iteration, now, apis, dataModels, archImpact, platforms, features),
1676
+ content: buildTechSpec(iteration, now, apis, dataModels, archImpact, platforms, features, uiPatterns),
1580
1677
  });
1581
1678
  // TEST.md — 测试计划
1582
1679
  files.push({
@@ -1603,6 +1700,11 @@ async function generateSpecsFromRequirements(reqPaths, iteration, specDir) {
1603
1700
  filename: 'MONITOR.md',
1604
1701
  content: buildMonitorSpec(iteration, now, apis, features),
1605
1702
  });
1703
+ // UI_SPEC.md — 前端 UI 规格
1704
+ files.push({
1705
+ filename: 'UI_SPEC.md',
1706
+ content: buildUISpec(iteration, now, uiPatterns),
1707
+ });
1606
1708
  // 4. 写入文件(覆盖空模板,不覆盖已有实质内容的文件)
1607
1709
  let withContent = 0;
1608
1710
  let skipped = 0;
@@ -1774,7 +1876,7 @@ function buildRequirementSpec(iter, now, features, apis, models, rules) {
1774
1876
  }
1775
1877
  return md;
1776
1878
  }
1777
- function buildTechSpec(iter, now, apis, models, archImpact, platforms, features) {
1879
+ function buildTechSpec(iter, now, apis, models, archImpact, platforms, features, uiPatterns) {
1778
1880
  let md = `# 技术方案\n\n> 迭代: ${iter} | 生成: ${now} | 由 analyze --auto 自动提取\n\n`;
1779
1881
  // 架构
1780
1882
  md += `## 1. 整体架构\n\n`;
@@ -1810,6 +1912,202 @@ function buildTechSpec(iter, now, apis, models, archImpact, platforms, features)
1810
1912
  md += `| 依赖 | 用途 |\n| :--- | :--- |\n`;
1811
1913
  archImpact.newDependencies.forEach(d => { md += `| ${d} | 需求文档提及 |\n`; });
1812
1914
  }
1915
+ // 前端 UI 规格
1916
+ if (uiPatterns.pages.length > 0 || uiPatterns.components.length > 0) {
1917
+ md += `\n## 5. 前端 UI 规格\n\n`;
1918
+ md += `### 5.1 页面结构\n\n`;
1919
+ if (uiPatterns.pages.length > 0) {
1920
+ md += `| 页面 | 路由 | 描述 |\n| :--- | :--- | :--- |\n`;
1921
+ uiPatterns.pages.forEach(p => { md += `| ${p.name} | \`${p.route}\` | ${p.desc} |\n`; });
1922
+ }
1923
+ else {
1924
+ md += `_待补充_\n`;
1925
+ }
1926
+ md += `\n### 5.2 组件清单\n\n`;
1927
+ if (uiPatterns.components.length > 0) {
1928
+ md += `| 组件 | 类型 | 所属页面 |\n| :--- | :--- | :--- |\n`;
1929
+ uiPatterns.components.forEach(c => { md += `| ${c.name} | ${c.type} | ${c.page} |\n`; });
1930
+ }
1931
+ else {
1932
+ md += `_待补充_\n`;
1933
+ }
1934
+ md += `\n### 5.3 字段→UI 映射\n\n`;
1935
+ if (uiPatterns.formFields.length > 0) {
1936
+ md += `| 页面/表单 | 字段 |\n| :--- | :--- |\n`;
1937
+ uiPatterns.formFields.forEach(f => { md += `| ${f.page} | ${f.fields.join(', ')} |\n`; });
1938
+ }
1939
+ else {
1940
+ md += `_待补充_\n`;
1941
+ }
1942
+ md += `\n### 5.4 状态枚举\n\n`;
1943
+ if (uiPatterns.statusEnums.length > 0) {
1944
+ md += `| 字段 | 值 | 含义 |\n| :--- | :--- | :--- |\n`;
1945
+ uiPatterns.statusEnums.forEach(s => {
1946
+ md += `| ${s.field} | ${s.values.join(' / ')} | ${s.labels.join(' / ')} |\n`;
1947
+ });
1948
+ }
1949
+ else {
1950
+ md += `_待补充_\n`;
1951
+ }
1952
+ }
1953
+ return md;
1954
+ }
1955
+ // ── UI 规格提取与构建 ──
1956
+ function extractUIPatterns(content) {
1957
+ const pages = [];
1958
+ const components = [];
1959
+ const formFields = [];
1960
+ const statusEnums = [];
1961
+ // 1. 提取页面:匹配「XX页面」「XX界面」
1962
+ const pageRegex = /(?:^|\n)#{1,4}\s+(.+?(?:页面|界面|首页|列表|详情|设置|登录|注册))/g;
1963
+ let m;
1964
+ const pageNames = new Set();
1965
+ while ((m = pageRegex.exec(content)) !== null) {
1966
+ const name = m[1].trim().replace(/^#+\s*/, '');
1967
+ if (!pageNames.has(name) && name.length >= 2 && name.length < 30) {
1968
+ pageNames.add(name);
1969
+ const routeGuess = '/' + name.replace(/页面|界面/g, '').toLowerCase().replace(/\s+/g, '-');
1970
+ // 取后续 2 行作为描述
1971
+ const after = content.slice(m.index + m[0].length, m.index + m[0].length + 200);
1972
+ const descLines = after.split('\n').filter(l => l.trim() && !l.startsWith('#')).slice(0, 2);
1973
+ pages.push({ name, route: routeGuess, desc: descLines.join(' ').slice(0, 80) || '—' });
1974
+ }
1975
+ }
1976
+ // 从路由定义补充页面
1977
+ const routeRegex = /(?:路由|路径|route)[::]\s*(\/\S+)/gi;
1978
+ while ((m = routeRegex.exec(content)) !== null) {
1979
+ const route = m[1].trim();
1980
+ const before = content.slice(Math.max(0, m.index - 100), m.index);
1981
+ const nameMatch = before.match(/[#*\-]\s*(.+?)(?:\n|$)/);
1982
+ if (nameMatch) {
1983
+ const name = nameMatch[1].trim().replace(/[`*]/g, '');
1984
+ if (!pages.some(p => p.route === route) && name.length >= 2 && name.length < 30) {
1985
+ pages.push({ name, route, desc: '从路由定义提取' });
1986
+ }
1987
+ }
1988
+ }
1989
+ // 2. 提取组件:从 UI 关键词推断
1990
+ const lines = content.split('\n');
1991
+ for (let i = 0; i < lines.length; i++) {
1992
+ const line = lines[i];
1993
+ // 列表/表格组件
1994
+ if (/列表|清单|记录/.test(line) && !/待补充|待填充/.test(line)) {
1995
+ const heading = findNearestHeading(lines, i);
1996
+ if (heading && !components.some(c => c.name === heading + '列表')) {
1997
+ components.push({ name: heading + '列表', type: 'Table/List', page: heading });
1998
+ }
1999
+ }
2000
+ // 表单组件
2001
+ if (/表单|表单页|填写|录入|新建|创建.*页|编辑.*页/.test(line) && !/待补充|待填充/.test(line)) {
2002
+ const heading = findNearestHeading(lines, i);
2003
+ if (heading && !components.some(c => c.name.includes('表单'))) {
2004
+ components.push({ name: heading + '表单', type: 'Form', page: heading });
2005
+ }
2006
+ }
2007
+ // 详情组件
2008
+ if (/详情页|详情展示|查看.*详情/.test(line) && !/待补充|待填充/.test(line)) {
2009
+ const heading = findNearestHeading(lines, i);
2010
+ if (heading && !components.some(c => c.name.includes('详情'))) {
2011
+ components.push({ name: heading + '详情', type: 'Detail', page: heading });
2012
+ }
2013
+ }
2014
+ // Dashboard/仪表盘
2015
+ if (/仪表盘|Dashboard|看板|数据大屏|统计概览/.test(line)) {
2016
+ if (!components.some(c => c.type === 'Dashboard')) {
2017
+ components.push({ name: '仪表盘', type: 'Dashboard', page: '首页' });
2018
+ }
2019
+ }
2020
+ }
2021
+ // 3. 提取表单字段:匹配「字段:」「字段:」模式
2022
+ const formLabels = /(?:字段|参数|输入项|表项|属性)[::]\s*(.+)/g;
2023
+ while ((m = formLabels.exec(content)) !== null) {
2024
+ const fieldsStr = m[1];
2025
+ const fields = fieldsStr.split(/[,,、;;\s]+/).filter(f => f.length >= 1 && f.length < 20);
2026
+ if (fields.length > 0) {
2027
+ const heading = findNearestHeading(lines, content.slice(0, m.index).split('\n').length - 1);
2028
+ formFields.push({ page: heading || '通用', fields: fields.slice(0, 10) });
2029
+ }
2030
+ }
2031
+ // 4. 提取状态枚举:匹配「status = 0:xxx, 1:yyy」或「状态:0=xxx 1=yyy」
2032
+ const statusRegex = /(?:status|状态|type|类型)\s*[::]\s*(.+)/gi;
2033
+ while ((m = statusRegex.exec(content)) !== null) {
2034
+ const defs = m[1];
2035
+ const valueMatches = defs.matchAll(/(\d+)\s*[=::]\s*([^,,;;\d]+)/g);
2036
+ const values = [];
2037
+ const labels = [];
2038
+ for (const vm of valueMatches) {
2039
+ values.push(vm[1]);
2040
+ labels.push(vm[2].trim());
2041
+ }
2042
+ if (values.length >= 2) {
2043
+ statusEnums.push({ field: m[0].split(/[::]/)[0].trim(), values, labels });
2044
+ }
2045
+ }
2046
+ return {
2047
+ pages: pages.slice(0, 15),
2048
+ components: components.slice(0, 20),
2049
+ formFields: formFields.slice(0, 10),
2050
+ statusEnums: statusEnums.slice(0, 10),
2051
+ };
2052
+ }
2053
+ function findNearestHeading(lines, lineIndex) {
2054
+ for (let i = lineIndex; i >= Math.max(0, lineIndex - 8); i--) {
2055
+ const headingMatch = lines[i].match(/^#{1,4}\s+(.+)$/);
2056
+ if (headingMatch) {
2057
+ const name = headingMatch[1].trim();
2058
+ if (name.length >= 2 && name.length < 30)
2059
+ return name;
2060
+ }
2061
+ }
2062
+ return null;
2063
+ }
2064
+ function buildUISpec(iter, now, uiPatterns) {
2065
+ let md = `# 前端 UI 规格\n\n> 迭代: ${iter} | 生成: ${now} | 由 analyze --auto 自动提取\n\n`;
2066
+ // 1. 页面结构
2067
+ md += `## 1. 页面结构\n\n`;
2068
+ if (uiPatterns.pages.length > 0) {
2069
+ md += `| # | 页面 | 路由 | 描述 |\n| :--- | :--- | :--- | :--- |\n`;
2070
+ uiPatterns.pages.forEach((p, i) => {
2071
+ md += `| ${i + 1} | ${p.name} | \`${p.route}\` | ${p.desc} |\n`;
2072
+ });
2073
+ }
2074
+ else {
2075
+ md += `_需求文档中未检测到页面定义,建议补充页面清单。_\n`;
2076
+ }
2077
+ // 2. 组件清单
2078
+ md += `\n## 2. 组件清单\n\n`;
2079
+ if (uiPatterns.components.length > 0) {
2080
+ md += `| 组件 | 类型 | 所属页面 |\n| :--- | :--- | :--- |\n`;
2081
+ uiPatterns.components.forEach(c => {
2082
+ md += `| ${c.name} | ${c.type} | ${c.page} |\n`;
2083
+ });
2084
+ }
2085
+ else {
2086
+ md += `_需求文档中未检测到 UI 组件,建议根据页面功能补充。_\n`;
2087
+ }
2088
+ // 3. 字段→UI 映射
2089
+ md += `\n## 3. 字段→UI 映射\n\n`;
2090
+ if (uiPatterns.formFields.length > 0) {
2091
+ md += `| 页面/表单 | 字段列表 |\n| :--- | :--- |\n`;
2092
+ uiPatterns.formFields.forEach(f => {
2093
+ md += `| ${f.page} | ${f.fields.join(', ')} |\n`;
2094
+ });
2095
+ }
2096
+ else {
2097
+ md += `_需求文档中未检测到表单字段定义,建议补充各页面字段映射。_\n`;
2098
+ }
2099
+ // 4. 状态枚举
2100
+ md += `\n## 4. 状态枚举\n\n`;
2101
+ if (uiPatterns.statusEnums.length > 0) {
2102
+ md += `| 字段 | 值→含义 |\n| :--- | :--- |\n`;
2103
+ uiPatterns.statusEnums.forEach(s => {
2104
+ const mapping = s.values.map((v, i) => `${v}=${s.labels[i]}`).join('; ');
2105
+ md += `| ${s.field} | ${mapping} |\n`;
2106
+ });
2107
+ }
2108
+ else {
2109
+ md += `_需求文档中未检测到状态枚举定义,建议补充前后端共享的状态值。_\n`;
2110
+ }
1813
2111
  return md;
1814
2112
  }
1815
2113
  function buildTestSpec(iter, now, features, apis) {