soloforge 1.0.0 → 1.1.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 (182) hide show
  1. package/README.md +4 -1
  2. package/dist/adapters/claude_code/claude_md.d.ts +1 -2
  3. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  4. package/dist/adapters/claude_code/claude_md.js +2 -76
  5. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  6. package/dist/adapters/claude_code/server.d.ts +16 -0
  7. package/dist/adapters/claude_code/server.d.ts.map +1 -1
  8. package/dist/adapters/claude_code/server.js +17 -1
  9. package/dist/adapters/claude_code/server.js.map +1 -1
  10. package/dist/adapters/claude_code/tools.d.ts +32 -1
  11. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  12. package/dist/adapters/claude_code/tools.js +65 -30
  13. package/dist/adapters/claude_code/tools.js.map +1 -1
  14. package/dist/adapters/codex/codex_config.d.ts +3 -0
  15. package/dist/adapters/codex/codex_config.d.ts.map +1 -0
  16. package/dist/adapters/codex/codex_config.js +51 -0
  17. package/dist/adapters/codex/codex_config.js.map +1 -0
  18. package/dist/adapters/codex/codex_rules.d.ts +2 -0
  19. package/dist/adapters/codex/codex_rules.d.ts.map +1 -0
  20. package/dist/adapters/codex/codex_rules.js +5 -0
  21. package/dist/adapters/codex/codex_rules.js.map +1 -0
  22. package/dist/adapters/shared/workflow_template.d.ts +3 -0
  23. package/dist/adapters/shared/workflow_template.d.ts.map +1 -0
  24. package/dist/adapters/shared/workflow_template.js +78 -0
  25. package/dist/adapters/shared/workflow_template.js.map +1 -0
  26. package/dist/adapters/trae/trae_rules.d.ts +1 -2
  27. package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
  28. package/dist/adapters/trae/trae_rules.js +2 -75
  29. package/dist/adapters/trae/trae_rules.js.map +1 -1
  30. package/dist/bin/soloforge.js +146 -22
  31. package/dist/bin/soloforge.js.map +1 -1
  32. package/dist/engine/change_coordinator.d.ts +20 -5
  33. package/dist/engine/change_coordinator.d.ts.map +1 -1
  34. package/dist/engine/change_coordinator.js +36 -22
  35. package/dist/engine/change_coordinator.js.map +1 -1
  36. package/dist/engine/classifier.d.ts +7 -0
  37. package/dist/engine/classifier.d.ts.map +1 -1
  38. package/dist/engine/classifier.js +75 -3
  39. package/dist/engine/classifier.js.map +1 -1
  40. package/dist/engine/code_reviewer.d.ts +37 -1
  41. package/dist/engine/code_reviewer.d.ts.map +1 -1
  42. package/dist/engine/code_reviewer.js +126 -24
  43. package/dist/engine/code_reviewer.js.map +1 -1
  44. package/dist/engine/confidence_scorer.d.ts +21 -0
  45. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  46. package/dist/engine/confidence_scorer.js +19 -6
  47. package/dist/engine/confidence_scorer.js.map +1 -1
  48. package/dist/engine/contract_guard.d.ts +23 -0
  49. package/dist/engine/contract_guard.d.ts.map +1 -1
  50. package/dist/engine/contract_guard.js +152 -43
  51. package/dist/engine/contract_guard.js.map +1 -1
  52. package/dist/engine/convention_detector.d.ts +20 -0
  53. package/dist/engine/convention_detector.d.ts.map +1 -1
  54. package/dist/engine/convention_detector.js +19 -1
  55. package/dist/engine/convention_detector.js.map +1 -1
  56. package/dist/engine/debt_reporter.d.ts +5 -0
  57. package/dist/engine/debt_reporter.d.ts.map +1 -1
  58. package/dist/engine/debt_reporter.js +30 -6
  59. package/dist/engine/debt_reporter.js.map +1 -1
  60. package/dist/engine/debt_tracker.d.ts +52 -0
  61. package/dist/engine/debt_tracker.d.ts.map +1 -1
  62. package/dist/engine/debt_tracker.js +66 -1
  63. package/dist/engine/debt_tracker.js.map +1 -1
  64. package/dist/engine/debugger.d.ts +9 -0
  65. package/dist/engine/debugger.d.ts.map +1 -1
  66. package/dist/engine/debugger.js +112 -20
  67. package/dist/engine/debugger.js.map +1 -1
  68. package/dist/engine/delivery.d.ts +27 -0
  69. package/dist/engine/delivery.d.ts.map +1 -1
  70. package/dist/engine/delivery.js +67 -13
  71. package/dist/engine/delivery.js.map +1 -1
  72. package/dist/engine/dependency_scanner.d.ts +5 -8
  73. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  74. package/dist/engine/dependency_scanner.js +46 -29
  75. package/dist/engine/dependency_scanner.js.map +1 -1
  76. package/dist/engine/evolver.d.ts +54 -0
  77. package/dist/engine/evolver.d.ts.map +1 -1
  78. package/dist/engine/evolver.js +159 -6
  79. package/dist/engine/evolver.js.map +1 -1
  80. package/dist/engine/exploration.d.ts +114 -0
  81. package/dist/engine/exploration.d.ts.map +1 -0
  82. package/dist/engine/exploration.js +414 -0
  83. package/dist/engine/exploration.js.map +1 -0
  84. package/dist/engine/failure_classifier.d.ts +28 -0
  85. package/dist/engine/failure_classifier.d.ts.map +1 -1
  86. package/dist/engine/failure_classifier.js +51 -5
  87. package/dist/engine/failure_classifier.js.map +1 -1
  88. package/dist/engine/git_deps.d.ts +29 -0
  89. package/dist/engine/git_deps.d.ts.map +1 -1
  90. package/dist/engine/git_deps.js +1 -0
  91. package/dist/engine/git_deps.js.map +1 -1
  92. package/dist/engine/impact_analyzer.d.ts +17 -0
  93. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  94. package/dist/engine/impact_analyzer.js +76 -4
  95. package/dist/engine/impact_analyzer.js.map +1 -1
  96. package/dist/engine/intent_expander.d.ts +58 -0
  97. package/dist/engine/intent_expander.d.ts.map +1 -1
  98. package/dist/engine/intent_expander.js +173 -1
  99. package/dist/engine/intent_expander.js.map +1 -1
  100. package/dist/engine/migration_guard.d.ts +6 -0
  101. package/dist/engine/migration_guard.d.ts.map +1 -1
  102. package/dist/engine/migration_guard.js +26 -7
  103. package/dist/engine/migration_guard.js.map +1 -1
  104. package/dist/engine/observability.d.ts +31 -7
  105. package/dist/engine/observability.d.ts.map +1 -1
  106. package/dist/engine/observability.js +88 -28
  107. package/dist/engine/observability.js.map +1 -1
  108. package/dist/engine/onboarding.d.ts +41 -1
  109. package/dist/engine/onboarding.d.ts.map +1 -1
  110. package/dist/engine/onboarding.js +83 -8
  111. package/dist/engine/onboarding.js.map +1 -1
  112. package/dist/engine/scaffolder.d.ts +10 -0
  113. package/dist/engine/scaffolder.d.ts.map +1 -1
  114. package/dist/engine/scaffolder.js +55 -10
  115. package/dist/engine/scaffolder.js.map +1 -1
  116. package/dist/engine/scope_controller.d.ts +13 -0
  117. package/dist/engine/scope_controller.d.ts.map +1 -1
  118. package/dist/engine/scope_controller.js +76 -12
  119. package/dist/engine/scope_controller.js.map +1 -1
  120. package/dist/engine/task_context.d.ts +124 -0
  121. package/dist/engine/task_context.d.ts.map +1 -1
  122. package/dist/engine/task_context.js +155 -7
  123. package/dist/engine/task_context.js.map +1 -1
  124. package/dist/engine/task_planner.d.ts +17 -0
  125. package/dist/engine/task_planner.d.ts.map +1 -1
  126. package/dist/engine/task_planner.js +51 -4
  127. package/dist/engine/task_planner.js.map +1 -1
  128. package/dist/engine/team_awareness.d.ts +17 -0
  129. package/dist/engine/team_awareness.d.ts.map +1 -1
  130. package/dist/engine/team_awareness.js +29 -11
  131. package/dist/engine/team_awareness.js.map +1 -1
  132. package/dist/engine/test_generator.d.ts +5 -4
  133. package/dist/engine/test_generator.d.ts.map +1 -1
  134. package/dist/engine/test_generator.js +22 -5
  135. package/dist/engine/test_generator.js.map +1 -1
  136. package/dist/engine/test_quality.d.ts +11 -4
  137. package/dist/engine/test_quality.d.ts.map +1 -1
  138. package/dist/engine/test_quality.js +171 -14
  139. package/dist/engine/test_quality.js.map +1 -1
  140. package/dist/engine/verifier.d.ts +41 -0
  141. package/dist/engine/verifier.d.ts.map +1 -1
  142. package/dist/engine/verifier.js +110 -1
  143. package/dist/engine/verifier.js.map +1 -1
  144. package/dist/git/operations.d.ts +1 -0
  145. package/dist/git/operations.d.ts.map +1 -1
  146. package/dist/git/operations.js +3 -0
  147. package/dist/git/operations.js.map +1 -1
  148. package/dist/index.d.ts +9 -0
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +14 -0
  151. package/dist/index.js.map +1 -1
  152. package/dist/knowledge/index_manager.d.ts +7 -1
  153. package/dist/knowledge/index_manager.d.ts.map +1 -1
  154. package/dist/knowledge/index_manager.js +112 -37
  155. package/dist/knowledge/index_manager.js.map +1 -1
  156. package/dist/knowledge/loader.d.ts +31 -0
  157. package/dist/knowledge/loader.d.ts.map +1 -1
  158. package/dist/knowledge/loader.js +102 -8
  159. package/dist/knowledge/loader.js.map +1 -1
  160. package/dist/types.d.ts +608 -0
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +1 -1
  163. package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +19 -0
  164. package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +4 -0
  165. package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +4 -1
  166. package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +34 -0
  167. package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +66 -0
  168. package/templates/scaffolds/react/Form.tsx.hbs +9 -1
  169. package/templates/scaffolds/react/List.tsx.hbs +10 -1
  170. package/templates/scaffolds/react/Page.tsx.hbs +4 -1
  171. package/templates/scaffolds/react/service.ts.hbs +29 -0
  172. package/templates/scaffolds/react/types.ts.hbs +7 -1
  173. package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +34 -2
  174. package/templates/scaffolds/spring-boot/Controller.java.hbs +27 -0
  175. package/templates/scaffolds/spring-boot/DTO.java.hbs +7 -1
  176. package/templates/scaffolds/spring-boot/Entity.java.hbs +11 -1
  177. package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +13 -1
  178. package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
  179. package/templates/scaffolds/spring-boot/PageResponse.java.hbs +24 -1
  180. package/templates/scaffolds/spring-boot/Service.java.hbs +32 -0
  181. package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +23 -5
  182. package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +7 -1
@@ -1,37 +1,66 @@
1
1
  import type { GitFileStatus, GitLogEntry, GitDiffHunk, GitBlameLine } from "../git/operations.js";
2
+ /**
3
+ * Git 操作依赖注入模块。
4
+ * @description 定义 GitOperations 接口作为抽象层,并导出基于真实 Git 命令的实现(realGitOps)。
5
+ * 使用依赖注入模式,便于测试时替换为 mock 实现。
6
+ */
7
+ /**
8
+ * Git 操作抽象接口。
9
+ * @description 封装所有项目需要的 Git 操作,包括仓库查询、状态检查、日志查看、
10
+ * 差异比较、分支管理和远程操作等。
11
+ */
2
12
  export interface GitOperations {
13
+ /** 检查指定目录是否为 Git 仓库 */
3
14
  isGitRepo(cwd: string): Promise<boolean>;
15
+ /** 获取 Git 仓库根目录路径 */
4
16
  getRootDir(cwd: string): Promise<string>;
17
+ /** 获取当前分支名称 */
5
18
  getCurrentBranch(cwd: string): Promise<string>;
19
+ /** 检查工作区是否干净(无未提交变更) */
6
20
  isClean(cwd: string): Promise<boolean>;
21
+ /** 获取工作区文件状态列表 */
7
22
  getStatus(cwd: string): Promise<GitFileStatus[]>;
23
+ /** 获取提交日志,支持按数量、时间、作者和路径过滤 */
8
24
  getLog(cwd: string, options?: {
9
25
  maxCount?: number;
10
26
  since?: string;
11
27
  author?: string;
12
28
  path?: string;
13
29
  }): Promise<GitLogEntry[]>;
30
+ /** 获取简短日志摘要(按作者分组统计提交数) */
14
31
  getShortlog(cwd: string, since?: string): Promise<Array<{
15
32
  author: string;
16
33
  count: number;
17
34
  }>>;
35
+ /** 获取差异信息(结构化 Hunk 列表) */
18
36
  getDiff(cwd: string, options?: {
19
37
  cached?: boolean;
20
38
  path?: string;
21
39
  }): Promise<GitDiffHunk[]>;
40
+ /** 获取指定文件的差异补丁文本 */
22
41
  getDiffPatch(cwd: string, filePath: string, options?: {
23
42
  cached?: boolean;
24
43
  }): Promise<string>;
44
+ /** 获取指定文件的逐行 Blame 信息 */
25
45
  getBlame(cwd: string, filePath: string): Promise<GitBlameLine[]>;
46
+ /** 列出所有本地分支及其当前标记 */
26
47
  listBranches(cwd: string): Promise<Array<{
27
48
  name: string;
28
49
  isCurrent: boolean;
29
50
  }>>;
51
+ /** 将文件添加到暂存区 */
30
52
  add(cwd: string, paths: string[]): Promise<void>;
53
+ /** 创建提交,返回提交 SHA */
31
54
  commit(cwd: string, message: string): Promise<string>;
55
+ /** 推送到远程仓库,返回推送结果 */
32
56
  push(cwd: string, remote?: string, branch?: string): Promise<string>;
57
+ /** 获取两个分支的最新公共祖先提交 SHA */
33
58
  getMergeBase(cwd: string, branchA: string, branchB: string): Promise<string>;
59
+ /** 获取远程仓库 URL,不存在则返回 null */
34
60
  getRemoteUrl(cwd: string, remote?: string): Promise<string | null>;
61
+ /** 获取 HEAD 的短 commit hash */
62
+ getHeadCommitHash(cwd: string): Promise<string>;
35
63
  }
64
+ /** 基于真实 Git 命令的 GitOperations 实现 */
36
65
  export declare const realGitOps: GitOperations;
37
66
  //# sourceMappingURL=git_deps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git_deps.d.ts","sourceRoot":"","sources":["../../src/engine/git_deps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGlG,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7H,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAChF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,UAAU,EAAE,aAAmB,CAAC"}
1
+ {"version":3,"file":"git_deps.d.ts","sourceRoot":"","sources":["../../src/engine/git_deps.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import * as ops from "../git/operations.js";
2
+ /** 基于真实 Git 命令的 GitOperations 实现 */
2
3
  export const realGitOps = ops;
3
4
  //# sourceMappingURL=git_deps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git_deps.js","sourceRoot":"","sources":["../../src/engine/git_deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAqB5C,MAAM,CAAC,MAAM,UAAU,GAAkB,GAAG,CAAC"}
1
+ {"version":3,"file":"git_deps.js","sourceRoot":"","sources":["../../src/engine/git_deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAkD5C,oCAAoC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAkB,GAAG,CAAC"}
@@ -1,4 +1,14 @@
1
1
  import type { ClassifyResult, ExpandResult, ImpactAnalysisResult, ProjectConfig } from "../types.js";
2
+ /**
3
+ * 影响分析器 — 根据用户意图和分类结果,自动识别受影响的文件并评估作用域充分性。
4
+ *
5
+ * 核心流程:
6
+ * 1. 从意图中提取业务实体名(中文名词或英文 PascalCase)
7
+ * 2. 在受影响仓库的文件路径中搜索匹配的实体文件
8
+ * 3. 将搜索结果与声明的允许范围对比,判断是否存在越界文件
9
+ * 4. 根据越界文件的置信度给出建议(proceed / expand_scope / confirm)
10
+ */
11
+ /** 影响分析输入参数 */
2
12
  export interface ImpactAnalyzeInput {
3
13
  intent: string;
4
14
  classification: ClassifyResult;
@@ -6,5 +16,12 @@ export interface ImpactAnalyzeInput {
6
16
  config: ProjectConfig;
7
17
  projectPath: string;
8
18
  }
19
+ /**
20
+ * 执行影响范围分析。
21
+ * 从用户意图中提取业务实体,搜索可能受影响的文件,
22
+ * 并与声明的允许范围进行对比,判断作用域是否充分。
23
+ * @param input - 影响分析输入,包含意图、分类结果、扩展结果、项目配置和路径
24
+ * @returns 影响分析结果,包含受影响文件列表、越界文件和建议
25
+ */
9
26
  export declare function analyzeImpact(input: ImpactAnalyzeInput): Promise<ImpactAnalysisResult>;
10
27
  //# sourceMappingURL=impact_analyzer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"impact_analyzer.d.ts","sourceRoot":"","sources":["../../src/engine/impact_analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkD5F"}
1
+ {"version":3,"file":"impact_analyzer.d.ts","sourceRoot":"","sources":["../../src/engine/impact_analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjH;;;;;;;;GAQG;AAEH,eAAe;AACf,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkD5F"}
@@ -1,5 +1,12 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
+ /**
4
+ * 执行影响范围分析。
5
+ * 从用户意图中提取业务实体,搜索可能受影响的文件,
6
+ * 并与声明的允许范围进行对比,判断作用域是否充分。
7
+ * @param input - 影响分析输入,包含意图、分类结果、扩展结果、项目配置和路径
8
+ * @returns 影响分析结果,包含受影响文件列表、越界文件和建议
9
+ */
3
10
  export async function analyzeImpact(input) {
4
11
  const { intent, classification, expansion, config, projectPath } = input;
5
12
  // 提取业务实体名
@@ -38,6 +45,12 @@ export async function analyzeImpact(input) {
38
45
  expand_suggestion: expandSuggestion,
39
46
  };
40
47
  }
48
+ /**
49
+ * 从意图文本中提取业务实体名称。
50
+ * 支持中文业务名词匹配和英文 PascalCase 识别。
51
+ * @param intent - 用户意图文本
52
+ * @returns 提取到的实体名称列表(去重后)
53
+ */
41
54
  function extractEntities(intent) {
42
55
  // 从意图中提取业务实体(中文词组或英文驼峰词)
43
56
  const entities = [];
@@ -52,7 +65,7 @@ function extractEntities(intent) {
52
65
  entities.push(term);
53
66
  }
54
67
  }
55
- // 英文实体提取: PascalCase
68
+ // 英文实体提取: PascalCase 词(匹配如 OrderService、UserController 等)
56
69
  const pascalMatches = intent.match(/[A-Z][a-z]+(?:[A-Z][a-z]+)*/g);
57
70
  if (pascalMatches) {
58
71
  for (const m of pascalMatches) {
@@ -62,6 +75,15 @@ function extractEntities(intent) {
62
75
  }
63
76
  return entities;
64
77
  }
78
+ /**
79
+ * 在受影响仓库中递归搜索与实体名相关的文件。
80
+ * 对每个仓库列出所有源文件,通过路径匹配判断关联性。
81
+ * @param entities - 业务实体名称列表
82
+ * @param affectedRepos - 受影响的仓库名称列表
83
+ * @param config - 项目配置(包含仓库信息)
84
+ * @param projectPath - 项目根路径
85
+ * @returns 匹配到的受影响文件列表(含置信度和匹配原因)
86
+ */
65
87
  async function searchAffectedFiles(entities, affectedRepos, config, projectPath) {
66
88
  const results = [];
67
89
  for (const repo of affectedRepos) {
@@ -90,13 +112,21 @@ async function searchAffectedFiles(entities, affectedRepos, config, projectPath)
90
112
  }
91
113
  return results;
92
114
  }
115
+ /**
116
+ * 递归列出目录下所有文件。
117
+ * 自动跳过隐藏目录和常见的构建产物目录。
118
+ * @param dir - 起始目录路径
119
+ * @param maxDepth - 最大递归深度,默认 6 层,防止遍历过深
120
+ * @param depth - 当前递归深度(内部递归使用)
121
+ * @returns 目录下所有文件的绝对路径列表
122
+ */
93
123
  async function listFilesRecursive(dir, maxDepth = 6, depth = 0) {
94
124
  if (depth > maxDepth)
95
- return [];
125
+ return []; // 超出最大深度,停止递归
96
126
  const entries = await fs.readdir(dir, { withFileTypes: true });
97
127
  const files = [];
98
128
  for (const entry of entries) {
99
- // 跳过隐藏目录和常见忽略目录
129
+ // 跳过隐藏目录和常见构建/依赖目录
100
130
  if (entry.name.startsWith(".") || ["node_modules", "target", "build", "dist", ".git"].includes(entry.name)) {
101
131
  continue;
102
132
  }
@@ -110,19 +140,34 @@ async function listFilesRecursive(dir, maxDepth = 6, depth = 0) {
110
140
  }
111
141
  return files;
112
142
  }
143
+ /**
144
+ * 判断文件路径是否与业务实体相关,并返回匹配的置信度。
145
+ *
146
+ * 置信度规则:
147
+ * - high: 文件名直接包含实体名且带有 Entity/DO/DTO/VO/PO/Model 后缀
148
+ * - medium: 文件名包含实体名且为 Service/Controller/Mapper/Repository/Component 或测试文件
149
+ * - low: 文件名或路径中包含实体名,但无明确结构关联
150
+ *
151
+ * @param filePath - 文件相对路径
152
+ * @param entities - 业务实体名称列表
153
+ * @returns 匹配结果(包含原因和置信度),未匹配返回 null
154
+ */
113
155
  function matchEntityInPath(filePath, entities) {
114
156
  const basename = path.basename(filePath, path.extname(filePath));
115
157
  const lowerPath = filePath.toLowerCase();
116
158
  for (const entity of entities) {
117
159
  const entityLower = entity.toLowerCase();
118
- // 高置信度: 文件名直接包含实体名(Entity/DO/DTO)
160
+ // 高置信度: 文件名直接包含实体名且为数据模型类
119
161
  if (basename.toLowerCase().includes(entityLower)) {
162
+ // 数据模型后缀 — 直接对应实体定义
120
163
  if (/Entity|DO|DTO|VO|PO|Model/.test(basename)) {
121
164
  return { reason: `${basename} 直接对应实体 ${entity}`, confidence: "high" };
122
165
  }
166
+ // 业务层后缀 — 操作该实体的服务或控制器
123
167
  if (/Service|Controller|Mapper|Repository|Component/.test(basename)) {
124
168
  return { reason: `${basename} 操作实体 ${entity}`, confidence: "medium" };
125
169
  }
170
+ // 测试文件 — 间接关联该实体
126
171
  if (/test|spec/i.test(basename)) {
127
172
  return { reason: `${basename} 测试实体 ${entity}`, confidence: "medium" };
128
173
  }
@@ -135,8 +180,16 @@ function matchEntityInPath(filePath, entities) {
135
180
  }
136
181
  return null;
137
182
  }
183
+ /**
184
+ * 检查文件路径是否在允许的范围内。
185
+ * 支持 glob 风格的 `**` 通配符,并执行目录边界校验防止部分前缀匹配。
186
+ * @param filePath - 待检查的文件路径
187
+ * @param allowedPaths - 允许的路径模式列表(支持 ** 通配符)
188
+ * @returns true 表示路径在允许范围内
189
+ */
138
190
  function isPathInScope(filePath, allowedPaths) {
139
191
  return allowedPaths.some((allowed) => {
192
+ // 去除 glob 通配符和尾部斜杠,得到规范化的目录前缀
140
193
  let normalized = allowed.replace(/\*\*/g, "").replace(/\/$/, "");
141
194
  if (!filePath.startsWith(normalized))
142
195
  return false;
@@ -146,6 +199,17 @@ function isPathInScope(filePath, allowedPaths) {
146
199
  return filePath[normalized.length] === "/";
147
200
  });
148
201
  }
202
+ /**
203
+ * 根据越界文件的置信度推导后续建议。
204
+ *
205
+ * 决策规则:
206
+ * - 无越界文件 → proceed(直接执行)
207
+ * - 存在高或中置信度越界文件 → expand_scope(建议扩大范围)
208
+ * - 仅有低置信度越界文件 → confirm(建议人工确认)
209
+ *
210
+ * @param outOfScope - 越界文件列表
211
+ * @returns 建议类型
212
+ */
149
213
  function deriveRecommendation(outOfScope) {
150
214
  if (outOfScope.length === 0)
151
215
  return "proceed";
@@ -155,9 +219,17 @@ function deriveRecommendation(outOfScope) {
155
219
  return "expand_scope";
156
220
  return "confirm";
157
221
  }
222
+ /** 对目录路径列表去重 */
158
223
  function deduplicatePaths(dirs) {
159
224
  return [...new Set(dirs)];
160
225
  }
226
+ /**
227
+ * 格式化影响分析的摘要文本。
228
+ * @param affected - 受影响文件总数
229
+ * @param outOfScope - 越界文件数量
230
+ * @param recommendation - 建议类型
231
+ * @returns 人类可读的摘要字符串
232
+ */
161
233
  function formatSummary(affected, outOfScope, recommendation) {
162
234
  if (recommendation === "proceed") {
163
235
  return `影响范围分析完成: ${affected} 个相关文件,全部在声明范围内`;
@@ -1 +1 @@
1
- {"version":3,"file":"impact_analyzer.js","sourceRoot":"","sources":["../../src/engine/impact_analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"impact_analyzer.js","sourceRoot":"","sources":["../../src/engine/impact_analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,23 @@
1
+ /**
2
+ * 意图膨胀器 — 将分类结果扩展为包含完整上下文的 AI 执行 prompt。
3
+ *
4
+ * 核心职责:
5
+ * - 查询知识库获取匹配的领域知识
6
+ * - 检测遗留代码惯例(通过 convention_detector)
7
+ * - 解析 scope(允许修改路径、新建文件规则)
8
+ * - 生成验收标准(自动 + 人工)
9
+ * - 组装 Handlebars 模板生成最终 prompt
10
+ * - 生成执行契约(能力 1: 约束 + 停止条件)
11
+ * - 生成不确定性触发条件(能力 4: DDL/权限/金额等高风险模式识别)
12
+ */
1
13
  import type { ProjectConfig, ClassifyResult, ExpandResult, SubTask } from "../types.js";
2
14
  import type { KnowledgeIndexManager } from "../knowledge/index_manager.js";
15
+ /** 计划阶段上下文: 用于多阶段执行时注入当前步骤信息 */
3
16
  export interface PlanContext {
4
17
  current_step: SubTask;
5
18
  previous_outputs: Record<string, string>;
6
19
  }
20
+ /** 意图膨胀输入参数 */
7
21
  export interface ExpandInput {
8
22
  intent: string;
9
23
  classification: ClassifyResult;
@@ -13,5 +27,49 @@ export interface ExpandInput {
13
27
  clarificationAnswers?: string[];
14
28
  plan_context?: PlanContext;
15
29
  }
30
+ /**
31
+ * 将分类结果扩展为完整的 AI 执行 prompt 和配套元数据。
32
+ * @param input - 膨胀输入,包含意图、分类结果、项目配置、知识索引等
33
+ * @returns 膨胀结果,包含 prompt / scope / 验收标准 / 执行契约 / 不确定性触发条件
34
+ */
16
35
  export declare function expand(input: ExpandInput): Promise<ExpandResult>;
36
+ /** 熔断触发结果 */
37
+ export interface CircuitBreakerResult {
38
+ /** 是否触发熔断 */
39
+ tripped: boolean;
40
+ /** 置信度 (0-1) */
41
+ confidence: number;
42
+ /** 熔断原因 */
43
+ reason?: string;
44
+ /** 头脑风暴输出(熔断时生成) */
45
+ brainstorm?: BrainstormOutput;
46
+ }
47
+ /** 头脑风暴输出 */
48
+ export interface BrainstormOutput {
49
+ /** 三个逻辑盲区 */
50
+ blind_spots: string[];
51
+ /** 三轨演进路径 */
52
+ evolution_tracks: {
53
+ minimal: string;
54
+ industrial: string;
55
+ radical: string;
56
+ };
57
+ /** 闭环逼问(≤3 个 A/B 选择题) */
58
+ decision_questions: Array<{
59
+ question: string;
60
+ option_a: string;
61
+ option_b: string;
62
+ }>;
63
+ }
64
+ /**
65
+ * 置信度熔断器 — 评估意图清晰度,低于阈值触发 sf_brainstorm 模式。
66
+ * 评估维度: 知识匹配度、意图明确性、分类一致性。
67
+ * 熔断后不输出执行代码,而是输出头脑风暴结构供人类决策。
68
+ */
69
+ export declare function checkCircuitBreaker(params: {
70
+ intent: string;
71
+ classification: ClassifyResult;
72
+ matchedEntries: any[];
73
+ degraded: boolean;
74
+ }): CircuitBreakerResult;
17
75
  //# sourceMappingURL=intent_expander.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent_expander.d.ts","sourceRoot":"","sources":["../../src/engine/intent_expander.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAsE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5J,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AA6D3E,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAqGtE"}
1
+ {"version":3,"file":"intent_expander.d.ts","sourceRoot":"","sources":["../../src/engine/intent_expander.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAsE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5J,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AA8D3E,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,eAAe;AACf,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAuItE;AAwZD,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,aAAa;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa;IACb,gBAAgB,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,yBAAyB;IACzB,kBAAkB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrF;AAKD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,GAAG,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,oBAAoB,CA4CvB"}
@@ -1,5 +1,6 @@
1
1
  import Handlebars from "handlebars";
2
2
  import { detectConventions } from "./convention_detector.js";
3
+ // AI 执行 prompt 模板: 包含任务描述、项目上下文、知识匹配、scope 约束、验收标准
3
4
  const PROMPT_TEMPLATE = Handlebars.compile(`## 任务
4
5
  {{intent}}
5
6
 
@@ -57,6 +58,11 @@ const PROMPT_TEMPLATE = Handlebars.compile(`## 任务
57
58
  **注意**: 当前无领域知识匹配,请保守操作,只修改必要文件。
58
59
  {{/if}}
59
60
  `);
61
+ /**
62
+ * 将分类结果扩展为完整的 AI 执行 prompt 和配套元数据。
63
+ * @param input - 膨胀输入,包含意图、分类结果、项目配置、知识索引等
64
+ * @returns 膨胀结果,包含 prompt / scope / 验收标准 / 执行契约 / 不确定性触发条件
65
+ */
60
66
  export async function expand(input) {
61
67
  const { intent, classification, projectPath, config, knowledgeIndex } = input;
62
68
  // 1. 查询知识库
@@ -123,11 +129,42 @@ export async function expand(input) {
123
129
  if (input.plan_context) {
124
130
  prompt = injectPlanContext(prompt, input.plan_context, knowledgeIndex);
125
131
  }
126
- // 6. 使用计数已通过 markUsed 更新(步骤 89-91),无需重复递增
132
+ // 6. 使用计数已通过 markUsed 更新,无需重复递增
127
133
  // 7. 生成执行契约(能力 1)
128
134
  const contract = buildExecutionContract(intent, classification, scope, acceptance);
129
135
  // 8. 生成不确定性触发条件(能力 4)
130
136
  const uncertaintyTriggers = buildUncertaintyTriggers(classification, intent);
137
+ // 机制 1: 意图熔断器检查
138
+ const breakerResult = checkCircuitBreaker({
139
+ intent,
140
+ classification,
141
+ matchedEntries,
142
+ degraded,
143
+ });
144
+ // 熔断触发时: 注入头脑风暴 prompt,不阻止流程但标记 tripped
145
+ let circuitBreakerOutput;
146
+ if (breakerResult.tripped) {
147
+ circuitBreakerOutput = breakerResult;
148
+ prompt += `
149
+
150
+ ---
151
+ ## ⚠ 意图熔断触发(置信度: ${breakerResult.confidence.toFixed(2)})
152
+ 当前需求理解置信度低于 ${CONFIDENCE_THRESHOLD},以下为分析辅助:
153
+
154
+ ### 【逻辑盲区】
155
+ ${breakerResult.brainstorm.blind_spots.map((s) => `- ${s}`).join("\n")}
156
+
157
+ ### 【三轨演进】
158
+ - **极简验证路径**: ${breakerResult.brainstorm.evolution_tracks.minimal}
159
+ - **工业级标准路径**: ${breakerResult.brainstorm.evolution_tracks.industrial}
160
+ - **激进重构路径**: ${breakerResult.brainstorm.evolution_tracks.radical}
161
+
162
+ ### 【闭环逼问】
163
+ ${breakerResult.brainstorm.decision_questions.map((q, i) => `${i + 1}. ${q.question}\n A) ${q.option_a}\n B) ${q.option_b}`).join("\n\n")}
164
+
165
+ **注意**: 请等待人类决策后再输出执行代码。
166
+ `;
167
+ }
131
168
  return {
132
169
  task_id: "", // 由调用方填充
133
170
  prompt,
@@ -140,6 +177,7 @@ export async function expand(input) {
140
177
  degraded,
141
178
  contract,
142
179
  uncertainty_triggers: uncertaintyTriggers.length > 0 ? uncertaintyTriggers : undefined,
180
+ circuit_breaker: circuitBreakerOutput,
143
181
  };
144
182
  }
145
183
  /**
@@ -147,6 +185,10 @@ export async function expand(input) {
147
185
  * 将当前计划步骤的上下文注入到 expansion prompt 中。
148
186
  * 包括:上一步产出文件内容、输出格式模板、建议工具。
149
187
  * AI 自主决定执行方式(P4: 评估结果不评估路径)。
188
+ * @param prompt - 基础 prompt 文本
189
+ * @param planContext - 当前计划步骤上下文
190
+ * @param knowledgeIndex - 知识索引管理器,用于查询输出模板
191
+ * @returns 注入上下文后的 prompt 文本
150
192
  */
151
193
  function injectPlanContext(prompt, planContext, knowledgeIndex) {
152
194
  const { current_step, previous_outputs } = planContext;
@@ -184,6 +226,11 @@ function injectPlanContext(prompt, planContext, knowledgeIndex) {
184
226
  return prompt;
185
227
  return `${prompt}\n\n---\n\n## 当前计划阶段\n正在执行: **${current_step.title}**\n${current_step.description}\n\n${sections.join("\n\n")}`;
186
228
  }
229
+ /**
230
+ * 简单关键词提取: 移除中文虚词后按分隔符拆分,过滤长度不足 2 的词。
231
+ * @param intent - 原始意图文本
232
+ * @returns 关键词数组
233
+ */
187
234
  function extractKeywords(intent) {
188
235
  // 简单关键词提取: 按常见分隔符拆分,过滤短词
189
236
  return intent
@@ -191,6 +238,13 @@ function extractKeywords(intent) {
191
238
  .split(/[\s,,、;;]+/)
192
239
  .filter((w) => w.length >= 2);
193
240
  }
241
+ /**
242
+ * 解析任务作用域: 基于分类结果的受影响仓库确定允许修改路径和只读路径。
243
+ * @param config - 项目配置
244
+ * @param classification - 分类结果
245
+ * @param degraded - 是否处于降级模式(无知识匹配时降级,禁止新建文件)
246
+ * @returns 作用域结果,包含 allowed_paths / readonly_paths / new_files_allowed
247
+ */
194
248
  function resolveScope(config, classification, degraded) {
195
249
  const allowedPaths = [];
196
250
  for (const repoName of classification.affected_repos) {
@@ -220,6 +274,15 @@ function resolveScope(config, classification, degraded) {
220
274
  : undefined,
221
275
  };
222
276
  }
277
+ /**
278
+ * 生成验收标准: 降级模式仅含编译+测试,完整模式额外解析知识中的验收项并按任务类型添加人工验收。
279
+ * @param intent - 用户意图
280
+ * @param classification - 分类结果
281
+ * @param matchedEntries - 匹配的知识条目
282
+ * @param _config - 项目配置(预留参数)
283
+ * @param degraded - 是否处于降级模式
284
+ * @returns 自动验收项和人工验收项
285
+ */
223
286
  function generateAcceptance(intent, classification, matchedEntries, _config, degraded) {
224
287
  const automated = [];
225
288
  const manual = [];
@@ -267,6 +330,12 @@ function generateAcceptance(intent, classification, matchedEntries, _config, deg
267
330
  }
268
331
  return { automated, manual };
269
332
  }
333
+ /**
334
+ * 从知识条目的 Markdown 正文中解析 "## 验收项" 下的验收条目。
335
+ * 支持 `(check: 命令)` 语法提取自动检查命令。
336
+ * @param body - 知识条目的 Markdown 正文
337
+ * @returns 解析到的验收项数组
338
+ */
270
339
  function parseAcceptanceItems(body) {
271
340
  const items = [];
272
341
  if (!body.includes("## 验收项"))
@@ -293,6 +362,11 @@ function parseAcceptanceItems(body) {
293
362
  }
294
363
  return items;
295
364
  }
365
+ /**
366
+ * 构建技术栈标签字符串,用于 prompt 中展示项目技术栈信息。
367
+ * @param config - 项目配置
368
+ * @returns 技术栈标签,如 "spring-boot 3.x + react 18"
369
+ */
296
370
  function buildTechStackLabel(config) {
297
371
  const parts = [];
298
372
  if (config.tech_stack.backend.framework) {
@@ -304,6 +378,15 @@ function buildTechStackLabel(config) {
304
378
  return parts.join(" + ") || "未知";
305
379
  }
306
380
  // ── 能力 1: 执行契约 ──
381
+ /**
382
+ * 构建执行契约: 根据风险和复杂度生成约束条件和停止条件。
383
+ * 高风险任务收紧约束并限制修复循环次数。
384
+ * @param intent - 用户意图
385
+ * @param classification - 分类结果
386
+ * @param scope - 作用域
387
+ * @param acceptance - 验收标准
388
+ * @returns 执行契约
389
+ */
307
390
  function buildExecutionContract(intent, classification, scope, acceptance) {
308
391
  const constraints = [];
309
392
  const stopConditions = [];
@@ -335,6 +418,8 @@ function buildExecutionContract(intent, classification, scope, acceptance) {
335
418
  };
336
419
  }
337
420
  // ── 能力 4: 不确定性协议 ──
421
+ // 不确定性模式表: 识别高风险领域(DDL 变更、权限、金额、跨系统、状态机、破坏性操作、并发、敏感数据)
422
+ // 每个模式包含: 正则匹配、触发类型、描述、选项及权衡、推荐方案
338
423
  const UNCERTAINTY_PATTERNS = [
339
424
  {
340
425
  pattern: /(?:表结构|DDL|加字段|删字段|改字段|索引|migration)/i,
@@ -417,6 +502,13 @@ const UNCERTAINTY_PATTERNS = [
417
502
  recommendation: "传输+存储均加密",
418
503
  },
419
504
  ];
505
+ /**
506
+ * 根据意图文本和分类结果生成不确定性触发条件。
507
+ * 高风险 + 高歧义时额外追加确认触发。
508
+ * @param classification - 分类结果
509
+ * @param intent - 用户意图文本
510
+ * @returns 匹配到的不确定性触发条件数组
511
+ */
420
512
  function buildUncertaintyTriggers(classification, intent) {
421
513
  const triggers = [];
422
514
  for (const pattern of UNCERTAINTY_PATTERNS) {
@@ -443,5 +535,85 @@ function buildUncertaintyTriggers(classification, intent) {
443
535
  }
444
536
  return triggers;
445
537
  }
538
+ /** 熔断置信度阈值: 低于此值禁止输出执行代码 */
539
+ const CONFIDENCE_THRESHOLD = 0.95;
540
+ /**
541
+ * 置信度熔断器 — 评估意图清晰度,低于阈值触发 sf_brainstorm 模式。
542
+ * 评估维度: 知识匹配度、意图明确性、分类一致性。
543
+ * 熔断后不输出执行代码,而是输出头脑风暴结构供人类决策。
544
+ */
545
+ export function checkCircuitBreaker(params) {
546
+ const { intent, classification, matchedEntries, degraded } = params;
547
+ let confidence = 1.0;
548
+ // 维度 1: 知识匹配度(权重 0.35)
549
+ if (degraded || matchedEntries.length === 0) {
550
+ confidence -= 0.35;
551
+ }
552
+ else if (matchedEntries.length < 2) {
553
+ confidence -= 0.15;
554
+ }
555
+ // 维度 2: 分类一致性(权重 0.35)— ambiguity 非 low 或 strategy 为 skip 时扣分
556
+ if (classification.ambiguity === "high") {
557
+ confidence -= 0.35;
558
+ }
559
+ else if (classification.ambiguity === "medium") {
560
+ confidence -= 0.15;
561
+ }
562
+ // 维度 3: 意图明确性(权重 0.30)— 关键词密度不足时扣分
563
+ const keywords = extractKeywords(intent);
564
+ if (keywords.length < 2) {
565
+ confidence -= 0.20;
566
+ }
567
+ else if (keywords.length < 3) {
568
+ confidence -= 0.10;
569
+ }
570
+ // 降级模式额外惩罚
571
+ if (degraded) {
572
+ confidence -= 0.10;
573
+ }
574
+ confidence = Math.max(0, Math.min(1, confidence));
575
+ if (confidence < CONFIDENCE_THRESHOLD) {
576
+ return {
577
+ tripped: true,
578
+ confidence,
579
+ reason: `意图置信度 ${confidence.toFixed(2)} 低于阈值 ${CONFIDENCE_THRESHOLD}`,
580
+ brainstorm: generateBrainstorm(intent, classification, matchedEntries),
581
+ };
582
+ }
583
+ return { tripped: false, confidence };
584
+ }
585
+ /**
586
+ * 生成头脑风暴结构: 逻辑盲区 + 三轨演进 + 闭环逼问。
587
+ * 熔断触发时由 AI 补充具体内容,此处生成骨架。
588
+ */
589
+ function generateBrainstorm(intent, classification, _matchedEntries) {
590
+ const taskLabel = classification.task_type === "feature" ? "新功能" :
591
+ classification.task_type === "bugfix" ? "缺陷修复" :
592
+ classification.task_type === "refactor" ? "重构" : "任务";
593
+ return {
594
+ blind_spots: [
595
+ `【${taskLabel}】是否存在未声明的隐性依赖?`,
596
+ `执行后是否有副作用波及非目标模块?`,
597
+ `极端场景(空数据/并发/超量)是否有防护?`,
598
+ ],
599
+ evolution_tracks: {
600
+ minimal: "极简验证路径: 最小可运行实现 + 核心断言验证",
601
+ industrial: "工业级标准路径: 完整实现 + 边界测试 + 异常处理 + 日志埋点",
602
+ radical: "激进重构路径: 重新审视现有架构,考虑是否需结构级调整",
603
+ },
604
+ decision_questions: [
605
+ {
606
+ question: "优先交付速度还是健壮性?",
607
+ option_a: "极简路径 — 快速验证核心逻辑",
608
+ option_b: "工业级路径 — 含完整边界和异常处理",
609
+ },
610
+ {
611
+ question: "实现范围是否需要扩大?",
612
+ option_a: "限定当前声明范围,后续迭代补充",
613
+ option_b: "现在就处理关联模块,避免技术债积累",
614
+ },
615
+ ],
616
+ };
617
+ }
446
618
  // ── 执行分层 ──
447
619
  //# sourceMappingURL=intent_expander.js.map