soloforge 1.3.2 → 1.3.3

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 (84) hide show
  1. package/README.md +5 -0
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +287 -1
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  6. package/dist/adapters/shared/workflow_template.js +2 -1
  7. package/dist/adapters/shared/workflow_template.js.map +1 -1
  8. package/dist/bin/soloforge.d.ts.map +1 -1
  9. package/dist/bin/soloforge.js +231 -1
  10. package/dist/bin/soloforge.js.map +1 -1
  11. package/dist/engine/asset_manifest.d.ts.map +1 -1
  12. package/dist/engine/asset_manifest.js +13 -0
  13. package/dist/engine/asset_manifest.js.map +1 -1
  14. package/dist/engine/backend_implementation_contract.d.ts +51 -0
  15. package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
  16. package/dist/engine/backend_implementation_contract.js +142 -0
  17. package/dist/engine/backend_implementation_contract.js.map +1 -0
  18. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  19. package/dist/engine/consumable_asset_registry.js +133 -0
  20. package/dist/engine/consumable_asset_registry.js.map +1 -1
  21. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  22. package/dist/engine/dual_layer_mechanism_registry.js +124 -0
  23. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  24. package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
  25. package/dist/engine/explicit_asset_registry.js +204 -0
  26. package/dist/engine/explicit_asset_registry.js.map +1 -1
  27. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  28. package/dist/engine/implementation_roadmap_registry.js +68 -2
  29. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  30. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  31. package/dist/engine/mechanism_contract_registry.js +68 -0
  32. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  33. package/dist/engine/next_action_planner.d.ts +19 -0
  34. package/dist/engine/next_action_planner.d.ts.map +1 -0
  35. package/dist/engine/next_action_planner.js +453 -0
  36. package/dist/engine/next_action_planner.js.map +1 -0
  37. package/dist/engine/ood_solid_contract.d.ts +51 -0
  38. package/dist/engine/ood_solid_contract.d.ts.map +1 -0
  39. package/dist/engine/ood_solid_contract.js +115 -0
  40. package/dist/engine/ood_solid_contract.js.map +1 -0
  41. package/dist/engine/project_stage_detector.d.ts +17 -0
  42. package/dist/engine/project_stage_detector.d.ts.map +1 -0
  43. package/dist/engine/project_stage_detector.js +185 -0
  44. package/dist/engine/project_stage_detector.js.map +1 -0
  45. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  46. package/dist/engine/release_issue_scenario_registry.js +14 -1
  47. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  48. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  49. package/dist/engine/release_readiness_gate.js +149 -3
  50. package/dist/engine/release_readiness_gate.js.map +1 -1
  51. package/dist/engine/stale_current_task_detector.d.ts +30 -0
  52. package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
  53. package/dist/engine/stale_current_task_detector.js +168 -0
  54. package/dist/engine/stale_current_task_detector.js.map +1 -0
  55. package/dist/engine/task_stage_detector.d.ts +19 -0
  56. package/dist/engine/task_stage_detector.d.ts.map +1 -0
  57. package/dist/engine/task_stage_detector.js +201 -0
  58. package/dist/engine/task_stage_detector.js.map +1 -0
  59. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  60. package/dist/engine/tool_invocation_contract_registry.js +10 -0
  61. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  62. package/dist/engine/workflow_navigation_contract.d.ts +115 -0
  63. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
  64. package/dist/engine/workflow_navigation_contract.js +39 -0
  65. package/dist/engine/workflow_navigation_contract.js.map +1 -0
  66. package/dist/types.d.ts +8 -0
  67. package/dist/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/knowledge/acceptance_templates/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md +60 -0
  70. package/templates/knowledge/acceptance_templates//345/220/216/347/253/257/345/256/236/347/216/260/351/252/214/346/224/266/346/270/205/345/215/225.md +46 -0
  71. package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
  72. package/templates/knowledge/procedures//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +100 -0
  73. package/templates/knowledge/procedures//345/220/216/347/253/257/346/216/245/345/217/243/345/256/236/347/216/260/345/267/245/344/275/234/346/265/201.md +50 -0
  74. package/templates/knowledge/review_rules/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md +40 -0
  75. package/templates/knowledge/review_rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/256/241/346/237/245/350/247/204/345/210/231.md +38 -0
  76. package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
  77. package/templates/knowledge/rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/245/221/347/272/246/350/247/204/345/210/231.md +55 -0
  78. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246/350/247/204/345/210/231.md +113 -0
  79. package/templates/knowledge/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md +43 -0
  80. package/templates/knowledge/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +44 -0
  81. package/templates/knowledge/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +47 -0
  82. package/templates/knowledge/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +46 -0
  83. package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
  84. package/templates/patterns//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/350/247/204/350/214/203.md +39 -0
@@ -0,0 +1,453 @@
1
+ /**
2
+ * 下一步动作规划器 — 问题六十五。
3
+ *
4
+ * 核心编排模块: 综合项目阶段、任务阶段、陈旧检测和禁止动作规则,
5
+ * 生成可执行的 NextActionPlan 和 ExecutableWorkPackage。
6
+ *
7
+ * 不输出一句提示,而是生成一个完整的工作包。
8
+ */
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ import crypto from "node:crypto";
12
+ import { detectProjectStage } from "./project_stage_detector.js";
13
+ import { detectTaskStage } from "./task_stage_detector.js";
14
+ import { detectStaleCurrentTask } from "./stale_current_task_detector.js";
15
+ import { TaskContextManager } from "./task_context.js";
16
+ import { debug } from "./logger.js";
17
+ /**
18
+ * 核心编排: 生成下一步行动计划。
19
+ */
20
+ export async function planNextAction(projectPath) {
21
+ debug("动作规划", "开始规划", projectPath);
22
+ const planId = `nav-${crypto.randomUUID().slice(0, 8)}`;
23
+ const generatedAt = new Date().toISOString();
24
+ // 1. 检测项目阶段
25
+ const projectStage = await detectProjectStage(projectPath);
26
+ const stageEvidence = [`project_stage=${projectStage}`];
27
+ // 2. 检测陈旧任务
28
+ const stateDir = path.join(projectPath, ".soloforge", "state");
29
+ let staleTask = null;
30
+ let currentTaskCtx = null;
31
+ let currentTaskId = null;
32
+ let taskStage = null;
33
+ if (fs.existsSync(stateDir)) {
34
+ staleTask = await detectStaleCurrentTask(stateDir);
35
+ if (staleTask.task_id) {
36
+ currentTaskId = staleTask.task_id;
37
+ currentTaskCtx = staleTask.current_task_context ?? null;
38
+ }
39
+ // 如果没有陈旧问题,获取当前活跃任务
40
+ if (!staleTask.is_stale && !currentTaskCtx) {
41
+ try {
42
+ const manager = new TaskContextManager(stateDir);
43
+ currentTaskCtx = await manager.getCurrentTask();
44
+ if (currentTaskCtx) {
45
+ currentTaskId = currentTaskCtx.task_id;
46
+ }
47
+ }
48
+ catch {
49
+ // 状态目录存在但无活跃任务
50
+ }
51
+ }
52
+ if (currentTaskCtx) {
53
+ taskStage = detectTaskStage(currentTaskCtx);
54
+ stageEvidence.push(`task_stage=${taskStage}`);
55
+ stageEvidence.push(`task_status=${currentTaskCtx.status}`);
56
+ }
57
+ }
58
+ // 3. 禁止动作
59
+ const disallowedActions = computeDisallowedActions(projectStage, taskStage, currentTaskCtx, projectPath);
60
+ // 4. 阻断原因
61
+ const blockingReasons = disallowedActions.map((da) => da.reason_zh);
62
+ // 5. 工作包
63
+ const workPackage = computeWorkPackage(projectStage, taskStage, staleTask, currentTaskCtx, projectPath);
64
+ // 6. 推荐命令
65
+ const recommendedCommands = computeRecommendedCommands(projectStage, taskStage, staleTask, workPackage);
66
+ // 7. 推荐提示语
67
+ const recommendedPrompt = computeRecommendedPrompt(projectStage, taskStage, staleTask, workPackage);
68
+ // 8. 警告
69
+ const warnings = computeWarnings(projectStage, currentTaskCtx);
70
+ // 9. 置信度
71
+ const confidence = computeConfidence(projectStage, currentTaskCtx);
72
+ return {
73
+ plan_id: planId,
74
+ generated_at: generatedAt,
75
+ project_stage: projectStage,
76
+ task_stage: taskStage,
77
+ current_task_id: currentTaskId,
78
+ confidence,
79
+ stage_evidence: stageEvidence,
80
+ blocking_reasons: blockingReasons,
81
+ stale_task: staleTask?.is_stale ? staleTask : null,
82
+ work_package: workPackage,
83
+ disallowed_actions: disallowedActions,
84
+ recommended_commands: recommendedCommands,
85
+ recommended_prompt_zh: recommendedPrompt,
86
+ warnings,
87
+ project_path: projectPath,
88
+ };
89
+ }
90
+ /**
91
+ * 计算 7 条禁止动作规则。
92
+ */
93
+ export function computeDisallowedActions(projectStage, taskStage, ctx, projectPath) {
94
+ const actions = [];
95
+ // 规则 1: 设计审计失败 → 禁止写业务代码
96
+ if (ctx?.design_artifact_pack
97
+ && ctx.design_artifact_pack.status !== "implementation_ready"
98
+ && ctx.design_artifact_pack.status !== "confirmed") {
99
+ actions.push({
100
+ rule_id: "design_audit_fail_no_coding",
101
+ blocked_actions: ["sf_execute"],
102
+ reason_zh: "设计产物未通过审计复验,禁止写业务代码",
103
+ evidence_field: `design_artifact_pack.status=${ctx.design_artifact_pack.status}`,
104
+ });
105
+ }
106
+ // 规则 2: 配置未确认 → 只允许 init 和 config confirm
107
+ if (projectStage === "configuration_pending") {
108
+ actions.push({
109
+ rule_id: "unconfirmed_config_no_action",
110
+ blocked_actions: ["sf_classify", "sf_expand", "sf_execute", "sf_verify", "sf_learn", "sf_deliver"],
111
+ reason_zh: "配置未确认,优先建议确认配置后再开始任务",
112
+ evidence_field: "project_stage=configuration_pending",
113
+ });
114
+ }
115
+ // 规则 3: 决策未确认 → 禁止定稿架构/详细设计/代码
116
+ if (ctx?.architecture_decision_workshop) {
117
+ const workshop = ctx.architecture_decision_workshop;
118
+ const hasUnconfirmed = Object.values(workshop.domains ?? {}).some((d) => d.status !== "confirmed" && d.status !== "not_applicable");
119
+ if (hasUnconfirmed) {
120
+ actions.push({
121
+ rule_id: "unconfirmed_decision_no_finalization",
122
+ blocked_actions: ["sf_execute", "sf_expand"],
123
+ reason_zh: "架构决策研讨中存在未确认的决策项,禁止定稿架构/详细设计/代码",
124
+ evidence_field: "architecture_decision_workshop 含未确认域",
125
+ });
126
+ }
127
+ }
128
+ // 规则 4: 无开发切片计划 → 禁止大范围编码
129
+ if (ctx?.expansion && !ctx.planning && taskStage === "coding") {
130
+ actions.push({
131
+ rule_id: "no_slice_plan_no_wide_coding",
132
+ blocked_actions: ["sf_execute"],
133
+ reason_zh: "无开发切片计划,禁止大范围编码,建议先生成切片规划工作包",
134
+ evidence_field: "expansion 存在但 planning 不存在",
135
+ });
136
+ }
137
+ // 规则 5: repair_reverify_directive 未清零 → 禁止交付
138
+ if (ctx?.repair_reverify_directive?.blocked) {
139
+ actions.push({
140
+ rule_id: "repair_directive_no_delivery",
141
+ blocked_actions: ["sf_deliver"],
142
+ reason_zh: "修复重验指令未清零,优先完成修复和复验",
143
+ evidence_field: `repair_reverify_directive.contract_id=${ctx.repair_reverify_directive.contract_id}`,
144
+ });
145
+ }
146
+ // 规则 6: 测试失败 → 禁止交付
147
+ if (ctx?.verification_result?.status === "failed") {
148
+ actions.push({
149
+ rule_id: "test_fail_no_delivery",
150
+ blocked_actions: ["sf_deliver"],
151
+ reason_zh: "测试未通过,禁止交付",
152
+ evidence_field: "verification.status=failed",
153
+ });
154
+ }
155
+ // 规则 7: 本地验收缺失 → 禁止交付结论
156
+ if (ctx?.delivery_readiness?.delivery_allowed && !ctx.local_acceptance_evidence) {
157
+ actions.push({
158
+ rule_id: "missing_local_acceptance_no_delivery",
159
+ blocked_actions: ["sf_deliver"],
160
+ reason_zh: "缺少本地验收证据,禁止交付结论",
161
+ evidence_field: "local_acceptance_evidence 不存在",
162
+ });
163
+ }
164
+ return actions;
165
+ }
166
+ /**
167
+ * 根据阶段计算可执行工作包。
168
+ */
169
+ function computeWorkPackage(projectStage, taskStage, staleTask, ctx, projectPath) {
170
+ // 陈旧任务 → 解决陈旧问题
171
+ if (staleTask?.is_stale) {
172
+ return {
173
+ id: "resolve-stale-task",
174
+ goal_zh: "解决陈旧任务指针",
175
+ description_zh: staleTask.reason_zh,
176
+ action: "resolve_stale",
177
+ input_files: [],
178
+ must_read: [".soloforge/state/current-task.json"],
179
+ forbidden_changes: ["删除任务文件", "绕过 SoloForge 直接操作"],
180
+ expected_outputs: ["选择: 恢复旧任务 / 归档旧任务 / 开始新任务"],
181
+ acceptance_commands: ["soloforge next"],
182
+ user_confirmation_points: ["确认如何处理陈旧任务"],
183
+ rollback_or_fallback: ["恢复归档的指针文件"],
184
+ };
185
+ }
186
+ // 按项目阶段分发工作包
187
+ switch (projectStage) {
188
+ case "uninitialized":
189
+ return {
190
+ id: "project-init",
191
+ goal_zh: "初始化 SoloForge 项目配置",
192
+ description_zh: "运行 soloforge init 初始化 .soloforge/ 目录和项目配置",
193
+ action: "sf_init",
194
+ tool_name: "soloforge",
195
+ tool_args: { command: "init" },
196
+ input_files: [],
197
+ must_read: [],
198
+ forbidden_changes: ["写业务代码", "修改数据库结构", "修改接口语义"],
199
+ expected_outputs: [".soloforge/config.yaml", ".soloforge/config.evidence.json"],
200
+ acceptance_commands: ["soloforge validate"],
201
+ user_confirmation_points: ["确认项目名称、技术栈、产品类型"],
202
+ rollback_or_fallback: ["删除 .soloforge/ 目录重新初始化"],
203
+ };
204
+ case "configuration_pending":
205
+ return {
206
+ id: "config-confirm",
207
+ goal_zh: "确认项目配置",
208
+ description_zh: "运行 soloforge config confirm 确认项目配置字段",
209
+ action: "config_confirm",
210
+ tool_name: "soloforge",
211
+ tool_args: { command: "config", subcommand: "confirm" },
212
+ input_files: [".soloforge/config.yaml"],
213
+ must_read: [".soloforge/config.yaml", ".soloforge/config.evidence.json"],
214
+ forbidden_changes: ["写业务代码"],
215
+ expected_outputs: ["config.evidence.json 中所有字段 confidence=high"],
216
+ acceptance_commands: ["soloforge validate", "soloforge stage"],
217
+ user_confirmation_points: ["确认技术栈、产品类型、构建命令等"],
218
+ rollback_or_fallback: ["soloforge config unset <field>"],
219
+ };
220
+ case "knowledge_ready":
221
+ if (!ctx) {
222
+ return {
223
+ id: "start-new-task",
224
+ goal_zh: "开始新的开发任务",
225
+ description_zh: "使用 sf_classify 提交新的开发意图,开始任务分类",
226
+ action: "sf_classify",
227
+ tool_name: "sf_classify",
228
+ input_files: [],
229
+ must_read: [],
230
+ forbidden_changes: [],
231
+ expected_outputs: ["新的 TaskContext,status=classifying"],
232
+ acceptance_commands: ["soloforge next"],
233
+ user_confirmation_points: [],
234
+ rollback_or_fallback: [],
235
+ };
236
+ }
237
+ break;
238
+ case "design_in_progress":
239
+ return {
240
+ id: "complete-design",
241
+ goal_zh: "完成设计产物并通过审计",
242
+ description_zh: "完成架构/数据库/API 设计产物包,通过审计复验",
243
+ action: "sf_expand",
244
+ tool_name: "sf_expand",
245
+ input_files: [],
246
+ must_read: ["docs/architecture/**"],
247
+ forbidden_changes: ["写业务代码", "改数据库结构", "修改接口语义"],
248
+ expected_outputs: ["design_artifact_pack.status=implementation_ready"],
249
+ acceptance_commands: ["soloforge audit-design-artifacts"],
250
+ user_confirmation_points: ["确认设计产物内容"],
251
+ rollback_or_fallback: ["回退设计产物到草稿状态"],
252
+ };
253
+ case "implementation_ready":
254
+ return {
255
+ id: "first-slice-planning",
256
+ goal_zh: "基于已通过审计的设计产物制定第一阶段开发切片",
257
+ description_zh: "设计产物已通过审计,制定开发切片计划后开始编码",
258
+ action: "slice_planning",
259
+ tool_name: "sf_expand",
260
+ input_files: [],
261
+ must_read: [
262
+ "docs/architecture/01-架构设计文档.md",
263
+ "docs/architecture/02-数据库设计文档.md",
264
+ "docs/architecture/03-API接口规格文档.md",
265
+ ],
266
+ forbidden_changes: ["写业务代码", "改数据库结构", "修改接口语义"],
267
+ expected_outputs: ["切片列表", "推荐第一个切片", "每个切片的验收标准"],
268
+ acceptance_commands: ["soloforge validate"],
269
+ user_confirmation_points: ["确认第一个切片"],
270
+ rollback_or_fallback: ["调整切片划分"],
271
+ };
272
+ case "development_in_progress":
273
+ if (taskStage === "coding") {
274
+ return {
275
+ id: "continue-coding",
276
+ goal_zh: "继续编码实现当前切片",
277
+ description_zh: "继续编码实现,完成后进行本地验证",
278
+ action: "sf_execute",
279
+ tool_name: "sf_execute",
280
+ input_files: [],
281
+ must_read: [],
282
+ forbidden_changes: [],
283
+ expected_outputs: ["代码变更", "执行结果"],
284
+ acceptance_commands: ["soloforge next"],
285
+ user_confirmation_points: [],
286
+ rollback_or_fallback: ["回退代码变更"],
287
+ };
288
+ }
289
+ if (taskStage === "local_verification") {
290
+ return {
291
+ id: "run-verification",
292
+ goal_zh: "执行本地构建和测试验证",
293
+ description_zh: "运行构建和测试命令验证代码变更",
294
+ action: "sf_verify",
295
+ tool_name: "sf_verify",
296
+ input_files: [],
297
+ must_read: [],
298
+ forbidden_changes: [],
299
+ expected_outputs: ["verification.status=passed"],
300
+ acceptance_commands: ["soloforge next"],
301
+ user_confirmation_points: [],
302
+ rollback_or_fallback: ["回退代码变更重新编码"],
303
+ };
304
+ }
305
+ break;
306
+ case "delivery_ready":
307
+ return {
308
+ id: "delivery-acceptance",
309
+ goal_zh: "交付验收",
310
+ description_zh: "任务已通过验证,进行交付验收",
311
+ action: "sf_deliver",
312
+ tool_name: "sf_deliver",
313
+ input_files: [],
314
+ must_read: [],
315
+ forbidden_changes: [],
316
+ expected_outputs: ["交付记录"],
317
+ acceptance_commands: ["soloforge status"],
318
+ user_confirmation_points: ["确认交付内容"],
319
+ rollback_or_fallback: ["回退交付"],
320
+ };
321
+ case "released":
322
+ case "post_release_observation":
323
+ return {
324
+ id: "post-release-observation",
325
+ goal_zh: "发布后观察",
326
+ description_zh: "发布后验证、监控观察、反馈收集、回滚预案检查",
327
+ action: "wait",
328
+ input_files: [],
329
+ must_read: [],
330
+ forbidden_changes: ["直接修改生产环境"],
331
+ expected_outputs: ["监控报告", "用户反馈"],
332
+ acceptance_commands: [],
333
+ user_confirmation_points: [],
334
+ rollback_or_fallback: ["回滚发布"],
335
+ };
336
+ }
337
+ // 默认: 提示下一步
338
+ return {
339
+ id: "check-navigation",
340
+ goal_zh: "查看当前状态和下一步建议",
341
+ description_zh: "当前无特定工作包,建议运行 soloforge next 查看详细导航",
342
+ action: "sf_navigation",
343
+ input_files: [],
344
+ must_read: [],
345
+ forbidden_changes: [],
346
+ expected_outputs: [],
347
+ acceptance_commands: ["soloforge next"],
348
+ user_confirmation_points: [],
349
+ rollback_or_fallback: [],
350
+ };
351
+ }
352
+ /**
353
+ * 计算推荐命令列表。
354
+ */
355
+ function computeRecommendedCommands(projectStage, taskStage, staleTask, workPackage) {
356
+ const commands = [];
357
+ if (staleTask?.is_stale) {
358
+ commands.push("soloforge next # 查看陈旧任务处理建议");
359
+ return commands;
360
+ }
361
+ switch (projectStage) {
362
+ case "uninitialized":
363
+ commands.push("soloforge init");
364
+ commands.push("soloforge init --auto # 自动检测技术栈");
365
+ break;
366
+ case "configuration_pending":
367
+ commands.push("soloforge config confirm <field> <value>");
368
+ commands.push("soloforge config explain <field>");
369
+ break;
370
+ case "knowledge_ready":
371
+ if (!taskStage) {
372
+ commands.push("# 开始新任务: 向 AI 描述你的开发意图");
373
+ }
374
+ break;
375
+ case "design_in_progress":
376
+ commands.push("soloforge audit-design-artifacts # 检查设计产物状态");
377
+ break;
378
+ case "implementation_ready":
379
+ commands.push("# 准备第一个开发切片");
380
+ break;
381
+ case "development_in_progress":
382
+ commands.push("soloforge next # 查看当前任务进度");
383
+ break;
384
+ case "delivery_ready":
385
+ commands.push("soloforge next # 确认交付");
386
+ break;
387
+ default:
388
+ commands.push("soloforge next # 查看下一步建议");
389
+ }
390
+ return commands;
391
+ }
392
+ /**
393
+ * 计算推荐给 AI 的自然语言指令。
394
+ */
395
+ function computeRecommendedPrompt(projectStage, taskStage, staleTask, workPackage) {
396
+ if (staleTask?.is_stale) {
397
+ return "检测到陈旧任务。请先运行 soloforge next 查看处理建议,选择恢复旧任务、归档旧任务或开始新任务。不要绕过 SoloForge 直接操作。";
398
+ }
399
+ switch (projectStage) {
400
+ case "uninitialized":
401
+ return "项目尚未初始化。请先运行 soloforge init 初始化项目配置。";
402
+ case "configuration_pending":
403
+ return "项目配置需要确认。请运行 soloforge config confirm 确认关键字段后再开始开发。";
404
+ case "knowledge_ready":
405
+ if (!taskStage)
406
+ return "项目已就绪,可以开始新的开发任务。请描述你的开发意图。";
407
+ return "任务进行中,请继续当前任务阶段的工作。";
408
+ case "design_in_progress":
409
+ return "设计产物尚未通过审计。请完成架构/数据库/API 设计,通过审计后才能开始编码。";
410
+ case "implementation_ready":
411
+ return "设计已通过审计。建议先制定开发切片计划,然后按切片编码。";
412
+ case "development_in_progress":
413
+ return "开发进行中。请继续当前任务,完成后运行验证。";
414
+ case "delivery_ready":
415
+ return "任务已通过验证,准备交付。请确认交付内容。";
416
+ case "released":
417
+ case "post_release_observation":
418
+ return "已发布。建议进行发布后验证、监控观察和反馈收集。";
419
+ default:
420
+ return "运行 soloforge next 查看详细导航建议。";
421
+ }
422
+ }
423
+ /**
424
+ * 计算警告信息。
425
+ */
426
+ function computeWarnings(projectStage, ctx) {
427
+ const warnings = [];
428
+ if (projectStage === "uninitialized") {
429
+ warnings.push({ code: "NOT_INITIALIZED", message_zh: "项目未初始化,建议先运行 soloforge init" });
430
+ }
431
+ if (ctx?.rework_history && ctx.rework_history.length >= 2) {
432
+ warnings.push({
433
+ code: "HIGH_REWORK_COUNT",
434
+ message_zh: `任务已返工 ${ctx.rework_history.length} 次,请检查根因`,
435
+ });
436
+ }
437
+ return warnings;
438
+ }
439
+ /**
440
+ * 计算阶段判断置信度。
441
+ */
442
+ function computeConfidence(projectStage, ctx) {
443
+ if (projectStage === "uninitialized")
444
+ return "high";
445
+ if (!ctx)
446
+ return "medium";
447
+ if (ctx.classification && ctx.route_decision)
448
+ return "high";
449
+ if (ctx.classification)
450
+ return "medium";
451
+ return "low";
452
+ }
453
+ //# sourceMappingURL=next_action_planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next_action_planner.js","sourceRoot":"","sources":["../../src/engine/next_action_planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * OOD 与 SOLID 实现契约。
3
+ *
4
+ * 复杂业务编码在执行前必须给出对象职责与依赖边界;审查和交付阶段
5
+ * 使用同一套 finding 口径阻断典型的 SOLID 违规。
6
+ */
7
+ export type SolidPrinciple = "SRP" | "OCP" | "LSP" | "ISP" | "DIP" | "OVERDESIGN";
8
+ export type SolidSeverity = "hard_fail" | "warning" | "advisory";
9
+ export interface OodDesignSummary {
10
+ task_id: string;
11
+ status: "required" | "satisfied" | "not_applicable";
12
+ applicability_reason_zh: string;
13
+ objects: Array<{
14
+ name: string;
15
+ responsibility: string;
16
+ }>;
17
+ interfaces: string[];
18
+ dependency_direction: string[];
19
+ change_points: string[];
20
+ solid_risks: string[];
21
+ not_applicable_reason?: string;
22
+ user_confirmation_ref?: string;
23
+ }
24
+ export interface SolidReviewFinding {
25
+ principle: SolidPrinciple;
26
+ severity: SolidSeverity;
27
+ file: string;
28
+ evidence: string;
29
+ suggestion_zh: string;
30
+ }
31
+ export interface OodSolidGateResult {
32
+ applicable: boolean;
33
+ allowed: boolean;
34
+ status: "required" | "satisfied" | "not_applicable" | "blocked";
35
+ reason_zh: string;
36
+ required_summary?: OodDesignSummary;
37
+ findings: SolidReviewFinding[];
38
+ }
39
+ export declare function requiresOodSolidContract(intent: string, route?: string, changedFiles?: string[]): boolean;
40
+ export declare function createOodDesignSummary(taskId: string, intent: string): OodDesignSummary;
41
+ export declare function evaluateOodDesignGate(input: {
42
+ task_id: string;
43
+ intent: string;
44
+ route?: string;
45
+ changed_files?: string[];
46
+ summary?: OodDesignSummary;
47
+ }): OodSolidGateResult;
48
+ export declare function reviewSolidCode(fileContents: Record<string, string>): SolidReviewFinding[];
49
+ export declare function hasBlockingSolidFindings(findings: SolidReviewFinding[]): boolean;
50
+ export declare function evaluateOverdesignRisk(intent: string, summary?: OodDesignSummary): SolidReviewFinding[];
51
+ //# sourceMappingURL=ood_solid_contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ood_solid_contract.d.ts","sourceRoot":"","sources":["../../src/engine/ood_solid_contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,YAAY,CAAC;AAClF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,gBAAgB,CAAC;IACpD,uBAAuB,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAKD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,GAAE,MAAM,EAAO,GAC1B,OAAO,CAKT;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAWvF;AAYD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,GAAG,kBAAkB,CA4BrB;AAaD,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,kBAAkB,EAAE,CA2C1F;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAEhF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,EAAE,CASvG"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * OOD 与 SOLID 实现契约。
3
+ *
4
+ * 复杂业务编码在执行前必须给出对象职责与依赖边界;审查和交付阶段
5
+ * 使用同一套 finding 口径阻断典型的 SOLID 违规。
6
+ */
7
+ const COMPLEX_OOD_KEYWORDS = /领域|业务规则|状态流转|策略模式|计费策略|订单流转|支付编排|结算规则|工作流编排|重构架构|模块设计|服务设计|领域服务|应用服务设计|domain|aggregate|solid|面向对象|职责拆分|接口抽象|依赖倒置/i;
8
+ const LOW_RISK_KEYWORDS = /错别字|拼写|文案|注释|样式|css|颜色|README|日志文案|配置值|测试数据|fixture/i;
9
+ export function requiresOodSolidContract(intent, route, changedFiles = []) {
10
+ const text = `${intent} ${changedFiles.join(" ")}`;
11
+ if (LOW_RISK_KEYWORDS.test(text) && !COMPLEX_OOD_KEYWORDS.test(text))
12
+ return false;
13
+ const codeRoute = !route || ["code_change", "artifact_generation", "operation", "multi_stage_plan"].includes(route);
14
+ return codeRoute && COMPLEX_OOD_KEYWORDS.test(text);
15
+ }
16
+ export function createOodDesignSummary(taskId, intent) {
17
+ return {
18
+ task_id: taskId,
19
+ status: "required",
20
+ applicability_reason_zh: `该任务涉及复杂对象职责或依赖边界,编码前需补齐 OOD/SOLID 摘要: ${intent}`,
21
+ objects: [],
22
+ interfaces: [],
23
+ dependency_direction: [],
24
+ change_points: [],
25
+ solid_risks: [],
26
+ };
27
+ }
28
+ function hasCompleteDesignSummary(summary) {
29
+ return !!summary
30
+ && summary.objects.length > 0
31
+ && summary.objects.every((item) => item.name.trim().length > 0 && item.responsibility.trim().length > 0)
32
+ && summary.interfaces.length > 0
33
+ && summary.dependency_direction.length > 0
34
+ && summary.change_points.length > 0
35
+ && summary.solid_risks.length > 0;
36
+ }
37
+ export function evaluateOodDesignGate(input) {
38
+ if (!requiresOodSolidContract(input.intent, input.route, input.changed_files)) {
39
+ return {
40
+ applicable: false,
41
+ allowed: true,
42
+ status: "not_applicable",
43
+ reason_zh: "低风险或非对象设计任务,无需引入 OOD/SOLID 工作包",
44
+ findings: [],
45
+ };
46
+ }
47
+ if (!hasCompleteDesignSummary(input.summary)) {
48
+ return {
49
+ applicable: true,
50
+ allowed: false,
51
+ status: "blocked",
52
+ reason_zh: "复杂编码任务缺少完整 OOD/SOLID 设计摘要,不得开始实现",
53
+ required_summary: input.summary ?? createOodDesignSummary(input.task_id, input.intent),
54
+ findings: [],
55
+ };
56
+ }
57
+ return {
58
+ applicable: true,
59
+ allowed: true,
60
+ status: "satisfied",
61
+ reason_zh: "OOD/SOLID 设计摘要已具备,可进入实现并在审查阶段复验",
62
+ required_summary: { ...input.summary, status: "satisfied" },
63
+ findings: [],
64
+ };
65
+ }
66
+ function addFinding(findings, principle, severity, file, evidence, suggestion_zh) {
67
+ findings.push({ principle, severity, file, evidence, suggestion_zh });
68
+ }
69
+ export function reviewSolidCode(fileContents) {
70
+ const findings = [];
71
+ for (const [file, content] of Object.entries(fileContents)) {
72
+ const lowered = file.toLowerCase();
73
+ if (/controller/.test(lowered)
74
+ && /(?:repository\.|mapper\.|entitymanager|save\s*\(|@Transactional|calculate|compute)/i.test(content)) {
75
+ addFinding(findings, "SRP", "hard_fail", file, "Controller 同时出现持久化、事务或业务计算职责", "将业务规则与持久化移入应用服务,Controller 仅处理协议适配、校验和响应映射。");
76
+ }
77
+ if (/(?:service|usecase|application)/.test(lowered)
78
+ && /new\s+(?:RestTemplate|WebClient|HttpClient|Stripe|S3|OpenAI|Twilio|Axios|.*Repository)\s*\(/i.test(content)) {
79
+ addFinding(findings, "DIP", "hard_fail", file, "业务服务直接构造外部依赖或仓储实现", "通过端口接口与依赖注入隔离基础设施实现。");
80
+ }
81
+ if (/interface\s+\w+[\s\S]{0,800}(?:upload|export|notify|delete|approve)[\s\S]{0,800}(?:upload|export|notify|delete|approve)/i.test(content)
82
+ && /(?:UnsupportedOperationException|throw new Error\(['\"]not implemented)/i.test(content)) {
83
+ addFinding(findings, "ISP", "hard_fail", file, "实现被迫抛出未支持操作,接口职责过宽", "拆分为客户端真正需要的细粒度接口。");
84
+ }
85
+ if (/(?:extends|implements)\s+\w+[\s\S]{0,500}(?:UnsupportedOperationException|throw new Error\(['\"]unsupported)/i.test(content)) {
86
+ addFinding(findings, "LSP", "hard_fail", file, "子类型拒绝父契约操作", "重构抽象层级,确保替换后仍满足原契约。");
87
+ }
88
+ const branching = (content.match(/\b(?:if|else if|switch)\s*\([^)]*(?:type|status|kind|strategy)/gi) ?? []).length;
89
+ if (branching >= 3) {
90
+ addFinding(findings, "OCP", "warning", file, "同一变化维度出现多处分支扩展点", "用策略/处理器注册方式隔离新增类型,减少修改既有分支。");
91
+ }
92
+ if (/(?:component|page|\.tsx$|\.vue$)/.test(lowered)
93
+ && /(?:fetch\(|axios\.|apiClient|request\()/i.test(content)
94
+ && /(?:useState|useEffect|computed\(|ref\(|watch\()/i.test(content)
95
+ && /(?:if\s*\(|switch\s*\()/i.test(content)) {
96
+ addFinding(findings, "SRP", "hard_fail", file, "复杂 UI 组件混合远程调用、状态编排与业务判断", "拆分展示组件、状态 hook/composable 与 API client/业务服务。");
97
+ }
98
+ }
99
+ return findings;
100
+ }
101
+ export function hasBlockingSolidFindings(findings) {
102
+ return findings.some((finding) => finding.severity === "hard_fail");
103
+ }
104
+ export function evaluateOverdesignRisk(intent, summary) {
105
+ if (!LOW_RISK_KEYWORDS.test(intent) || !summary || summary.objects.length < 4)
106
+ return [];
107
+ return [{
108
+ principle: "OVERDESIGN",
109
+ severity: "warning",
110
+ file: "OOD设计摘要",
111
+ evidence: "低风险修改引入多个对象与抽象边界",
112
+ suggestion_zh: "保持最小实现,不为简单修改提前引入复杂对象结构。",
113
+ }];
114
+ }
115
+ //# sourceMappingURL=ood_solid_contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ood_solid_contract.js","sourceRoot":"","sources":["../../src/engine/ood_solid_contract.ts"],"names":[],"mappings":"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"}