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,471 @@
1
+ // ── API contract file path keywords ──
2
+ const API_PATH_KEYWORDS = [
3
+ "controller",
4
+ "route",
5
+ "api",
6
+ "dto",
7
+ "request",
8
+ "response",
9
+ "model",
10
+ "entity",
11
+ "schema",
12
+ ];
13
+ // ── Main function ──
14
+ export async function checkContractChanges(input) {
15
+ const { changedFiles, projectPath, config, gitOps } = input;
16
+ const changes = [];
17
+ // Filter to API-contract-relevant files
18
+ const contractFiles = changedFiles.filter((f) => isApiContractFile(f));
19
+ if (contractFiles.length === 0) {
20
+ return emptyResult("No API contract files changed.");
21
+ }
22
+ // Collect diffs for each contract file
23
+ const diffs = [];
24
+ for (const file of contractFiles) {
25
+ try {
26
+ const diff = await gitOps.getDiffPatch(projectPath, file, {
27
+ cached: true,
28
+ });
29
+ if (diff.trim()) {
30
+ diffs.push({ file, diff });
31
+ }
32
+ }
33
+ catch {
34
+ // Skip files whose diff cannot be retrieved
35
+ }
36
+ }
37
+ if (diffs.length === 0) {
38
+ return emptyResult("No diff content found in API contract files.");
39
+ }
40
+ // Parse each diff for contract changes
41
+ for (const { file, diff } of diffs) {
42
+ const parsed = parseDiffForContractChanges(file, diff);
43
+ changes.push(...parsed);
44
+ }
45
+ // Tally
46
+ const breaking = changes.filter((c) => c.severity === "breaking");
47
+ const compatible = changes.filter((c) => c.severity === "compatible");
48
+ // Cross-service impact analysis
49
+ const crossServiceImpact = analyzeCrossServiceImpact(breaking, config);
50
+ const summary = buildSummary(changes.length, breaking.length, compatible.length, crossServiceImpact);
51
+ return {
52
+ changes,
53
+ breaking_count: breaking.length,
54
+ compatible_count: compatible.length,
55
+ cross_service_impact: crossServiceImpact,
56
+ requires_review: breaking.length > 0,
57
+ summary,
58
+ };
59
+ }
60
+ // ── File classification ──
61
+ function isApiContractFile(filePath) {
62
+ const lower = filePath.toLowerCase();
63
+ return API_PATH_KEYWORDS.some((kw) => lower.includes(kw));
64
+ }
65
+ // ── Diff parsing ──
66
+ function parseDiffForContractChanges(file, diff) {
67
+ const changes = [];
68
+ const lines = diff.split("\n");
69
+ const consumedIndices = new Set();
70
+ for (let i = 0; i < lines.length; i++) {
71
+ if (consumedIndices.has(i))
72
+ continue;
73
+ const line = lines[i];
74
+ // Only look at added/removed lines (skip diff metadata headers)
75
+ const isAdded = line.startsWith("+") && !line.startsWith("+++");
76
+ const isRemoved = line.startsWith("-") && !line.startsWith("---");
77
+ if (!isAdded && !isRemoved)
78
+ continue;
79
+ const content = line.slice(1); // strip leading +/- (and the space)
80
+ // Spring MVC annotations
81
+ const springChange = detectSpringAnnotationChange(content, isAdded, isRemoved, file);
82
+ if (springChange) {
83
+ changes.push(springChange);
84
+ continue;
85
+ }
86
+ // Express route definitions
87
+ const expressChange = detectExpressRouteChange(content, isAdded, isRemoved, file);
88
+ if (expressChange) {
89
+ changes.push(expressChange);
90
+ continue;
91
+ }
92
+ // DTO/Entity field changes
93
+ const fieldChange = detectFieldChange(content, isAdded, isRemoved, file, lines, i, consumedIndices);
94
+ if (fieldChange) {
95
+ changes.push(fieldChange);
96
+ // If field_type_changed detected, skip ahead for the related + line
97
+ if (fieldChange.change_type === "field_type_changed" && isRemoved) {
98
+ // We already consumed context; continue normally
99
+ }
100
+ }
101
+ }
102
+ // Post-process: detect HTTP method changes on same path
103
+ // Pair path_removed + path_added with the same URL path into method_changed
104
+ const methodChanged = detectMethodChanges(changes);
105
+ return methodChanged;
106
+ }
107
+ // ── HTTP method change detection ──
108
+ function detectMethodChanges(changes) {
109
+ const removed = new Map();
110
+ const added = new Map();
111
+ const consumed = new Set();
112
+ // Index removed and added path changes by their URL path
113
+ for (let i = 0; i < changes.length; i++) {
114
+ const change = changes[i];
115
+ if (change.change_type === "path_removed") {
116
+ const pathStr = extractPath(change.before ?? change.description);
117
+ if (pathStr)
118
+ removed.set(pathStr, change);
119
+ }
120
+ else if (change.change_type === "path_added") {
121
+ const pathStr = extractPath(change.after ?? change.description);
122
+ if (pathStr)
123
+ added.set(pathStr, change);
124
+ }
125
+ }
126
+ // Find matching pairs (same URL path, different HTTP method)
127
+ const result = [];
128
+ for (const [urlPath, removedChange] of removed) {
129
+ const addedChange = added.get(urlPath);
130
+ if (addedChange) {
131
+ // Extract HTTP methods
132
+ const removedMethod = extractHttpMethod(removedChange.before ?? removedChange.description);
133
+ const addedMethod = extractHttpMethod(addedChange.after ?? addedChange.description);
134
+ if (removedMethod && addedMethod && removedMethod !== addedMethod) {
135
+ consumed.add(changes.indexOf(removedChange));
136
+ consumed.add(changes.indexOf(addedChange));
137
+ result.push({
138
+ file: removedChange.file,
139
+ change_type: "method_changed",
140
+ severity: "breaking",
141
+ description: `HTTP method changed: ${removedMethod} ${urlPath} -> ${addedMethod} ${urlPath}`,
142
+ before: `${removedMethod} ${urlPath}`,
143
+ after: `${addedMethod} ${urlPath}`,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ // Return method_changed + any unconsumed changes
149
+ for (let i = 0; i < changes.length; i++) {
150
+ if (!consumed.has(i)) {
151
+ result.push(changes[i]);
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ function extractPath(endpointStr) {
157
+ // Extract URL path from strings like "GetMapping /api/v1/users" or "GET /api/v1/users"
158
+ const match = endpointStr.match(/\/[\w\-{}./]+/);
159
+ return match ? match[0] : null;
160
+ }
161
+ function extractHttpMethod(endpointStr) {
162
+ // Extract HTTP method from strings like "GetMapping /api/v1/users" or "GET /api/v1/users"
163
+ const match = endpointStr.match(/^(Get|Post|Put|Delete|Patch|Mapping)\w*\s/i);
164
+ if (match) {
165
+ const raw = match[1].toUpperCase();
166
+ // Map Spring annotation names to HTTP methods
167
+ const methodMap = {
168
+ GET: "GET", POST: "POST", PUT: "PUT", DELETE: "DELETE", PATCH: "PATCH",
169
+ REQUESTMAPPING: "REQUEST",
170
+ };
171
+ return methodMap[raw] ?? raw;
172
+ }
173
+ // Try uppercase HTTP method
174
+ const httpMatch = endpointStr.match(/^(GET|POST|PUT|DELETE|PATCH)\s/);
175
+ return httpMatch ? httpMatch[1] : null;
176
+ }
177
+ // ── Spring annotation detection ──
178
+ function detectSpringAnnotationChange(content, isAdded, isRemoved, file) {
179
+ const springAnnotationRe = /^\s*@(?<method>RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping)\s*\(?\s*(?:value\s*=\s*)?["'`](?<path>\/[^"'`]*)["'`]/;
180
+ const match = content.match(springAnnotationRe);
181
+ if (!match)
182
+ return null;
183
+ const path = match.groups.path;
184
+ const httpMethod = match.groups.method;
185
+ if (isAdded) {
186
+ return {
187
+ file,
188
+ change_type: "path_added",
189
+ severity: "compatible",
190
+ description: `New endpoint added: ${httpMethod} ${path}`,
191
+ after: `${httpMethod} ${path}`,
192
+ };
193
+ }
194
+ if (isRemoved) {
195
+ return {
196
+ file,
197
+ change_type: "path_removed",
198
+ severity: "breaking",
199
+ description: `Endpoint removed: ${httpMethod} ${path}`,
200
+ before: `${httpMethod} ${path}`,
201
+ };
202
+ }
203
+ return null;
204
+ }
205
+ // ── Express route detection ──
206
+ function detectExpressRouteChange(content, isAdded, isRemoved, file) {
207
+ const expressRouteRe = /router\.(?<method>get|post|put|delete|patch)\s*\(\s*['"`](?<path>\/[^'"`]*)['"`]/;
208
+ const match = content.match(expressRouteRe);
209
+ if (!match)
210
+ return null;
211
+ const path = match.groups.path;
212
+ const httpMethod = match.groups.method.toUpperCase();
213
+ if (isAdded) {
214
+ return {
215
+ file,
216
+ change_type: "path_added",
217
+ severity: "compatible",
218
+ description: `New Express route added: ${httpMethod} ${path}`,
219
+ after: `${httpMethod} ${path}`,
220
+ };
221
+ }
222
+ if (isRemoved) {
223
+ return {
224
+ file,
225
+ change_type: "path_removed",
226
+ severity: "breaking",
227
+ description: `Express route removed: ${httpMethod} ${path}`,
228
+ before: `${httpMethod} ${path}`,
229
+ };
230
+ }
231
+ return null;
232
+ }
233
+ // ── Field change detection ──
234
+ function detectFieldChange(content, isAdded, isRemoved, file, lines, currentIndex, consumedIndices) {
235
+ // Java: private Type fieldName;
236
+ const javaFieldRe = /^\s*(private|protected|public)\s+(?<type>[\w<>[\]]+)\s+(?<name>\w+)/;
237
+ // TypeScript: fieldName: Type; or fieldName?: Type;
238
+ const tsFieldRe = /^\s*(?<name>\w+)\s*(?<optional>\??):\s*(?<type>[\w<>[\]|.]+)\s*[;=]?/;
239
+ const javaMatch = content.match(javaFieldRe);
240
+ const tsMatch = !javaMatch ? content.match(tsFieldRe) : null;
241
+ if (javaMatch) {
242
+ const { type, name } = javaMatch.groups;
243
+ const fieldName = `${name}: ${type}`;
244
+ if (isAdded) {
245
+ // Check if there's a preceding - line with the same field name (type change detection)
246
+ const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
247
+ if (typeChange) {
248
+ return {
249
+ file,
250
+ change_type: "field_type_changed",
251
+ severity: "breaking",
252
+ description: `Field type changed: ${name}`,
253
+ before: typeChange.before,
254
+ after: typeChange.after,
255
+ };
256
+ }
257
+ return {
258
+ file,
259
+ change_type: "field_added",
260
+ severity: "compatible",
261
+ description: `Field added: ${fieldName}`,
262
+ after: fieldName,
263
+ };
264
+ }
265
+ if (isRemoved) {
266
+ // Check if the next line is a similar field addition (type change detection)
267
+ const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
268
+ if (typeChange) {
269
+ return {
270
+ file,
271
+ change_type: "field_type_changed",
272
+ severity: "breaking",
273
+ description: `Field type changed: ${name}`,
274
+ before: typeChange.before,
275
+ after: typeChange.after,
276
+ };
277
+ }
278
+ return {
279
+ file,
280
+ change_type: "field_removed",
281
+ severity: "breaking",
282
+ description: `Field removed: ${fieldName}`,
283
+ before: fieldName,
284
+ };
285
+ }
286
+ }
287
+ if (tsMatch) {
288
+ const { type, name } = tsMatch.groups;
289
+ const optional = tsMatch.groups.optional === "?";
290
+ const fieldName = `${name}${optional ? "?" : ""}: ${type}`;
291
+ if (isAdded) {
292
+ // Check if there's a preceding - line with the same field name (type change detection)
293
+ const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
294
+ if (typeChange) {
295
+ return {
296
+ file,
297
+ change_type: "field_type_changed",
298
+ severity: "breaking",
299
+ description: `Field type changed: ${name}`,
300
+ before: typeChange.before,
301
+ after: typeChange.after,
302
+ };
303
+ }
304
+ return {
305
+ file,
306
+ change_type: "field_added",
307
+ severity: "compatible",
308
+ description: `Field added: ${fieldName}`,
309
+ after: fieldName,
310
+ };
311
+ }
312
+ if (isRemoved) {
313
+ const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
314
+ if (typeChange) {
315
+ return {
316
+ file,
317
+ change_type: "field_type_changed",
318
+ severity: "breaking",
319
+ description: `Field type changed: ${name}`,
320
+ before: typeChange.before,
321
+ after: typeChange.after,
322
+ };
323
+ }
324
+ return {
325
+ file,
326
+ change_type: "field_removed",
327
+ severity: "breaking",
328
+ description: `Field removed: ${fieldName}`,
329
+ before: fieldName,
330
+ };
331
+ }
332
+ }
333
+ return null;
334
+ }
335
+ // ── Type change detection (adjacent -/+ lines with same field name) ──
336
+ function detectTypeChangeForField(fieldName, lines, currentIndex, consumedIndices) {
337
+ const javaRe = /^\s*(private|protected|public)\s+(?<type>[\w<>[\]]+)\s+(?<name>\w+)/;
338
+ const tsRe = /^\s*(?<name>\w+)\s*(?<optional>\??):\s*(?<type>[\w<>[\]|.]+)\s*[;=]?/;
339
+ const currentLine = lines[currentIndex];
340
+ const isRemoved = currentLine.startsWith("-") && !currentLine.startsWith("---");
341
+ const isAdded = currentLine.startsWith("+") && !currentLine.startsWith("+++");
342
+ // Helper to extract type from a diff line content (after +/- prefix)
343
+ function extractTypeInfo(lineIndex) {
344
+ const line = lines[lineIndex];
345
+ const isPlus = line.startsWith("+") && !line.startsWith("+++");
346
+ const isMinus = line.startsWith("-") && !line.startsWith("---");
347
+ if (!isPlus && !isMinus)
348
+ return null;
349
+ const content = line.slice(1);
350
+ const jMatch = content.match(javaRe);
351
+ const tMatch = !jMatch ? content.match(tsRe) : null;
352
+ const m = jMatch ?? tMatch;
353
+ if (!m)
354
+ return null;
355
+ return { type: m.groups.type, name: m.groups.name };
356
+ }
357
+ function getCurrentTypeInfo() {
358
+ return extractTypeInfo(currentIndex);
359
+ }
360
+ const maxLook = 5;
361
+ if (isRemoved) {
362
+ // Look ahead for a + line with the same field name but different type
363
+ for (let j = currentIndex + 1; j < Math.min(currentIndex + maxLook, lines.length); j++) {
364
+ if (consumedIndices.has(j))
365
+ continue;
366
+ const info = extractTypeInfo(j);
367
+ if (info && info.name === fieldName) {
368
+ const currentInfo = getCurrentTypeInfo();
369
+ if (info.type !== currentInfo.type) {
370
+ consumedIndices.add(j);
371
+ return { before: `${fieldName}: ${currentInfo.type}`, after: `${fieldName}: ${info.type}` };
372
+ }
373
+ }
374
+ }
375
+ // Also look backward for a + line (when - comes after + in the diff)
376
+ for (let j = currentIndex - 1; j >= Math.max(0, currentIndex - maxLook); j--) {
377
+ if (consumedIndices.has(j))
378
+ continue;
379
+ const info = extractTypeInfo(j);
380
+ if (info && info.name === fieldName) {
381
+ const currentInfo = getCurrentTypeInfo();
382
+ if (info.type !== currentInfo.type) {
383
+ consumedIndices.add(j);
384
+ return { before: `${fieldName}: ${currentInfo.type}`, after: `${fieldName}: ${info.type}` };
385
+ }
386
+ }
387
+ }
388
+ }
389
+ if (isAdded) {
390
+ // Look backward for a - line with the same field name but different type
391
+ for (let j = currentIndex - 1; j >= Math.max(0, currentIndex - maxLook); j--) {
392
+ if (consumedIndices.has(j))
393
+ continue;
394
+ const info = extractTypeInfo(j);
395
+ if (info && info.name === fieldName) {
396
+ const currentInfo = getCurrentTypeInfo();
397
+ if (info.type !== currentInfo.type) {
398
+ consumedIndices.add(j);
399
+ return { before: `${fieldName}: ${info.type}`, after: `${fieldName}: ${currentInfo.type}` };
400
+ }
401
+ }
402
+ }
403
+ // Also look forward for a - line (when + comes before - in the diff)
404
+ for (let j = currentIndex + 1; j < Math.min(currentIndex + maxLook, lines.length); j++) {
405
+ if (consumedIndices.has(j))
406
+ continue;
407
+ const info = extractTypeInfo(j);
408
+ if (info && info.name === fieldName) {
409
+ const currentInfo = getCurrentTypeInfo();
410
+ if (info.type !== currentInfo.type) {
411
+ consumedIndices.add(j);
412
+ return { before: `${fieldName}: ${info.type}`, after: `${fieldName}: ${currentInfo.type}` };
413
+ }
414
+ }
415
+ }
416
+ }
417
+ return null;
418
+ }
419
+ // ── Cross-service impact analysis ──
420
+ function analyzeCrossServiceImpact(breakingChanges, config) {
421
+ const impact = [];
422
+ // Only relevant if the project has multiple repos (multi-service)
423
+ if (config.repos.length < 2)
424
+ return impact;
425
+ // Extract impacted endpoint paths from breaking changes
426
+ const affectedEndpoints = [];
427
+ for (const change of breakingChanges) {
428
+ if (change.change_type === "path_removed" ||
429
+ change.change_type === "method_changed" ||
430
+ change.change_type === "field_removed" ||
431
+ change.change_type === "field_type_changed") {
432
+ const endpoint = change.before ?? change.description;
433
+ affectedEndpoints.push(endpoint);
434
+ }
435
+ }
436
+ if (affectedEndpoints.length > 0) {
437
+ impact.push({
438
+ service: "frontend",
439
+ endpoints: affectedEndpoints,
440
+ });
441
+ }
442
+ return impact;
443
+ }
444
+ // ── Summary builder ──
445
+ function buildSummary(total, breaking, compatible, crossService) {
446
+ const parts = [];
447
+ if (total === 0) {
448
+ return "No contract changes detected.";
449
+ }
450
+ parts.push(`Detected ${total} contract change(s): ${breaking} breaking, ${compatible} compatible.`);
451
+ if (crossService.length > 0) {
452
+ const services = crossService.map((c) => `${c.service} (${c.endpoints.length} endpoint(s))`);
453
+ parts.push(`Cross-service impact: ${services.join(", ")}.`);
454
+ }
455
+ if (breaking > 0) {
456
+ parts.push("Review required due to breaking changes.");
457
+ }
458
+ return parts.join(" ");
459
+ }
460
+ // ── Empty result helper ──
461
+ function emptyResult(summary) {
462
+ return {
463
+ changes: [],
464
+ breaking_count: 0,
465
+ compatible_count: 0,
466
+ cross_service_impact: [],
467
+ requires_review: false,
468
+ summary,
469
+ };
470
+ }
471
+ //# sourceMappingURL=contract_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract_guard.js","sourceRoot":"","sources":["../../src/engine/contract_guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Convention {
2
+ file_pattern: string;
3
+ convention: string;
4
+ example?: string;
5
+ }
6
+ export declare function detectConventions(filePaths: string[], projectPath: string, conventionsFile?: string): Promise<Convention[]>;
7
+ //# sourceMappingURL=convention_detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention_detector.d.ts","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,UAAU,EAAE,CAAC,CA0CvB"}
@@ -0,0 +1,93 @@
1
+ import fs from "node:fs/promises";
2
+ import fss from "node:fs";
3
+ import path from "node:path";
4
+ import matter from "gray-matter";
5
+ export async function detectConventions(filePaths, projectPath, conventionsFile) {
6
+ const conventions = [];
7
+ // 优先加载项目约定的惯例文件
8
+ if (conventionsFile) {
9
+ const convPath = path.resolve(projectPath, conventionsFile);
10
+ if (fss.existsSync(convPath)) {
11
+ try {
12
+ const raw = await fs.readFile(convPath, "utf-8");
13
+ const { data } = matter(raw);
14
+ if (Array.isArray(data.conventions)) {
15
+ for (const c of data.conventions) {
16
+ conventions.push({
17
+ file_pattern: c.pattern || c.file_pattern || "*",
18
+ convention: c.convention || c.rule || String(c),
19
+ example: c.example,
20
+ });
21
+ }
22
+ }
23
+ }
24
+ catch {
25
+ // 惯例文件解析失败,跳过
26
+ }
27
+ }
28
+ }
29
+ for (const filePath of filePaths) {
30
+ try {
31
+ const fullPath = path.resolve(projectPath, filePath);
32
+ const stat = await fs.stat(fullPath);
33
+ if (!stat.isFile())
34
+ continue;
35
+ const content = await fs.readFile(fullPath, "utf-8");
36
+ const detected = analyzeFile(content, filePath);
37
+ conventions.push(...detected);
38
+ }
39
+ catch {
40
+ // 文件无法访问,跳过
41
+ }
42
+ if (conventions.length >= 10)
43
+ break;
44
+ }
45
+ return conventions;
46
+ }
47
+ function analyzeFile(content, filePath) {
48
+ const conventions = [];
49
+ // 检测 Spring 惯例
50
+ if (filePath.endsWith(".java")) {
51
+ if (/private.*Map.*cache/.test(content)) {
52
+ conventions.push({
53
+ file_pattern: filePath,
54
+ convention: "Service 类包含缓存字段(Map 缓存),修改时遵循此模式",
55
+ });
56
+ }
57
+ if (/@Transactional/.test(content) && !/readOnly\s*=\s*true/.test(content)) {
58
+ conventions.push({
59
+ file_pattern: filePath,
60
+ convention: "写操作使用 @Transactional,查询操作不加事务注解",
61
+ });
62
+ }
63
+ if (/class \w+ServiceImpl/.test(content)) {
64
+ conventions.push({
65
+ file_pattern: filePath,
66
+ convention: "使用 ServiceImpl 后缀命名实现类",
67
+ });
68
+ }
69
+ }
70
+ // 检测 React/TypeScript 惯例
71
+ if (/\.tsx?$/.test(filePath)) {
72
+ if (/export default/.test(content)) {
73
+ conventions.push({
74
+ file_pattern: filePath,
75
+ convention: "使用 export default 导出组件",
76
+ });
77
+ }
78
+ if (/interface \w+Props/.test(content)) {
79
+ conventions.push({
80
+ file_pattern: filePath,
81
+ convention: "Props 使用 interface 定义(非 type)",
82
+ });
83
+ }
84
+ if (/useStyles|makeStyles|styled/.test(content)) {
85
+ conventions.push({
86
+ file_pattern: filePath,
87
+ convention: "使用 CSS-in-JS 方案管理样式",
88
+ });
89
+ }
90
+ }
91
+ return conventions;
92
+ }
93
+ //# sourceMappingURL=convention_detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention_detector.js","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DebtTracker } from "./debt_tracker.js";
2
+ import type { DebtReport } from "../types.js";
3
+ export declare function generateDebtReport(tracker: DebtTracker): Promise<DebtReport>;
4
+ //# sourceMappingURL=debt_reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debt_reporter.d.ts","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AAyBxD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDlF"}