soloforge 1.2.8 → 1.2.10

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 (405) hide show
  1. package/README.md +105 -321
  2. package/dist/adapters/claude_code/claude_md.d.ts +5 -0
  3. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  4. package/dist/adapters/claude_code/claude_md.js +6 -0
  5. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  6. package/dist/adapters/claude_code/hooks.d.ts +4 -0
  7. package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
  8. package/dist/adapters/claude_code/hooks.js +5 -0
  9. package/dist/adapters/claude_code/hooks.js.map +1 -1
  10. package/dist/adapters/claude_code/server.d.ts.map +1 -1
  11. package/dist/adapters/claude_code/server.js +9 -21
  12. package/dist/adapters/claude_code/server.js.map +1 -1
  13. package/dist/adapters/claude_code/tools.d.ts +5 -0
  14. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  15. package/dist/adapters/claude_code/tools.js +619 -205
  16. package/dist/adapters/claude_code/tools.js.map +1 -1
  17. package/dist/adapters/codex/codex_config.d.ts +9 -0
  18. package/dist/adapters/codex/codex_config.d.ts.map +1 -1
  19. package/dist/adapters/codex/codex_config.js +11 -3
  20. package/dist/adapters/codex/codex_config.js.map +1 -1
  21. package/dist/adapters/codex/codex_rules.d.ts +5 -0
  22. package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
  23. package/dist/adapters/codex/codex_rules.js +8 -1
  24. package/dist/adapters/codex/codex_rules.js.map +1 -1
  25. package/dist/adapters/shared/workflow_template.d.ts +5 -0
  26. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  27. package/dist/adapters/shared/workflow_template.js +32 -79
  28. package/dist/adapters/shared/workflow_template.js.map +1 -1
  29. package/dist/adapters/trae/trae_config.d.ts +4 -0
  30. package/dist/adapters/trae/trae_config.d.ts.map +1 -1
  31. package/dist/adapters/trae/trae_config.js +5 -7
  32. package/dist/adapters/trae/trae_config.js.map +1 -1
  33. package/dist/adapters/trae/trae_rules.d.ts +5 -0
  34. package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
  35. package/dist/adapters/trae/trae_rules.js +7 -1
  36. package/dist/adapters/trae/trae_rules.js.map +1 -1
  37. package/dist/bin/config_commands.d.ts +33 -0
  38. package/dist/bin/config_commands.d.ts.map +1 -0
  39. package/dist/bin/config_commands.js +222 -0
  40. package/dist/bin/config_commands.js.map +1 -0
  41. package/dist/bin/soloforge.js +609 -119
  42. package/dist/bin/soloforge.js.map +1 -1
  43. package/dist/engine/artifact_contract_registry.d.ts +138 -0
  44. package/dist/engine/artifact_contract_registry.d.ts.map +1 -0
  45. package/dist/engine/artifact_contract_registry.js +427 -0
  46. package/dist/engine/artifact_contract_registry.js.map +1 -0
  47. package/dist/engine/audit_pool.d.ts +40 -0
  48. package/dist/engine/audit_pool.d.ts.map +1 -1
  49. package/dist/engine/audit_pool.js +37 -1
  50. package/dist/engine/audit_pool.js.map +1 -1
  51. package/dist/engine/audit_sampler.d.ts +5 -0
  52. package/dist/engine/audit_sampler.d.ts.map +1 -1
  53. package/dist/engine/audit_sampler.js +6 -0
  54. package/dist/engine/audit_sampler.js.map +1 -1
  55. package/dist/engine/audit_verifier.d.ts.map +1 -1
  56. package/dist/engine/audit_verifier.js +5 -1
  57. package/dist/engine/audit_verifier.js.map +1 -1
  58. package/dist/engine/batch1_manifest.d.ts +61 -0
  59. package/dist/engine/batch1_manifest.d.ts.map +1 -0
  60. package/dist/engine/batch1_manifest.js +220 -0
  61. package/dist/engine/batch1_manifest.js.map +1 -0
  62. package/dist/engine/batch1_reality_gate.d.ts +40 -0
  63. package/dist/engine/batch1_reality_gate.d.ts.map +1 -0
  64. package/dist/engine/batch1_reality_gate.js +290 -0
  65. package/dist/engine/batch1_reality_gate.js.map +1 -0
  66. package/dist/engine/batch1_scenario_registry.d.ts +62 -0
  67. package/dist/engine/batch1_scenario_registry.d.ts.map +1 -0
  68. package/dist/engine/batch1_scenario_registry.js +392 -0
  69. package/dist/engine/batch1_scenario_registry.js.map +1 -0
  70. package/dist/engine/batch1_scenario_runners.d.ts +42 -0
  71. package/dist/engine/batch1_scenario_runners.d.ts.map +1 -0
  72. package/dist/engine/batch1_scenario_runners.js +292 -0
  73. package/dist/engine/batch1_scenario_runners.js.map +1 -0
  74. package/dist/engine/capability_action_advisor.d.ts +3 -0
  75. package/dist/engine/capability_action_advisor.d.ts.map +1 -1
  76. package/dist/engine/capability_action_advisor.js +10 -0
  77. package/dist/engine/capability_action_advisor.js.map +1 -1
  78. package/dist/engine/capability_registry.d.ts +21 -0
  79. package/dist/engine/capability_registry.d.ts.map +1 -1
  80. package/dist/engine/capability_registry.js +113 -0
  81. package/dist/engine/capability_registry.js.map +1 -1
  82. package/dist/engine/capability_state_store.d.ts +63 -0
  83. package/dist/engine/capability_state_store.d.ts.map +1 -1
  84. package/dist/engine/capability_state_store.js +49 -1
  85. package/dist/engine/capability_state_store.js.map +1 -1
  86. package/dist/engine/change_coordinator.d.ts.map +1 -1
  87. package/dist/engine/change_coordinator.js +5 -4
  88. package/dist/engine/change_coordinator.js.map +1 -1
  89. package/dist/engine/classifier.d.ts +15 -5
  90. package/dist/engine/classifier.d.ts.map +1 -1
  91. package/dist/engine/classifier.js +70 -69
  92. package/dist/engine/classifier.js.map +1 -1
  93. package/dist/engine/code_reviewer.d.ts +14 -0
  94. package/dist/engine/code_reviewer.d.ts.map +1 -1
  95. package/dist/engine/code_reviewer.js +109 -10
  96. package/dist/engine/code_reviewer.js.map +1 -1
  97. package/dist/engine/cognitive_anchor.d.ts +14 -0
  98. package/dist/engine/cognitive_anchor.d.ts.map +1 -1
  99. package/dist/engine/cognitive_anchor.js +26 -2
  100. package/dist/engine/cognitive_anchor.js.map +1 -1
  101. package/dist/engine/command_execution_contract.d.ts +226 -0
  102. package/dist/engine/command_execution_contract.d.ts.map +1 -0
  103. package/dist/engine/command_execution_contract.js +571 -0
  104. package/dist/engine/command_execution_contract.js.map +1 -0
  105. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  106. package/dist/engine/confidence_scorer.js +1 -0
  107. package/dist/engine/confidence_scorer.js.map +1 -1
  108. package/dist/engine/config_precedence_contract.d.ts +269 -0
  109. package/dist/engine/config_precedence_contract.d.ts.map +1 -0
  110. package/dist/engine/config_precedence_contract.js +948 -0
  111. package/dist/engine/config_precedence_contract.js.map +1 -0
  112. package/dist/engine/conflict_gate.d.ts +13 -0
  113. package/dist/engine/conflict_gate.d.ts.map +1 -1
  114. package/dist/engine/conflict_gate.js +20 -2
  115. package/dist/engine/conflict_gate.js.map +1 -1
  116. package/dist/engine/consumable_asset_registry.d.ts +46 -0
  117. package/dist/engine/consumable_asset_registry.d.ts.map +1 -0
  118. package/dist/engine/consumable_asset_registry.js +758 -0
  119. package/dist/engine/consumable_asset_registry.js.map +1 -0
  120. package/dist/engine/contract_guard.d.ts +4 -0
  121. package/dist/engine/contract_guard.d.ts.map +1 -1
  122. package/dist/engine/contract_guard.js +15 -7
  123. package/dist/engine/contract_guard.js.map +1 -1
  124. package/dist/engine/convention_detector.d.ts.map +1 -1
  125. package/dist/engine/convention_detector.js +5 -2
  126. package/dist/engine/convention_detector.js.map +1 -1
  127. package/dist/engine/core_engineering_principles.d.ts +155 -0
  128. package/dist/engine/core_engineering_principles.d.ts.map +1 -0
  129. package/dist/engine/core_engineering_principles.js +426 -0
  130. package/dist/engine/core_engineering_principles.js.map +1 -0
  131. package/dist/engine/debt_reporter.d.ts.map +1 -1
  132. package/dist/engine/debt_reporter.js +3 -1
  133. package/dist/engine/debt_reporter.js.map +1 -1
  134. package/dist/engine/debt_tracker.d.ts.map +1 -1
  135. package/dist/engine/debt_tracker.js +9 -3
  136. package/dist/engine/debt_tracker.js.map +1 -1
  137. package/dist/engine/debugger.d.ts.map +1 -1
  138. package/dist/engine/debugger.js +2 -0
  139. package/dist/engine/debugger.js.map +1 -1
  140. package/dist/engine/decision_contract.d.ts +11 -2
  141. package/dist/engine/decision_contract.d.ts.map +1 -1
  142. package/dist/engine/decision_contract.js +17 -2
  143. package/dist/engine/decision_contract.js.map +1 -1
  144. package/dist/engine/delivery.d.ts +7 -0
  145. package/dist/engine/delivery.d.ts.map +1 -1
  146. package/dist/engine/delivery.js +89 -36
  147. package/dist/engine/delivery.js.map +1 -1
  148. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  149. package/dist/engine/dependency_scanner.js +14 -9
  150. package/dist/engine/dependency_scanner.js.map +1 -1
  151. package/dist/engine/developer_sovereignty.d.ts.map +1 -1
  152. package/dist/engine/developer_sovereignty.js +8 -2
  153. package/dist/engine/developer_sovereignty.js.map +1 -1
  154. package/dist/engine/diff_ownership.d.ts.map +1 -1
  155. package/dist/engine/diff_ownership.js +8 -0
  156. package/dist/engine/diff_ownership.js.map +1 -1
  157. package/dist/engine/diff_ownership_store.d.ts +26 -10
  158. package/dist/engine/diff_ownership_store.d.ts.map +1 -1
  159. package/dist/engine/diff_ownership_store.js +47 -20
  160. package/dist/engine/diff_ownership_store.js.map +1 -1
  161. package/dist/engine/dual_layer_mechanism_registry.d.ts +66 -0
  162. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -0
  163. package/dist/engine/dual_layer_mechanism_registry.js +1077 -0
  164. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -0
  165. package/dist/engine/escape_report.d.ts +50 -0
  166. package/dist/engine/escape_report.d.ts.map +1 -1
  167. package/dist/engine/escape_report.js +38 -0
  168. package/dist/engine/escape_report.js.map +1 -1
  169. package/dist/engine/evolver.d.ts.map +1 -1
  170. package/dist/engine/evolver.js +12 -2
  171. package/dist/engine/evolver.js.map +1 -1
  172. package/dist/engine/exploration.d.ts.map +1 -1
  173. package/dist/engine/exploration.js +87 -0
  174. package/dist/engine/exploration.js.map +1 -1
  175. package/dist/engine/failure_classifier.d.ts.map +1 -1
  176. package/dist/engine/failure_classifier.js +8 -0
  177. package/dist/engine/failure_classifier.js.map +1 -1
  178. package/dist/engine/feasibility_checker.d.ts +8 -0
  179. package/dist/engine/feasibility_checker.d.ts.map +1 -1
  180. package/dist/engine/feasibility_checker.js +12 -0
  181. package/dist/engine/feasibility_checker.js.map +1 -1
  182. package/dist/engine/git_deps.d.ts +4 -1
  183. package/dist/engine/git_deps.d.ts.map +1 -1
  184. package/dist/engine/git_deps.js +5 -1
  185. package/dist/engine/git_deps.js.map +1 -1
  186. package/dist/engine/governance_report.d.ts +57 -1
  187. package/dist/engine/governance_report.d.ts.map +1 -1
  188. package/dist/engine/governance_report.js +91 -1
  189. package/dist/engine/governance_report.js.map +1 -1
  190. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  191. package/dist/engine/impact_analyzer.js +5 -1
  192. package/dist/engine/impact_analyzer.js.map +1 -1
  193. package/dist/engine/implementation_roadmap_registry.d.ts +105 -0
  194. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -0
  195. package/dist/engine/implementation_roadmap_registry.js +813 -0
  196. package/dist/engine/implementation_roadmap_registry.js.map +1 -0
  197. package/dist/engine/input_material_contract_registry.d.ts +185 -0
  198. package/dist/engine/input_material_contract_registry.d.ts.map +1 -0
  199. package/dist/engine/input_material_contract_registry.js +563 -0
  200. package/dist/engine/input_material_contract_registry.js.map +1 -0
  201. package/dist/engine/intent_expander.d.ts +8 -27
  202. package/dist/engine/intent_expander.d.ts.map +1 -1
  203. package/dist/engine/intent_expander.js +1170 -139
  204. package/dist/engine/intent_expander.js.map +1 -1
  205. package/dist/engine/intent_router.d.ts +82 -0
  206. package/dist/engine/intent_router.d.ts.map +1 -0
  207. package/dist/engine/intent_router.js +458 -0
  208. package/dist/engine/intent_router.js.map +1 -0
  209. package/dist/engine/io_controller.d.ts.map +1 -1
  210. package/dist/engine/io_controller.js +25 -13
  211. package/dist/engine/io_controller.js.map +1 -1
  212. package/dist/engine/java_quality_guard.d.ts.map +1 -1
  213. package/dist/engine/java_quality_guard.js +8 -4
  214. package/dist/engine/java_quality_guard.js.map +1 -1
  215. package/dist/engine/job_manager.d.ts +35 -0
  216. package/dist/engine/job_manager.d.ts.map +1 -1
  217. package/dist/engine/job_manager.js +53 -9
  218. package/dist/engine/job_manager.js.map +1 -1
  219. package/dist/engine/knowledge_config_loader.d.ts +12 -1
  220. package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
  221. package/dist/engine/knowledge_config_loader.js +50 -10
  222. package/dist/engine/knowledge_config_loader.js.map +1 -1
  223. package/dist/engine/knowledge_injection_boundary.d.ts +56 -0
  224. package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -0
  225. package/dist/engine/knowledge_injection_boundary.js +561 -0
  226. package/dist/engine/knowledge_injection_boundary.js.map +1 -0
  227. package/dist/engine/knowledge_manager.d.ts +73 -0
  228. package/dist/engine/knowledge_manager.d.ts.map +1 -1
  229. package/dist/engine/knowledge_manager.js +163 -21
  230. package/dist/engine/knowledge_manager.js.map +1 -1
  231. package/dist/engine/knowledge_sovereignty.d.ts +1 -0
  232. package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
  233. package/dist/engine/knowledge_sovereignty.js +8 -3
  234. package/dist/engine/knowledge_sovereignty.js.map +1 -1
  235. package/dist/engine/llm_gateway.d.ts +74 -3
  236. package/dist/engine/llm_gateway.d.ts.map +1 -1
  237. package/dist/engine/llm_gateway.js +75 -4
  238. package/dist/engine/llm_gateway.js.map +1 -1
  239. package/dist/engine/main_path_integration_contract.d.ts +383 -0
  240. package/dist/engine/main_path_integration_contract.d.ts.map +1 -0
  241. package/dist/engine/main_path_integration_contract.js +1581 -0
  242. package/dist/engine/main_path_integration_contract.js.map +1 -0
  243. package/dist/engine/mechanism_contract_registry.d.ts +59 -0
  244. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -0
  245. package/dist/engine/mechanism_contract_registry.js +484 -0
  246. package/dist/engine/mechanism_contract_registry.js.map +1 -0
  247. package/dist/engine/migration_guard.d.ts.map +1 -1
  248. package/dist/engine/migration_guard.js +24 -15
  249. package/dist/engine/migration_guard.js.map +1 -1
  250. package/dist/engine/mutation_audit.d.ts +10 -0
  251. package/dist/engine/mutation_audit.d.ts.map +1 -1
  252. package/dist/engine/mutation_audit.js +19 -2
  253. package/dist/engine/mutation_audit.js.map +1 -1
  254. package/dist/engine/observability.d.ts.map +1 -1
  255. package/dist/engine/observability.js +17 -6
  256. package/dist/engine/observability.js.map +1 -1
  257. package/dist/engine/onboarding.d.ts.map +1 -1
  258. package/dist/engine/onboarding.js +20 -4
  259. package/dist/engine/onboarding.js.map +1 -1
  260. package/dist/engine/policy_drift_detector.d.ts +6 -0
  261. package/dist/engine/policy_drift_detector.d.ts.map +1 -1
  262. package/dist/engine/policy_drift_detector.js +16 -0
  263. package/dist/engine/policy_drift_detector.js.map +1 -1
  264. package/dist/engine/privacy_secret_contract.d.ts +320 -0
  265. package/dist/engine/privacy_secret_contract.d.ts.map +1 -0
  266. package/dist/engine/privacy_secret_contract.js +874 -0
  267. package/dist/engine/privacy_secret_contract.js.map +1 -0
  268. package/dist/engine/regression_matrix.d.ts +21 -8
  269. package/dist/engine/regression_matrix.d.ts.map +1 -1
  270. package/dist/engine/regression_matrix.js +37 -8
  271. package/dist/engine/regression_matrix.js.map +1 -1
  272. package/dist/engine/risk_sampler.d.ts +6 -0
  273. package/dist/engine/risk_sampler.d.ts.map +1 -1
  274. package/dist/engine/risk_sampler.js +9 -0
  275. package/dist/engine/risk_sampler.js.map +1 -1
  276. package/dist/engine/runtime_safety.d.ts.map +1 -1
  277. package/dist/engine/runtime_safety.js +7 -3
  278. package/dist/engine/runtime_safety.js.map +1 -1
  279. package/dist/engine/scaffolder.d.ts.map +1 -1
  280. package/dist/engine/scaffolder.js +7 -1
  281. package/dist/engine/scaffolder.js.map +1 -1
  282. package/dist/engine/scope_controller.d.ts.map +1 -1
  283. package/dist/engine/scope_controller.js +12 -1
  284. package/dist/engine/scope_controller.js.map +1 -1
  285. package/dist/engine/scope_lease.d.ts +43 -0
  286. package/dist/engine/scope_lease.d.ts.map +1 -1
  287. package/dist/engine/scope_lease.js +44 -0
  288. package/dist/engine/scope_lease.js.map +1 -1
  289. package/dist/engine/semantic_evidence.d.ts +6 -0
  290. package/dist/engine/semantic_evidence.d.ts.map +1 -1
  291. package/dist/engine/semantic_evidence.js +9 -0
  292. package/dist/engine/semantic_evidence.js.map +1 -1
  293. package/dist/engine/task_context.d.ts +36 -1
  294. package/dist/engine/task_context.d.ts.map +1 -1
  295. package/dist/engine/task_context.js +252 -13
  296. package/dist/engine/task_context.js.map +1 -1
  297. package/dist/engine/task_planner.d.ts.map +1 -1
  298. package/dist/engine/task_planner.js +13 -3
  299. package/dist/engine/task_planner.js.map +1 -1
  300. package/dist/engine/team_awareness.d.ts.map +1 -1
  301. package/dist/engine/team_awareness.js +8 -7
  302. package/dist/engine/team_awareness.js.map +1 -1
  303. package/dist/engine/template_mechanism_auditor.d.ts +93 -0
  304. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -0
  305. package/dist/engine/template_mechanism_auditor.js +622 -0
  306. package/dist/engine/template_mechanism_auditor.js.map +1 -0
  307. package/dist/engine/test_generator.d.ts.map +1 -1
  308. package/dist/engine/test_generator.js +6 -0
  309. package/dist/engine/test_generator.js.map +1 -1
  310. package/dist/engine/test_quality.d.ts +6 -0
  311. package/dist/engine/test_quality.d.ts.map +1 -1
  312. package/dist/engine/test_quality.js +26 -10
  313. package/dist/engine/test_quality.js.map +1 -1
  314. package/dist/engine/tool_invocation_contract_registry.d.ts +136 -0
  315. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -0
  316. package/dist/engine/tool_invocation_contract_registry.js +731 -0
  317. package/dist/engine/tool_invocation_contract_registry.js.map +1 -0
  318. package/dist/engine/traceability.d.ts +3 -0
  319. package/dist/engine/traceability.d.ts.map +1 -1
  320. package/dist/engine/traceability.js +12 -4
  321. package/dist/engine/traceability.js.map +1 -1
  322. package/dist/engine/user_feedback_contract.d.ts +162 -0
  323. package/dist/engine/user_feedback_contract.d.ts.map +1 -0
  324. package/dist/engine/user_feedback_contract.js +356 -0
  325. package/dist/engine/user_feedback_contract.js.map +1 -0
  326. package/dist/engine/verifier.d.ts +6 -1
  327. package/dist/engine/verifier.d.ts.map +1 -1
  328. package/dist/engine/verifier.js +114 -1
  329. package/dist/engine/verifier.js.map +1 -1
  330. package/dist/engine/workflow_contract_registry.d.ts +70 -0
  331. package/dist/engine/workflow_contract_registry.d.ts.map +1 -0
  332. package/dist/engine/workflow_contract_registry.js +501 -0
  333. package/dist/engine/workflow_contract_registry.js.map +1 -0
  334. package/dist/engine/workspace_resumer.d.ts.map +1 -1
  335. package/dist/engine/workspace_resumer.js +8 -0
  336. package/dist/engine/workspace_resumer.js.map +1 -1
  337. package/dist/engine/zero_config_init.d.ts +67 -2
  338. package/dist/engine/zero_config_init.d.ts.map +1 -1
  339. package/dist/engine/zero_config_init.js +410 -28
  340. package/dist/engine/zero_config_init.js.map +1 -1
  341. package/dist/git/operations.d.ts +101 -0
  342. package/dist/git/operations.d.ts.map +1 -1
  343. package/dist/git/operations.js +125 -9
  344. package/dist/git/operations.js.map +1 -1
  345. package/dist/index.d.ts +1 -1
  346. package/dist/index.js +16 -5
  347. package/dist/index.js.map +1 -1
  348. package/dist/knowledge/conflict_detector.d.ts +6 -0
  349. package/dist/knowledge/conflict_detector.d.ts.map +1 -1
  350. package/dist/knowledge/conflict_detector.js +7 -0
  351. package/dist/knowledge/conflict_detector.js.map +1 -1
  352. package/dist/knowledge/health_checker.d.ts +16 -0
  353. package/dist/knowledge/health_checker.d.ts.map +1 -1
  354. package/dist/knowledge/health_checker.js +24 -1
  355. package/dist/knowledge/health_checker.js.map +1 -1
  356. package/dist/knowledge/index_manager.d.ts +140 -2
  357. package/dist/knowledge/index_manager.d.ts.map +1 -1
  358. package/dist/knowledge/index_manager.js +186 -26
  359. package/dist/knowledge/index_manager.js.map +1 -1
  360. package/dist/knowledge/loader.d.ts +8 -1
  361. package/dist/knowledge/loader.d.ts.map +1 -1
  362. package/dist/knowledge/loader.js +56 -2
  363. package/dist/knowledge/loader.js.map +1 -1
  364. package/dist/knowledge/writer.d.ts +49 -1
  365. package/dist/knowledge/writer.d.ts.map +1 -1
  366. package/dist/knowledge/writer.js +55 -1
  367. package/dist/knowledge/writer.js.map +1 -1
  368. package/dist/types.d.ts +255 -1
  369. package/dist/types.d.ts.map +1 -1
  370. package/dist/utils/logger.d.ts +3 -0
  371. package/dist/utils/logger.d.ts.map +1 -0
  372. package/dist/utils/logger.js +29 -0
  373. package/dist/utils/logger.js.map +1 -0
  374. package/package.json +7 -7
  375. package/templates/knowledge/checklists//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
  376. package/templates/knowledge/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
  377. package/templates/knowledge/checklists//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/351/252/214/346/224/266/346/270/205/345/215/225.md +43 -0
  378. package/templates/knowledge/checklists//347/237/245/350/257/206/346/263/250/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
  379. package/templates/knowledge/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +15 -0
  380. package/templates/knowledge/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
  381. package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +1 -0
  382. package/templates/knowledge/procedures//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/350/257/201/346/265/201/347/250/213.md +23 -0
  383. package/templates/knowledge/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +19 -0
  384. package/templates/knowledge/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +15 -0
  385. package/templates/knowledge/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +15 -0
  386. package/templates/knowledge/procedures//346/272/220/347/240/201/345/216/237/345/236/213/344/272/244/344/273/230/346/265/201/347/250/213.md +1 -1
  387. package/templates/knowledge/procedures//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +53 -0
  388. package/templates/knowledge/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +21 -0
  389. package/templates/knowledge/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +25 -0
  390. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +20 -0
  391. package/templates/knowledge/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +25 -0
  392. package/templates/knowledge/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +26 -0
  393. package/templates/knowledge/rules//346/211/247/350/241/214/345/256/210/345/215/253/350/257/204/344/274/260/350/247/204/345/210/231.md +24 -0
  394. package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/345/244/204/347/220/206/350/247/204/345/210/231.md +20 -0
  395. package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +125 -0
  396. package/templates/knowledge/rules//346/263/250/345/206/214/350/241/250/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/345/210/231.md +26 -0
  397. package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +22 -0
  398. package/templates/knowledge/rules//347/237/245/350/257/206/346/263/250/345/205/245/350/276/271/347/225/214/350/247/204/345/210/231.md +25 -0
  399. package/templates/knowledge/rules//350/276/223/345/205/245/346/235/220/346/226/231/345/245/221/347/272/246/350/247/204/345/210/231.md +27 -0
  400. package/templates/knowledge/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +22 -0
  401. package/templates/knowledge/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +24 -0
  402. package/templates/knowledge/rules//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226/350/247/204/345/210/231.md +28 -0
  403. package/templates/knowledge/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +25 -0
  404. package/templates/knowledge/templates/{review_summary.md → /345/256/241/346/237/245/346/221/230/350/246/201.md} +1 -1
  405. package/templates/config.yaml +0 -53
package/README.md CHANGED
@@ -1,406 +1,190 @@
1
1
  # SoloForge
2
2
 
3
- AI 驱动的开发工作流系统 一个人干五个人的活。
3
+ AI 编程助手的项目工作流配置器。SoloForge 帮你把 Claude Code、Codex App、Trae IDE 接入同一套项目规则、知识模板和验证习惯,让 AI 在你的项目里更少误判、更少乱写、更容易交付可检查的结果。
4
4
 
5
- SoloForge 是一个 [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) 服务器,为 AI 编程助手(Claude Code、Codex App、Trae IDE)提供结构化的、知识驱动的开发工作流。它作为规则引擎和模板系统,通过知识模式、验证管线和自动化代码审查来保障工程质量。
5
+ ## 适合谁
6
+
7
+ - 你已经在用 Claude Code、Codex App 或 Trae IDE 写代码。
8
+ - 你希望每个项目都有稳定的 AI 工作流规则,而不是每次从零解释。
9
+ - 你希望 AI 修改代码前先理解项目边界,生成产物时不要误改源码。
10
+ - 你希望配置可以自动推断,但不要在低置信度时乱写项目配置。
6
11
 
7
12
  ## 最短成功路径
8
13
 
9
14
  ```bash
10
- # 1. 全局安装(任意目录均可)
15
+ # 1. 全局安装
11
16
  npm install -g soloforge
12
17
 
13
18
  # 2. 进入项目根目录
14
19
  cd /path/to/my-project
15
20
 
16
- # 3. 预检:看看会生成什么(不写入文件)
21
+ # 3. 预检:查看 SoloForge 会识别出什么,不写入配置
17
22
  soloforge init --auto --dry-run
18
23
 
19
- # 4. 确认后正式初始化(自动探测项目结构)
24
+ # 4. 初始化项目
20
25
  soloforge init --auto
21
26
 
22
- # 5. 重新打开 / 重载 AI 工具(让它加载新生成的配置)
23
- # Claude Code 退出后重新在项目目录启动 claude
24
- # Trae IDE → 重新打开项目目录(需已开启项目级 MCP)
25
- # Codex App → 重新打开项目目录
27
+ # 5. 重新打开你的 AI 工具,让它加载新配置
28
+ # Claude Code: 退出后在项目目录重新启动 claude
29
+ # Codex App: 重新打开项目目录
30
+ # Trae IDE: 重新打开项目目录
26
31
 
27
- # 6. 验证是否生效
28
- soloforge validate # 检查配置和知识文件
29
- soloforge status # 查看当前项目状态
32
+ # 6. 检查状态
33
+ soloforge validate
34
+ soloforge status
30
35
  ```
31
36
 
32
- 如果 `--auto` 置信度不够,用 `soloforge init --interactive` 手动配置。
33
-
34
- ## 快速开始
35
-
36
- ### 安装
37
+ 如果 `init --auto` 提示置信度不足,改用:
37
38
 
38
39
  ```bash
39
- npm install -g soloforge # 全局安装,可在任意目录执行
40
+ soloforge init --interactive
40
41
  ```
41
42
 
42
- ### 初始化
43
+ ## 初始化方式
43
44
 
44
- 所有 `soloforge` 命令默认在**当前目录**操作。`--project-path` 仅 `init` 和 `init --auto` 支持;`generate-*`、`validate`、`status` 需先 `cd` 到目标项目目录。
45
+ 所有命令默认作用于当前目录。推荐先 `cd` 到项目根目录再执行。
45
46
 
46
47
  ```bash
47
- # 推荐:先 dry-run 预检
48
- soloforge init --auto --dry-run # 查看探测结果,不写入文件
49
-
50
- # 正式初始化(在项目根目录执行,或加 --project-path)
51
- soloforge init --auto # 自动探测项目结构,高置信度时写入
52
- soloforge init --auto --project-path /path/to/proj # 不在项目目录时用 --project-path
53
- soloforge init # 手动默认配置(Claude Code 适配器)
54
- soloforge init --adapter trae # Trae IDE 适配器
55
- soloforge init --adapter codex # Codex App 适配器
56
- soloforge init --adapter all # 同时生成所有适配器配置
57
-
58
- # 交互式配置(手动输入项目名称、技术栈等)
59
- soloforge init --interactive
60
-
61
- # 低置信度时的兜底
62
- soloforge init --interactive # 手动补充配置
48
+ soloforge init --auto --dry-run # 只预览,不写入 config.yaml
49
+ soloforge init --auto # 高置信度时生成项目配置和适配器文件
50
+ soloforge init # 生成目录、知识模板和适配器文件,不写 config.yaml
51
+ soloforge init --interactive # 手动确认项目配置
52
+ soloforge init --adapter claude # 只生成 Claude Code 配置
53
+ soloforge init --adapter codex # 只生成 Codex App 配置
54
+ soloforge init --adapter trae # 只生成 Trae IDE 配置
55
+ soloforge init --adapter all # 同时生成所有适配器配置
63
56
  ```
64
57
 
65
- ### 各适配器生成的文件
66
-
67
- | 适配器 | 生成文件 | 说明 |
68
- |--------|---------|------|
69
- | Claude Code | `.claude/settings.json` | Hooks 配置(PreToolUse/PostToolUse) |
70
- | | `CLAUDE.md` | 工作流规则文件 |
71
- | | `.mcp.json` | MCP Server 配置(SoloForge + Playwright) |
72
- | Trae IDE | `.trae/mcp.json` | MCP Server 配置 |
73
- | | `.trae/rules/project_rules.md` | 项目规则文件 |
74
- | Codex App | `.codex/config.toml` | MCP Server 配置(TOML 格式) |
75
- | | `.codex/hooks.json` | Hooks 配置 |
76
- | | `AGENTS.md` | 工作流规则文件 |
77
- | 共通 | `.soloforge/config.yaml` | 项目配置(不覆盖已有) |
78
- | | `.soloforge/knowledge/` | 知识模板(不覆盖已有) |
79
- | | `.gitignore` 追加 | `.mcp.json` 和 `.soloforge/`(如缺失则追加) |
80
-
81
- > **Cursor 说明**: Cursor 暂无内置适配器(无 `--adapter cursor`)。如需在 Cursor 中使用 SoloForge:
82
- > 1. 先用 `soloforge init` 生成 `.mcp.json`
83
- > 2. 从 `.mcp.json` 中复制 `soloforge` 这一项,粘贴到项目根目录的 `.cursor/mcp.json`
84
- > 3. 将 `SOLOFORGE_PROJECT` 改为项目绝对路径
85
- >
86
- > 示例 `.cursor/mcp.json`:
87
- > ```json
88
- > {
89
- > "mcpServers": {
90
- > "soloforge": {
91
- > "command": "soloforge",
92
- > "args": ["mcp"],
93
- > "env": { "SOLOFORGE_PROJECT": "/absolute/path/to/my-project" }
94
- > }
95
- > }
96
- > }
97
- > ```
98
- > 前提:`soloforge` 已全局安装(`npm install -g soloforge`)且在 PATH 上。生成后重载 Cursor 窗口。
99
-
100
- ### 初始化后的下一步
101
-
102
- 1. **检查配置**: `soloforge validate` — 确认 config.yaml 和知识文件正确
103
- 2. **重新打开 / 重载 AI 工具**: 退出并重新启动 Claude Code / Trae / Codex,让它加载新生成的配置文件
104
- 3. **试一个小任务**: 让 AI "创建一个简单的 DTO",观察 SoloForge 工作流是否触发
105
- 4. **查看状态**: `soloforge status` — 确认知识库已索引
106
-
107
- ### 更新与重新生成
108
-
109
- SoloForge 更新后,需要重新生成适配器配置以获取最新的 hooks 和规则:
58
+ `config.yaml` 是可选文件。没有它时,SoloForge 会根据 `package.json`、`pom.xml`、`go.mod` 等文件在运行时推断项目类型;只有高置信度或你手动确认时,才会把配置写入 `.soloforge/config.yaml`。
110
59
 
111
- ```bash
112
- # 更新 SoloForge(任意目录均可)
113
- npm update -g soloforge
60
+ ## 生成文件
114
61
 
115
- # 重新生成(在目标项目根目录执行,不会覆盖 config.yaml 和已有知识)
116
- soloforge init # Claude Code: .claude/settings.json + CLAUDE.md
117
- soloforge generate-hooks # 仅重新生成 .claude/settings.json hooks
118
- soloforge generate-claude-md # 仅重新生成 CLAUDE.md
119
- soloforge generate-trae # 仅重新生成 .trae/ 配置
120
- soloforge generate-codex # 仅重新生成 .codex/ 配置 + AGENTS.md
121
-
122
- # 重新生成后,重新打开 / 重载 AI 工具以加载更新
62
+ | 位置 | 用途 |
63
+ |------|------|
64
+ | `.soloforge/knowledge/` | 项目知识模板和规则 |
65
+ | `.soloforge/config.yaml` | 可选项目配置,仅在高置信度或手动确认后生成 |
66
+ | `.claude/settings.json` / `CLAUDE.md` / `.mcp.json` | Claude Code 配置 |
67
+ | `.codex/config.toml` / `.codex/hooks.json` / `AGENTS.md` | Codex App 配置 |
68
+ | `.trae/mcp.json` / `.trae/rules/project_rules.md` | Trae IDE 配置 |
123
69
 
124
- # 查看版本
125
- soloforge version
126
- ```
70
+ SoloForge 不会覆盖已有知识文件。重新运行 `soloforge init` 可刷新适配器配置。
127
71
 
128
- ### 日常命令
72
+ ## 日常命令
129
73
 
130
74
  ```bash
131
- # 以下命令均在项目根目录执行
132
- soloforge validate # 验证配置和知识文件
133
- soloforge status # 查看当前项目状态
75
+ soloforge validate # 检查项目配置和知识文件
76
+ soloforge status # 查看当前项目状态和配置来源
77
+ soloforge version # 查看版本
134
78
  ```
135
79
 
136
- ## 工作原理
137
-
138
- SoloForge 以 MCP Server(stdio 传输)运行。AI 助手在开发过程中调用 SoloForge 工具:
80
+ 更新 SoloForge 后,建议重新生成适配器配置:
139
81
 
82
+ ```bash
83
+ npm update -g soloforge
84
+ cd /path/to/my-project
85
+ soloforge init
140
86
  ```
141
- 开发者 → AI 助手 (Claude Code / Trae / Codex) → SoloForge MCP Server
142
- ← 知识、规则、模板
143
- ```
144
-
145
- SoloForge 引擎不直接调用 LLM API,由宿主 AI 中转。所有智能来自宿主 AI,SoloForge 提供结构、规则和知识。
146
-
147
- ## MCP 工具
148
-
149
- ### 核心管线(Phase 1)
150
-
151
- | 工具 | 说明 |
152
- |------|------|
153
- | `sf_classify` | 分类任务意图、风险、复杂度;确定执行模式 |
154
- | `sf_expand` | 意图膨胀 + 知识匹配 + 作用域控制 + 验收标准 |
155
- | `sf_verify` | 生成构建/测试验证命令,收集证据 |
156
- | `sf_learn` | 从已完成任务提取模式,更新知识库 |
157
- | `sf_status` | 查询任务状态,恢复中断的工作流 |
158
-
159
- ### 质量与规划(Phase 2)
160
-
161
- | 工具 | 说明 |
162
- |------|------|
163
- | `sf_plan` | 复杂意图拆解为子任务,分析依赖关系 |
164
- | `sf_plan_advance` | 高级任务规划:知识驱动的多步骤规划 |
165
- | `sf_analyze` | 影响范围分析,与声明范围对比 |
166
- | `sf_scaffold` | 脚手架生成(Controller/Service/DTO 等) |
167
- | `sf_review` | 五维代码审查(质量/安全/性能/技术债务/架构) |
168
-
169
- ### 团队协作(Phase 3)
170
-
171
- | 工具 | 说明 |
172
- |------|------|
173
- | `sf_deliver` | 提交代码、生成变更日志;推送和 PR 取决于交付配置 ⚠️ |
174
- | `sf_coord_check` | 预测性冲突检测,跨仓库关联提示 |
175
- | `sf_team_status` | 活动流、工作负载可视化、过期分支告警 |
176
- | `sf_contract_check` | 检测接口契约的破坏性变更 |
177
- | `sf_onboard` | 引导式入职:项目概览 → 代码导览 → 首任务 |
178
-
179
- > **⚠️ `sf_deliver` 风险说明**: 默认行为是 `auto_commit=true, auto_push=false, auto_pr=false` — 即只执行 `git commit`,不推送、不创建 PR。推送和 PR 由交付配置(`delivery` 域知识中的 `auto_push` / `auto_pr`)或调用参数 `skip_push` / `skip_pr` 控制。SoloForge 不会自动调用此工具,必须由开发者或 AI 助手显式触发。建议首次使用前先执行 `sf_review` 确认变更内容,或在交付配置中保持 `auto_push: false` 以手动控制推送时机。
180
-
181
- ### 知识维护
182
87
 
183
- | 工具 | 说明 |
184
- |------|------|
185
- | `sf_knowledge_add` | 新增知识条目,返回行业探索指引 |
186
- | `sf_knowledge_update` | 更新知识条目内容 |
187
- | `sf_knowledge_audit` | 审计知识格式、完整性和质量 |
188
-
189
- ### 高级能力(Phase 4)
88
+ ## 使用时你会看到什么
190
89
 
191
- | 工具 | 说明 |
192
- |------|------|
193
- | `sf_feasibility_check` | 三档可行性分析(可行/风险/不可行) |
194
- | `sf_debug` | 智能排障:解析 → 追踪 → 根因 → 修复方案 |
195
- | `sf_observability` | 系统指标、告警检测、周期报告 |
90
+ 接入成功后,AI 助手会在合适的时候调用 SoloForge 来理解任务、生成执行上下文、给出验证建议和记录任务状态。对你来说,主要变化是:
196
91
 
197
- ### 深度能力(Phase 5)
92
+ - 写代码类任务会更明确 scope、验收项和验证命令。
93
+ - 生成文档、提取说明、分析日志等产物型任务会默认输出到 `.soloforge/output/`,不会默认修改 `src/`。
94
+ - 遇到缺少路径、源码包、日志等必需输入时,会先澄清,而不是猜着执行。
95
+ - 敏感信息、危险命令和高风险交付动作会更保守,需要你确认。
198
96
 
199
- | 工具 | 说明 |
200
- |------|------|
201
- | `sf_migration_check` | 分析数据库迁移文件安全性,检测破坏性操作 |
202
- | `sf_test_guide` | 根据变更文件生成测试类型、场景和 Mock 指引 |
203
- | `sf_test_quality` | 五维评估测试文件质量(断言/边界/命名/重复/覆盖) |
204
- | `sf_dependency_scan` | 扫描依赖漏洞,支持 npm/maven/gradle |
205
- | `sf_debt_report` | 技术债务聚合报告:分类、趋势、优先级 |
97
+ ## 产物输出
206
98
 
207
- ### 治理闭环
99
+ 文档、分析报告、源码包提取结果等非代码产物默认写入:
208
100
 
209
- | 工具 | 说明 |
210
- |------|------|
211
- | `sf_audit_sample` | 按风险加权抽样,critical 100% 抽中 |
212
- | `sf_escape_report` | 记录逃逸/误伤/工具故障 |
213
- | `sf_governance_report` | 汇总治理健康报告 |
214
- | `sf_capability_update` | 人工确认后更新能力状态 |
101
+ ```text
102
+ .soloforge/output/
103
+ ```
215
104
 
216
- ## 知识体系
105
+ 例如让 AI “从 `/tmp/prototype.zip` 抓取原型说明”,SoloForge 会把它作为只读外部材料处理,要求产物写入 `.soloforge/output/**`,而不是修改项目源码。
217
106
 
218
- SoloForge 内置知识模板(含全局模式),覆盖 6 种类型:
107
+ ## Cursor 说明
219
108
 
220
- | 类型 | 用途 |
221
- |------|------|
222
- | `pattern` | 决策规则 + 验收标准 |
223
- | `procedure` | 操作流程 + 检查点 |
224
- | `domain` | 业务规则、约束条件、例外情况 |
225
- | `acceptance_template` | 质量门禁 + 自动化检查命令 |
226
- | `review_rule` | 正则驱动的代码审查规则 |
227
- | `pipeline_procedure` | CI/CD 流水线阶段定义 |
228
-
229
- 知识文件采用 Markdown + YAML frontmatter 格式:
230
-
231
- ```markdown
232
- ---
233
- name: crud-operation
234
- type: pattern
235
- when: "CRUD, 增删改查, 新增, 删除, 修改"
236
- scope: [backend]
237
- products: ["*"]
238
- ---
239
-
240
- ## 决策规则
241
- - API 层使用 DTO,持久层使用 Entity
242
- - 业务实体使用软删除,日志使用硬删除
243
- ...
244
-
245
- ## 验收项
246
- - [AC-01] 所有 CRUD 端点返回正确的 HTTP 状态码
247
- ...
248
- ```
109
+ Cursor 暂无内置适配器。可以先生成 `.mcp.json`,再手动复制到 `.cursor/mcp.json`:
249
110
 
250
- ## 项目配置
251
-
252
- SoloForge 从 `.soloforge/config.yaml` 读取项目配置:
253
-
254
- ```yaml
255
- name: my-project
256
- tech_stack:
257
- backend:
258
- lang: java
259
- framework: spring-boot
260
- version: "3.0"
261
- frontend:
262
- lang: typescript
263
- framework: react
264
- version: "18"
265
- product_profile: default
266
- repos:
267
- - name: backend
268
- path: .
269
- lang: java
270
- framework: spring-boot
271
- scope: ["src/main/java"]
272
- build_commands:
273
- backend:
274
- build: mvn compile -q
275
- test: mvn test -q
276
- full: mvn verify -q
277
- frontend:
278
- build: npm run build
279
- test: npm test
280
- full: npm run build && npm test
281
- scope:
282
- backend: ["src/main/java"]
283
- frontend: ["src/main/react"]
111
+ ```bash
112
+ soloforge init
284
113
  ```
285
114
 
286
- ## 架构
287
-
288
- ```
289
- 知识层 机制层 适配层
290
- +------------------+ +---------------------+ +------------------+
291
- | 知识模板 | | 分类器 | | Claude Code |
292
- | 6 种知识类型 | | 意图膨胀器 | | Trae IDE |
293
- | 产品 Profile | | 验证器 | | Codex App |
294
- | | | 代码审查器 | | CLI |
295
- | 项目专属知识 | | 任务规划器 | | |
296
- | | | 脚手架生成器 | | |
297
- | | | 自动交付 | | |
298
- | | | 契约治理内核 | | |
299
- +------------------+ +---------------------+ +------------------+
115
+ 示例:
116
+
117
+ ```json
118
+ {
119
+ "mcpServers": {
120
+ "soloforge": {
121
+ "command": "soloforge",
122
+ "args": ["mcp"],
123
+ "env": { "SOLOFORGE_PROJECT": "/absolute/path/to/my-project" }
124
+ }
125
+ }
126
+ }
300
127
  ```
301
128
 
302
- ## 契约治理内核
303
-
304
- SoloForge 的治理能力按四级状态管理,新增治理能力不伪装 hard block:
305
-
306
- | 状态 | 含义 |
307
- |------|------|
308
- | `enforced` | 强制执行,阻断不合规操作 |
309
- | `advisory` | 建议性告警,由开发者决策 |
310
- | `experimental` | 实验性,需晋级计划才能升级 |
311
- | `removed` | 已移除,不再生效 |
312
-
313
- 治理闭环:任务完成入池 → 按风险加权抽样 → 逃逸记录 → 治理报告 → 人工确认后状态更新。所有状态变更必须经 `sf_capability_update` + 人工确认,不自动执行。
314
-
315
- ## 常见问题 / 排错
316
-
317
- ### `soloforge init` 报 "配置校验失败"
318
-
319
- `--auto` 模式依赖指纹检测(pom.xml / package.json 等)。如果项目结构非标准,用 `--interactive` 手动配置。
129
+ 保存后重载 Cursor 窗口。
320
130
 
321
- ### `soloforge validate` 报知识文件错误
131
+ ## 常见问题
322
132
 
323
- 知识模板随 SoloForge 版本更新。重新运行 `soloforge init` 不会覆盖已有知识,但可手动删除 `.soloforge/knowledge/` 后重新初始化。
133
+ ### `soloforge init --auto` 没有生成 config.yaml
324
134
 
325
- ### AI 助手没有调用 SoloForge 工具
135
+ 这是正常行为。SoloForge 只有在项目指纹足够明确时才会自动写配置。你可以继续使用运行时推断,也可以执行 `soloforge init --interactive` 手动确认。
326
136
 
327
- 确认适配器配置已生成:
328
- - Claude Code: 检查 `.mcp.json` 是否存在且路径正确
329
- - Trae IDE: 检查 `.trae/mcp.json` 是否存在,并确认 Trae 已开启项目级 MCP(beta flag)
330
- - Codex App: 检查 `.codex/config.toml` 是否存在
137
+ ### AI 工具没有调用 SoloForge
331
138
 
332
- ### `sf_deliver` 执行后想撤回
139
+ 先检查对应配置文件是否生成,然后重启或重载 AI 工具:
333
140
 
334
- 默认只执行 `git commit`(不推送)。如果交付配置启用了 `auto_push`:
335
- - 未推送时:`git reset HEAD~1` 撤销最近一次提交
336
- - 已推送时:`git revert <hash>` 创建反向提交
337
- - PR:在 Git 平台关闭
141
+ - Claude Code: `.mcp.json`、`.claude/settings.json`、`CLAUDE.md`
142
+ - Codex App: `.codex/config.toml`、`.codex/hooks.json`、`AGENTS.md`
143
+ - Trae IDE: `.trae/mcp.json`、`.trae/rules/project_rules.md`
338
144
 
339
- ### 指定项目路径 vs 当前目录
145
+ ### 想重新生成配置
340
146
 
341
147
  ```bash
342
- # 方式 1: cd 到项目目录
343
- cd /path/to/my-project
344
148
  soloforge init
345
-
346
- # 方式 2: --project-path(适用于脚本或非交互场景)
347
- soloforge init --project-path /path/to/my-project
348
149
  ```
349
150
 
350
- ## 卸载 / 清理
151
+ 该命令会刷新适配器配置,不会覆盖已有 `.soloforge/config.yaml` 和知识文件。
351
152
 
352
- ### 全局卸载
153
+ ### 想清理项目中的 SoloForge 文件
154
+
155
+ 全局卸载只会移除命令:
353
156
 
354
157
  ```bash
355
- npm uninstall -g soloforge # 任意目录均可
158
+ npm uninstall -g soloforge
356
159
  ```
357
160
 
358
- `npm uninstall -g` 只移除 `soloforge` 命令本身,不会删除任何项目中的 `.soloforge/`、适配器配置或规则文件。
359
-
360
- ### 项目内清理
161
+ 项目内文件需要手动删除:
361
162
 
362
- 卸载后,以下文件/目录保留在项目中,按需手动删除:
363
-
364
- | 文件 / 目录 | 适配器 | 备注 |
365
- |------------|--------|------|
366
- | `.soloforge/` | 共通 | 项目配置、知识模板、状态 |
367
- | `.mcp.json` | Claude Code | MCP Server 配置 |
368
- | `.claude/settings.json` | Claude Code | Hooks 配置 |
369
- | `CLAUDE.md` | Claude Code | **可能有用户手写内容,删除前确认** |
370
- | `.trae/` | Trae IDE | MCP 配置 + 规则文件 |
371
- | `.codex/` | Codex App | MCP 配置 + Hooks |
372
- | `AGENTS.md` | Codex App | **可能有用户手写内容,删除前确认** |
163
+ ```text
164
+ .soloforge/
165
+ .mcp.json
166
+ .claude/
167
+ CLAUDE.md
168
+ .codex/
169
+ AGENTS.md
170
+ .trae/
171
+ ```
373
172
 
374
- `.gitignore` 中由 SoloForge 自动追加的 `.mcp.json` 和 `.soloforge/` 条目也需手动移除。
173
+ 删除 `CLAUDE.md` `AGENTS.md` 前请确认没有手写内容。
375
174
 
376
175
  ## 本仓库开发
377
176
 
378
- 以下命令在 SoloForge 源码仓库根目录执行:
379
-
380
177
  ```bash
381
- # 安装依赖
382
178
  npm install
383
-
384
- # 构建
385
179
  npm run build
386
-
387
- # 运行测试
388
180
  npm test
389
-
390
- # 类型检查
391
- npm run lint
392
-
393
- # 监听模式
394
- npm run dev
395
181
  ```
396
182
 
397
- ## 技术栈
183
+ ## 技术要求
398
184
 
399
- - TypeScript (ESM)
400
185
  - Node.js >= 18
401
- - MCP SDK (`@modelcontextprotocol/sdk`)
402
- - Handlebars(模板引擎)
403
- - Vitest(测试框架)
186
+ - TypeScript / ESM
187
+ - 支持的 AI 编程工具(Claude Code / Codex App / Trae IDE)
404
188
 
405
189
  ## 许可证
406
190
 
@@ -1,2 +1,7 @@
1
+ /**
2
+ * 生成 CLAUDE.md 项目指令文件内容。
3
+ * @param config - 项目配置
4
+ * @returns CLAUDE.md 文件的文本内容
5
+ */
1
6
  export declare function generateClaudeMd(config: import("../../types.js").ProjectConfig): string;
2
7
  //# sourceMappingURL=claude_md.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude_md.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,aAAa,GAAG,MAAM,CAEvF"}
1
+ {"version":3,"file":"claude_md.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,aAAa,GAAG,MAAM,CAGvF"}
@@ -1,5 +1,11 @@
1
1
  import { generateWorkflowRules } from "../shared/workflow_template.js";
2
+ /**
3
+ * 生成 CLAUDE.md 项目指令文件内容。
4
+ * @param config - 项目配置
5
+ * @returns CLAUDE.md 文件的文本内容
6
+ */
2
7
  export function generateClaudeMd(config) {
8
+ console.error("[soloForge] ClaudeMD生成: 开始生成 CLAUDE.md");
3
9
  return generateWorkflowRules(config) + "\n";
4
10
  }
5
11
  //# sourceMappingURL=claude_md.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude_md.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,UAAU,gBAAgB,CAAC,MAA8C;IAC7E,OAAO,qBAAqB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"claude_md.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA8C;IAC7E,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,qBAAqB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC"}
@@ -1,3 +1,7 @@
1
1
  export { generateClaudeMd } from "./claude_md.js";
2
+ /**
3
+ * 生成 Claude Code hooks 配置对象。
4
+ * @returns hooks 配置对象,包含 PreToolUse 和 PostToolUse 钩子
5
+ */
2
6
  export declare function generateHooksConfig(): object;
3
7
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,mBAAmB,IAAI,MAAM,CA2B5C"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CA4B5C"}
@@ -1,5 +1,10 @@
1
1
  export { generateClaudeMd } from "./claude_md.js";
2
+ /**
3
+ * 生成 Claude Code hooks 配置对象。
4
+ * @returns hooks 配置对象,包含 PreToolUse 和 PostToolUse 钩子
5
+ */
2
6
  export function generateHooksConfig() {
7
+ console.error("[soloForge] Hooks配置: 生成 hooks 配置");
3
8
  return {
4
9
  hooks: {
5
10
  PreToolUse: [
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;yBACjC;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX;oBACE,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,qBAAqB;yBAC/B;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAClD,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,uBAAuB;yBACjC;qBACF;iBACF;aACF;YACD,WAAW,EAAE;gBACX;oBACE,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,qBAAqB;yBAC/B;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDjE"}
@@ -8,6 +8,7 @@ import { registerTools } from "./tools.js";
8
8
  * @param deps - 服务器依赖项(配置、知识索引、任务上下文)
9
9
  */
10
10
  export async function startServer(deps) {
11
+ console.error("[soloForge] server: startServer() 开始执行");
11
12
  const { config, knowledgeIndex, taskContext } = deps;
12
13
  const server = new McpServer({
13
14
  name: "soloforge",
@@ -28,7 +29,7 @@ export async function startServer(deps) {
28
29
  await transport.close?.();
29
30
  }
30
31
  catch (e) {
31
- console.debug("[soloforge]", e);
32
+ console.debug("[soloForge]", e);
32
33
  }
33
34
  process.exit(0);
34
35
  };
@@ -38,30 +39,17 @@ export async function startServer(deps) {
38
39
  process.on("SIGPIPE", () => {
39
40
  shutdown();
40
41
  });
41
- // 捕获未处理的同步异常,确保资源释放后退出
42
- process.on("uncaughtException", async (err) => {
42
+ // 捕获未处理的同步异常,同步清理后退出(避免异步清理未完成就 exit)
43
+ process.on("uncaughtException", (err) => {
43
44
  console.error("SoloForge 未捕获异常:", err);
44
- try {
45
- if (knowledgeIndex)
46
- await knowledgeIndex.close();
47
- await transport.close?.();
48
- }
49
- catch (e) {
50
- console.debug("[soloforge]", e);
51
- }
45
+ // 同步清理:不等待 async 操作,直接退出
46
+ process.exitCode = 1;
52
47
  process.exit(1);
53
48
  });
54
- // 捕获未处理的 Promise 拒绝,确保资源释放后退出
55
- process.on("unhandledRejection", async (reason) => {
49
+ // 捕获未处理的 Promise 拒绝,同步清理后退出
50
+ process.on("unhandledRejection", (reason) => {
56
51
  console.error("SoloForge 未处理的 Promise 拒绝:", reason);
57
- try {
58
- if (knowledgeIndex)
59
- await knowledgeIndex.close();
60
- await transport.close?.();
61
- }
62
- catch (e) {
63
- console.debug("[soloforge]", e);
64
- }
52
+ process.exitCode = 1;
65
53
  process.exit(1);
66
54
  });
67
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsB3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAChD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5C,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsB3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAC9C,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACvC,yBAAyB;QACzB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}