speccore 6.82.0 → 6.89.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.
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +178 -34
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/change.d.ts.map +1 -1
- package/dist/commands/change.js +39 -1
- package/dist/commands/change.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +118 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +75 -38
- package/dist/commands/pr.js.map +1 -1
- package/dist/core/agents/defaults/_INDEX.md +68 -0
- package/dist/core/agents/defaults/_TEMPLATE.md +34 -0
- package/dist/core/agents/defaults/code-reviewer.md +49 -0
- package/dist/core/agents/defaults/compiler.md +25 -0
- package/dist/core/agents/defaults/compliance-checker.md +38 -0
- package/dist/core/agents/defaults/dependency-analyst.md +42 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +25 -0
- package/dist/core/agents/defaults/impact-analyst.md +37 -0
- package/dist/core/agents/defaults/interaction-designer.md +73 -0
- package/dist/core/agents/defaults/performance-expert.md +35 -0
- package/dist/core/agents/defaults/product-analyst-backend.md +68 -0
- package/dist/core/agents/defaults/product-analyst-frontend.md +72 -0
- package/dist/core/agents/defaults/product-analyst.md +48 -0
- package/dist/core/agents/defaults/regression-tester.md +36 -0
- package/dist/core/agents/defaults/risk-assessor.md +38 -0
- package/dist/core/agents/defaults/schedule-planner.md +37 -0
- package/dist/core/agents/defaults/security-reviewer-finance.md +67 -0
- package/dist/core/agents/defaults/security-reviewer.md +43 -0
- package/dist/core/agents/defaults/task-decomposer.md +33 -0
- package/dist/core/agents/defaults/test-engineer.md +25 -0
- package/dist/core/agents/defaults/test-reviewer.md +48 -0
- package/dist/core/agents/engine/agent-executor.d.ts +50 -0
- package/dist/core/agents/engine/agent-executor.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-executor.js +225 -0
- package/dist/core/agents/engine/agent-executor.js.map +1 -0
- package/dist/core/agents/engine/agent-loader.d.ts +58 -0
- package/dist/core/agents/engine/agent-loader.d.ts.map +1 -0
- package/dist/core/agents/engine/agent-loader.js +377 -0
- package/dist/core/agents/engine/agent-loader.js.map +1 -0
- package/dist/core/agents/engine/types.d.ts +71 -0
- package/dist/core/agents/engine/types.d.ts.map +1 -0
- package/dist/core/agents/engine/types.js +8 -0
- package/dist/core/agents/engine/types.js.map +1 -0
- package/dist/core/agents/index.d.ts +12 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/index.js +31 -0
- package/dist/core/agents/index.js.map +1 -0
- package/dist/core/agents/product-analyst.d.ts +17 -0
- package/dist/core/agents/product-analyst.d.ts.map +1 -0
- package/dist/core/agents/product-analyst.js +188 -0
- package/dist/core/agents/product-analyst.js.map +1 -0
- package/dist/core/command-loader.d.ts +31 -0
- package/dist/core/command-loader.d.ts.map +1 -0
- package/dist/core/command-loader.js +76 -0
- package/dist/core/command-loader.js.map +1 -0
- package/dist/core/commands/defaults/change-impact.md +40 -0
- package/dist/core/commands/defaults/pr-review.md +42 -0
- package/dist/core/commands/defaults/refactor.md +37 -0
- package/dist/core/context-injector.d.ts +56 -0
- package/dist/core/context-injector.d.ts.map +1 -0
- package/dist/core/context-injector.js +122 -0
- package/dist/core/context-injector.js.map +1 -0
- package/dist/core/hook-runner.d.ts +36 -0
- package/dist/core/hook-runner.d.ts.map +1 -0
- package/dist/core/hook-runner.js +93 -0
- package/dist/core/hook-runner.js.map +1 -0
- package/dist/core/hooks/defaults/post-execute.md +22 -0
- package/dist/core/hooks/defaults/pre-execute.md +18 -0
- package/dist/core/prompt-builder.d.ts +1 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +60 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/requirement-clarifier.d.ts +2 -1
- package/dist/core/requirement-clarifier.d.ts.map +1 -1
- package/dist/core/requirement-clarifier.js +78 -1
- package/dist/core/requirement-clarifier.js.map +1 -1
- package/dist/core/rule-loader.d.ts +38 -0
- package/dist/core/rule-loader.d.ts.map +1 -0
- package/dist/core/rule-loader.js +156 -0
- package/dist/core/rule-loader.js.map +1 -0
- package/dist/core/rules/defaults/_INDEX.md +16 -0
- package/dist/core/rules/defaults/api-design.md +44 -0
- package/dist/core/rules/defaults/database.md +37 -0
- package/dist/core/rules/defaults/frontend-common.md +38 -0
- package/dist/core/rules/defaults/nodejs.md +38 -0
- package/dist/core/rules/defaults/react.md +34 -0
- package/dist/core/rules/defaults/security.md +31 -0
- package/dist/core/rules/defaults/testing.md +35 -0
- package/dist/core/rules/defaults/typescript.md +36 -0
- package/dist/core/skill-loader.d.ts +28 -0
- package/dist/core/skill-loader.d.ts.map +1 -0
- package/dist/core/skill-loader.js +102 -0
- package/dist/core/skill-loader.js.map +1 -0
- package/dist/core/skills/defaults/caching.md +33 -0
- package/dist/core/skills/defaults/db-migration.md +46 -0
- package/dist/core/skills/defaults/deployment.md +50 -0
- package/dist/core/skills/defaults/logging.md +38 -0
- package/dist/core/verify-engine.d.ts +7 -0
- package/dist/core/verify-engine.d.ts.map +1 -1
- package/dist/core/verify-engine.js +27 -1
- package/dist/core/verify-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AA4DA,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,CAAC;IACxC,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;IAElB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8lC3E"}
|
package/dist/commands/analyze.js
CHANGED
|
@@ -65,6 +65,9 @@ const change_detection_1 = require("../core/change-detection");
|
|
|
65
65
|
const streaming_analyzer_1 = require("../core/streaming-analyzer");
|
|
66
66
|
// v6.80.0+: 需求澄清模块
|
|
67
67
|
const requirement_clarifier_1 = require("../core/requirement-clarifier");
|
|
68
|
+
// v6.83.0+: 专业 AI 角色定义
|
|
69
|
+
// v6.84.0+: 迁移到规范数据库 (.speccore/AGENTS/),保留向后兼容
|
|
70
|
+
const agents_1 = require("../core/agents");
|
|
68
71
|
async function analyzeCommand(options) {
|
|
69
72
|
// ── --full / --phase 模式: 委托给 synthesizeCommand(原 synthesize 命令) ──
|
|
70
73
|
if (options.full || options.phase) {
|
|
@@ -2996,17 +2999,56 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
2996
2999
|
if (qualityReports.length > 0) {
|
|
2997
3000
|
await (0, requirement_clarifier_1.writeClarifyReport)(iterDir, qualityReports);
|
|
2998
3001
|
}
|
|
2999
|
-
//
|
|
3000
|
-
let prompt = `\n# 任务: 需求专业化(Phase 0:
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3002
|
+
// v6.84.0+: 从 AGENTS 规范数据库动态加载角色
|
|
3003
|
+
let prompt = `\n# 任务: 需求专业化(Phase 0: 需求澄清,v6.84.0+)\n\n`;
|
|
3004
|
+
const projectRoot = (0, task_utils_1.findProjectRoot)() || process.cwd();
|
|
3005
|
+
const agentContext = {
|
|
3006
|
+
iteration,
|
|
3007
|
+
iterationDir: iterDir,
|
|
3008
|
+
};
|
|
3009
|
+
try {
|
|
3010
|
+
const resolvedAgents = await (0, agents_1.resolveAgentsForPhase)('analyze', 'clarify', agentContext, projectRoot);
|
|
3011
|
+
if (resolvedAgents.length > 0) {
|
|
3012
|
+
// 动态注入角色定义
|
|
3013
|
+
for (const ra of resolvedAgents) {
|
|
3014
|
+
prompt += ra.definition.rolePrompt;
|
|
3015
|
+
prompt += '\n\n';
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
else {
|
|
3019
|
+
// 回退到硬编码角色(向后兼容)
|
|
3020
|
+
prompt += agents_1.PRODUCT_ANALYST_ROLE;
|
|
3021
|
+
prompt += '\n\n';
|
|
3022
|
+
prompt += agents_1.INTERACTION_DESIGNER_ROLE;
|
|
3023
|
+
prompt += '\n\n';
|
|
3024
|
+
}
|
|
3025
|
+
}
|
|
3026
|
+
catch {
|
|
3027
|
+
// 回退到硬编码角色(向后兼容)
|
|
3028
|
+
prompt += agents_1.PRODUCT_ANALYST_ROLE;
|
|
3029
|
+
prompt += '\n\n';
|
|
3030
|
+
prompt += agents_1.INTERACTION_DESIGNER_ROLE;
|
|
3031
|
+
prompt += '\n\n';
|
|
3032
|
+
}
|
|
3033
|
+
prompt += `## 质量评价摘要(7维度)\n\n`;
|
|
3004
3034
|
for (const r of qualityReports) {
|
|
3005
3035
|
const name = r.filePath.split('/').pop() || '-';
|
|
3006
|
-
prompt +=
|
|
3036
|
+
prompt += `### ${name} — 综合评分 ${r.overallScore}/100 (${r.level.toUpperCase()})\n\n`;
|
|
3037
|
+
prompt += `| 维度 | 评分 | 问题数 | 状态 |\n`;
|
|
3038
|
+
prompt += `| :--- | :--- | :--- | :--- |\n`;
|
|
3039
|
+
for (const dim of r.dimensions) {
|
|
3040
|
+
const badge = dim.score >= 80 ? '🟢' : dim.score >= 50 ? '🟡' : '🔴';
|
|
3041
|
+
prompt += `| ${badge} ${dim.name} | ${dim.score}/100 | ${dim.issues.length} | ${dim.issues.length === 0 ? '✅' : '⚠️ 需改进'} |\n`;
|
|
3042
|
+
}
|
|
3043
|
+
prompt += '\n';
|
|
3044
|
+
// 详细问题(只列出问题项)
|
|
3007
3045
|
for (const dim of r.dimensions) {
|
|
3008
3046
|
if (dim.issues.length > 0) {
|
|
3009
|
-
prompt +=
|
|
3047
|
+
prompt += `**${dim.name}** 需改进:\n`;
|
|
3048
|
+
for (let i = 0; i < dim.issues.length; i++) {
|
|
3049
|
+
prompt += `- ${dim.issues[i]} → ${dim.suggestions[i] || '请优化'}\n`;
|
|
3050
|
+
}
|
|
3051
|
+
prompt += '\n';
|
|
3010
3052
|
}
|
|
3011
3053
|
}
|
|
3012
3054
|
}
|
|
@@ -3017,35 +3059,108 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
3017
3059
|
prompt += `3. \`010-requirements/converted/*.md\` — 已转换文档\n`;
|
|
3018
3060
|
prompt += `4. \`010-requirements/features/*/README.md\` — 功能级补充\n`;
|
|
3019
3061
|
prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n\n`;
|
|
3020
|
-
prompt +=
|
|
3062
|
+
prompt += `---\n\n`;
|
|
3063
|
+
prompt += `# 📋 五步迭代澄清流程\n\n`;
|
|
3064
|
+
prompt += `> 本阶段要求你先以专业角色深度分析,再生成改写版,与用户反复迭代确认,最终写入。\n\n`;
|
|
3065
|
+
prompt += `## Step 1: 深度专业分析\n\n`;
|
|
3066
|
+
prompt += `对每份需求文档,分别以 **产品分析师** 和 **交互设计师** 两个角色进行深度审查:\n\n`;
|
|
3067
|
+
prompt += `**产品分析师审查清单**:\n`;
|
|
3068
|
+
prompt += `- [ ] 每条业务流程是否有明确的起点、步骤、分支、终点\n`;
|
|
3069
|
+
prompt += `- [ ] 状态流转是否闭环(所有状态都有进入和退出条件)\n`;
|
|
3070
|
+
prompt += `- [ ] 是否遗漏了异常分支(网络失败、权限不足、数据为空、超时)\n`;
|
|
3071
|
+
prompt += `- [ ] 是否遗漏了逆向流程(取消、退款、退货、撤销)\n`;
|
|
3072
|
+
prompt += `- [ ] 关键状态变化是否有通知机制(站内信/推送/邮件/短信)\n`;
|
|
3073
|
+
prompt += `- [ ] 并发场景是否有处理(重复提交、幂等性)\n`;
|
|
3074
|
+
prompt += `- [ ] 术语是否统一(同一概念不能有两个名称)\n\n`;
|
|
3075
|
+
prompt += `**交互设计师审查清单**:\n`;
|
|
3076
|
+
prompt += `- [ ] 每个页面/组件是否有 Loading 状态定义\n`;
|
|
3077
|
+
prompt += `- [ ] 每个列表/表格是否有 Empty State 定义\n`;
|
|
3078
|
+
prompt += `- [ ] 每个操作是否有 Error State 定义\n`;
|
|
3079
|
+
prompt += `- [ ] 列表/表格是否有分页/筛选/排序逻辑\n`;
|
|
3080
|
+
prompt += `- [ ] 不可逆操作是否有二次确认\n`;
|
|
3081
|
+
prompt += `- [ ] 表单是否有完整的校验规则\n`;
|
|
3082
|
+
prompt += `- [ ] 不同角色的权限控制是否明确\n`;
|
|
3083
|
+
prompt += `- [ ] 前后端校验规则是否一致\n`;
|
|
3084
|
+
prompt += `- [ ] 数据刷新策略是什么(实时/手动/轮询/WebSocket)\n\n`;
|
|
3085
|
+
prompt += `**输出**:输出一份《深度审查报告》,列出所有发现的问题和修改建议。\n\n`;
|
|
3086
|
+
prompt += `## Step 2: 生成改写版(Draft v1)\n\n`;
|
|
3087
|
+
prompt += `基于 Step 1 的审查报告,生成一份 **完整的专业 PRD 文档**,要求:\n\n`;
|
|
3021
3088
|
prompt += `### 必须包含的章节\n`;
|
|
3022
|
-
prompt += `1.
|
|
3023
|
-
prompt += `2.
|
|
3024
|
-
prompt += `3.
|
|
3025
|
-
prompt += `4.
|
|
3026
|
-
prompt += `
|
|
3027
|
-
prompt += `
|
|
3028
|
-
prompt += `
|
|
3089
|
+
prompt += `1. **背景与目标**:为什么要做这个功能,解决什么问题,预期收益\n`;
|
|
3090
|
+
prompt += `2. **术语表(Glossary)**:文档中所有专业术语的统一表述\n`;
|
|
3091
|
+
prompt += `3. **用户故事**:作为 [角色],我希望 [目标],以便 [价值](每个功能一个)\n`;
|
|
3092
|
+
prompt += `4. **功能规格**(按模块组织):\n`;
|
|
3093
|
+
prompt += ` - 功能清单(带唯一需求编号 R-01, R-02...)\n`;
|
|
3094
|
+
prompt += ` - 每个功能的详细描述(输入、处理、输出)\n`;
|
|
3095
|
+
prompt += ` - 业务流程(正常流程 + 异常分支 + 状态流转图)\n`;
|
|
3096
|
+
prompt += ` - 页面交互逻辑(页面结构、用户操作、反馈机制、权限控制)\n`;
|
|
3097
|
+
prompt += ` - 业务规则(校验、约束、状态流转条件)\n`;
|
|
3098
|
+
prompt += ` - 异常场景和边界条件(网络失败、权限不足、数据为空、超时)\n`;
|
|
3099
|
+
prompt += `5. **验收标准(AC)**:可测试的、具体的验收条件,每条用 \`[ ]\` 标记,必须量化\n`;
|
|
3100
|
+
prompt += `6. **非功能需求**:性能、安全、兼容性、可访问性等\n`;
|
|
3101
|
+
prompt += `7. **依赖与约束**:依赖的其他系统/模块,技术/业务约束\n`;
|
|
3102
|
+
prompt += `8. **功能边界**:明确「做什么」和「不做什么」\n`;
|
|
3103
|
+
prompt += `9. **待确认事项**:标注需要用户确认的内容(不要编造)\n\n`;
|
|
3029
3104
|
prompt += `### 质量要求\n`;
|
|
3030
|
-
prompt += `-
|
|
3031
|
-
prompt += `- 统一术语表述,不要同一概念用不同词汇\n`;
|
|
3105
|
+
prompt += `- 统一术语,建立术语表\n`;
|
|
3032
3106
|
prompt += `- 验收标准必须量化(如响应时间<200ms,成功率>99%)\n`;
|
|
3033
|
-
prompt += `-
|
|
3034
|
-
prompt += `-
|
|
3035
|
-
prompt +=
|
|
3036
|
-
prompt +=
|
|
3037
|
-
prompt +=
|
|
3038
|
-
prompt += `##
|
|
3107
|
+
prompt += `- 业务流程必须包含异常分支\n`;
|
|
3108
|
+
prompt += `- 前端交互必须包含 Loading/Empty/Error 状态\n`;
|
|
3109
|
+
prompt += `- 不要添加文档中未提及的功能\n`;
|
|
3110
|
+
prompt += `- 如果原始描述不完整,标注「待确认」而不是编造\n\n`;
|
|
3111
|
+
prompt += `**输出**:将 Draft v1 的内容暂存,进入 Step 3。\n\n`;
|
|
3112
|
+
prompt += `## Step 3: 生成对比视图\n\n`;
|
|
3113
|
+
prompt += `生成一份 **原文档 vs 改写版(Draft v1)的对比报告**,格式如下:\n\n`;
|
|
3114
|
+
prompt += `\`\`\`\n`;
|
|
3115
|
+
prompt += `## 需求澄清对比报告\n\n`;
|
|
3116
|
+
prompt += `### 重大改进(原文缺失 → 改写版补充)\n`;
|
|
3117
|
+
prompt += `| 改进项 | 原文状态 | 改写版补充 | 影响 |\n`;
|
|
3118
|
+
prompt += `| :--- | :--- | :--- | :--- |\n`;
|
|
3119
|
+
prompt += `| 示例:订单状态流转 | ❌ 未定义 | ✅ 定义了 5 种状态及转换条件 | 避免状态不一致 bug |\n\n`;
|
|
3120
|
+
prompt += `### 交互完善(原文模糊 → 改写版明确)\n`;
|
|
3121
|
+
prompt += `| 改进项 | 原文描述 | 改写版描述 |\n`;
|
|
3122
|
+
prompt += `| :--- | :--- | :--- |\n`;
|
|
3123
|
+
prompt += `| 示例:提交按钮 | 「点击提交」 | 「点击后显示 Loading,成功后跳转,失败后显示错误信息」 |\n\n`;
|
|
3124
|
+
prompt += `### 待确认事项\n`;
|
|
3125
|
+
prompt += `- [ ] 事项 1:需要用户确认的业务规则\n`;
|
|
3126
|
+
prompt += `- [ ] 事项 2:需要用户补充的边界条件\n\n`;
|
|
3127
|
+
prompt += `### 建议取舍\n`;
|
|
3128
|
+
prompt += `- 建议保留改写版的改进(原因)\n`;
|
|
3129
|
+
prompt += `- 建议保留原文的表述(原因)\n`;
|
|
3130
|
+
prompt += `\`\`\`\n\n`;
|
|
3131
|
+
prompt += `**输出**:将对比报告展示给用户,进入 Step 4。\n\n`;
|
|
3132
|
+
prompt += `## Step 4: 迭代确认(多轮对话)\n\n`;
|
|
3133
|
+
prompt += `将 **对比报告** 和 **Draft v1** 一起展示给用户,然后:\n\n`;
|
|
3134
|
+
prompt += `1. **询问用户意见**:\n`;
|
|
3135
|
+
prompt += ` - "以上是我对需求文档的专业分析和改写,请检查是否有以下问题:"\n`;
|
|
3136
|
+
prompt += ` - "业务流程是否正确?"\n`;
|
|
3137
|
+
prompt += ` - "交互逻辑是否完整?"\n`;
|
|
3138
|
+
prompt += ` - "是否有遗漏的功能点?"\n`;
|
|
3139
|
+
prompt += ` - "是否有不需要的功能?"\n\n`;
|
|
3140
|
+
prompt += `2. **接收用户反馈**:\n`;
|
|
3141
|
+
prompt += ` - 如果用户提出修改意见 → 生成 **Draft v2** → 重新生成对比 → 回到步骤 1 询问\n`;
|
|
3142
|
+
prompt += ` - 可以迭代多轮(v1 → v2 → v3 ...),直到用户满意\n`;
|
|
3143
|
+
prompt += ` - 每轮迭代都要生成新的对比报告,标注本轮修改\n\n`;
|
|
3144
|
+
prompt += `3. **迭代原则**:\n`;
|
|
3145
|
+
prompt += ` - 尊重用户决策:用户说保留原文的,保留原文\n`;
|
|
3146
|
+
prompt += ` - 专业建议:用户遗漏的,以「建议补充」形式提出,不强加\n`;
|
|
3147
|
+
prompt += ` - 记录取舍:每轮迭代记录「采纳/拒绝/待确认」的决策\n\n`;
|
|
3148
|
+
prompt += `## Step 5: 确认写入\n\n`;
|
|
3149
|
+
prompt += `当用户确认 "满意,可以写入" 后:\n\n`;
|
|
3150
|
+
prompt += `1. 将最终版 PRD 写入 \`010-requirements/converted/clarified-{源文件名}-{日期}.md\`\n`;
|
|
3151
|
+
prompt += `2. 同时生成 \`010-requirements/converted/clarified-{源文件名}-{日期}-diff.md\` 保存最终对比报告\n`;
|
|
3152
|
+
prompt += `3. 使用以下命令写入:\n\n`;
|
|
3039
3153
|
prompt += `\`\`\`bash\n`;
|
|
3040
|
-
prompt += `speccore analyze --apply '{"010-requirements/converted/clarified-xxx.md":"..."}' -I ${iteration}\n`;
|
|
3154
|
+
prompt += `speccore analyze --apply '{"010-requirements/converted/clarified-xxx.md":"...","010-requirements/converted/clarified-xxx-diff.md":"..."}' -I ${iteration}\n`;
|
|
3041
3155
|
prompt += `\`\`\`\n\n`;
|
|
3042
|
-
prompt += `>
|
|
3156
|
+
prompt += `> 注意:写入后 CLI 会自动推进到需求确认阶段。\n`;
|
|
3043
3157
|
return prompt;
|
|
3044
3158
|
}
|
|
3045
3159
|
async function buildConfirmCheckPrompt(iteration) {
|
|
3046
3160
|
const iterDir = await (0, context_1.getIterationDir)(iteration);
|
|
3047
3161
|
const reportPath = (0, path_1.join)(iterDir, '010-requirements', 'CLARIFY_REPORT.md');
|
|
3048
|
-
|
|
3162
|
+
const convertedDir = (0, path_1.join)(iterDir, '010-requirements', 'converted');
|
|
3163
|
+
let prompt = `\n# 任务: 需求确认(Phase 0: 确认检查,v6.83.0+)\n\n`;
|
|
3049
3164
|
if (await (0, fs_extra_1.pathExists)(reportPath)) {
|
|
3050
3165
|
const report = await (0, fs_extra_2.readFile)(reportPath, 'utf-8');
|
|
3051
3166
|
prompt += `## 需求澄清报告\n\n`;
|
|
@@ -3054,17 +3169,46 @@ async function buildConfirmCheckPrompt(iteration) {
|
|
|
3054
3169
|
prompt += `\n\n... (报告共 ${report.length} 字符,已截断)\n`;
|
|
3055
3170
|
}
|
|
3056
3171
|
}
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3172
|
+
// v6.83.0+: 检查是否有 diff 文件
|
|
3173
|
+
let diffFiles = [];
|
|
3174
|
+
if (await (0, fs_extra_1.pathExists)(convertedDir)) {
|
|
3175
|
+
try {
|
|
3176
|
+
const entries = await (0, fs_extra_2.readdir)(convertedDir);
|
|
3177
|
+
diffFiles = entries.filter(f => f.includes('-diff.md'));
|
|
3178
|
+
}
|
|
3179
|
+
catch { /* ignore */ }
|
|
3180
|
+
}
|
|
3181
|
+
if (diffFiles.length > 0) {
|
|
3182
|
+
prompt += `\n## 已生成的对比报告\n\n`;
|
|
3183
|
+
for (const f of diffFiles) {
|
|
3184
|
+
prompt += `- \`converted/${f}\` — 需求澄清对比记录\n`;
|
|
3185
|
+
}
|
|
3186
|
+
prompt += '\n';
|
|
3187
|
+
}
|
|
3188
|
+
prompt += `## 确认检查清单\n\n`;
|
|
3189
|
+
prompt += `请逐项确认:\n\n`;
|
|
3190
|
+
prompt += `- [ ] clarified-*.md 已写入 \`010-requirements/converted/\`\n`;
|
|
3191
|
+
prompt += `- [ ] 验收标准可测试、可量化\n`;
|
|
3192
|
+
prompt += `- [ ] 功能边界明确(不做什么)\n`;
|
|
3193
|
+
prompt += `- [ ] 业务流程完整(含异常分支)\n`;
|
|
3194
|
+
prompt += `- [ ] 交互逻辑完整(Loading/Empty/Error 状态)\n`;
|
|
3195
|
+
prompt += `- [ ] 术语统一(已建立术语表)\n`;
|
|
3196
|
+
prompt += `- [ ] 所有「待确认」事项已解决\n\n`;
|
|
3197
|
+
prompt += `## 操作选项\n\n`;
|
|
3198
|
+
prompt += `**选项 A:确认通过,进入技术方案生成**\n`;
|
|
3064
3199
|
prompt += `\`\`\`bash\n`;
|
|
3065
3200
|
prompt += `speccore analyze --prompt -I ${iteration} --pipeline\n`;
|
|
3066
3201
|
prompt += `\`\`\`\n\n`;
|
|
3067
|
-
prompt +=
|
|
3202
|
+
prompt += `**选项 B:需要重新澄清(返回迭代)**\n`;
|
|
3203
|
+
prompt += `如果对需求文档不满意,可以返回重新澄清:\n`;
|
|
3204
|
+
prompt += `\`\`\`bash\n`;
|
|
3205
|
+
prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify=false\n`;
|
|
3206
|
+
prompt += `\`\`\`\n`;
|
|
3207
|
+
prompt += `> 重新进入 clarify-prompt 阶段,AI 会基于已有 draft 继续迭代。\n\n`;
|
|
3208
|
+
prompt += `**选项 C:跳过确认,直接进入分析(风险自负)**\n`;
|
|
3209
|
+
prompt += `\`\`\`bash\n`;
|
|
3210
|
+
prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify\n`;
|
|
3211
|
+
prompt += `\`\`\`\n`;
|
|
3068
3212
|
return prompt;
|
|
3069
3213
|
}
|
|
3070
3214
|
//# sourceMappingURL=analyze.js.map
|