soloforge 1.0.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 (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/dist/adapters/claude_code/claude_md.d.ts +3 -0
  4. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -0
  5. package/dist/adapters/claude_code/claude_md.js +79 -0
  6. package/dist/adapters/claude_code/claude_md.js.map +1 -0
  7. package/dist/adapters/claude_code/hooks.d.ts +3 -0
  8. package/dist/adapters/claude_code/hooks.d.ts.map +1 -0
  9. package/dist/adapters/claude_code/hooks.js +30 -0
  10. package/dist/adapters/claude_code/hooks.js.map +1 -0
  11. package/dist/adapters/claude_code/server.d.ts +10 -0
  12. package/dist/adapters/claude_code/server.d.ts.map +1 -0
  13. package/dist/adapters/claude_code/server.js +75 -0
  14. package/dist/adapters/claude_code/server.js.map +1 -0
  15. package/dist/adapters/claude_code/tools.d.ts +15 -0
  16. package/dist/adapters/claude_code/tools.d.ts.map +1 -0
  17. package/dist/adapters/claude_code/tools.js +758 -0
  18. package/dist/adapters/claude_code/tools.js.map +1 -0
  19. package/dist/adapters/trae/trae_config.d.ts +2 -0
  20. package/dist/adapters/trae/trae_config.d.ts.map +1 -0
  21. package/dist/adapters/trae/trae_config.js +22 -0
  22. package/dist/adapters/trae/trae_config.js.map +1 -0
  23. package/dist/adapters/trae/trae_rules.d.ts +3 -0
  24. package/dist/adapters/trae/trae_rules.d.ts.map +1 -0
  25. package/dist/adapters/trae/trae_rules.js +85 -0
  26. package/dist/adapters/trae/trae_rules.js.map +1 -0
  27. package/dist/bin/soloforge.d.ts +3 -0
  28. package/dist/bin/soloforge.d.ts.map +1 -0
  29. package/dist/bin/soloforge.js +353 -0
  30. package/dist/bin/soloforge.js.map +1 -0
  31. package/dist/engine/adr_recorder.d.ts +13 -0
  32. package/dist/engine/adr_recorder.d.ts.map +1 -0
  33. package/dist/engine/adr_recorder.js +132 -0
  34. package/dist/engine/adr_recorder.js.map +1 -0
  35. package/dist/engine/change_coordinator.d.ts +17 -0
  36. package/dist/engine/change_coordinator.d.ts.map +1 -0
  37. package/dist/engine/change_coordinator.js +138 -0
  38. package/dist/engine/change_coordinator.js.map +1 -0
  39. package/dist/engine/classifier.d.ts +7 -0
  40. package/dist/engine/classifier.d.ts.map +1 -0
  41. package/dist/engine/classifier.js +135 -0
  42. package/dist/engine/classifier.js.map +1 -0
  43. package/dist/engine/code_reviewer.d.ts +15 -0
  44. package/dist/engine/code_reviewer.d.ts.map +1 -0
  45. package/dist/engine/code_reviewer.js +371 -0
  46. package/dist/engine/code_reviewer.js.map +1 -0
  47. package/dist/engine/confidence_scorer.d.ts +11 -0
  48. package/dist/engine/confidence_scorer.d.ts.map +1 -0
  49. package/dist/engine/confidence_scorer.js +30 -0
  50. package/dist/engine/confidence_scorer.js.map +1 -0
  51. package/dist/engine/contract_guard.d.ts +10 -0
  52. package/dist/engine/contract_guard.d.ts.map +1 -0
  53. package/dist/engine/contract_guard.js +471 -0
  54. package/dist/engine/contract_guard.js.map +1 -0
  55. package/dist/engine/convention_detector.d.ts +7 -0
  56. package/dist/engine/convention_detector.d.ts.map +1 -0
  57. package/dist/engine/convention_detector.js +93 -0
  58. package/dist/engine/convention_detector.js.map +1 -0
  59. package/dist/engine/debt_reporter.d.ts +4 -0
  60. package/dist/engine/debt_reporter.d.ts.map +1 -0
  61. package/dist/engine/debt_reporter.js +67 -0
  62. package/dist/engine/debt_reporter.js.map +1 -0
  63. package/dist/engine/debt_tracker.d.ts +20 -0
  64. package/dist/engine/debt_tracker.d.ts.map +1 -0
  65. package/dist/engine/debt_tracker.js +152 -0
  66. package/dist/engine/debt_tracker.js.map +1 -0
  67. package/dist/engine/debugger.d.ts +3 -0
  68. package/dist/engine/debugger.d.ts.map +1 -0
  69. package/dist/engine/debugger.js +291 -0
  70. package/dist/engine/debugger.js.map +1 -0
  71. package/dist/engine/delivery.d.ts +15 -0
  72. package/dist/engine/delivery.d.ts.map +1 -0
  73. package/dist/engine/delivery.js +182 -0
  74. package/dist/engine/delivery.js.map +1 -0
  75. package/dist/engine/dependency_scanner.d.ts +13 -0
  76. package/dist/engine/dependency_scanner.d.ts.map +1 -0
  77. package/dist/engine/dependency_scanner.js +275 -0
  78. package/dist/engine/dependency_scanner.js.map +1 -0
  79. package/dist/engine/evolver.d.ts +15 -0
  80. package/dist/engine/evolver.d.ts.map +1 -0
  81. package/dist/engine/evolver.js +167 -0
  82. package/dist/engine/evolver.js.map +1 -0
  83. package/dist/engine/failure_classifier.d.ts +11 -0
  84. package/dist/engine/failure_classifier.d.ts.map +1 -0
  85. package/dist/engine/failure_classifier.js +120 -0
  86. package/dist/engine/failure_classifier.js.map +1 -0
  87. package/dist/engine/feasibility_checker.d.ts +6 -0
  88. package/dist/engine/feasibility_checker.d.ts.map +1 -0
  89. package/dist/engine/feasibility_checker.js +88 -0
  90. package/dist/engine/feasibility_checker.js.map +1 -0
  91. package/dist/engine/git_deps.d.ts +37 -0
  92. package/dist/engine/git_deps.d.ts.map +1 -0
  93. package/dist/engine/git_deps.js +3 -0
  94. package/dist/engine/git_deps.js.map +1 -0
  95. package/dist/engine/impact_analyzer.d.ts +10 -0
  96. package/dist/engine/impact_analyzer.d.ts.map +1 -0
  97. package/dist/engine/impact_analyzer.js +171 -0
  98. package/dist/engine/impact_analyzer.js.map +1 -0
  99. package/dist/engine/intent_expander.d.ts +17 -0
  100. package/dist/engine/intent_expander.d.ts.map +1 -0
  101. package/dist/engine/intent_expander.js +447 -0
  102. package/dist/engine/intent_expander.js.map +1 -0
  103. package/dist/engine/knowledge_manager.d.ts +76 -0
  104. package/dist/engine/knowledge_manager.d.ts.map +1 -0
  105. package/dist/engine/knowledge_manager.js +781 -0
  106. package/dist/engine/knowledge_manager.js.map +1 -0
  107. package/dist/engine/migration_guard.d.ts +3 -0
  108. package/dist/engine/migration_guard.d.ts.map +1 -0
  109. package/dist/engine/migration_guard.js +235 -0
  110. package/dist/engine/migration_guard.js.map +1 -0
  111. package/dist/engine/observability.d.ts +33 -0
  112. package/dist/engine/observability.d.ts.map +1 -0
  113. package/dist/engine/observability.js +312 -0
  114. package/dist/engine/observability.js.map +1 -0
  115. package/dist/engine/onboarding.d.ts +27 -0
  116. package/dist/engine/onboarding.d.ts.map +1 -0
  117. package/dist/engine/onboarding.js +362 -0
  118. package/dist/engine/onboarding.js.map +1 -0
  119. package/dist/engine/prompt_experiment.d.ts +18 -0
  120. package/dist/engine/prompt_experiment.d.ts.map +1 -0
  121. package/dist/engine/prompt_experiment.js +127 -0
  122. package/dist/engine/prompt_experiment.js.map +1 -0
  123. package/dist/engine/resilience.d.ts +20 -0
  124. package/dist/engine/resilience.d.ts.map +1 -0
  125. package/dist/engine/resilience.js +210 -0
  126. package/dist/engine/resilience.js.map +1 -0
  127. package/dist/engine/scaffolder.d.ts +9 -0
  128. package/dist/engine/scaffolder.d.ts.map +1 -0
  129. package/dist/engine/scaffolder.js +222 -0
  130. package/dist/engine/scaffolder.js.map +1 -0
  131. package/dist/engine/scope_controller.d.ts +3 -0
  132. package/dist/engine/scope_controller.d.ts.map +1 -0
  133. package/dist/engine/scope_controller.js +121 -0
  134. package/dist/engine/scope_controller.js.map +1 -0
  135. package/dist/engine/task_context.d.ts +34 -0
  136. package/dist/engine/task_context.d.ts.map +1 -0
  137. package/dist/engine/task_context.js +321 -0
  138. package/dist/engine/task_context.js.map +1 -0
  139. package/dist/engine/task_planner.d.ts +11 -0
  140. package/dist/engine/task_planner.d.ts.map +1 -0
  141. package/dist/engine/task_planner.js +267 -0
  142. package/dist/engine/task_planner.js.map +1 -0
  143. package/dist/engine/team_awareness.d.ts +12 -0
  144. package/dist/engine/team_awareness.d.ts.map +1 -0
  145. package/dist/engine/team_awareness.js +121 -0
  146. package/dist/engine/team_awareness.js.map +1 -0
  147. package/dist/engine/test_generator.d.ts +9 -0
  148. package/dist/engine/test_generator.d.ts.map +1 -0
  149. package/dist/engine/test_generator.js +241 -0
  150. package/dist/engine/test_generator.js.map +1 -0
  151. package/dist/engine/test_quality.d.ts +9 -0
  152. package/dist/engine/test_quality.d.ts.map +1 -0
  153. package/dist/engine/test_quality.js +256 -0
  154. package/dist/engine/test_quality.js.map +1 -0
  155. package/dist/engine/traceability.d.ts +3 -0
  156. package/dist/engine/traceability.d.ts.map +1 -0
  157. package/dist/engine/traceability.js +137 -0
  158. package/dist/engine/traceability.js.map +1 -0
  159. package/dist/engine/verifier.d.ts +3 -0
  160. package/dist/engine/verifier.d.ts.map +1 -0
  161. package/dist/engine/verifier.js +202 -0
  162. package/dist/engine/verifier.js.map +1 -0
  163. package/dist/engine/workspace_manager.d.ts +29 -0
  164. package/dist/engine/workspace_manager.d.ts.map +1 -0
  165. package/dist/engine/workspace_manager.js +77 -0
  166. package/dist/engine/workspace_manager.js.map +1 -0
  167. package/dist/git/operations.d.ts +57 -0
  168. package/dist/git/operations.d.ts.map +1 -0
  169. package/dist/git/operations.js +215 -0
  170. package/dist/git/operations.js.map +1 -0
  171. package/dist/index.d.ts +3 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +24 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/knowledge/conflict_detector.d.ts +6 -0
  176. package/dist/knowledge/conflict_detector.d.ts.map +1 -0
  177. package/dist/knowledge/conflict_detector.js +19 -0
  178. package/dist/knowledge/conflict_detector.js.map +1 -0
  179. package/dist/knowledge/health_checker.d.ts +10 -0
  180. package/dist/knowledge/health_checker.d.ts.map +1 -0
  181. package/dist/knowledge/health_checker.js +61 -0
  182. package/dist/knowledge/health_checker.js.map +1 -0
  183. package/dist/knowledge/index_manager.d.ts +35 -0
  184. package/dist/knowledge/index_manager.d.ts.map +1 -0
  185. package/dist/knowledge/index_manager.js +209 -0
  186. package/dist/knowledge/index_manager.js.map +1 -0
  187. package/dist/knowledge/loader.d.ts +13 -0
  188. package/dist/knowledge/loader.d.ts.map +1 -0
  189. package/dist/knowledge/loader.js +161 -0
  190. package/dist/knowledge/loader.js.map +1 -0
  191. package/dist/knowledge/writer.d.ts +15 -0
  192. package/dist/knowledge/writer.d.ts.map +1 -0
  193. package/dist/knowledge/writer.js +98 -0
  194. package/dist/knowledge/writer.js.map +1 -0
  195. package/dist/types.d.ts +724 -0
  196. package/dist/types.d.ts.map +1 -0
  197. package/dist/types.js +3 -0
  198. package/dist/types.js.map +1 -0
  199. package/package.json +54 -0
  200. package/templates/config.yaml +53 -0
  201. package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +45 -0
  202. package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +39 -0
  203. package/templates/knowledge/acceptance_templates//345/211/215/347/253/257/351/241/265/351/235/242/351/252/214/346/224/266/346/270/205/345/215/225.md +27 -0
  204. package/templates/knowledge/acceptance_templates//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +180 -0
  205. package/templates/knowledge/acceptance_templates//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md +26 -0
  206. package/templates/knowledge/acceptance_templates//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md +51 -0
  207. package/templates/knowledge/acceptance_templates//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md +45 -0
  208. package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/345/257/271/346/216/245/346/226/271/346/241/210/346/250/241/347/211/210.md +45 -0
  209. package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/350/256/276/350/256/241/346/250/241/347/211/210.md +58 -0
  210. package/templates/knowledge/acceptance_templates//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md +53 -0
  211. package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/346/226/271/346/241/210/346/250/241/347/211/210.md +45 -0
  212. package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/351/252/214/346/224/266/346/270/205/345/215/225.md +24 -0
  213. package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +42 -0
  214. package/templates/knowledge/acceptance_templates//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md +39 -0
  215. package/templates/knowledge/acceptance_templates//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md +40 -0
  216. package/templates/knowledge/acceptance_templates//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md +42 -0
  217. 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 +26 -0
  218. package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +47 -0
  219. package/templates/knowledge/acceptance_templates//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md +44 -0
  220. package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +35 -0
  221. package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +34 -0
  222. package/templates/knowledge/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +37 -0
  223. package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +37 -0
  224. package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +36 -0
  225. package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +38 -0
  226. package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +34 -0
  227. package/templates/knowledge/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +24 -0
  228. package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +36 -0
  229. package/templates/knowledge/procedures/Figma/344/272/244/344/273/230/346/265/201/347/250/213.md +35 -0
  230. package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +28 -0
  231. package/templates/knowledge/procedures//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md +33 -0
  232. package/templates/knowledge/procedures//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md +31 -0
  233. package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +37 -0
  234. package/templates/knowledge/procedures//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md +43 -0
  235. package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +27 -0
  236. package/templates/knowledge/procedures//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md +46 -0
  237. package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +38 -0
  238. package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/346/265/201/347/250/213.md +30 -0
  239. package/templates/knowledge/procedures//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md +24 -0
  240. package/templates/knowledge/procedures//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md +40 -0
  241. package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +45 -0
  242. package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/347/250/213.md +33 -0
  243. package/templates/knowledge/procedures//347/274/272/351/231/267/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +28 -0
  244. package/templates/knowledge/procedures//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md +29 -0
  245. package/templates/knowledge/procedures//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +43 -0
  246. package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +27 -0
  247. package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +45 -0
  248. package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +27 -0
  249. package/templates/knowledge/procedures//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md +36 -0
  250. package/templates/knowledge/procedures//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md +32 -0
  251. package/templates/knowledge/procedures//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +40 -0
  252. package/templates/knowledge/procedures//351/252/214/350/257/201/350/256/241/345/210/222/346/265/201/347/250/213.md +32 -0
  253. package/templates/knowledge/product_profiles/b2b-internal.yaml +35 -0
  254. package/templates/knowledge/product_profiles/b2c.yaml +37 -0
  255. package/templates/knowledge/product_profiles/saas.yaml +35 -0
  256. package/templates/knowledge/review_rules//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md +79 -0
  257. package/templates/knowledge/review_rules//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -0
  258. package/templates/knowledge/review_rules//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +61 -0
  259. package/templates/knowledge/review_rules//346/216/245/345/217/243/345/245/221/347/272/246/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -0
  260. package/templates/knowledge/review_rules//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +62 -0
  261. package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +80 -0
  262. package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +31 -0
  263. package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +31 -0
  264. package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +31 -0
  265. package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +32 -0
  266. package/templates/patterns/React/345/210/227/350/241/250/350/241/250/346/240/274/350/247/204/350/214/203.md +29 -0
  267. package/templates/patterns/React/346/216/245/345/217/243/351/233/206/346/210/220/350/247/204/350/214/203.md +28 -0
  268. package/templates/patterns/React/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +28 -0
  269. package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +28 -0
  270. package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +29 -0
  271. package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +29 -0
  272. package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -0
  273. package/templates/patterns/Vue/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +28 -0
  274. package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +28 -0
  275. package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +29 -0
  276. package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +32 -0
  277. package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +28 -0
  278. package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +30 -0
  279. package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +31 -0
  280. package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +27 -0
  281. package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +33 -0
  282. package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +32 -0
  283. package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +31 -0
  284. package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +31 -0
  285. package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +29 -0
  286. package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -0
  287. package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +25 -0
  288. package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +33 -0
  289. package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +39 -0
  290. package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +34 -0
  291. package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +27 -0
  292. package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +30 -0
  293. package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +32 -0
  294. package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +31 -0
  295. package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +31 -0
  296. package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +33 -0
  297. package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +31 -0
  298. package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +35 -0
  299. package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +30 -0
  300. package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -0
  301. package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +33 -0
  302. package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +29 -0
  303. package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +32 -0
  304. package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +31 -0
  305. package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +31 -0
  306. package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +30 -0
  307. package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +28 -0
  308. package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +30 -0
  309. package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +32 -0
  310. package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +24 -0
  311. package/templates/patterns//351/242/206/345/237/237/351/251/261/345/212/250/350/256/276/350/256/241/350/247/204/350/214/203.md +29 -0
  312. package/templates/scaffolds/react/Form.tsx.hbs +16 -0
  313. package/templates/scaffolds/react/List.tsx.hbs +28 -0
  314. package/templates/scaffolds/react/Page.test.tsx.hbs +10 -0
  315. package/templates/scaffolds/react/Page.tsx.hbs +14 -0
  316. package/templates/scaffolds/react/README.md.hbs +44 -0
  317. package/templates/scaffolds/react/service.ts.hbs +37 -0
  318. package/templates/scaffolds/react/types.ts.hbs +6 -0
  319. package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +88 -0
  320. package/templates/scaffolds/spring-boot/ApiContract.md.hbs +110 -0
  321. package/templates/scaffolds/spring-boot/Controller.java.hbs +43 -0
  322. package/templates/scaffolds/spring-boot/DTO.java.hbs +9 -0
  323. package/templates/scaffolds/spring-boot/Entity.java.hbs +12 -0
  324. package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +28 -0
  325. package/templates/scaffolds/spring-boot/Mapper.java.hbs +9 -0
  326. package/templates/scaffolds/spring-boot/PageResponse.java.hbs +29 -0
  327. package/templates/scaffolds/spring-boot/Service.java.hbs +12 -0
  328. package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +48 -0
  329. package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +22 -0
@@ -0,0 +1,171 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function analyzeImpact(input) {
4
+ const { intent, classification, expansion, config, projectPath } = input;
5
+ // 提取业务实体名
6
+ const entities = extractEntities(intent);
7
+ if (entities.length === 0) {
8
+ return {
9
+ task_id: "",
10
+ intent,
11
+ affected_files: [],
12
+ declared_scope: expansion.scope.allowed_paths,
13
+ out_of_scope_files: [],
14
+ scope_sufficient: true,
15
+ recommendation: "proceed",
16
+ summary: "未识别到明确的业务实体,无法进行影响分析",
17
+ };
18
+ }
19
+ // 在受影响仓库中搜索相关文件
20
+ const affectedFiles = await searchAffectedFiles(entities, classification.affected_repos, config, projectPath);
21
+ // 对比声明范围
22
+ const declaredScope = expansion.scope.allowed_paths;
23
+ const outOfScope = affectedFiles.filter((f) => !isPathInScope(f.path, declaredScope));
24
+ const scopeSufficient = outOfScope.length === 0;
25
+ const recommendation = deriveRecommendation(outOfScope);
26
+ const expandSuggestion = recommendation === "expand_scope"
27
+ ? deduplicatePaths(outOfScope.map((f) => path.dirname(f.path)))
28
+ : undefined;
29
+ return {
30
+ task_id: "",
31
+ intent,
32
+ affected_files: affectedFiles,
33
+ declared_scope: declaredScope,
34
+ out_of_scope_files: outOfScope,
35
+ scope_sufficient: scopeSufficient,
36
+ recommendation,
37
+ summary: formatSummary(affectedFiles.length, outOfScope.length, recommendation),
38
+ expand_suggestion: expandSuggestion,
39
+ };
40
+ }
41
+ function extractEntities(intent) {
42
+ // 从意图中提取业务实体(中文词组或英文驼峰词)
43
+ const entities = [];
44
+ // 中文实体提取: 常见业务名词
45
+ const businessTerms = [
46
+ "订单", "商品", "用户", "支付", "权限", "角色", "菜单",
47
+ "导出", "导入", "报表", "配置", "日志", "通知", "消息",
48
+ "库存", "购物车", "退款", "发票", "地址", "评论",
49
+ ];
50
+ for (const term of businessTerms) {
51
+ if (intent.includes(term) && !entities.includes(term)) {
52
+ entities.push(term);
53
+ }
54
+ }
55
+ // 英文实体提取: PascalCase 词
56
+ const pascalMatches = intent.match(/[A-Z][a-z]+(?:[A-Z][a-z]+)*/g);
57
+ if (pascalMatches) {
58
+ for (const m of pascalMatches) {
59
+ if (!entities.includes(m))
60
+ entities.push(m);
61
+ }
62
+ }
63
+ return entities;
64
+ }
65
+ async function searchAffectedFiles(entities, affectedRepos, config, projectPath) {
66
+ const results = [];
67
+ for (const repo of affectedRepos) {
68
+ const repoConfig = config.repos.find((r) => r.name === repo);
69
+ if (!repoConfig)
70
+ continue;
71
+ const repoPath = path.resolve(projectPath, repoConfig.path);
72
+ let files;
73
+ try {
74
+ files = await listFilesRecursive(repoPath);
75
+ }
76
+ catch {
77
+ continue;
78
+ }
79
+ for (const filePath of files) {
80
+ const relativePath = path.relative(projectPath, filePath);
81
+ const matchInfo = matchEntityInPath(relativePath, entities);
82
+ if (matchInfo) {
83
+ results.push({
84
+ path: relativePath,
85
+ reason: matchInfo.reason,
86
+ confidence: matchInfo.confidence,
87
+ });
88
+ }
89
+ }
90
+ }
91
+ return results;
92
+ }
93
+ async function listFilesRecursive(dir, maxDepth = 6, depth = 0) {
94
+ if (depth > maxDepth)
95
+ return [];
96
+ const entries = await fs.readdir(dir, { withFileTypes: true });
97
+ const files = [];
98
+ for (const entry of entries) {
99
+ // 跳过隐藏目录和常见忽略目录
100
+ if (entry.name.startsWith(".") || ["node_modules", "target", "build", "dist", ".git"].includes(entry.name)) {
101
+ continue;
102
+ }
103
+ const fullPath = path.join(dir, entry.name);
104
+ if (entry.isDirectory()) {
105
+ files.push(...await listFilesRecursive(fullPath, maxDepth, depth + 1));
106
+ }
107
+ else {
108
+ files.push(fullPath);
109
+ }
110
+ }
111
+ return files;
112
+ }
113
+ function matchEntityInPath(filePath, entities) {
114
+ const basename = path.basename(filePath, path.extname(filePath));
115
+ const lowerPath = filePath.toLowerCase();
116
+ for (const entity of entities) {
117
+ const entityLower = entity.toLowerCase();
118
+ // 高置信度: 文件名直接包含实体名(Entity/DO/DTO)
119
+ if (basename.toLowerCase().includes(entityLower)) {
120
+ if (/Entity|DO|DTO|VO|PO|Model/.test(basename)) {
121
+ return { reason: `${basename} 直接对应实体 ${entity}`, confidence: "high" };
122
+ }
123
+ if (/Service|Controller|Mapper|Repository|Component/.test(basename)) {
124
+ return { reason: `${basename} 操作实体 ${entity}`, confidence: "medium" };
125
+ }
126
+ if (/test|spec/i.test(basename)) {
127
+ return { reason: `${basename} 测试实体 ${entity}`, confidence: "medium" };
128
+ }
129
+ return { reason: `${basename} 可能涉及实体 ${entity}`, confidence: "low" };
130
+ }
131
+ // 路径中包含实体名
132
+ if (lowerPath.includes(entityLower)) {
133
+ return { reason: `路径包含 ${entity}`, confidence: "low" };
134
+ }
135
+ }
136
+ return null;
137
+ }
138
+ function isPathInScope(filePath, allowedPaths) {
139
+ return allowedPaths.some((allowed) => {
140
+ let normalized = allowed.replace(/\*\*/g, "").replace(/\/$/, "");
141
+ if (!filePath.startsWith(normalized))
142
+ return false;
143
+ // 目录边界检查:匹配后的下一个字符必须是 / 或已到末尾
144
+ if (filePath.length === normalized.length)
145
+ return true;
146
+ return filePath[normalized.length] === "/";
147
+ });
148
+ }
149
+ function deriveRecommendation(outOfScope) {
150
+ if (outOfScope.length === 0)
151
+ return "proceed";
152
+ const hasHighConfidence = outOfScope.some((f) => f.confidence === "high");
153
+ const hasMediumConfidence = outOfScope.some((f) => f.confidence === "medium");
154
+ if (hasHighConfidence || hasMediumConfidence)
155
+ return "expand_scope";
156
+ return "confirm";
157
+ }
158
+ function deduplicatePaths(dirs) {
159
+ return [...new Set(dirs)];
160
+ }
161
+ function formatSummary(affected, outOfScope, recommendation) {
162
+ if (recommendation === "proceed") {
163
+ return `影响范围分析完成: ${affected} 个相关文件,全部在声明范围内`;
164
+ }
165
+ const labels = {
166
+ expand_scope: `影响范围超出声明范围: ${outOfScope} 个文件不在当前 scope 内,建议扩大作用域`,
167
+ confirm: `影响范围可能超出: ${outOfScope} 个低置信度文件不在 scope 内,建议确认`,
168
+ };
169
+ return labels[recommendation] ?? "分析完成";
170
+ }
171
+ //# sourceMappingURL=impact_analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact_analyzer.js","sourceRoot":"","sources":["../../src/engine/impact_analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB;IAC3D,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEzE,UAAU;IACV,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,EAAE;YACX,MAAM;YACN,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa;YAC7C,kBAAkB,EAAE,EAAE;YACtB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,SAAS;YACzB,OAAO,EAAE,sBAAsB;SAChC,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAC7C,QAAQ,EACR,cAAc,CAAC,cAAc,EAC7B,MAAM,EACN,WAAW,CACZ,CAAC;IAEF,SAAS;IACT,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;IACpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAC7C,CAAC;IAEF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAExD,MAAM,gBAAgB,GAAG,cAAc,KAAK,cAAc;QACxD,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,OAAO,EAAE,EAAE;QACX,MAAM;QACN,cAAc,EAAE,aAAa;QAC7B,cAAc,EAAE,aAAa;QAC7B,kBAAkB,EAAE,UAAU;QAC9B,gBAAgB,EAAE,eAAe;QACjC,cAAc;QACd,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC;QAC/E,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,yBAAyB;IACzB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iBAAiB;IACjB,MAAM,aAAa,GAAG;QACpB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QACxC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QACxC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACpC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACnE,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAkB,EAClB,aAAuB,EACvB,MAAqB,EACrB,WAAmB;IAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,UAAU,EAAE,SAAS,CAAC,UAAU;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;IACpE,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,gBAAgB;QAChB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3G,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,QAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEzC,kCAAkC;QAClC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjD,IAAI,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/C,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,WAAW,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,gDAAgD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YACxE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,WAAW,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACvE,CAAC;QAED,WAAW;QACX,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,YAAsB;IAC7D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACnD,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACvD,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,UAAwB;IAExB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;IAC9E,IAAI,iBAAiB,IAAI,mBAAmB;QAAE,OAAO,cAAc,CAAC;IACpE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,UAAkB,EAAE,cAAsB;IACjF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,aAAa,QAAQ,iBAAiB,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAA2B;QACrC,YAAY,EAAE,eAAe,UAAU,0BAA0B;QACjE,OAAO,EAAE,aAAa,UAAU,yBAAyB;KAC1D,CAAC;IACF,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ProjectConfig, ClassifyResult, ExpandResult, SubTask } from "../types.js";
2
+ import type { KnowledgeIndexManager } from "../knowledge/index_manager.js";
3
+ export interface PlanContext {
4
+ current_step: SubTask;
5
+ previous_outputs: Record<string, string>;
6
+ }
7
+ export interface ExpandInput {
8
+ intent: string;
9
+ classification: ClassifyResult;
10
+ projectPath: string;
11
+ config: ProjectConfig;
12
+ knowledgeIndex: KnowledgeIndexManager;
13
+ clarificationAnswers?: string[];
14
+ plan_context?: PlanContext;
15
+ }
16
+ export declare function expand(input: ExpandInput): Promise<ExpandResult>;
17
+ //# sourceMappingURL=intent_expander.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,447 @@
1
+ import Handlebars from "handlebars";
2
+ import { detectConventions } from "./convention_detector.js";
3
+ const PROMPT_TEMPLATE = Handlebars.compile(`## 任务
4
+ {{intent}}
5
+
6
+ ## 项目上下文
7
+ - 技术栈: {{tech_stack}}
8
+ - 产品类型: {{product_profile}}
9
+ - 涉及仓库: {{affected_repos}}
10
+
11
+ {{#if matched_knowledge}}
12
+ ## 适用知识
13
+ {{#each matched_knowledge}}
14
+ ### {{this.name}}
15
+ {{this.content}}
16
+
17
+ {{/each}}
18
+ {{/if}}
19
+
20
+ {{#if relevant_files}}
21
+ ## 相关文件
22
+ {{#each relevant_files}}
23
+ - {{this.path}} ({{this.reason}})
24
+ {{/each}}
25
+ {{/if}}
26
+
27
+ {{#if is_legacy_code}}
28
+ ## 遗留代码注意事项
29
+ 以下文件存在与标准模式不一致的惯例,修改时请遵循现有风格:
30
+ {{#each legacy_conventions}}
31
+ - {{this}}
32
+ {{/each}}
33
+ {{/if}}
34
+
35
+ ## 约束
36
+ - 只允许修改以下路径: {{scope.allowed_paths}}
37
+ {{#unless scope.new_files_allowed}}
38
+ - 不允许新建文件
39
+ {{/unless}}
40
+ {{#if scope.new_file_patterns}}
41
+ - 新建文件必须匹配: {{scope.new_file_patterns}}
42
+ {{/if}}
43
+
44
+ ## 验收标准
45
+ ### 自动验证(系统检查)
46
+ {{#each acceptance.automated}}
47
+ - [{{this.id}}] {{this.description}}
48
+ {{/each}}
49
+ {{#if acceptance.manual}}
50
+ ### 人工验证(需你确认)
51
+ {{#each acceptance.manual}}
52
+ - [{{this.id}}] {{this.description}}
53
+ {{/each}}
54
+ {{/if}}
55
+
56
+ {{#if degraded}}
57
+ **注意**: 当前无领域知识匹配,请保守操作,只修改必要文件。
58
+ {{/if}}
59
+ `);
60
+ export async function expand(input) {
61
+ const { intent, classification, projectPath, config, knowledgeIndex } = input;
62
+ // 1. 查询知识库
63
+ const scopeFilters = classification.affected_repos.length > 0
64
+ ? classification.affected_repos
65
+ : ["shared"];
66
+ const matchedEntries = knowledgeIndex.query({
67
+ scope: scopeFilters,
68
+ products: [config.product_profile],
69
+ keywords: extractKeywords(intent),
70
+ limit: 5,
71
+ });
72
+ // 记录知识使用
73
+ if (matchedEntries.length > 0) {
74
+ knowledgeIndex.markUsed(matchedEntries.map((e) => e.id));
75
+ }
76
+ const degraded = matchedEntries.length === 0;
77
+ // 2. 检测遗留惯例
78
+ const legacyConventions = [];
79
+ let isLegacyCode = false;
80
+ if (!degraded && classification.affected_repos.length > 0) {
81
+ try {
82
+ const repoDirs = classification.affected_repos
83
+ .map((r) => config.repos.find((repo) => repo.name === r)?.path)
84
+ .filter(Boolean);
85
+ // 检查仓库中第一个已存在文件的惯例
86
+ const conventions = await detectConventions(repoDirs.map((d) => `${d}/src`).slice(0, 3), projectPath, config.conventions_file);
87
+ if (conventions.length > 0) {
88
+ isLegacyCode = true;
89
+ legacyConventions.push(...conventions.map((c) => c.convention));
90
+ }
91
+ }
92
+ catch {
93
+ // 惯例检测为尽力而为
94
+ }
95
+ }
96
+ // 3. 确定 scope
97
+ const scope = resolveScope(config, classification, degraded);
98
+ // 4. 生成验收标准
99
+ const acceptance = generateAcceptance(intent, classification, matchedEntries, config, degraded);
100
+ // 5. 组装 prompt
101
+ const techStack = buildTechStackLabel(config);
102
+ let prompt = PROMPT_TEMPLATE({
103
+ intent,
104
+ tech_stack: techStack,
105
+ product_profile: config.product_profile,
106
+ affected_repos: classification.affected_repos.join(", "),
107
+ matched_knowledge: matchedEntries.map((e) => ({
108
+ name: e.name,
109
+ content: e.body || e.when,
110
+ })),
111
+ relevant_files: scope.allowed_paths.slice(0, 10).map((p) => ({ path: p, reason: "scope 允许路径" })),
112
+ is_legacy_code: isLegacyCode,
113
+ legacy_conventions: legacyConventions,
114
+ scope: {
115
+ allowed_paths: scope.allowed_paths.join(", "),
116
+ new_files_allowed: scope.new_files_allowed,
117
+ new_file_patterns: scope.new_file_patterns?.join(", "),
118
+ },
119
+ acceptance,
120
+ degraded,
121
+ });
122
+ // 5.1 注入计划阶段上下文(P1: AI 唯一执行者, P2: 模板是护栏, P3: 产物系统)
123
+ if (input.plan_context) {
124
+ prompt = injectPlanContext(prompt, input.plan_context, knowledgeIndex);
125
+ }
126
+ // 6. 使用计数已通过 markUsed 更新(步骤 89-91),无需重复递增
127
+ // 7. 生成执行契约(能力 1)
128
+ const contract = buildExecutionContract(intent, classification, scope, acceptance);
129
+ // 8. 生成不确定性触发条件(能力 4)
130
+ const uncertaintyTriggers = buildUncertaintyTriggers(classification, intent);
131
+ return {
132
+ task_id: "", // 由调用方填充
133
+ prompt,
134
+ scope,
135
+ acceptance,
136
+ matched_patterns: matchedEntries.map((e) => e.name),
137
+ matched_knowledge: matchedEntries.map((e) => e.name),
138
+ is_legacy_code: isLegacyCode,
139
+ legacy_conventions: legacyConventions.length > 0 ? legacyConventions : undefined,
140
+ degraded,
141
+ contract,
142
+ uncertainty_triggers: uncertaintyTriggers.length > 0 ? uncertaintyTriggers : undefined,
143
+ };
144
+ }
145
+ /**
146
+ * P2(做什么/怎么做分离)+ P3(产物系统):
147
+ * 将当前计划步骤的上下文注入到 expansion prompt 中。
148
+ * 包括:上一步产出文件内容、输出格式模板、建议工具。
149
+ * AI 自主决定执行方式(P4: 评估结果不评估路径)。
150
+ */
151
+ function injectPlanContext(prompt, planContext, knowledgeIndex) {
152
+ const { current_step, previous_outputs } = planContext;
153
+ const sections = [];
154
+ // 上一步产出(P3: 产物系统,通过文件传递上下文)
155
+ const prevEntries = Object.entries(previous_outputs);
156
+ if (prevEntries.length > 0) {
157
+ sections.push("## 前序阶段产出");
158
+ for (const [stepId, content] of prevEntries) {
159
+ if (content) {
160
+ sections.push(`### ${stepId}\n${content.slice(0, 3000)}`);
161
+ }
162
+ }
163
+ }
164
+ // 输出格式模板(P2: 模板是护栏不是笼子)
165
+ if (current_step.output_template) {
166
+ const templateEntries = knowledgeIndex.query({
167
+ type: "acceptance_template",
168
+ keywords: [],
169
+ });
170
+ const matched = templateEntries.find((e) => e.name === current_step.output_template);
171
+ if (matched?.body) {
172
+ sections.push(`## 输出格式参考(模板: ${current_step.output_template})\n${matched.body}`);
173
+ }
174
+ }
175
+ // 输出路径(P3: 产出保存位置)
176
+ if (current_step.output_path) {
177
+ sections.push(`## 产出保存\n将本阶段产出写入: ${current_step.output_path}`);
178
+ }
179
+ // 建议工具(P2: AI 自主决定是否使用)
180
+ if (current_step.suggested_tools && current_step.suggested_tools.length > 0) {
181
+ sections.push(`## 建议工具(可选)\n${current_step.suggested_tools.map((t) => `- ${t}`).join("\n")}`);
182
+ }
183
+ if (sections.length === 0)
184
+ return prompt;
185
+ return `${prompt}\n\n---\n\n## 当前计划阶段\n正在执行: **${current_step.title}**\n${current_step.description}\n\n${sections.join("\n\n")}`;
186
+ }
187
+ function extractKeywords(intent) {
188
+ // 简单关键词提取: 按常见分隔符拆分,过滤短词
189
+ return intent
190
+ .replace(/[的了吗呢把被在从对和与或是]/g, " ")
191
+ .split(/[\s,,、;;]+/)
192
+ .filter((w) => w.length >= 2);
193
+ }
194
+ function resolveScope(config, classification, degraded) {
195
+ const allowedPaths = [];
196
+ for (const repoName of classification.affected_repos) {
197
+ const repo = config.repos.find((r) => r.name === repoName);
198
+ if (repo) {
199
+ allowedPaths.push(...repo.scope);
200
+ }
201
+ }
202
+ // 无匹配仓库或降级时回退到默认 scope
203
+ if (allowedPaths.length === 0) {
204
+ allowedPaths.push(...(config.scope.backend || []));
205
+ allowedPaths.push(...(config.scope.frontend || []));
206
+ }
207
+ // 计算 readonly_paths: 不在受影响仓库 scope 内但属于项目的路径
208
+ const readonlyPaths = [];
209
+ for (const repo of config.repos) {
210
+ if (!classification.affected_repos.includes(repo.name)) {
211
+ readonlyPaths.push(...repo.scope);
212
+ }
213
+ }
214
+ return {
215
+ allowed_paths: allowedPaths,
216
+ readonly_paths: readonlyPaths,
217
+ new_files_allowed: !degraded,
218
+ new_file_patterns: !degraded && classification.strategy === "full_pipeline"
219
+ ? ["**/*"] // full_pipeline 模式下允许新建任意文件
220
+ : undefined,
221
+ };
222
+ }
223
+ function generateAcceptance(intent, classification, matchedEntries, _config, degraded) {
224
+ const automated = [];
225
+ const manual = [];
226
+ if (degraded) {
227
+ // 降级模式: 仅基本验收(sf_verify 独立生成 build/test 命令,此处仅声明验收项)
228
+ automated.push({
229
+ id: "A-build",
230
+ description: "编译通过,无类型错误",
231
+ type: "automated",
232
+ });
233
+ automated.push({
234
+ id: "A-test",
235
+ description: "测试通过",
236
+ type: "automated",
237
+ });
238
+ return { automated, manual };
239
+ }
240
+ // 完整模式: 构建 + 模式特定 + 任务类型验收
241
+ automated.push({
242
+ id: "A-build",
243
+ description: "编译通过,无类型错误",
244
+ type: "automated",
245
+ });
246
+ // 模式特定验收: 从知识正文中解析 ## 验收项
247
+ for (const entry of matchedEntries) {
248
+ if (entry.body) {
249
+ const items = parseAcceptanceItems(entry.body);
250
+ automated.push(...items);
251
+ }
252
+ }
253
+ // 任务类型特定的人工验收项
254
+ if (classification.task_type === "feature") {
255
+ manual.push({
256
+ id: "M-ux",
257
+ description: "新增功能的交互是否符合设计规范",
258
+ type: "manual",
259
+ });
260
+ }
261
+ if (classification.task_type === "bugfix") {
262
+ manual.push({
263
+ id: "M-root",
264
+ description: "修复是否针对了根本原因而非症状",
265
+ type: "manual",
266
+ });
267
+ }
268
+ return { automated, manual };
269
+ }
270
+ function parseAcceptanceItems(body) {
271
+ const items = [];
272
+ if (!body.includes("## 验收项"))
273
+ return items;
274
+ const lines = body.split("\n");
275
+ let inSection = false;
276
+ for (const line of lines) {
277
+ if (line.startsWith("## 验收项")) {
278
+ inSection = true;
279
+ continue;
280
+ }
281
+ if (inSection && line.startsWith("## "))
282
+ break;
283
+ if (inSection) {
284
+ // 支持 (check: ...) 提取 check_command
285
+ const match = line.match(/- \[([A-Z]+-\d+)\]\s*(.+?)(?:\s*\(check:\s*(.+)\))?$/);
286
+ if (match) {
287
+ const item = { id: match[1], description: match[2].trim(), type: "automated" };
288
+ if (match[3])
289
+ item.check_command = match[3].trim();
290
+ items.push(item);
291
+ }
292
+ }
293
+ }
294
+ return items;
295
+ }
296
+ function buildTechStackLabel(config) {
297
+ const parts = [];
298
+ if (config.tech_stack.backend.framework) {
299
+ parts.push(`${config.tech_stack.backend.framework} ${config.tech_stack.backend.version}`);
300
+ }
301
+ if (config.tech_stack.frontend.framework) {
302
+ parts.push(`${config.tech_stack.frontend.framework} ${config.tech_stack.frontend.version}`);
303
+ }
304
+ return parts.join(" + ") || "未知";
305
+ }
306
+ // ── 能力 1: 执行契约 ──
307
+ function buildExecutionContract(intent, classification, scope, acceptance) {
308
+ const constraints = [];
309
+ const stopConditions = [];
310
+ // 按 risk 级别收紧约束
311
+ if (classification.risk === "high") {
312
+ constraints.push("高风险任务:每个变更文件必须有明确来源(任务卡/缺陷/设计锚点)");
313
+ constraints.push("禁止顺手重构或范围外变更");
314
+ constraints.push("修复循环上限 3 轮,超过必须升级");
315
+ stopConditions.push("修复循环超过 3 轮");
316
+ stopConditions.push("变更文件超出 scope.allowed_paths 范围");
317
+ }
318
+ else if (classification.risk === "medium") {
319
+ constraints.push("中等风险:核心逻辑变更需有回归测试");
320
+ stopConditions.push("编译失败 2 次以上");
321
+ }
322
+ else {
323
+ constraints.push("低风险:标准变更流程");
324
+ }
325
+ if (classification.complexity === "high") {
326
+ constraints.push("高复杂度:必须先定位根因再编码,禁止试错");
327
+ constraints.push("一次只修一个问题,禁止跨层大重构");
328
+ }
329
+ return {
330
+ goal: intent.slice(0, 200),
331
+ scope: scope.allowed_paths,
332
+ constraints,
333
+ verification: acceptance.automated.map((a) => `[${a.id}] ${a.description}`),
334
+ stop_conditions: stopConditions,
335
+ };
336
+ }
337
+ // ── 能力 4: 不确定性协议 ──
338
+ const UNCERTAINTY_PATTERNS = [
339
+ {
340
+ pattern: /(?:表结构|DDL|加字段|删字段|改字段|索引|migration)/i,
341
+ trigger_type: "ddl_change",
342
+ description: "涉及数据库结构变更,可能影响现有数据",
343
+ options: [
344
+ { label: "向前兼容变更", tradeoff: "需额外兼容逻辑,但可平滑迁移" },
345
+ { label: "破坏性变更(需迁移脚本)", tradeoff: "直接但需停机或分步迁移" },
346
+ ],
347
+ recommendation: "优先向前兼容方案",
348
+ },
349
+ {
350
+ pattern: /(?:权限|角色|授权|鉴权|permission|auth)/i,
351
+ trigger_type: "permission_change",
352
+ description: "涉及权限/角色变更,影响用户访问控制",
353
+ options: [
354
+ { label: "收紧权限", tradeoff: "安全但可能阻断合法用户" },
355
+ { label: "放宽权限", tradeoff: "便利但增加安全风险" },
356
+ ],
357
+ recommendation: "默认收紧,逐案放开",
358
+ },
359
+ {
360
+ pattern: /(?:金额|价格|费用|支付|退款|计算|结算)/i,
361
+ trigger_type: "amount_logic",
362
+ description: "涉及金额计算逻辑,需要精确性验证",
363
+ options: [
364
+ { label: "复用现有计算逻辑", tradeoff: "安全但可能不适用新场景" },
365
+ { label: "新建计算逻辑", tradeoff: "灵活但需全面测试(含边界值/精度/并发)" },
366
+ ],
367
+ recommendation: "复用现有逻辑优先",
368
+ },
369
+ {
370
+ pattern: /(?:跨系统|外部接口|第三方|回调|同步|推送)/i,
371
+ trigger_type: "cross_system",
372
+ description: "涉及跨系统交互,需要幂等和补偿机制",
373
+ options: [
374
+ { label: "同步调用", tradeoff: "简单但强耦合" },
375
+ { label: "异步+补偿", tradeoff: "解耦但复杂度高" },
376
+ ],
377
+ recommendation: "异步+补偿优先",
378
+ },
379
+ {
380
+ pattern: /(?:状态机|状态流转|审批|审核|工作流)/i,
381
+ trigger_type: "state_transition",
382
+ description: "涉及状态流转逻辑,需要完整的守卫条件",
383
+ options: [
384
+ { label: "扩展现有状态机", tradeoff: "一致但需理解现有流转" },
385
+ { label: "新建独立流程", tradeoff: "独立但可能重复" },
386
+ ],
387
+ recommendation: "扩展现有状态机优先",
388
+ },
389
+ {
390
+ pattern: /(?:删除|清理|归档|批量操作)/i,
391
+ trigger_type: "destructive_operation",
392
+ description: "涉及破坏性操作,需要可恢复机制",
393
+ options: [
394
+ { label: "软删除(可恢复)", tradeoff: "安全但占存储" },
395
+ { label: "硬删除+备份", tradeoff: "干净但恢复成本高" },
396
+ ],
397
+ recommendation: "优先软删除",
398
+ },
399
+ {
400
+ pattern: /(?:并发|锁|竞争|原子|分布式事务)/i,
401
+ trigger_type: "concurrency",
402
+ description: "涉及并发控制,需要确定并发策略",
403
+ options: [
404
+ { label: "乐观锁", tradeoff: "高性能但需冲突重试" },
405
+ { label: "悲观锁", tradeoff: "安全但降低吞吐" },
406
+ ],
407
+ recommendation: "乐观锁优先",
408
+ },
409
+ {
410
+ pattern: /(?:敏感信息|加密|解密|脱敏|密码|token)/i,
411
+ trigger_type: "sensitive_data",
412
+ description: "涉及敏感数据处理,需要安全策略",
413
+ options: [
414
+ { label: "传输+存储加密", tradeoff: "安全但性能有开销" },
415
+ { label: "仅传输加密", tradeoff: "轻量但存储风险" },
416
+ ],
417
+ recommendation: "传输+存储均加密",
418
+ },
419
+ ];
420
+ function buildUncertaintyTriggers(classification, intent) {
421
+ const triggers = [];
422
+ for (const pattern of UNCERTAINTY_PATTERNS) {
423
+ if (pattern.pattern.test(intent)) {
424
+ triggers.push({
425
+ trigger_type: pattern.trigger_type,
426
+ description: pattern.description,
427
+ options: pattern.options,
428
+ recommendation: pattern.recommendation,
429
+ });
430
+ }
431
+ }
432
+ // 高风险 + 高歧义 = 额外确认
433
+ if (classification.risk === "high" && classification.ambiguity === "high") {
434
+ triggers.push({
435
+ trigger_type: "high_risk_high_ambiguity",
436
+ description: "高风险 + 高歧义任务,意图可能存在多种解读",
437
+ options: [
438
+ { label: "按最保守方案执行", tradeoff: "安全但可能不满足全部需求" },
439
+ { label: "先澄清再执行", tradeoff: "准确但增加前置时间" },
440
+ ],
441
+ recommendation: "先澄清再执行",
442
+ });
443
+ }
444
+ return triggers;
445
+ }
446
+ // ── 执行分层 ──
447
+ //# sourceMappingURL=intent_expander.js.map