@winspan/claude-forge 0.1.1

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 (487) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +505 -0
  3. package/dist/autopilot/index.d.ts +4 -0
  4. package/dist/autopilot/index.d.ts.map +1 -0
  5. package/dist/autopilot/index.js +4 -0
  6. package/dist/autopilot/index.js.map +1 -0
  7. package/dist/autopilot/intent-engine.d.ts +60 -0
  8. package/dist/autopilot/intent-engine.d.ts.map +1 -0
  9. package/dist/autopilot/intent-engine.js +308 -0
  10. package/dist/autopilot/intent-engine.js.map +1 -0
  11. package/dist/autopilot/knowledge-engine.d.ts +67 -0
  12. package/dist/autopilot/knowledge-engine.d.ts.map +1 -0
  13. package/dist/autopilot/knowledge-engine.js +262 -0
  14. package/dist/autopilot/knowledge-engine.js.map +1 -0
  15. package/dist/autopilot/quality-gate.d.ts +69 -0
  16. package/dist/autopilot/quality-gate.d.ts.map +1 -0
  17. package/dist/autopilot/quality-gate.js +244 -0
  18. package/dist/autopilot/quality-gate.js.map +1 -0
  19. package/dist/autopilot/team-orchestrator.d.ts +16 -0
  20. package/dist/autopilot/team-orchestrator.d.ts.map +1 -0
  21. package/dist/autopilot/team-orchestrator.js +56 -0
  22. package/dist/autopilot/team-orchestrator.js.map +1 -0
  23. package/dist/backup/index.d.ts +16 -0
  24. package/dist/backup/index.d.ts.map +1 -0
  25. package/dist/backup/index.js +169 -0
  26. package/dist/backup/index.js.map +1 -0
  27. package/dist/claudemd/detector.d.ts +54 -0
  28. package/dist/claudemd/detector.d.ts.map +1 -0
  29. package/dist/claudemd/detector.js +510 -0
  30. package/dist/claudemd/detector.js.map +1 -0
  31. package/dist/claudemd/index.d.ts +44 -0
  32. package/dist/claudemd/index.d.ts.map +1 -0
  33. package/dist/claudemd/index.js +193 -0
  34. package/dist/claudemd/index.js.map +1 -0
  35. package/dist/claudemd/modules-config.d.ts +37 -0
  36. package/dist/claudemd/modules-config.d.ts.map +1 -0
  37. package/dist/claudemd/modules-config.js +80 -0
  38. package/dist/claudemd/modules-config.js.map +1 -0
  39. package/dist/claudemd/prompt-injector.d.ts +29 -0
  40. package/dist/claudemd/prompt-injector.d.ts.map +1 -0
  41. package/dist/claudemd/prompt-injector.js +144 -0
  42. package/dist/claudemd/prompt-injector.js.map +1 -0
  43. package/dist/claudemd/prompts.d.ts +16 -0
  44. package/dist/claudemd/prompts.d.ts.map +1 -0
  45. package/dist/claudemd/prompts.js +439 -0
  46. package/dist/claudemd/prompts.js.map +1 -0
  47. package/dist/claudemd/writer.d.ts +27 -0
  48. package/dist/claudemd/writer.d.ts.map +1 -0
  49. package/dist/claudemd/writer.js +91 -0
  50. package/dist/claudemd/writer.js.map +1 -0
  51. package/dist/cli/commands/backup.d.ts +3 -0
  52. package/dist/cli/commands/backup.d.ts.map +1 -0
  53. package/dist/cli/commands/backup.js +63 -0
  54. package/dist/cli/commands/backup.js.map +1 -0
  55. package/dist/cli/commands/claudemd.d.ts +3 -0
  56. package/dist/cli/commands/claudemd.d.ts.map +1 -0
  57. package/dist/cli/commands/claudemd.js +322 -0
  58. package/dist/cli/commands/claudemd.js.map +1 -0
  59. package/dist/cli/commands/config.d.ts +3 -0
  60. package/dist/cli/commands/config.d.ts.map +1 -0
  61. package/dist/cli/commands/config.js +67 -0
  62. package/dist/cli/commands/config.js.map +1 -0
  63. package/dist/cli/commands/console.d.ts +3 -0
  64. package/dist/cli/commands/console.d.ts.map +1 -0
  65. package/dist/cli/commands/console.js +11 -0
  66. package/dist/cli/commands/console.js.map +1 -0
  67. package/dist/cli/commands/convention.d.ts +3 -0
  68. package/dist/cli/commands/convention.d.ts.map +1 -0
  69. package/dist/cli/commands/convention.js +269 -0
  70. package/dist/cli/commands/convention.js.map +1 -0
  71. package/dist/cli/commands/daemon.d.ts +3 -0
  72. package/dist/cli/commands/daemon.d.ts.map +1 -0
  73. package/dist/cli/commands/daemon.js +191 -0
  74. package/dist/cli/commands/daemon.js.map +1 -0
  75. package/dist/cli/commands/distill.d.ts +3 -0
  76. package/dist/cli/commands/distill.d.ts.map +1 -0
  77. package/dist/cli/commands/distill.js +61 -0
  78. package/dist/cli/commands/distill.js.map +1 -0
  79. package/dist/cli/commands/init.d.ts +3 -0
  80. package/dist/cli/commands/init.d.ts.map +1 -0
  81. package/dist/cli/commands/init.js +306 -0
  82. package/dist/cli/commands/init.js.map +1 -0
  83. package/dist/cli/commands/logs.d.ts +3 -0
  84. package/dist/cli/commands/logs.d.ts.map +1 -0
  85. package/dist/cli/commands/logs.js +311 -0
  86. package/dist/cli/commands/logs.js.map +1 -0
  87. package/dist/cli/commands/pattern.d.ts +3 -0
  88. package/dist/cli/commands/pattern.d.ts.map +1 -0
  89. package/dist/cli/commands/pattern.js +118 -0
  90. package/dist/cli/commands/pattern.js.map +1 -0
  91. package/dist/cli/commands/pipeline.d.ts +3 -0
  92. package/dist/cli/commands/pipeline.d.ts.map +1 -0
  93. package/dist/cli/commands/pipeline.js +75 -0
  94. package/dist/cli/commands/pipeline.js.map +1 -0
  95. package/dist/cli/commands/profile.d.ts +3 -0
  96. package/dist/cli/commands/profile.d.ts.map +1 -0
  97. package/dist/cli/commands/profile.js +213 -0
  98. package/dist/cli/commands/profile.js.map +1 -0
  99. package/dist/cli/commands/query.d.ts +3 -0
  100. package/dist/cli/commands/query.d.ts.map +1 -0
  101. package/dist/cli/commands/query.js +115 -0
  102. package/dist/cli/commands/query.js.map +1 -0
  103. package/dist/cli/commands/skill.d.ts +3 -0
  104. package/dist/cli/commands/skill.d.ts.map +1 -0
  105. package/dist/cli/commands/skill.js +466 -0
  106. package/dist/cli/commands/skill.js.map +1 -0
  107. package/dist/cli/index.d.ts +3 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +49 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/interceptor.d.ts +5 -0
  112. package/dist/cli/interceptor.d.ts.map +1 -0
  113. package/dist/cli/interceptor.js +55 -0
  114. package/dist/cli/interceptor.js.map +1 -0
  115. package/dist/cli/tui.d.ts +2 -0
  116. package/dist/cli/tui.d.ts.map +1 -0
  117. package/dist/cli/tui.js +360 -0
  118. package/dist/cli/tui.js.map +1 -0
  119. package/dist/cli/utils/errors.d.ts +17 -0
  120. package/dist/cli/utils/errors.d.ts.map +1 -0
  121. package/dist/cli/utils/errors.js +42 -0
  122. package/dist/cli/utils/errors.js.map +1 -0
  123. package/dist/cli/utils/output.d.ts +23 -0
  124. package/dist/cli/utils/output.d.ts.map +1 -0
  125. package/dist/cli/utils/output.js +69 -0
  126. package/dist/cli/utils/output.js.map +1 -0
  127. package/dist/config/defaults.d.ts +3 -0
  128. package/dist/config/defaults.d.ts.map +1 -0
  129. package/dist/config/defaults.js +50 -0
  130. package/dist/config/defaults.js.map +1 -0
  131. package/dist/config/index.d.ts +26 -0
  132. package/dist/config/index.d.ts.map +1 -0
  133. package/dist/config/index.js +161 -0
  134. package/dist/config/index.js.map +1 -0
  135. package/dist/config/schema.d.ts +59 -0
  136. package/dist/config/schema.d.ts.map +1 -0
  137. package/dist/config/schema.js +86 -0
  138. package/dist/config/schema.js.map +1 -0
  139. package/dist/convention/convention-distiller.d.ts +28 -0
  140. package/dist/convention/convention-distiller.d.ts.map +1 -0
  141. package/dist/convention/convention-distiller.js +172 -0
  142. package/dist/convention/convention-distiller.js.map +1 -0
  143. package/dist/convention/convention-evolver.d.ts +31 -0
  144. package/dist/convention/convention-evolver.d.ts.map +1 -0
  145. package/dist/convention/convention-evolver.js +175 -0
  146. package/dist/convention/convention-evolver.js.map +1 -0
  147. package/dist/convention/convention-loader.d.ts +22 -0
  148. package/dist/convention/convention-loader.d.ts.map +1 -0
  149. package/dist/convention/convention-loader.js +139 -0
  150. package/dist/convention/convention-loader.js.map +1 -0
  151. package/dist/convention/convention-manager.d.ts +46 -0
  152. package/dist/convention/convention-manager.d.ts.map +1 -0
  153. package/dist/convention/convention-manager.js +193 -0
  154. package/dist/convention/convention-manager.js.map +1 -0
  155. package/dist/convention/index.d.ts +6 -0
  156. package/dist/convention/index.d.ts.map +1 -0
  157. package/dist/convention/index.js +5 -0
  158. package/dist/convention/index.js.map +1 -0
  159. package/dist/convention/types.d.ts +90 -0
  160. package/dist/convention/types.d.ts.map +1 -0
  161. package/dist/convention/types.js +13 -0
  162. package/dist/convention/types.js.map +1 -0
  163. package/dist/daemon/engine-registry/init-autopilot.d.ts +12 -0
  164. package/dist/daemon/engine-registry/init-autopilot.d.ts.map +1 -0
  165. package/dist/daemon/engine-registry/init-autopilot.js +20 -0
  166. package/dist/daemon/engine-registry/init-autopilot.js.map +1 -0
  167. package/dist/daemon/engine-registry/init-distill.d.ts +6 -0
  168. package/dist/daemon/engine-registry/init-distill.d.ts.map +1 -0
  169. package/dist/daemon/engine-registry/init-distill.js +25 -0
  170. package/dist/daemon/engine-registry/init-distill.js.map +1 -0
  171. package/dist/daemon/engine-registry/init-orchestration.d.ts +5 -0
  172. package/dist/daemon/engine-registry/init-orchestration.d.ts.map +1 -0
  173. package/dist/daemon/engine-registry/init-orchestration.js +11 -0
  174. package/dist/daemon/engine-registry/init-orchestration.js.map +1 -0
  175. package/dist/daemon/engine-registry/init-pattern-engine.d.ts +9 -0
  176. package/dist/daemon/engine-registry/init-pattern-engine.d.ts.map +1 -0
  177. package/dist/daemon/engine-registry/init-pattern-engine.js +22 -0
  178. package/dist/daemon/engine-registry/init-pattern-engine.js.map +1 -0
  179. package/dist/daemon/engine-registry/init-pipeline.d.ts +5 -0
  180. package/dist/daemon/engine-registry/init-pipeline.d.ts.map +1 -0
  181. package/dist/daemon/engine-registry/init-pipeline.js +12 -0
  182. package/dist/daemon/engine-registry/init-pipeline.js.map +1 -0
  183. package/dist/daemon/engine-registry/init-profile.d.ts +3 -0
  184. package/dist/daemon/engine-registry/init-profile.d.ts.map +1 -0
  185. package/dist/daemon/engine-registry/init-profile.js +28 -0
  186. package/dist/daemon/engine-registry/init-profile.js.map +1 -0
  187. package/dist/daemon/engine-registry/init-resume.d.ts +6 -0
  188. package/dist/daemon/engine-registry/init-resume.d.ts.map +1 -0
  189. package/dist/daemon/engine-registry/init-resume.js +16 -0
  190. package/dist/daemon/engine-registry/init-resume.js.map +1 -0
  191. package/dist/daemon/engine-registry/init-skill-registry.d.ts +10 -0
  192. package/dist/daemon/engine-registry/init-skill-registry.d.ts.map +1 -0
  193. package/dist/daemon/engine-registry/init-skill-registry.js +46 -0
  194. package/dist/daemon/engine-registry/init-skill-registry.js.map +1 -0
  195. package/dist/daemon/engine-registry.d.ts +13 -0
  196. package/dist/daemon/engine-registry.d.ts.map +1 -0
  197. package/dist/daemon/engine-registry.js +45 -0
  198. package/dist/daemon/engine-registry.js.map +1 -0
  199. package/dist/daemon/event-parser.d.ts +5 -0
  200. package/dist/daemon/event-parser.d.ts.map +1 -0
  201. package/dist/daemon/event-parser.js +29 -0
  202. package/dist/daemon/event-parser.js.map +1 -0
  203. package/dist/daemon/handler-context.d.ts +37 -0
  204. package/dist/daemon/handler-context.d.ts.map +1 -0
  205. package/dist/daemon/handler-context.js +2 -0
  206. package/dist/daemon/handler-context.js.map +1 -0
  207. package/dist/daemon/handlers/base-handler.d.ts +14 -0
  208. package/dist/daemon/handlers/base-handler.d.ts.map +1 -0
  209. package/dist/daemon/handlers/base-handler.js +18 -0
  210. package/dist/daemon/handlers/base-handler.js.map +1 -0
  211. package/dist/daemon/handlers/conversational-config-handler.d.ts +24 -0
  212. package/dist/daemon/handlers/conversational-config-handler.d.ts.map +1 -0
  213. package/dist/daemon/handlers/conversational-config-handler.js +175 -0
  214. package/dist/daemon/handlers/conversational-config-handler.js.map +1 -0
  215. package/dist/daemon/handlers/post-tool-use-handler.d.ts +9 -0
  216. package/dist/daemon/handlers/post-tool-use-handler.d.ts.map +1 -0
  217. package/dist/daemon/handlers/post-tool-use-handler.js +82 -0
  218. package/dist/daemon/handlers/post-tool-use-handler.js.map +1 -0
  219. package/dist/daemon/handlers/pre-tool-use-handler.d.ts +11 -0
  220. package/dist/daemon/handlers/pre-tool-use-handler.d.ts.map +1 -0
  221. package/dist/daemon/handlers/pre-tool-use-handler.js +58 -0
  222. package/dist/daemon/handlers/pre-tool-use-handler.js.map +1 -0
  223. package/dist/daemon/handlers/stop-handler.d.ts +11 -0
  224. package/dist/daemon/handlers/stop-handler.d.ts.map +1 -0
  225. package/dist/daemon/handlers/stop-handler.js +112 -0
  226. package/dist/daemon/handlers/stop-handler.js.map +1 -0
  227. package/dist/daemon/handlers/user-prompt-handler.d.ts +72 -0
  228. package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -0
  229. package/dist/daemon/handlers/user-prompt-handler.js +374 -0
  230. package/dist/daemon/handlers/user-prompt-handler.js.map +1 -0
  231. package/dist/daemon/index.d.ts +2 -0
  232. package/dist/daemon/index.d.ts.map +1 -0
  233. package/dist/daemon/index.js +284 -0
  234. package/dist/daemon/index.js.map +1 -0
  235. package/dist/daemon/lifecycle.d.ts +9 -0
  236. package/dist/daemon/lifecycle.d.ts.map +1 -0
  237. package/dist/daemon/lifecycle.js +56 -0
  238. package/dist/daemon/lifecycle.js.map +1 -0
  239. package/dist/daemon/server.d.ts +22 -0
  240. package/dist/daemon/server.d.ts.map +1 -0
  241. package/dist/daemon/server.js +139 -0
  242. package/dist/daemon/server.js.map +1 -0
  243. package/dist/distill/index.d.ts +16 -0
  244. package/dist/distill/index.d.ts.map +1 -0
  245. package/dist/distill/index.js +104 -0
  246. package/dist/distill/index.js.map +1 -0
  247. package/dist/distill/prompts.d.ts +6 -0
  248. package/dist/distill/prompts.d.ts.map +1 -0
  249. package/dist/distill/prompts.js +77 -0
  250. package/dist/distill/prompts.js.map +1 -0
  251. package/dist/distill/trigger.d.ts +40 -0
  252. package/dist/distill/trigger.d.ts.map +1 -0
  253. package/dist/distill/trigger.js +127 -0
  254. package/dist/distill/trigger.js.map +1 -0
  255. package/dist/distill/writer.d.ts +15 -0
  256. package/dist/distill/writer.d.ts.map +1 -0
  257. package/dist/distill/writer.js +73 -0
  258. package/dist/distill/writer.js.map +1 -0
  259. package/dist/doc-sync/index.d.ts +21 -0
  260. package/dist/doc-sync/index.d.ts.map +1 -0
  261. package/dist/doc-sync/index.js +190 -0
  262. package/dist/doc-sync/index.js.map +1 -0
  263. package/dist/hooks/check-context-limit.sh +97 -0
  264. package/dist/hooks/hooks/check-context-limit.sh +97 -0
  265. package/dist/hooks/hooks/notification.sh +33 -0
  266. package/dist/hooks/hooks/post-tool-use.sh +49 -0
  267. package/dist/hooks/hooks/pre-tool-use.sh +55 -0
  268. package/dist/hooks/hooks/stop.sh +29 -0
  269. package/dist/hooks/hooks/user-prompt-submit.sh +72 -0
  270. package/dist/hooks/notification.sh +33 -0
  271. package/dist/hooks/post-tool-use.sh +49 -0
  272. package/dist/hooks/pre-tool-use.sh +55 -0
  273. package/dist/hooks/stop.sh +29 -0
  274. package/dist/hooks/user-prompt-submit.sh +72 -0
  275. package/dist/orchestration/index.d.ts +32 -0
  276. package/dist/orchestration/index.d.ts.map +1 -0
  277. package/dist/orchestration/index.js +72 -0
  278. package/dist/orchestration/index.js.map +1 -0
  279. package/dist/orchestration/notifier.d.ts +11 -0
  280. package/dist/orchestration/notifier.d.ts.map +1 -0
  281. package/dist/orchestration/notifier.js +22 -0
  282. package/dist/orchestration/notifier.js.map +1 -0
  283. package/dist/orchestration/policy-engine.d.ts +21 -0
  284. package/dist/orchestration/policy-engine.d.ts.map +1 -0
  285. package/dist/orchestration/policy-engine.js +77 -0
  286. package/dist/orchestration/policy-engine.js.map +1 -0
  287. package/dist/orchestration/tracker.d.ts +45 -0
  288. package/dist/orchestration/tracker.d.ts.map +1 -0
  289. package/dist/orchestration/tracker.js +95 -0
  290. package/dist/orchestration/tracker.js.map +1 -0
  291. package/dist/pattern-engine/execution-tracker.d.ts +45 -0
  292. package/dist/pattern-engine/execution-tracker.d.ts.map +1 -0
  293. package/dist/pattern-engine/execution-tracker.js +132 -0
  294. package/dist/pattern-engine/execution-tracker.js.map +1 -0
  295. package/dist/pattern-engine/index.d.ts +52 -0
  296. package/dist/pattern-engine/index.d.ts.map +1 -0
  297. package/dist/pattern-engine/index.js +104 -0
  298. package/dist/pattern-engine/index.js.map +1 -0
  299. package/dist/pattern-engine/pattern-evolver.d.ts +39 -0
  300. package/dist/pattern-engine/pattern-evolver.d.ts.map +1 -0
  301. package/dist/pattern-engine/pattern-evolver.js +170 -0
  302. package/dist/pattern-engine/pattern-evolver.js.map +1 -0
  303. package/dist/pattern-engine/pattern-executor.d.ts +43 -0
  304. package/dist/pattern-engine/pattern-executor.d.ts.map +1 -0
  305. package/dist/pattern-engine/pattern-executor.js +185 -0
  306. package/dist/pattern-engine/pattern-executor.js.map +1 -0
  307. package/dist/pattern-engine/pattern-loader.d.ts +14 -0
  308. package/dist/pattern-engine/pattern-loader.d.ts.map +1 -0
  309. package/dist/pattern-engine/pattern-loader.js +111 -0
  310. package/dist/pattern-engine/pattern-loader.js.map +1 -0
  311. package/dist/pattern-engine/pattern-router.d.ts +24 -0
  312. package/dist/pattern-engine/pattern-router.d.ts.map +1 -0
  313. package/dist/pattern-engine/pattern-router.js +124 -0
  314. package/dist/pattern-engine/pattern-router.js.map +1 -0
  315. package/dist/pattern-engine/types.d.ts +144 -0
  316. package/dist/pattern-engine/types.d.ts.map +1 -0
  317. package/dist/pattern-engine/types.js +8 -0
  318. package/dist/pattern-engine/types.js.map +1 -0
  319. package/dist/pipeline/analyzer.d.ts +17 -0
  320. package/dist/pipeline/analyzer.d.ts.map +1 -0
  321. package/dist/pipeline/analyzer.js +103 -0
  322. package/dist/pipeline/analyzer.js.map +1 -0
  323. package/dist/pipeline/index.d.ts +68 -0
  324. package/dist/pipeline/index.d.ts.map +1 -0
  325. package/dist/pipeline/index.js +183 -0
  326. package/dist/pipeline/index.js.map +1 -0
  327. package/dist/pipeline/phase-manager.d.ts +32 -0
  328. package/dist/pipeline/phase-manager.d.ts.map +1 -0
  329. package/dist/pipeline/phase-manager.js +188 -0
  330. package/dist/pipeline/phase-manager.js.map +1 -0
  331. package/dist/pipeline/pipeline-options.d.ts +19 -0
  332. package/dist/pipeline/pipeline-options.d.ts.map +1 -0
  333. package/dist/pipeline/pipeline-options.js +136 -0
  334. package/dist/pipeline/pipeline-options.js.map +1 -0
  335. package/dist/pipeline/store.d.ts +32 -0
  336. package/dist/pipeline/store.d.ts.map +1 -0
  337. package/dist/pipeline/store.js +113 -0
  338. package/dist/pipeline/store.js.map +1 -0
  339. package/dist/pipeline/types.d.ts +25 -0
  340. package/dist/pipeline/types.d.ts.map +1 -0
  341. package/dist/pipeline/types.js +16 -0
  342. package/dist/pipeline/types.js.map +1 -0
  343. package/dist/profile/index.d.ts +77 -0
  344. package/dist/profile/index.d.ts.map +1 -0
  345. package/dist/profile/index.js +407 -0
  346. package/dist/profile/index.js.map +1 -0
  347. package/dist/resume/context-gen.d.ts +20 -0
  348. package/dist/resume/context-gen.d.ts.map +1 -0
  349. package/dist/resume/context-gen.js +130 -0
  350. package/dist/resume/context-gen.js.map +1 -0
  351. package/dist/resume/index.d.ts +32 -0
  352. package/dist/resume/index.d.ts.map +1 -0
  353. package/dist/resume/index.js +142 -0
  354. package/dist/resume/index.js.map +1 -0
  355. package/dist/resume/state-machine.d.ts +21 -0
  356. package/dist/resume/state-machine.d.ts.map +1 -0
  357. package/dist/resume/state-machine.js +58 -0
  358. package/dist/resume/state-machine.js.map +1 -0
  359. package/dist/skill-registry/collector.d.ts +75 -0
  360. package/dist/skill-registry/collector.d.ts.map +1 -0
  361. package/dist/skill-registry/collector.js +334 -0
  362. package/dist/skill-registry/collector.js.map +1 -0
  363. package/dist/skill-registry/evolver.d.ts +84 -0
  364. package/dist/skill-registry/evolver.d.ts.map +1 -0
  365. package/dist/skill-registry/evolver.js +585 -0
  366. package/dist/skill-registry/evolver.js.map +1 -0
  367. package/dist/skill-registry/index.d.ts +73 -0
  368. package/dist/skill-registry/index.d.ts.map +1 -0
  369. package/dist/skill-registry/index.js +195 -0
  370. package/dist/skill-registry/index.js.map +1 -0
  371. package/dist/skill-registry/official-sync.d.ts +20 -0
  372. package/dist/skill-registry/official-sync.d.ts.map +1 -0
  373. package/dist/skill-registry/official-sync.js +576 -0
  374. package/dist/skill-registry/official-sync.js.map +1 -0
  375. package/dist/skill-registry/orchestration-config.d.ts +35 -0
  376. package/dist/skill-registry/orchestration-config.d.ts.map +1 -0
  377. package/dist/skill-registry/orchestration-config.js +125 -0
  378. package/dist/skill-registry/orchestration-config.js.map +1 -0
  379. package/dist/skill-registry/orchestrator.d.ts +45 -0
  380. package/dist/skill-registry/orchestrator.d.ts.map +1 -0
  381. package/dist/skill-registry/orchestrator.js +183 -0
  382. package/dist/skill-registry/orchestrator.js.map +1 -0
  383. package/dist/skill-registry/project-learner.d.ts +25 -0
  384. package/dist/skill-registry/project-learner.d.ts.map +1 -0
  385. package/dist/skill-registry/project-learner.js +176 -0
  386. package/dist/skill-registry/project-learner.js.map +1 -0
  387. package/dist/skill-registry/recommender.d.ts +25 -0
  388. package/dist/skill-registry/recommender.d.ts.map +1 -0
  389. package/dist/skill-registry/recommender.js +91 -0
  390. package/dist/skill-registry/recommender.js.map +1 -0
  391. package/dist/skill-registry/registry.d.ts +49 -0
  392. package/dist/skill-registry/registry.d.ts.map +1 -0
  393. package/dist/skill-registry/registry.js +160 -0
  394. package/dist/skill-registry/registry.js.map +1 -0
  395. package/dist/skill-registry/scanner.d.ts +36 -0
  396. package/dist/skill-registry/scanner.d.ts.map +1 -0
  397. package/dist/skill-registry/scanner.js +122 -0
  398. package/dist/skill-registry/scanner.js.map +1 -0
  399. package/dist/skill-registry/skills-config.d.ts +29 -0
  400. package/dist/skill-registry/skills-config.d.ts.map +1 -0
  401. package/dist/skill-registry/skills-config.js +86 -0
  402. package/dist/skill-registry/skills-config.js.map +1 -0
  403. package/dist/storage/index.d.ts +31 -0
  404. package/dist/storage/index.d.ts.map +1 -0
  405. package/dist/storage/index.js +2 -0
  406. package/dist/storage/index.js.map +1 -0
  407. package/dist/storage/sqlite.d.ts +58 -0
  408. package/dist/storage/sqlite.d.ts.map +1 -0
  409. package/dist/storage/sqlite.js +375 -0
  410. package/dist/storage/sqlite.js.map +1 -0
  411. package/dist/tests/claude-api.test.d.ts +2 -0
  412. package/dist/tests/claude-api.test.d.ts.map +1 -0
  413. package/dist/tests/claude-api.test.js +96 -0
  414. package/dist/tests/claude-api.test.js.map +1 -0
  415. package/dist/tests/conversational-config-handler.test.d.ts +2 -0
  416. package/dist/tests/conversational-config-handler.test.d.ts.map +1 -0
  417. package/dist/tests/conversational-config-handler.test.js +107 -0
  418. package/dist/tests/conversational-config-handler.test.js.map +1 -0
  419. package/dist/tests/doc-sync.test.d.ts +2 -0
  420. package/dist/tests/doc-sync.test.d.ts.map +1 -0
  421. package/dist/tests/doc-sync.test.js +148 -0
  422. package/dist/tests/doc-sync.test.js.map +1 -0
  423. package/dist/tests/orchestration-config.test.d.ts +2 -0
  424. package/dist/tests/orchestration-config.test.d.ts.map +1 -0
  425. package/dist/tests/orchestration-config.test.js +122 -0
  426. package/dist/tests/orchestration-config.test.js.map +1 -0
  427. package/dist/tests/pipeline-options.test.d.ts +2 -0
  428. package/dist/tests/pipeline-options.test.d.ts.map +1 -0
  429. package/dist/tests/pipeline-options.test.js +68 -0
  430. package/dist/tests/pipeline-options.test.js.map +1 -0
  431. package/dist/tests/resume-context-gen.test.d.ts +2 -0
  432. package/dist/tests/resume-context-gen.test.d.ts.map +1 -0
  433. package/dist/tests/resume-context-gen.test.js +93 -0
  434. package/dist/tests/resume-context-gen.test.js.map +1 -0
  435. package/dist/tests/sqlite.test.d.ts +2 -0
  436. package/dist/tests/sqlite.test.d.ts.map +1 -0
  437. package/dist/tests/sqlite.test.js +154 -0
  438. package/dist/tests/sqlite.test.js.map +1 -0
  439. package/dist/tests/tracker.test.d.ts +2 -0
  440. package/dist/tests/tracker.test.d.ts.map +1 -0
  441. package/dist/tests/tracker.test.js +75 -0
  442. package/dist/tests/tracker.test.js.map +1 -0
  443. package/dist/tests/tui.test.d.ts +2 -0
  444. package/dist/tests/tui.test.d.ts.map +1 -0
  445. package/dist/tests/tui.test.js +39 -0
  446. package/dist/tests/tui.test.js.map +1 -0
  447. package/dist/tests/user-prompt-handler.test.d.ts +2 -0
  448. package/dist/tests/user-prompt-handler.test.d.ts.map +1 -0
  449. package/dist/tests/user-prompt-handler.test.js +182 -0
  450. package/dist/tests/user-prompt-handler.test.js.map +1 -0
  451. package/dist/tui/index.d.ts +2 -0
  452. package/dist/tui/index.d.ts.map +1 -0
  453. package/dist/tui/index.js +486 -0
  454. package/dist/tui/index.js.map +1 -0
  455. package/dist/types/event.d.ts +24 -0
  456. package/dist/types/event.d.ts.map +1 -0
  457. package/dist/types/event.js +2 -0
  458. package/dist/types/event.js.map +1 -0
  459. package/dist/types/index.d.ts +3 -0
  460. package/dist/types/index.d.ts.map +1 -0
  461. package/dist/types/index.js +2 -0
  462. package/dist/types/index.js.map +1 -0
  463. package/dist/types/session.d.ts +11 -0
  464. package/dist/types/session.d.ts.map +1 -0
  465. package/dist/types/session.js +2 -0
  466. package/dist/types/session.js.map +1 -0
  467. package/dist/utils/claude-api.d.ts +49 -0
  468. package/dist/utils/claude-api.d.ts.map +1 -0
  469. package/dist/utils/claude-api.js +233 -0
  470. package/dist/utils/claude-api.js.map +1 -0
  471. package/dist/utils/formatter.d.ts +57 -0
  472. package/dist/utils/formatter.d.ts.map +1 -0
  473. package/dist/utils/formatter.js +109 -0
  474. package/dist/utils/formatter.js.map +1 -0
  475. package/dist/utils/logger.d.ts +25 -0
  476. package/dist/utils/logger.d.ts.map +1 -0
  477. package/dist/utils/logger.js +136 -0
  478. package/dist/utils/logger.js.map +1 -0
  479. package/dist/utils/mutex-lock.d.ts +23 -0
  480. package/dist/utils/mutex-lock.d.ts.map +1 -0
  481. package/dist/utils/mutex-lock.js +42 -0
  482. package/dist/utils/mutex-lock.js.map +1 -0
  483. package/dist/utils/truncate.d.ts +30 -0
  484. package/dist/utils/truncate.d.ts.map +1 -0
  485. package/dist/utils/truncate.js +64 -0
  486. package/dist/utils/truncate.js.map +1 -0
  487. package/package.json +63 -0
@@ -0,0 +1,308 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { logger } from '../utils/logger.js';
4
+ /**
5
+ * IntentEngine — 意图识别引擎
6
+ *
7
+ * 所有用户输入都会拦截分析,根据项目实际情况判断:
8
+ * - simple: 纯对话、查看文件、运行命令等不涉及代码改动的操作 → 直接放行
9
+ * - moderate: 改动范围较小(少量文件) → 注入提示,不启动 Pipeline
10
+ * - complex: 改动范围大、需求不明确、需要任务拆分和质量管控 → 启动 Pipeline 编排
11
+ */
12
+ export class IntentEngine {
13
+ api;
14
+ /** 项目结构缓存,TTL=2min,避免每次分析都读文件系统 */
15
+ structureCache = new Map();
16
+ /** decisions.md 内容缓存,TTL=2min */
17
+ decisionsCache = new Map();
18
+ static CACHE_TTL_MS = 2 * 60 * 1000; // 2min
19
+ constructor(api) {
20
+ this.api = api;
21
+ }
22
+ /**
23
+ * 分析用户输入的意图和复杂度
24
+ */
25
+ async analyze(userPrompt, projectPath, techStack) {
26
+ // 快速放行:纯对话和无改动操作
27
+ const quickResult = this.quickFilter(userPrompt);
28
+ if (quickResult) {
29
+ logger.info(`[意图引擎] 快速过滤:${quickResult.complexity}`);
30
+ return quickResult;
31
+ }
32
+ // 其他所有请求都走 AI 分析(带项目上下文)
33
+ try {
34
+ return await this.aiAnalyze(userPrompt, projectPath, techStack);
35
+ }
36
+ catch (err) {
37
+ logger.warn(`[意图引擎] AI 分析失败,使用降级方案:${err}`);
38
+ return this.fallbackAnalyze(userPrompt);
39
+ }
40
+ }
41
+ /**
42
+ * 快速放行:只过滤明确不涉及代码改动的操作
43
+ */
44
+ quickFilter(prompt) {
45
+ const lower = prompt.toLowerCase();
46
+ // 纯对话 / 提问:不涉及改动
47
+ const conversationPatterns = [
48
+ /^(看|查看|显示|cat|show|read|explain|解释|描述)/i,
49
+ /^(help|帮助|what|什么|how|怎么|为什么|why|where|哪)/i,
50
+ /^(当前|目前|现在).*(进度|状态|情况)/i,
51
+ /(是什么|干什么|怎么回事|什么意思)\s*[??]?\s*$/i,
52
+ ];
53
+ for (const pattern of conversationPatterns) {
54
+ if (pattern.test(lower)) {
55
+ return {
56
+ complexity: 'simple',
57
+ requiresPipeline: false,
58
+ requirement: prompt,
59
+ reasoning: '纯对话/提问,不涉及代码改动',
60
+ estimatedFiles: 0,
61
+ suggestedPhases: [],
62
+ };
63
+ }
64
+ }
65
+ // git / 运行命令:不涉及代码改动
66
+ const commandPatterns = [
67
+ /^(commit|push|pull|merge|rebase|stash|checkout|branch)/i,
68
+ /^(run|执行|启动)\s+(test|lint|build|dev|start|serve)/i,
69
+ /^(install|uninstall|npm|pnpm|yarn)\s/i,
70
+ ];
71
+ for (const pattern of commandPatterns) {
72
+ if (pattern.test(lower)) {
73
+ return {
74
+ complexity: 'simple',
75
+ requiresPipeline: false,
76
+ requirement: prompt,
77
+ reasoning: '运行命令/Git 操作,不涉及代码改动',
78
+ estimatedFiles: 0,
79
+ suggestedPhases: [],
80
+ };
81
+ }
82
+ }
83
+ // 极短输入且不含动词的大概率是对话
84
+ const byteLen = Buffer.byteLength(prompt, 'utf8');
85
+ const hasActionVerb = /修|改|加|删|实现|重构|优化|fix|add|remove|create|update|refactor|implement|build/i.test(lower);
86
+ if ((prompt.length < 6 || byteLen < 15) && !hasActionVerb) {
87
+ return {
88
+ complexity: 'simple',
89
+ requiresPipeline: false,
90
+ requirement: prompt,
91
+ reasoning: '极短输入且无改动动词,判定为对话',
92
+ estimatedFiles: 0,
93
+ suggestedPhases: [],
94
+ };
95
+ }
96
+ return null; // 交给 AI 分析
97
+ }
98
+ /**
99
+ * AI 分析意图(带项目上下文)
100
+ */
101
+ async aiAnalyze(userPrompt, projectPath, techStack) {
102
+ const contextInfo = this.readDecisionsContext(projectPath);
103
+ const projectStructure = this.getProjectStructure(projectPath);
104
+ const prompt = `你是一个 SDLC 意图分析引擎。请根据用户需求和项目实际情况,判断这个任务的复杂度和是否需要 Pipeline 编排。
105
+
106
+ ## 用户输入
107
+ ${userPrompt}
108
+
109
+ ## 项目信息
110
+ 路径: ${projectPath}
111
+ ${techStack ? `技术栈: ${techStack}` : ''}
112
+ ${projectStructure ? `项目结构:\n${projectStructure}` : ''}
113
+ ${contextInfo ? `近期工作上下文: ${contextInfo}` : ''}
114
+
115
+ ## 判断逻辑(按优先级)
116
+
117
+ 1. **这个需求是否涉及代码改动?**
118
+ - 不涉及(纯对话、提问、查看、运行命令)→ simple
119
+ - 涉及 → 继续判断
120
+
121
+ 2. **改动范围有多大?**(结合项目结构推断)
122
+ - 改 1-2 个文件,逻辑清晰 → simple,不需要编排
123
+ - 改 3-5 个文件,改动模式明确,问题定位清晰 → moderate,不需要编排
124
+ - 改动 6+ 个文件,或需求模糊需要先拆分 → complex,需要编排
125
+
126
+ 3. **是否需要 Pipeline 编排?**(仅在以下情况启用)
127
+ - 需求非常模糊,需要先 analyze 阶段梳理
128
+ - 涉及多个模块的架构级改动,需要 design 阶段规划
129
+ - 改动量大(10+ 文件)且需要任务拆分
130
+ - 新功能开发需要完整的质量管控流程
131
+
132
+ ## 重要原则
133
+ - **优化/修复类任务**:即使涉及多个文件,只要问题定位明确、改动模式清晰,应判定为 moderate,不启动 Pipeline
134
+ - **Bug 修复**:除非涉及架构级重构,否则都是 simple 或 moderate
135
+ - **配置调整**:即使涉及多个配置文件,也是 moderate
136
+ - **代码审查/优化**:如果是针对现有代码的优化,不是新功能开发,应判定为 moderate
137
+
138
+ ## 输出格式(严格 JSON)
139
+ {
140
+ "complexity": "simple|moderate|complex",
141
+ "requiresPipeline": true/false,
142
+ "requirement": "提炼后的一句话需求",
143
+ "reasoning": "判断理由:为什么是这个复杂度,预估改动哪些文件/模块,为什么需要或不需要编排",
144
+ "estimatedFiles": 预估改动文件数(数字),
145
+ "suggestedPhases": ["analyze", "design", "code", "test", "review"],
146
+ "clarifyQuestions": ["需要向用户确认的问题(当需求不明确时)"],
147
+ "searchKeywords": ["相关最佳实践关键词"]
148
+ }
149
+
150
+ 注意:
151
+ - simple 时 suggestedPhases 为空数组,requiresPipeline 为 false
152
+ - moderate 时 requiresPipeline 为 false,suggestedPhases 可包含 code/test
153
+ - complex 时 requiresPipeline 为 true,suggestedPhases 包含完整流程
154
+ - clarifyQuestions 触发条件(满足任一即必须填写):
155
+ * 需求中有歧义词("优化"、"改进"、"处理"、"搞一下"等,没有明确目标)
156
+ * 涉及多个可能的实现方案,需要用户选择
157
+ * 缺少关键信息(如目标文件、功能范围、技术选型)
158
+ * 不满足以上条件时,clarifyQuestions 为空数组 []
159
+ - 只输出 JSON,不要其他内容`;
160
+ const response = await this.api.complete(prompt, 'intent');
161
+ return this.parseAnalysis(response, userPrompt);
162
+ }
163
+ /**
164
+ * 获取项目结构摘要(给 AI 提供上下文)
165
+ */
166
+ getProjectStructure(projectPath) {
167
+ const cached = this.structureCache.get(projectPath);
168
+ if (cached && Date.now() < cached.expireAt)
169
+ return cached.data;
170
+ try {
171
+ if (!fs.existsSync(projectPath))
172
+ return '';
173
+ const lines = [];
174
+ const entries = fs.readdirSync(projectPath, { withFileTypes: true });
175
+ // 收集一级目录和关键文件
176
+ const dirs = [];
177
+ const files = [];
178
+ const skipDirs = new Set(['node_modules', '.git', 'dist', 'build', '.next', '__pycache__', '.claude', '.claude-forge', 'vendor', 'target']);
179
+ for (const entry of entries) {
180
+ if (entry.name.startsWith('.') && entry.name !== '.env.example')
181
+ continue;
182
+ if (skipDirs.has(entry.name))
183
+ continue;
184
+ if (entry.isDirectory()) {
185
+ dirs.push(entry.name + '/');
186
+ }
187
+ else {
188
+ files.push(entry.name);
189
+ }
190
+ }
191
+ if (dirs.length > 0)
192
+ lines.push(`目录: ${dirs.join(', ')}`);
193
+ if (files.length > 0)
194
+ lines.push(`文件: ${files.join(', ')}`);
195
+ // 尝试读取 src/ 的一级子目录,了解模块划分
196
+ const srcPath = path.join(projectPath, 'src');
197
+ if (fs.existsSync(srcPath)) {
198
+ const srcEntries = fs.readdirSync(srcPath, { withFileTypes: true });
199
+ const srcDirs = srcEntries
200
+ .filter(e => e.isDirectory() && !e.name.startsWith('.'))
201
+ .map(e => e.name + '/');
202
+ if (srcDirs.length > 0) {
203
+ lines.push(`src/ 模块: ${srcDirs.join(', ')}`);
204
+ }
205
+ }
206
+ const data = lines.join('\n');
207
+ this.structureCache.set(projectPath, { data, expireAt: Date.now() + IntentEngine.CACHE_TTL_MS });
208
+ return data;
209
+ }
210
+ catch {
211
+ return '';
212
+ }
213
+ }
214
+ /**
215
+ * 降级分析:AI 不可用时的保底策略
216
+ * 默认倾向 moderate,让用户自己决定是否需要编排
217
+ */
218
+ fallbackAnalyze(prompt) {
219
+ // 有明确的代码改动动词 → moderate
220
+ const hasAction = /修|改|加|删|实现|重构|优化|fix|add|remove|create|update|refactor|implement|build/i.test(prompt);
221
+ if (!hasAction) {
222
+ return {
223
+ complexity: 'simple',
224
+ requiresPipeline: false,
225
+ requirement: prompt,
226
+ reasoning: 'AI 分析不可用,未检测到改动动词,降级判定为对话',
227
+ estimatedFiles: 0,
228
+ suggestedPhases: [],
229
+ };
230
+ }
231
+ return {
232
+ complexity: 'moderate',
233
+ requiresPipeline: false,
234
+ requirement: prompt,
235
+ reasoning: 'AI 分析不可用,检测到改动动词,降级判定为中等复杂度',
236
+ estimatedFiles: 0,
237
+ suggestedPhases: ['code', 'test'],
238
+ };
239
+ }
240
+ parseAnalysis(response, originalPrompt) {
241
+ try {
242
+ const cleaned = response.replace(/```json\s*/g, '').replace(/```\s*/g, '');
243
+ const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
244
+ if (!jsonMatch)
245
+ throw new Error('No JSON found');
246
+ const parsed = JSON.parse(jsonMatch[0]);
247
+ return {
248
+ complexity: parsed.complexity || 'moderate',
249
+ requiresPipeline: parsed.requiresPipeline ?? false,
250
+ requirement: parsed.requirement || originalPrompt,
251
+ reasoning: parsed.reasoning || '',
252
+ estimatedFiles: parsed.estimatedFiles ?? 0,
253
+ suggestedPhases: parsed.suggestedPhases || [],
254
+ clarifyQuestions: parsed.clarifyQuestions,
255
+ searchKeywords: parsed.searchKeywords,
256
+ };
257
+ }
258
+ catch {
259
+ logger.warn('[意图引擎] AI 响应解析失败');
260
+ return this.fallbackAnalyze(originalPrompt);
261
+ }
262
+ }
263
+ /**
264
+ * 读取项目蒸馏产出的 decisions.md 作为上下文(最近 500 字符)
265
+ */
266
+ readDecisionsContext(projectPath) {
267
+ const cached = this.decisionsCache.get(projectPath);
268
+ if (cached && Date.now() < cached.expireAt)
269
+ return cached.data;
270
+ try {
271
+ const decisionsPath = path.join(projectPath, '.claude-forge', 'decisions.md');
272
+ if (!fs.existsSync(decisionsPath))
273
+ return '';
274
+ const content = fs.readFileSync(decisionsPath, 'utf-8');
275
+ // 只取最近的内容,避免 prompt 过长
276
+ const data = content.trim();
277
+ this.decisionsCache.set(projectPath, { data, expireAt: Date.now() + IntentEngine.CACHE_TTL_MS });
278
+ return data;
279
+ }
280
+ catch {
281
+ return '';
282
+ }
283
+ }
284
+ /**
285
+ * 生成注入给 Claude Code 的编排指令
286
+ */
287
+ generateDirective(analysis) {
288
+ if (analysis.complexity === 'simple')
289
+ return null;
290
+ const parts = [];
291
+ if (analysis.requiresPipeline) {
292
+ parts.push(`[Forge Autopilot] 检测到复杂需求,已启动 Pipeline 编排。`);
293
+ parts.push(`需求:${analysis.requirement}`);
294
+ parts.push(`阶段:${analysis.suggestedPhases.join(' → ')}`);
295
+ parts.push('');
296
+ parts.push('请按 Pipeline 阶段指令逐步执行,每步完成后等待质量门禁审查。');
297
+ }
298
+ else {
299
+ // moderate: 提供建议但不强制编排
300
+ parts.push(`[Forge] 建议关注:${analysis.requirement}`);
301
+ if (analysis.searchKeywords && analysis.searchKeywords.length > 0) {
302
+ parts.push(`参考关键词:${analysis.searchKeywords.join(', ')}`);
303
+ }
304
+ }
305
+ return parts.join('\n');
306
+ }
307
+ }
308
+ //# sourceMappingURL=intent-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-engine.js","sourceRoot":"","sources":["../../src/autopilot/intent-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { ClaudeAPI } from '../utils/claude-api.js';
2
+ export interface KnowledgeEntry {
3
+ id: string;
4
+ title: string;
5
+ keywords: string[];
6
+ content: string;
7
+ source: 'search' | 'distill' | 'manual';
8
+ techStack: string[];
9
+ usageCount: number;
10
+ quality: number;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ /**
15
+ * KnowledgeEngine — 知识搜索与沉淀引擎
16
+ *
17
+ * 1. 联网搜索最佳实践
18
+ * 2. 蒸馏为可复用的知识文件
19
+ * 3. 下次遇到类似场景优先使用沉淀的知识
20
+ * 4. 知识自动过期和刷新
21
+ */
22
+ export declare class KnowledgeEngine {
23
+ private api;
24
+ private index;
25
+ constructor(api: ClaudeAPI);
26
+ /**
27
+ * 搜索知识库 — 优先本地,不足时联网搜索
28
+ */
29
+ search(keywords: string[], techStack?: string[]): Promise<string>;
30
+ /**
31
+ * 联网搜索并蒸馏为知识条目
32
+ */
33
+ private searchAndDistill;
34
+ /**
35
+ * 蒸馏搜索结果为知识条目并保存
36
+ */
37
+ private distillAndSave;
38
+ /**
39
+ * 本地搜索:关键词匹配 + 技术栈匹配
40
+ */
41
+ private searchLocal;
42
+ /**
43
+ * 格式化本地搜索结果
44
+ */
45
+ private formatLocalResults;
46
+ /**
47
+ * 反馈:标记知识质量(被采纳则提升,被忽略则降低)
48
+ */
49
+ updateQuality(entryId: string, delta: number): void;
50
+ /**
51
+ * 清理过期知识(超过 90 天未使用且质量低)
52
+ */
53
+ prune(maxAgeDays?: number): number;
54
+ /**
55
+ * 获取知识库统计
56
+ */
57
+ getStats(): {
58
+ total: number;
59
+ bySource: Record<string, number>;
60
+ avgQuality: number;
61
+ };
62
+ private ensureDir;
63
+ private loadIndex;
64
+ private saveIndex;
65
+ private slugify;
66
+ }
67
+ //# sourceMappingURL=knowledge-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-engine.d.ts","sourceRoot":"","sources":["../../src/autopilot/knowledge-engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,KAAK,CAAiB;gBAElB,GAAG,EAAE,SAAS;IAM1B;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3E;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,cAAc;IA2D5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASnD;;OAEG;IACH,KAAK,CAAC,UAAU,GAAE,MAAW,GAAG,MAAM;IAqBtC;;OAEG;IACH,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAiBnF,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,262 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { logger } from '../utils/logger.js';
5
+ const KNOWLEDGE_DIR = path.join(os.homedir(), '.claude-forge', 'knowledge');
6
+ const INDEX_FILE = path.join(KNOWLEDGE_DIR, 'index.json');
7
+ /**
8
+ * KnowledgeEngine — 知识搜索与沉淀引擎
9
+ *
10
+ * 1. 联网搜索最佳实践
11
+ * 2. 蒸馏为可复用的知识文件
12
+ * 3. 下次遇到类似场景优先使用沉淀的知识
13
+ * 4. 知识自动过期和刷新
14
+ */
15
+ export class KnowledgeEngine {
16
+ api;
17
+ index;
18
+ constructor(api) {
19
+ this.api = api;
20
+ this.ensureDir();
21
+ this.index = this.loadIndex();
22
+ }
23
+ /**
24
+ * 搜索知识库 — 优先本地,不足时联网搜索
25
+ */
26
+ async search(keywords, techStack = []) {
27
+ // 1. 先查本地知识库
28
+ const localResults = this.searchLocal(keywords, techStack);
29
+ if (localResults.length > 0) {
30
+ logger.info(`[知识库] 找到 ${localResults.length} 条本地记录:${keywords.join(', ')}`);
31
+ // 更新使用计数
32
+ for (const entry of localResults) {
33
+ entry.usageCount++;
34
+ entry.updatedAt = new Date().toISOString();
35
+ }
36
+ this.saveIndex();
37
+ return this.formatLocalResults(localResults);
38
+ }
39
+ // 2. 本地没有,联网搜索并沉淀
40
+ logger.info(`[知识库] 无本地结果,联网搜索:${keywords.join(', ')}`);
41
+ return this.searchAndDistill(keywords, techStack);
42
+ }
43
+ /**
44
+ * 联网搜索并蒸馏为知识条目
45
+ */
46
+ async searchAndDistill(keywords, techStack) {
47
+ const query = keywords.join(' ') + (techStack.length > 0 ? ` ${techStack.join(' ')}` : '');
48
+ const searchPrompt = `你是一个技术研究助手。请针对以下技术主题,提供最佳实践总结。
49
+
50
+ ## 搜索主题
51
+ ${query}
52
+
53
+ ## 技术栈上下文
54
+ ${techStack.length > 0 ? techStack.join(', ') : '通用'}
55
+
56
+ ## 要求
57
+ 1. 总结该领域的最佳实践(3-5 条核心原则)
58
+ 2. 推荐的技术方案和工具
59
+ 3. 常见的坑和注意事项
60
+ 4. 示例代码片段(如适用)
61
+ 5. 参考来源(如已知)
62
+
63
+ ## 输出格式
64
+ 用 Markdown 格式输出,结构清晰。`;
65
+ try {
66
+ const content = await this.api.complete(searchPrompt, 'knowledge');
67
+ // 蒸馏并存储
68
+ const entry = await this.distillAndSave(keywords, techStack, content);
69
+ logger.info(`[知识库] 已蒸馏并保存:${entry.title}`);
70
+ return `[Forge Knowledge] 已搜索并沉淀最佳实践:\n\n${content}`;
71
+ }
72
+ catch (err) {
73
+ logger.error(`[知识库] 搜索失败:${err}`);
74
+ return `[Forge Knowledge] 搜索失败,请手动查找 ${keywords.join(', ')} 相关的最佳实践。`;
75
+ }
76
+ }
77
+ /**
78
+ * 蒸馏搜索结果为知识条目并保存
79
+ */
80
+ async distillAndSave(keywords, techStack, rawContent) {
81
+ // 用 AI 生成标题和摘要
82
+ const metaPrompt = `基于以下内容,生成一个简短标题(不超过 30 字)。
83
+ 只输出标题文本,不要引号或其他格式。
84
+
85
+ ${rawContent.substring(0, 500)}`;
86
+ let title;
87
+ try {
88
+ title = (await this.api.complete(metaPrompt, 'knowledge')).trim();
89
+ }
90
+ catch {
91
+ title = keywords.slice(0, 3).join('-') + ' 最佳实践';
92
+ }
93
+ const id = this.slugify(keywords.join('-'));
94
+ const entry = {
95
+ id,
96
+ title,
97
+ keywords,
98
+ content: rawContent,
99
+ source: 'search',
100
+ techStack,
101
+ usageCount: 1,
102
+ quality: 0.5, // 初始中等质量
103
+ createdAt: new Date().toISOString(),
104
+ updatedAt: new Date().toISOString(),
105
+ };
106
+ // 保存知识文件
107
+ const filePath = path.join(KNOWLEDGE_DIR, `${id}.md`);
108
+ const fileContent = `---
109
+ title: ${title}
110
+ keywords: ${JSON.stringify(keywords)}
111
+ techStack: ${JSON.stringify(techStack)}
112
+ source: search
113
+ quality: ${entry.quality}
114
+ createdAt: ${entry.createdAt}
115
+ ---
116
+
117
+ ${rawContent}`;
118
+ fs.writeFileSync(filePath, fileContent, 'utf-8');
119
+ // 更新索引(去重)
120
+ const existingIdx = this.index.entries.findIndex(e => e.id === id);
121
+ if (existingIdx >= 0) {
122
+ this.index.entries[existingIdx] = entry;
123
+ }
124
+ else {
125
+ this.index.entries.push(entry);
126
+ }
127
+ this.saveIndex();
128
+ return entry;
129
+ }
130
+ /**
131
+ * 本地搜索:关键词匹配 + 技术栈匹配
132
+ */
133
+ searchLocal(keywords, techStack) {
134
+ return this.index.entries
135
+ .map(entry => {
136
+ let score = 0;
137
+ // 关键词匹配
138
+ for (const kw of keywords) {
139
+ const lower = kw.toLowerCase();
140
+ if (entry.keywords.some(ek => ek.toLowerCase().includes(lower)))
141
+ score += 3;
142
+ if (entry.title.toLowerCase().includes(lower))
143
+ score += 2;
144
+ if (entry.content.toLowerCase().includes(lower))
145
+ score += 1;
146
+ }
147
+ // 技术栈匹配
148
+ for (const ts of techStack) {
149
+ if (entry.techStack.some(et => et.toLowerCase() === ts.toLowerCase()))
150
+ score += 2;
151
+ }
152
+ // 质量加权
153
+ score *= entry.quality;
154
+ // 使用频率加分
155
+ score += Math.min(entry.usageCount * 0.1, 1);
156
+ return { entry, score };
157
+ })
158
+ .filter(r => r.score > 2) // 至少有一个关键词匹配
159
+ .sort((a, b) => b.score - a.score)
160
+ .slice(0, 3) // 最多返回 3 条
161
+ .map(r => r.entry);
162
+ }
163
+ /**
164
+ * 格式化本地搜索结果
165
+ */
166
+ formatLocalResults(entries) {
167
+ const parts = ['[Forge Knowledge] 已从知识库中找到相关最佳实践:', ''];
168
+ for (const entry of entries) {
169
+ parts.push(`### ${entry.title}`);
170
+ parts.push(`来源: ${entry.source} | 使用次数: ${entry.usageCount} | 质量评分: ${(entry.quality * 100).toFixed(0)}%`);
171
+ parts.push('');
172
+ // 只取前 1000 字符避免注入过多上下文
173
+ parts.push(entry.content.substring(0, 1000));
174
+ if (entry.content.length > 1000)
175
+ parts.push('...(更多内容请参考知识库文件)');
176
+ parts.push('');
177
+ }
178
+ return parts.join('\n');
179
+ }
180
+ /**
181
+ * 反馈:标记知识质量(被采纳则提升,被忽略则降低)
182
+ */
183
+ updateQuality(entryId, delta) {
184
+ const entry = this.index.entries.find(e => e.id === entryId);
185
+ if (entry) {
186
+ entry.quality = Math.max(0, Math.min(1, entry.quality + delta));
187
+ entry.updatedAt = new Date().toISOString();
188
+ this.saveIndex();
189
+ }
190
+ }
191
+ /**
192
+ * 清理过期知识(超过 90 天未使用且质量低)
193
+ */
194
+ prune(maxAgeDays = 90) {
195
+ const cutoff = new Date(Date.now() - maxAgeDays * 86400000).toISOString();
196
+ const before = this.index.entries.length;
197
+ this.index.entries = this.index.entries.filter(entry => {
198
+ if (entry.updatedAt > cutoff)
199
+ return true;
200
+ if (entry.quality > 0.7)
201
+ return true; // 高质量保留
202
+ if (entry.usageCount > 5)
203
+ return true; // 高频使用保留
204
+ // 删除文件
205
+ const filePath = path.join(KNOWLEDGE_DIR, `${entry.id}.md`);
206
+ try {
207
+ fs.unlinkSync(filePath);
208
+ }
209
+ catch { /* ignore */ }
210
+ return false;
211
+ });
212
+ this.saveIndex();
213
+ const pruned = before - this.index.entries.length;
214
+ if (pruned > 0)
215
+ logger.info(`[知识库] 已清理 ${pruned} 条过期记录`);
216
+ return pruned;
217
+ }
218
+ /**
219
+ * 获取知识库统计
220
+ */
221
+ getStats() {
222
+ const entries = this.index.entries;
223
+ const bySource = {};
224
+ let totalQuality = 0;
225
+ for (const e of entries) {
226
+ bySource[e.source] = (bySource[e.source] || 0) + 1;
227
+ totalQuality += e.quality;
228
+ }
229
+ return {
230
+ total: entries.length,
231
+ bySource,
232
+ avgQuality: entries.length > 0 ? totalQuality / entries.length : 0,
233
+ };
234
+ }
235
+ ensureDir() {
236
+ if (!fs.existsSync(KNOWLEDGE_DIR)) {
237
+ fs.mkdirSync(KNOWLEDGE_DIR, { recursive: true });
238
+ }
239
+ }
240
+ loadIndex() {
241
+ if (!fs.existsSync(INDEX_FILE)) {
242
+ return { entries: [], version: 1 };
243
+ }
244
+ try {
245
+ return JSON.parse(fs.readFileSync(INDEX_FILE, 'utf-8'));
246
+ }
247
+ catch {
248
+ return { entries: [], version: 1 };
249
+ }
250
+ }
251
+ saveIndex() {
252
+ fs.writeFileSync(INDEX_FILE, JSON.stringify(this.index, null, 2), 'utf-8');
253
+ }
254
+ slugify(text) {
255
+ return text
256
+ .toLowerCase()
257
+ .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
258
+ .replace(/^-+|-+$/g, '')
259
+ .substring(0, 60);
260
+ }
261
+ }
262
+ //# sourceMappingURL=knowledge-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-engine.js","sourceRoot":"","sources":["../../src/autopilot/knowledge-engine.ts"],"names":[],"mappings":"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"}