@intrect/openswarm 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +544 -0
  3. package/config.example.yaml +107 -0
  4. package/dist/adapters/base.d.ts +8 -0
  5. package/dist/adapters/base.d.ts.map +1 -0
  6. package/dist/adapters/base.js +104 -0
  7. package/dist/adapters/base.js.map +1 -0
  8. package/dist/adapters/claude.d.ts +13 -0
  9. package/dist/adapters/claude.d.ts.map +1 -0
  10. package/dist/adapters/claude.js +318 -0
  11. package/dist/adapters/claude.js.map +1 -0
  12. package/dist/adapters/codex.d.ts +14 -0
  13. package/dist/adapters/codex.d.ts.map +1 -0
  14. package/dist/adapters/codex.js +366 -0
  15. package/dist/adapters/codex.js.map +1 -0
  16. package/dist/adapters/cryptoQuantAdapter.d.ts +85 -0
  17. package/dist/adapters/cryptoQuantAdapter.d.ts.map +1 -0
  18. package/dist/adapters/cryptoQuantAdapter.js +238 -0
  19. package/dist/adapters/cryptoQuantAdapter.js.map +1 -0
  20. package/dist/adapters/index.d.ts +17 -0
  21. package/dist/adapters/index.d.ts.map +1 -0
  22. package/dist/adapters/index.js +47 -0
  23. package/dist/adapters/index.js.map +1 -0
  24. package/dist/adapters/processRegistry.d.ts +38 -0
  25. package/dist/adapters/processRegistry.d.ts.map +1 -0
  26. package/dist/adapters/processRegistry.js +147 -0
  27. package/dist/adapters/processRegistry.js.map +1 -0
  28. package/dist/adapters/streamBuffer.d.ts +59 -0
  29. package/dist/adapters/streamBuffer.d.ts.map +1 -0
  30. package/dist/adapters/streamBuffer.js +123 -0
  31. package/dist/adapters/streamBuffer.js.map +1 -0
  32. package/dist/adapters/types.d.ts +65 -0
  33. package/dist/adapters/types.d.ts.map +1 -0
  34. package/dist/adapters/types.js +6 -0
  35. package/dist/adapters/types.js.map +1 -0
  36. package/dist/agents/agentBus.d.ts +160 -0
  37. package/dist/agents/agentBus.d.ts.map +1 -0
  38. package/dist/agents/agentBus.js +350 -0
  39. package/dist/agents/agentBus.js.map +1 -0
  40. package/dist/agents/agentPair.d.ts +210 -0
  41. package/dist/agents/agentPair.d.ts.map +1 -0
  42. package/dist/agents/agentPair.js +420 -0
  43. package/dist/agents/agentPair.js.map +1 -0
  44. package/dist/agents/auditor.d.ts +27 -0
  45. package/dist/agents/auditor.d.ts.map +1 -0
  46. package/dist/agents/auditor.js +237 -0
  47. package/dist/agents/auditor.js.map +1 -0
  48. package/dist/agents/cliStreamParser.d.ts +18 -0
  49. package/dist/agents/cliStreamParser.d.ts.map +1 -0
  50. package/dist/agents/cliStreamParser.js +156 -0
  51. package/dist/agents/cliStreamParser.js.map +1 -0
  52. package/dist/agents/documenter.d.ts +31 -0
  53. package/dist/agents/documenter.d.ts.map +1 -0
  54. package/dist/agents/documenter.js +285 -0
  55. package/dist/agents/documenter.js.map +1 -0
  56. package/dist/agents/index.d.ts +10 -0
  57. package/dist/agents/index.d.ts.map +1 -0
  58. package/dist/agents/index.js +10 -0
  59. package/dist/agents/index.js.map +1 -0
  60. package/dist/agents/pairMetrics.d.ts +63 -0
  61. package/dist/agents/pairMetrics.d.ts.map +1 -0
  62. package/dist/agents/pairMetrics.js +231 -0
  63. package/dist/agents/pairMetrics.js.map +1 -0
  64. package/dist/agents/pairPipeline.d.ts +155 -0
  65. package/dist/agents/pairPipeline.d.ts.map +1 -0
  66. package/dist/agents/pairPipeline.js +793 -0
  67. package/dist/agents/pairPipeline.js.map +1 -0
  68. package/dist/agents/pairWebhook.d.ts +59 -0
  69. package/dist/agents/pairWebhook.d.ts.map +1 -0
  70. package/dist/agents/pairWebhook.js +242 -0
  71. package/dist/agents/pairWebhook.js.map +1 -0
  72. package/dist/agents/pipelineFormat.d.ts +11 -0
  73. package/dist/agents/pipelineFormat.d.ts.map +1 -0
  74. package/dist/agents/pipelineFormat.js +164 -0
  75. package/dist/agents/pipelineFormat.js.map +1 -0
  76. package/dist/agents/pipelineGuards.d.ts +23 -0
  77. package/dist/agents/pipelineGuards.d.ts.map +1 -0
  78. package/dist/agents/pipelineGuards.js +175 -0
  79. package/dist/agents/pipelineGuards.js.map +1 -0
  80. package/dist/agents/reviewer.d.ts +37 -0
  81. package/dist/agents/reviewer.d.ts.map +1 -0
  82. package/dist/agents/reviewer.js +213 -0
  83. package/dist/agents/reviewer.js.map +1 -0
  84. package/dist/agents/skillDocumenter.d.ts +23 -0
  85. package/dist/agents/skillDocumenter.d.ts.map +1 -0
  86. package/dist/agents/skillDocumenter.js +218 -0
  87. package/dist/agents/skillDocumenter.js.map +1 -0
  88. package/dist/agents/tester.d.ts +37 -0
  89. package/dist/agents/tester.d.ts.map +1 -0
  90. package/dist/agents/tester.js +308 -0
  91. package/dist/agents/tester.js.map +1 -0
  92. package/dist/agents/worker.d.ts +30 -0
  93. package/dist/agents/worker.d.ts.map +1 -0
  94. package/dist/agents/worker.js +128 -0
  95. package/dist/agents/worker.js.map +1 -0
  96. package/dist/automation/autonomousRunner.d.ts +123 -0
  97. package/dist/automation/autonomousRunner.d.ts.map +1 -0
  98. package/dist/automation/autonomousRunner.js +1082 -0
  99. package/dist/automation/autonomousRunner.js.map +1 -0
  100. package/dist/automation/ciWorker.d.ts +51 -0
  101. package/dist/automation/ciWorker.d.ts.map +1 -0
  102. package/dist/automation/ciWorker.js +282 -0
  103. package/dist/automation/ciWorker.js.map +1 -0
  104. package/dist/automation/conflictResolver.d.ts +29 -0
  105. package/dist/automation/conflictResolver.d.ts.map +1 -0
  106. package/dist/automation/conflictResolver.js +261 -0
  107. package/dist/automation/conflictResolver.js.map +1 -0
  108. package/dist/automation/dailyReporter.d.ts +26 -0
  109. package/dist/automation/dailyReporter.d.ts.map +1 -0
  110. package/dist/automation/dailyReporter.js +132 -0
  111. package/dist/automation/dailyReporter.js.map +1 -0
  112. package/dist/automation/index.d.ts +7 -0
  113. package/dist/automation/index.d.ts.map +1 -0
  114. package/dist/automation/index.js +7 -0
  115. package/dist/automation/index.js.map +1 -0
  116. package/dist/automation/longRunningMonitor.d.ts +26 -0
  117. package/dist/automation/longRunningMonitor.d.ts.map +1 -0
  118. package/dist/automation/longRunningMonitor.js +231 -0
  119. package/dist/automation/longRunningMonitor.js.map +1 -0
  120. package/dist/automation/prOwnership.d.ts +18 -0
  121. package/dist/automation/prOwnership.d.ts.map +1 -0
  122. package/dist/automation/prOwnership.js +61 -0
  123. package/dist/automation/prOwnership.js.map +1 -0
  124. package/dist/automation/prProcessor.d.ts +62 -0
  125. package/dist/automation/prProcessor.d.ts.map +1 -0
  126. package/dist/automation/prProcessor.js +700 -0
  127. package/dist/automation/prProcessor.js.map +1 -0
  128. package/dist/automation/runnerExecution.d.ts +49 -0
  129. package/dist/automation/runnerExecution.d.ts.map +1 -0
  130. package/dist/automation/runnerExecution.js +663 -0
  131. package/dist/automation/runnerExecution.js.map +1 -0
  132. package/dist/automation/runnerState.d.ts +170 -0
  133. package/dist/automation/runnerState.d.ts.map +1 -0
  134. package/dist/automation/runnerState.js +495 -0
  135. package/dist/automation/runnerState.js.map +1 -0
  136. package/dist/automation/runnerTypes.d.ts +46 -0
  137. package/dist/automation/runnerTypes.d.ts.map +1 -0
  138. package/dist/automation/runnerTypes.js +5 -0
  139. package/dist/automation/runnerTypes.js.map +1 -0
  140. package/dist/automation/scheduler.d.ts +75 -0
  141. package/dist/automation/scheduler.d.ts.map +1 -0
  142. package/dist/automation/scheduler.js +394 -0
  143. package/dist/automation/scheduler.js.map +1 -0
  144. package/dist/cli/promptHandler.d.ts +13 -0
  145. package/dist/cli/promptHandler.d.ts.map +1 -0
  146. package/dist/cli/promptHandler.js +189 -0
  147. package/dist/cli/promptHandler.js.map +1 -0
  148. package/dist/cli.d.ts +3 -0
  149. package/dist/cli.d.ts.map +1 -0
  150. package/dist/cli.js +138 -0
  151. package/dist/cli.js.map +1 -0
  152. package/dist/core/config.d.ts +308 -0
  153. package/dist/core/config.d.ts.map +1 -0
  154. package/dist/core/config.js +529 -0
  155. package/dist/core/config.js.map +1 -0
  156. package/dist/core/eventHub.d.ts +194 -0
  157. package/dist/core/eventHub.d.ts.map +1 -0
  158. package/dist/core/eventHub.js +136 -0
  159. package/dist/core/eventHub.js.map +1 -0
  160. package/dist/core/index.d.ts +6 -0
  161. package/dist/core/index.d.ts.map +1 -0
  162. package/dist/core/index.js +6 -0
  163. package/dist/core/index.js.map +1 -0
  164. package/dist/core/service.d.ts +27 -0
  165. package/dist/core/service.d.ts.map +1 -0
  166. package/dist/core/service.js +438 -0
  167. package/dist/core/service.js.map +1 -0
  168. package/dist/core/traceCollector.d.ts +105 -0
  169. package/dist/core/traceCollector.d.ts.map +1 -0
  170. package/dist/core/traceCollector.js +141 -0
  171. package/dist/core/traceCollector.js.map +1 -0
  172. package/dist/core/types.d.ts +413 -0
  173. package/dist/core/types.d.ts.map +1 -0
  174. package/dist/core/types.js +5 -0
  175. package/dist/core/types.js.map +1 -0
  176. package/dist/discord/discordCore.d.ts +104 -0
  177. package/dist/discord/discordCore.d.ts.map +1 -0
  178. package/dist/discord/discordCore.js +698 -0
  179. package/dist/discord/discordCore.js.map +1 -0
  180. package/dist/discord/discordHandlers.d.ts +86 -0
  181. package/dist/discord/discordHandlers.d.ts.map +1 -0
  182. package/dist/discord/discordHandlers.js +849 -0
  183. package/dist/discord/discordHandlers.js.map +1 -0
  184. package/dist/discord/discordPair.d.ts +6 -0
  185. package/dist/discord/discordPair.d.ts.map +1 -0
  186. package/dist/discord/discordPair.js +567 -0
  187. package/dist/discord/discordPair.js.map +1 -0
  188. package/dist/discord/index.d.ts +4 -0
  189. package/dist/discord/index.d.ts.map +1 -0
  190. package/dist/discord/index.js +11 -0
  191. package/dist/discord/index.js.map +1 -0
  192. package/dist/github/github.d.ts +236 -0
  193. package/dist/github/github.d.ts.map +1 -0
  194. package/dist/github/github.js +535 -0
  195. package/dist/github/github.js.map +1 -0
  196. package/dist/github/index.d.ts +2 -0
  197. package/dist/github/index.d.ts.map +1 -0
  198. package/dist/github/index.js +2 -0
  199. package/dist/github/index.js.map +1 -0
  200. package/dist/index.d.ts +3 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +60 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/knowledge/analyzer.d.ts +36 -0
  205. package/dist/knowledge/analyzer.d.ts.map +1 -0
  206. package/dist/knowledge/analyzer.js +170 -0
  207. package/dist/knowledge/analyzer.js.map +1 -0
  208. package/dist/knowledge/gitInfo.d.ts +10 -0
  209. package/dist/knowledge/gitInfo.d.ts.map +1 -0
  210. package/dist/knowledge/gitInfo.js +134 -0
  211. package/dist/knowledge/gitInfo.js.map +1 -0
  212. package/dist/knowledge/graph.d.ts +45 -0
  213. package/dist/knowledge/graph.d.ts.map +1 -0
  214. package/dist/knowledge/graph.js +262 -0
  215. package/dist/knowledge/graph.js.map +1 -0
  216. package/dist/knowledge/graphqlExporter.d.ts +64 -0
  217. package/dist/knowledge/graphqlExporter.d.ts.map +1 -0
  218. package/dist/knowledge/graphqlExporter.js +333 -0
  219. package/dist/knowledge/graphqlExporter.js.map +1 -0
  220. package/dist/knowledge/index.d.ts +58 -0
  221. package/dist/knowledge/index.d.ts.map +1 -0
  222. package/dist/knowledge/index.js +212 -0
  223. package/dist/knowledge/index.js.map +1 -0
  224. package/dist/knowledge/repository.d.ts +64 -0
  225. package/dist/knowledge/repository.d.ts.map +1 -0
  226. package/dist/knowledge/repository.js +250 -0
  227. package/dist/knowledge/repository.js.map +1 -0
  228. package/dist/knowledge/riskOnAnalyzer.d.ts +79 -0
  229. package/dist/knowledge/riskOnAnalyzer.d.ts.map +1 -0
  230. package/dist/knowledge/riskOnAnalyzer.js +243 -0
  231. package/dist/knowledge/riskOnAnalyzer.js.map +1 -0
  232. package/dist/knowledge/scanner.d.ts +14 -0
  233. package/dist/knowledge/scanner.d.ts.map +1 -0
  234. package/dist/knowledge/scanner.js +350 -0
  235. package/dist/knowledge/scanner.js.map +1 -0
  236. package/dist/knowledge/store.d.ts +23 -0
  237. package/dist/knowledge/store.d.ts.map +1 -0
  238. package/dist/knowledge/store.js +86 -0
  239. package/dist/knowledge/store.js.map +1 -0
  240. package/dist/knowledge/types.d.ts +288 -0
  241. package/dist/knowledge/types.d.ts.map +1 -0
  242. package/dist/knowledge/types.js +111 -0
  243. package/dist/knowledge/types.js.map +1 -0
  244. package/dist/linear/index.d.ts +3 -0
  245. package/dist/linear/index.d.ts.map +1 -0
  246. package/dist/linear/index.js +3 -0
  247. package/dist/linear/index.js.map +1 -0
  248. package/dist/linear/linear.d.ts +160 -0
  249. package/dist/linear/linear.d.ts.map +1 -0
  250. package/dist/linear/linear.js +983 -0
  251. package/dist/linear/linear.js.map +1 -0
  252. package/dist/linear/projectUpdater.d.ts +23 -0
  253. package/dist/linear/projectUpdater.d.ts.map +1 -0
  254. package/dist/linear/projectUpdater.js +347 -0
  255. package/dist/linear/projectUpdater.js.map +1 -0
  256. package/dist/locale/en.d.ts +3 -0
  257. package/dist/locale/en.d.ts.map +1 -0
  258. package/dist/locale/en.js +436 -0
  259. package/dist/locale/en.js.map +1 -0
  260. package/dist/locale/index.d.ts +28 -0
  261. package/dist/locale/index.d.ts.map +1 -0
  262. package/dist/locale/index.js +89 -0
  263. package/dist/locale/index.js.map +1 -0
  264. package/dist/locale/ko.d.ts +3 -0
  265. package/dist/locale/ko.d.ts.map +1 -0
  266. package/dist/locale/ko.js +436 -0
  267. package/dist/locale/ko.js.map +1 -0
  268. package/dist/locale/prompts/en.d.ts +3 -0
  269. package/dist/locale/prompts/en.d.ts.map +1 -0
  270. package/dist/locale/prompts/en.js +278 -0
  271. package/dist/locale/prompts/en.js.map +1 -0
  272. package/dist/locale/prompts/ko.d.ts +3 -0
  273. package/dist/locale/prompts/ko.d.ts.map +1 -0
  274. package/dist/locale/prompts/ko.js +279 -0
  275. package/dist/locale/prompts/ko.js.map +1 -0
  276. package/dist/locale/types.d.ts +407 -0
  277. package/dist/locale/types.d.ts.map +1 -0
  278. package/dist/locale/types.js +5 -0
  279. package/dist/locale/types.js.map +1 -0
  280. package/dist/memory/codex.d.ts +93 -0
  281. package/dist/memory/codex.d.ts.map +1 -0
  282. package/dist/memory/codex.js +366 -0
  283. package/dist/memory/codex.js.map +1 -0
  284. package/dist/memory/compaction.d.ts +21 -0
  285. package/dist/memory/compaction.d.ts.map +1 -0
  286. package/dist/memory/compaction.js +205 -0
  287. package/dist/memory/compaction.js.map +1 -0
  288. package/dist/memory/index.d.ts +13 -0
  289. package/dist/memory/index.d.ts.map +1 -0
  290. package/dist/memory/index.js +13 -0
  291. package/dist/memory/index.js.map +1 -0
  292. package/dist/memory/memoryCore.d.ts +178 -0
  293. package/dist/memory/memoryCore.d.ts.map +1 -0
  294. package/dist/memory/memoryCore.js +623 -0
  295. package/dist/memory/memoryCore.js.map +1 -0
  296. package/dist/memory/memoryOps.d.ts +90 -0
  297. package/dist/memory/memoryOps.d.ts.map +1 -0
  298. package/dist/memory/memoryOps.js +606 -0
  299. package/dist/memory/memoryOps.js.map +1 -0
  300. package/dist/orchestration/conflictDetector.d.ts +15 -0
  301. package/dist/orchestration/conflictDetector.d.ts.map +1 -0
  302. package/dist/orchestration/conflictDetector.js +130 -0
  303. package/dist/orchestration/conflictDetector.js.map +1 -0
  304. package/dist/orchestration/decisionEngine.d.ts +177 -0
  305. package/dist/orchestration/decisionEngine.d.ts.map +1 -0
  306. package/dist/orchestration/decisionEngine.js +496 -0
  307. package/dist/orchestration/decisionEngine.js.map +1 -0
  308. package/dist/orchestration/index.d.ts +5 -0
  309. package/dist/orchestration/index.d.ts.map +1 -0
  310. package/dist/orchestration/index.js +5 -0
  311. package/dist/orchestration/index.js.map +1 -0
  312. package/dist/orchestration/taskParser.d.ts +67 -0
  313. package/dist/orchestration/taskParser.d.ts.map +1 -0
  314. package/dist/orchestration/taskParser.js +542 -0
  315. package/dist/orchestration/taskParser.js.map +1 -0
  316. package/dist/orchestration/taskScheduler.d.ts +141 -0
  317. package/dist/orchestration/taskScheduler.d.ts.map +1 -0
  318. package/dist/orchestration/taskScheduler.js +317 -0
  319. package/dist/orchestration/taskScheduler.js.map +1 -0
  320. package/dist/orchestration/workflow.d.ts +145 -0
  321. package/dist/orchestration/workflow.d.ts.map +1 -0
  322. package/dist/orchestration/workflow.js +301 -0
  323. package/dist/orchestration/workflow.js.map +1 -0
  324. package/dist/runners/cliRunner.d.ts +11 -0
  325. package/dist/runners/cliRunner.d.ts.map +1 -0
  326. package/dist/runners/cliRunner.js +194 -0
  327. package/dist/runners/cliRunner.js.map +1 -0
  328. package/dist/support/apiCache.d.ts +85 -0
  329. package/dist/support/apiCache.d.ts.map +1 -0
  330. package/dist/support/apiCache.js +163 -0
  331. package/dist/support/apiCache.js.map +1 -0
  332. package/dist/support/chat.d.ts +3 -0
  333. package/dist/support/chat.d.ts.map +1 -0
  334. package/dist/support/chat.js +304 -0
  335. package/dist/support/chat.js.map +1 -0
  336. package/dist/support/chatBackend.d.ts +25 -0
  337. package/dist/support/chatBackend.d.ts.map +1 -0
  338. package/dist/support/chatBackend.js +235 -0
  339. package/dist/support/chatBackend.js.map +1 -0
  340. package/dist/support/chatMemory.d.ts +71 -0
  341. package/dist/support/chatMemory.d.ts.map +1 -0
  342. package/dist/support/chatMemory.js +119 -0
  343. package/dist/support/chatMemory.js.map +1 -0
  344. package/dist/support/chatTui.d.ts +3 -0
  345. package/dist/support/chatTui.d.ts.map +1 -0
  346. package/dist/support/chatTui.js +998 -0
  347. package/dist/support/chatTui.js.map +1 -0
  348. package/dist/support/costTracker.d.ts +29 -0
  349. package/dist/support/costTracker.d.ts.map +1 -0
  350. package/dist/support/costTracker.js +113 -0
  351. package/dist/support/costTracker.js.map +1 -0
  352. package/dist/support/dashboardHtml.d.ts +3 -0
  353. package/dist/support/dashboardHtml.d.ts.map +1 -0
  354. package/dist/support/dashboardHtml.js +2070 -0
  355. package/dist/support/dashboardHtml.js.map +1 -0
  356. package/dist/support/delete-beliefs.d.ts +2 -0
  357. package/dist/support/delete-beliefs.d.ts.map +1 -0
  358. package/dist/support/delete-beliefs.js +34 -0
  359. package/dist/support/delete-beliefs.js.map +1 -0
  360. package/dist/support/dev.d.ts +55 -0
  361. package/dist/support/dev.d.ts.map +1 -0
  362. package/dist/support/dev.js +298 -0
  363. package/dist/support/dev.js.map +1 -0
  364. package/dist/support/editParser.d.ts +37 -0
  365. package/dist/support/editParser.d.ts.map +1 -0
  366. package/dist/support/editParser.js +365 -0
  367. package/dist/support/editParser.js.map +1 -0
  368. package/dist/support/gitStatus.d.ts +21 -0
  369. package/dist/support/gitStatus.d.ts.map +1 -0
  370. package/dist/support/gitStatus.js +108 -0
  371. package/dist/support/gitStatus.js.map +1 -0
  372. package/dist/support/gitTracker.d.ts +30 -0
  373. package/dist/support/gitTracker.d.ts.map +1 -0
  374. package/dist/support/gitTracker.js +143 -0
  375. package/dist/support/gitTracker.js.map +1 -0
  376. package/dist/support/index.d.ts +13 -0
  377. package/dist/support/index.d.ts.map +1 -0
  378. package/dist/support/index.js +13 -0
  379. package/dist/support/index.js.map +1 -0
  380. package/dist/support/planner.d.ts +58 -0
  381. package/dist/support/planner.d.ts.map +1 -0
  382. package/dist/support/planner.js +395 -0
  383. package/dist/support/planner.js.map +1 -0
  384. package/dist/support/projectMapper.d.ts +46 -0
  385. package/dist/support/projectMapper.d.ts.map +1 -0
  386. package/dist/support/projectMapper.js +259 -0
  387. package/dist/support/projectMapper.js.map +1 -0
  388. package/dist/support/quotaTracker.d.ts +29 -0
  389. package/dist/support/quotaTracker.d.ts.map +1 -0
  390. package/dist/support/quotaTracker.js +89 -0
  391. package/dist/support/quotaTracker.js.map +1 -0
  392. package/dist/support/rateLimiter.d.ts +101 -0
  393. package/dist/support/rateLimiter.d.ts.map +1 -0
  394. package/dist/support/rateLimiter.js +219 -0
  395. package/dist/support/rateLimiter.js.map +1 -0
  396. package/dist/support/rollback.d.ts +61 -0
  397. package/dist/support/rollback.d.ts.map +1 -0
  398. package/dist/support/rollback.js +328 -0
  399. package/dist/support/rollback.js.map +1 -0
  400. package/dist/support/stuckDetector.d.ts +68 -0
  401. package/dist/support/stuckDetector.d.ts.map +1 -0
  402. package/dist/support/stuckDetector.js +174 -0
  403. package/dist/support/stuckDetector.js.map +1 -0
  404. package/dist/support/timeWindow.d.ts +60 -0
  405. package/dist/support/timeWindow.d.ts.map +1 -0
  406. package/dist/support/timeWindow.js +236 -0
  407. package/dist/support/timeWindow.js.map +1 -0
  408. package/dist/support/web.d.ts +11 -0
  409. package/dist/support/web.d.ts.map +1 -0
  410. package/dist/support/web.js +938 -0
  411. package/dist/support/web.js.map +1 -0
  412. package/dist/support/workflowLinear.d.ts +99 -0
  413. package/dist/support/workflowLinear.d.ts.map +1 -0
  414. package/dist/support/workflowLinear.js +257 -0
  415. package/dist/support/workflowLinear.js.map +1 -0
  416. package/dist/support/worktreeManager.d.ts +20 -0
  417. package/dist/support/worktreeManager.d.ts.map +1 -0
  418. package/dist/support/worktreeManager.js +144 -0
  419. package/dist/support/worktreeManager.js.map +1 -0
  420. package/dist/taskState/store.d.ts +101 -0
  421. package/dist/taskState/store.d.ts.map +1 -0
  422. package/dist/taskState/store.js +346 -0
  423. package/dist/taskState/store.js.map +1 -0
  424. package/package.json +70 -0
  425. package/templates/AGENTS.md +432 -0
  426. package/templates/BOOT.md +25 -0
  427. package/templates/BOOTSTRAP.md +50 -0
  428. package/templates/CHANGELOG_AUDIT.md +74 -0
  429. package/templates/HEARTBEAT.md +86 -0
  430. package/templates/IDENTITY.md +27 -0
  431. package/templates/ISSUE_ANALYSIS.md +31 -0
  432. package/templates/PR_LAND.md +75 -0
  433. package/templates/PR_REVIEW.md +97 -0
  434. package/templates/SOUL.dev.md +52 -0
  435. package/templates/SOUL.md +81 -0
  436. package/templates/TOOLS.md +52 -0
  437. package/templates/USER.md +22 -0
@@ -0,0 +1,262 @@
1
+ // ============================================
2
+ // OpenSwarm - Knowledge Graph
3
+ // In-memory graph with adjacency list + traversal
4
+ // ============================================
5
+ // KnowledgeGraph Class
6
+ export class KnowledgeGraph {
7
+ nodes = new Map();
8
+ edges = [];
9
+ // Adjacency list: nodeId → outgoing edges
10
+ adjacency = new Map();
11
+ // Reverse adjacency list: nodeId → incoming edges
12
+ reverseAdjacency = new Map();
13
+ projectSlug;
14
+ projectPath;
15
+ scannedAt = 0;
16
+ constructor(projectSlug, projectPath) {
17
+ this.projectSlug = projectSlug;
18
+ this.projectPath = projectPath;
19
+ }
20
+ // ============================================
21
+ // Node Operations
22
+ // ============================================
23
+ addNode(node) {
24
+ this.nodes.set(node.id, node);
25
+ if (!this.adjacency.has(node.id)) {
26
+ this.adjacency.set(node.id, []);
27
+ }
28
+ if (!this.reverseAdjacency.has(node.id)) {
29
+ this.reverseAdjacency.set(node.id, []);
30
+ }
31
+ }
32
+ getNode(id) {
33
+ return this.nodes.get(id);
34
+ }
35
+ hasNode(id) {
36
+ return this.nodes.has(id);
37
+ }
38
+ removeNode(id) {
39
+ this.nodes.delete(id);
40
+ // Remove related edges
41
+ this.edges = this.edges.filter(e => e.source !== id && e.target !== id);
42
+ this.adjacency.delete(id);
43
+ this.reverseAdjacency.delete(id);
44
+ // Also remove from other nodes' adjacency lists
45
+ for (const [key, edges] of this.adjacency) {
46
+ const filtered = edges.filter(e => e.target !== id);
47
+ if (filtered.length !== edges.length)
48
+ this.adjacency.set(key, filtered);
49
+ }
50
+ for (const [key, edges] of this.reverseAdjacency) {
51
+ const filtered = edges.filter(e => e.source !== id);
52
+ if (filtered.length !== edges.length)
53
+ this.reverseAdjacency.set(key, filtered);
54
+ }
55
+ }
56
+ getAllNodes() {
57
+ return Array.from(this.nodes.values());
58
+ }
59
+ getNodesByType(type) {
60
+ return this.getAllNodes().filter(n => n.type === type);
61
+ }
62
+ // ============================================
63
+ // Edge Operations
64
+ // ============================================
65
+ addEdge(edge) {
66
+ // Prevent duplicates
67
+ const exists = this.edges.some(e => e.source === edge.source && e.target === edge.target && e.type === edge.type);
68
+ if (exists)
69
+ return;
70
+ this.edges.push(edge);
71
+ const outEdges = this.adjacency.get(edge.source);
72
+ if (outEdges)
73
+ outEdges.push(edge);
74
+ else
75
+ this.adjacency.set(edge.source, [edge]);
76
+ const inEdges = this.reverseAdjacency.get(edge.target);
77
+ if (inEdges)
78
+ inEdges.push(edge);
79
+ else
80
+ this.reverseAdjacency.set(edge.target, [edge]);
81
+ }
82
+ getAllEdges() {
83
+ return this.edges;
84
+ }
85
+ /** Remove only specified edge types from a node's outgoing edges (with adjacency sync) */
86
+ removeOutgoingEdges(nodeId, types) {
87
+ const typeSet = new Set(types);
88
+ // Collect removal targets
89
+ const toRemove = this.edges.filter(e => e.source === nodeId && typeSet.has(e.type));
90
+ if (toRemove.length === 0)
91
+ return;
92
+ // Remove from main edge array
93
+ this.edges = this.edges.filter(e => !(e.source === nodeId && typeSet.has(e.type)));
94
+ // Sync adjacency map
95
+ const outEdges = this.adjacency.get(nodeId);
96
+ if (outEdges) {
97
+ this.adjacency.set(nodeId, outEdges.filter(e => !typeSet.has(e.type)));
98
+ }
99
+ // Sync reverseAdjacency map: remove incoming edges from removed edges' targets
100
+ for (const edge of toRemove) {
101
+ const inEdges = this.reverseAdjacency.get(edge.target);
102
+ if (inEdges) {
103
+ this.reverseAdjacency.set(edge.target, inEdges.filter(e => !(e.source === nodeId && typeSet.has(e.type))));
104
+ }
105
+ }
106
+ }
107
+ // ============================================
108
+ // Traversal Queries
109
+ // ============================================
110
+ /** Child nodes contained by a specific node (contains edges) */
111
+ getChildren(nodeId) {
112
+ const outEdges = this.adjacency.get(nodeId) ?? [];
113
+ return outEdges
114
+ .filter(e => e.type === 'contains')
115
+ .map(e => this.nodes.get(e.target))
116
+ .filter((n) => n !== undefined);
117
+ }
118
+ /** Modules imported by a specific module */
119
+ getImports(nodeId) {
120
+ const outEdges = this.adjacency.get(nodeId) ?? [];
121
+ return outEdges
122
+ .filter(e => e.type === 'imports')
123
+ .map(e => this.nodes.get(e.target))
124
+ .filter((n) => n !== undefined);
125
+ }
126
+ /** Modules that import a specific module (reverse direction) */
127
+ getDependents(nodeId) {
128
+ const inEdges = this.reverseAdjacency.get(nodeId) ?? [];
129
+ return inEdges
130
+ .filter(e => e.type === 'imports')
131
+ .map(e => this.nodes.get(e.source))
132
+ .filter((n) => n !== undefined);
133
+ }
134
+ /** Test files for a specific module */
135
+ getTests(nodeId) {
136
+ const inEdges = this.reverseAdjacency.get(nodeId) ?? [];
137
+ return inEdges
138
+ .filter(e => e.type === 'tests')
139
+ .map(e => this.nodes.get(e.source))
140
+ .filter((n) => n !== undefined);
141
+ }
142
+ /** Modules tested by a specific test file */
143
+ getTestedModules(testNodeId) {
144
+ const outEdges = this.adjacency.get(testNodeId) ?? [];
145
+ return outEdges
146
+ .filter(e => e.type === 'tests')
147
+ .map(e => this.nodes.get(e.target))
148
+ .filter((n) => n !== undefined);
149
+ }
150
+ /** Nodes connected by a specific edge type */
151
+ getConnected(nodeId, edgeType, direction = 'outgoing') {
152
+ const edgeList = direction === 'outgoing'
153
+ ? (this.adjacency.get(nodeId) ?? [])
154
+ : (this.reverseAdjacency.get(nodeId) ?? []);
155
+ return edgeList
156
+ .filter(e => e.type === edgeType)
157
+ .map(e => this.nodes.get(direction === 'outgoing' ? e.target : e.source))
158
+ .filter((n) => n !== undefined);
159
+ }
160
+ /** Transitive dependency traversal (BFS) */
161
+ getTransitiveDependents(nodeId, maxDepth = 5) {
162
+ const visited = new Set();
163
+ const result = [];
164
+ const queue = [{ id: nodeId, depth: 0 }];
165
+ while (queue.length > 0) {
166
+ const { id, depth } = queue.shift();
167
+ if (visited.has(id) || depth > maxDepth)
168
+ continue;
169
+ visited.add(id);
170
+ const dependents = this.getDependents(id);
171
+ for (const dep of dependents) {
172
+ if (!visited.has(dep.id)) {
173
+ result.push(dep);
174
+ queue.push({ id: dep.id, depth: depth + 1 });
175
+ }
176
+ }
177
+ }
178
+ return result;
179
+ }
180
+ // ============================================
181
+ // Analysis Queries
182
+ // ============================================
183
+ /** Search by module name or path segment */
184
+ findModules(query) {
185
+ const lower = query.toLowerCase();
186
+ return this.getAllNodes().filter(n => (n.type === 'module' || n.type === 'test_file') &&
187
+ (n.id.toLowerCase().includes(lower) || n.name.toLowerCase().includes(lower)));
188
+ }
189
+ /** Build project summary */
190
+ buildSummary() {
191
+ const modules = this.getNodesByType('module');
192
+ const testFiles = this.getNodesByType('test_file');
193
+ // Hot modules: top 5 by churn score
194
+ const hotModules = modules
195
+ .filter(m => m.gitInfo?.churnScore !== undefined)
196
+ .sort((a, b) => (b.gitInfo?.churnScore ?? 0) - (a.gitInfo?.churnScore ?? 0))
197
+ .slice(0, 5)
198
+ .map(m => m.id);
199
+ // Untested modules: modules with no test edges
200
+ const testedModuleIds = new Set(this.edges
201
+ .filter(e => e.type === 'tests')
202
+ .map(e => e.target));
203
+ const untestedModules = modules
204
+ .filter(m => !testedModuleIds.has(m.id))
205
+ .map(m => m.id);
206
+ // Average churn score
207
+ const churnScores = modules
208
+ .map(m => m.gitInfo?.churnScore ?? 0)
209
+ .filter(s => s > 0);
210
+ const avgChurnScore = churnScores.length > 0
211
+ ? churnScores.reduce((a, b) => a + b, 0) / churnScores.length
212
+ : 0;
213
+ return {
214
+ totalModules: modules.length,
215
+ totalTestFiles: testFiles.length,
216
+ hotModules,
217
+ untestedModules,
218
+ avgChurnScore: Math.round(avgChurnScore * 1000) / 1000,
219
+ };
220
+ }
221
+ // ============================================
222
+ // Serialization
223
+ // ============================================
224
+ serialize() {
225
+ return {
226
+ version: 1,
227
+ projectSlug: this.projectSlug,
228
+ projectPath: this.projectPath,
229
+ scannedAt: this.scannedAt,
230
+ nodes: this.getAllNodes(),
231
+ edges: this.getAllEdges(),
232
+ summary: this.buildSummary(),
233
+ };
234
+ }
235
+ static deserialize(data) {
236
+ const graph = new KnowledgeGraph(data.projectSlug, data.projectPath);
237
+ graph.scannedAt = data.scannedAt;
238
+ for (const node of data.nodes) {
239
+ graph.addNode(node);
240
+ }
241
+ for (const edge of data.edges) {
242
+ graph.addEdge(edge);
243
+ }
244
+ return graph;
245
+ }
246
+ // ============================================
247
+ // Utilities
248
+ // ============================================
249
+ clear() {
250
+ this.nodes.clear();
251
+ this.edges = [];
252
+ this.adjacency.clear();
253
+ this.reverseAdjacency.clear();
254
+ }
255
+ get nodeCount() {
256
+ return this.nodes.size;
257
+ }
258
+ get edgeCount() {
259
+ return this.edges.length;
260
+ }
261
+ }
262
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/knowledge/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { KnowledgeGraph } from './graph.js';
2
+ export interface RepoSnapshot {
3
+ schemaVersion: 1;
4
+ projectName: string;
5
+ projectPath: string;
6
+ scannedAt: string;
7
+ project: {
8
+ totalModules: number;
9
+ totalTests: number;
10
+ languages: {
11
+ language: string;
12
+ count: number;
13
+ loc: number;
14
+ }[];
15
+ layers: {
16
+ layer: string;
17
+ count: number;
18
+ modules: string[];
19
+ }[];
20
+ summary: {
21
+ avgChurnScore: number;
22
+ hotModules: string[];
23
+ untestedModules: string[];
24
+ stableCount: number;
25
+ experimentalCount: number;
26
+ deprecatedCount: number;
27
+ };
28
+ };
29
+ modules: {
30
+ id: string;
31
+ path: string;
32
+ name: string;
33
+ type: string;
34
+ layer: string;
35
+ language: string;
36
+ loc: number;
37
+ exports: number;
38
+ imports: number;
39
+ dependsOn: string[];
40
+ dependedBy: string[];
41
+ tests: string[];
42
+ churnScore: number | null;
43
+ commitCount30d: number | null;
44
+ lastCommitDate: string | null;
45
+ state: string | null;
46
+ techDebt: number | null;
47
+ isEntrypoint: boolean;
48
+ isHotspot: boolean;
49
+ risk: string;
50
+ }[];
51
+ circularDeps: {
52
+ modules: string[];
53
+ length: number;
54
+ }[];
55
+ }
56
+ export declare function buildSnapshot(graph: KnowledgeGraph, projectPath: string): RepoSnapshot;
57
+ export declare function exportRepoGraph(graph: KnowledgeGraph, projectPath: string): {
58
+ schemaPath: string;
59
+ snapshotPath: string;
60
+ };
61
+ export declare function hasRepoSnapshot(projectPath: string): boolean;
62
+ export declare function loadRepoSnapshot(projectPath: string): RepoSnapshot | null;
63
+ export declare function snapshotAgeMinutes(projectPath: string): number | null;
64
+ //# sourceMappingURL=graphqlExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphqlExporter.d.ts","sourceRoot":"","sources":["../../src/knowledge/graphqlExporter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgMjD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC9D,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAC;QAC9D,OAAO,EAAE;YACP,aAAa,EAAE,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,eAAe,EAAE,MAAM,EAAE,CAAC;YAC1B,WAAW,EAAE,MAAM,CAAC;YACpB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,eAAe,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;IAEF,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IAEJ,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAoHtF;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAiBA;AAGD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE5D;AAGD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQzE;AAGD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrE"}
@@ -0,0 +1,333 @@
1
+ // OpenSwarm - GraphQL Schema Exporter
2
+ // KnowledgeGraph → .openswarm/repo.graphql + repo-snapshot.json
3
+ // 에이전트가 컨텍스트 윈도우 없이도 저장소를 완전히 이해할 수 있는 정적 파일 생성
4
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ // GraphQL 스키마 (고정 — 데이터 구조 정의)
7
+ const REPO_SCHEMA = `# OpenSwarm Repository Graph Schema
8
+ # 에이전트가 저장소를 이해하기 위한 정적 스키마
9
+ # 데이터: repo-snapshot.json
10
+
11
+ type Query {
12
+ project: Project!
13
+ module(id: ID!): Module
14
+ modules(layer: ArchLayer, language: Language): [Module!]!
15
+ entrypoints: [Module!]!
16
+ hotspots(limit: Int = 5): [Module!]!
17
+ untested: [Module!]!
18
+ circularDeps: [Cycle!]!
19
+ impactOf(moduleId: ID!): Impact!
20
+ }
21
+
22
+ type Project {
23
+ name: String!
24
+ path: String!
25
+ scannedAt: String!
26
+ totalModules: Int!
27
+ totalTests: Int!
28
+ languages: [LanguageBreakdown!]!
29
+ layers: [LayerBreakdown!]!
30
+ summary: ProjectSummary!
31
+ }
32
+
33
+ type Module {
34
+ id: ID!
35
+ path: String!
36
+ name: String!
37
+ type: NodeType!
38
+ layer: ArchLayer
39
+ language: Language!
40
+ loc: Int!
41
+ exports: Int!
42
+ imports: Int!
43
+ dependsOn: [Module!]!
44
+ dependedBy: [Module!]!
45
+ tests: [Module!]!
46
+ churnScore: Float
47
+ commitCount30d: Int
48
+ lastCommitDate: String
49
+ state: ModuleState
50
+ techDebt: Float
51
+ isEntrypoint: Boolean!
52
+ isHotspot: Boolean!
53
+ risk: RiskLevel!
54
+ }
55
+
56
+ type Impact {
57
+ direct: [Module!]!
58
+ transitive: [Module!]!
59
+ affectedTests: [Module!]!
60
+ scope: Scope!
61
+ }
62
+
63
+ type Cycle {
64
+ modules: [ID!]!
65
+ length: Int!
66
+ }
67
+
68
+ type ProjectSummary {
69
+ avgChurnScore: Float!
70
+ hotModules: [ID!]!
71
+ untestedModules: [ID!]!
72
+ stableCount: Int!
73
+ experimentalCount: Int!
74
+ deprecatedCount: Int!
75
+ }
76
+
77
+ type LanguageBreakdown {
78
+ language: Language!
79
+ count: Int!
80
+ loc: Int!
81
+ }
82
+
83
+ type LayerBreakdown {
84
+ layer: ArchLayer!
85
+ count: Int!
86
+ modules: [ID!]!
87
+ }
88
+
89
+ enum NodeType { PROJECT DIRECTORY MODULE TEST_FILE }
90
+ enum Language { TYPESCRIPT PYTHON OTHER }
91
+ enum ArchLayer { CORE AGENT ADAPTER AUTOMATION SUPPORT KNOWLEDGE ORCHESTRATION LINEAR DISCORD CLI LOCALE MEMORY TEST OTHER }
92
+ enum ModuleState { STABLE EXPERIMENTAL DEPRECATED LEGACY PLANNED }
93
+ enum RiskLevel { LOW MEDIUM HIGH }
94
+ enum Scope { SMALL MEDIUM LARGE }
95
+ `;
96
+ // 아키텍처 레이어 추론
97
+ function inferLayer(modulePath) {
98
+ const segments = modulePath.split('/');
99
+ const layerMap = {
100
+ core: 'CORE',
101
+ agents: 'AGENT',
102
+ adapters: 'ADAPTER',
103
+ automation: 'AUTOMATION',
104
+ support: 'SUPPORT',
105
+ knowledge: 'KNOWLEDGE',
106
+ orchestration: 'ORCHESTRATION',
107
+ linear: 'LINEAR',
108
+ discord: 'DISCORD',
109
+ cli: 'CLI',
110
+ locale: 'LOCALE',
111
+ memory: 'MEMORY',
112
+ runners: 'CLI',
113
+ taskState: 'CORE',
114
+ __tests__: 'TEST',
115
+ };
116
+ for (const seg of segments) {
117
+ if (layerMap[seg])
118
+ return layerMap[seg];
119
+ }
120
+ return 'OTHER';
121
+ }
122
+ // 리스크 계산
123
+ function computeRisk(node, hasTests, dependentCount) {
124
+ const churn = node.gitInfo?.churnScore ?? 0;
125
+ const loc = node.metrics?.loc ?? 0;
126
+ if ((churn > 0.5 && !hasTests) || (dependentCount >= 5 && !hasTests))
127
+ return 'HIGH';
128
+ if (churn > 0.3 || dependentCount >= 3 || (loc > 200 && !hasTests))
129
+ return 'MEDIUM';
130
+ return 'LOW';
131
+ }
132
+ // 순환 의존성 탐지
133
+ function detectCycles(nodes, edges) {
134
+ const importEdges = edges.filter(e => e.type === 'imports');
135
+ const adj = new Map();
136
+ for (const e of importEdges) {
137
+ if (!adj.has(e.source))
138
+ adj.set(e.source, []);
139
+ adj.get(e.source).push(e.target);
140
+ }
141
+ const cycles = [];
142
+ const visited = new Set();
143
+ const stack = new Set();
144
+ const path = [];
145
+ function dfs(node) {
146
+ if (stack.has(node)) {
147
+ const cycleStart = path.indexOf(node);
148
+ if (cycleStart >= 0) {
149
+ cycles.push(path.slice(cycleStart));
150
+ }
151
+ return;
152
+ }
153
+ if (visited.has(node))
154
+ return;
155
+ visited.add(node);
156
+ stack.add(node);
157
+ path.push(node);
158
+ for (const next of adj.get(node) ?? []) {
159
+ dfs(next);
160
+ }
161
+ path.pop();
162
+ stack.delete(node);
163
+ }
164
+ for (const node of adj.keys()) {
165
+ dfs(node);
166
+ }
167
+ // 중복 사이클 제거 (정규화: 사전순 최소 시작)
168
+ const seen = new Set();
169
+ return cycles.filter(cycle => {
170
+ const minIdx = cycle.indexOf(cycle.slice().sort()[0]);
171
+ const normalized = [...cycle.slice(minIdx), ...cycle.slice(0, minIdx)].join('→');
172
+ if (seen.has(normalized))
173
+ return false;
174
+ seen.add(normalized);
175
+ return true;
176
+ });
177
+ }
178
+ // 진입점 탐지 (아무도 import하지 않는 모듈)
179
+ function findEntrypoints(nodes, edges) {
180
+ const imported = new Set(edges.filter(e => e.type === 'imports').map(e => e.target));
181
+ const entrypoints = new Set();
182
+ for (const node of nodes) {
183
+ if (node.type === 'module' && !imported.has(node.id)) {
184
+ entrypoints.add(node.id);
185
+ }
186
+ }
187
+ return entrypoints;
188
+ }
189
+ export function buildSnapshot(graph, projectPath) {
190
+ const allNodes = graph.getAllNodes();
191
+ const allEdges = graph.getAllEdges();
192
+ // Only include source files (src/, lib/, app/, etc.) — exclude node_modules artifacts, cache, models
193
+ const SOURCE_PREFIXES = ['src/', 'lib/', 'app/', 'packages/', 'test/', 'tests/', 'scripts/'];
194
+ const isSourceFile = (path) => SOURCE_PREFIXES.some(p => path.startsWith(p)) || !path.includes('/');
195
+ const moduleNodes = allNodes.filter((n) => (n.type === 'module' || n.type === 'test_file') && isSourceFile(n.path));
196
+ const moduleIds = new Set(moduleNodes.map(n => n.id));
197
+ const importEdges = allEdges.filter((e) => e.type === 'imports' && moduleIds.has(e.source));
198
+ const testEdges = allEdges.filter((e) => e.type === 'tests' && moduleIds.has(e.source));
199
+ const summary = graph.buildSummary();
200
+ // 의존성 맵 구축
201
+ const dependsOnMap = new Map();
202
+ const dependedByMap = new Map();
203
+ for (const e of importEdges) {
204
+ if (!dependsOnMap.has(e.source))
205
+ dependsOnMap.set(e.source, []);
206
+ dependsOnMap.get(e.source).push(e.target);
207
+ if (!dependedByMap.has(e.target))
208
+ dependedByMap.set(e.target, []);
209
+ dependedByMap.get(e.target).push(e.source);
210
+ }
211
+ // 테스트 맵
212
+ const testsMap = new Map();
213
+ for (const e of testEdges) {
214
+ if (!testsMap.has(e.target))
215
+ testsMap.set(e.target, []);
216
+ testsMap.get(e.target).push(e.source);
217
+ }
218
+ const entrypoints = findEntrypoints(moduleNodes, importEdges);
219
+ const hotModulesSet = new Set(summary.hotModules);
220
+ const sourceEdges = allEdges.filter((e) => moduleIds.has(e.source) && moduleIds.has(e.target));
221
+ const cycles = detectCycles(moduleNodes, sourceEdges);
222
+ // 언어 통계
223
+ const langStats = new Map();
224
+ for (const n of moduleNodes) {
225
+ const lang = (n.metrics?.language ?? 'other').toUpperCase();
226
+ const cur = langStats.get(lang) ?? { count: 0, loc: 0 };
227
+ cur.count++;
228
+ cur.loc += n.metrics?.loc ?? 0;
229
+ langStats.set(lang, cur);
230
+ }
231
+ // 레이어 통계
232
+ const layerStats = new Map();
233
+ for (const n of moduleNodes) {
234
+ const layer = inferLayer(n.path);
235
+ const cur = layerStats.get(layer) ?? { count: 0, modules: [] };
236
+ cur.count++;
237
+ cur.modules.push(n.id);
238
+ layerStats.set(layer, cur);
239
+ }
240
+ const projectName = projectPath.split('/').pop() ?? 'unknown';
241
+ return {
242
+ schemaVersion: 1,
243
+ projectName,
244
+ projectPath,
245
+ scannedAt: new Date(graph.scannedAt).toISOString(),
246
+ project: {
247
+ totalModules: summary.totalModules,
248
+ totalTests: summary.totalTestFiles,
249
+ languages: Array.from(langStats.entries()).map(([language, stats]) => ({
250
+ language, ...stats,
251
+ })),
252
+ layers: Array.from(layerStats.entries()).map(([layer, stats]) => ({
253
+ layer, count: stats.count, modules: stats.modules,
254
+ })),
255
+ summary: {
256
+ avgChurnScore: summary.avgChurnScore,
257
+ hotModules: summary.hotModules,
258
+ untestedModules: summary.untestedModules,
259
+ stableCount: summary.stableModules ?? 0,
260
+ experimentalCount: summary.experimentalModules ?? 0,
261
+ deprecatedCount: summary.deprecatedModules ?? 0,
262
+ },
263
+ },
264
+ modules: moduleNodes.map(n => {
265
+ const deps = dependsOnMap.get(n.id) ?? [];
266
+ const depBy = dependedByMap.get(n.id) ?? [];
267
+ const tests = testsMap.get(n.id) ?? [];
268
+ return {
269
+ id: n.id,
270
+ path: n.path,
271
+ name: n.name,
272
+ type: n.type.toUpperCase(),
273
+ layer: inferLayer(n.path),
274
+ language: (n.metrics?.language ?? 'other').toUpperCase(),
275
+ loc: n.metrics?.loc ?? 0,
276
+ exports: n.metrics?.exportCount ?? 0,
277
+ imports: n.metrics?.importCount ?? 0,
278
+ dependsOn: deps.filter(d => !d.startsWith('pkg:')),
279
+ dependedBy: depBy,
280
+ tests,
281
+ churnScore: n.gitInfo?.churnScore ?? null,
282
+ commitCount30d: n.gitInfo?.commitCount30d ?? null,
283
+ lastCommitDate: n.gitInfo?.lastCommitDate
284
+ ? new Date(n.gitInfo.lastCommitDate).toISOString()
285
+ : null,
286
+ state: n.metadata?.state ?? null,
287
+ techDebt: n.metadata?.techDebt ?? null,
288
+ isEntrypoint: entrypoints.has(n.id),
289
+ isHotspot: hotModulesSet.has(n.id),
290
+ risk: computeRisk(n, tests.length > 0, depBy.length),
291
+ };
292
+ }),
293
+ circularDeps: cycles.map(c => ({ modules: c, length: c.length })),
294
+ };
295
+ }
296
+ // .openswarm/ 디렉토리에 스키마 + 스냅샷 저장
297
+ export function exportRepoGraph(graph, projectPath) {
298
+ const dir = join(projectPath, '.openswarm');
299
+ if (!existsSync(dir)) {
300
+ mkdirSync(dir, { recursive: true });
301
+ }
302
+ const schemaPath = join(dir, 'repo.graphql');
303
+ const snapshotPath = join(dir, 'repo-snapshot.json');
304
+ writeFileSync(schemaPath, REPO_SCHEMA, 'utf8');
305
+ const snapshot = buildSnapshot(graph, projectPath);
306
+ writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf8');
307
+ console.log(`[Knowledge] Exported repo graph: ${schemaPath} (schema) + ${snapshotPath} (${snapshot.modules.length} modules, ${snapshot.circularDeps.length} cycles)`);
308
+ return { schemaPath, snapshotPath };
309
+ }
310
+ // 스냅샷이 존재하는지 확인
311
+ export function hasRepoSnapshot(projectPath) {
312
+ return existsSync(join(projectPath, '.openswarm', 'repo-snapshot.json'));
313
+ }
314
+ // 스냅샷 로드 (에이전트가 읽을 때)
315
+ export function loadRepoSnapshot(projectPath) {
316
+ const snapshotPath = join(projectPath, '.openswarm', 'repo-snapshot.json');
317
+ if (!existsSync(snapshotPath))
318
+ return null;
319
+ try {
320
+ return JSON.parse(readFileSync(snapshotPath, 'utf8'));
321
+ }
322
+ catch {
323
+ return null;
324
+ }
325
+ }
326
+ // 스냅샷 나이 확인 (분)
327
+ export function snapshotAgeMinutes(projectPath) {
328
+ const snapshot = loadRepoSnapshot(projectPath);
329
+ if (!snapshot)
330
+ return null;
331
+ return (Date.now() - new Date(snapshot.scannedAt).getTime()) / 60_000;
332
+ }
333
+ //# sourceMappingURL=graphqlExporter.js.map