@qotaq/lalphgram 0.1.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 (517) hide show
  1. package/Events/package.json +6 -0
  2. package/LICENSE +21 -0
  3. package/Main/package.json +6 -0
  4. package/README.md +1 -0
  5. package/dist/cjs/Events.js +55 -0
  6. package/dist/cjs/Events.js.map +1 -0
  7. package/dist/cjs/LalphMain.js +59 -0
  8. package/dist/cjs/LalphMain.js.map +1 -0
  9. package/dist/cjs/Main.js +115 -0
  10. package/dist/cjs/Main.js.map +1 -0
  11. package/dist/cjs/index.js +281 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/lib/AnalysisPrompts.js +61 -0
  14. package/dist/cjs/lib/AnalysisPrompts.js.map +1 -0
  15. package/dist/cjs/lib/BranchParser.js +45 -0
  16. package/dist/cjs/lib/BranchParser.js.map +1 -0
  17. package/dist/cjs/lib/MermaidToPlantUml.js +96 -0
  18. package/dist/cjs/lib/MermaidToPlantUml.js.map +1 -0
  19. package/dist/cjs/lib/SpecHtmlGenerator.js +160 -0
  20. package/dist/cjs/lib/SpecHtmlGenerator.js.map +1 -0
  21. package/dist/cjs/lib/StreamJsonParser.js +88 -0
  22. package/dist/cjs/lib/StreamJsonParser.js.map +1 -0
  23. package/dist/cjs/lib/TelegramFormatter.js +122 -0
  24. package/dist/cjs/lib/TelegramFormatter.js.map +1 -0
  25. package/dist/cjs/lib/TelegraphHtml.js +65 -0
  26. package/dist/cjs/lib/TelegraphHtml.js.map +1 -0
  27. package/dist/cjs/lib/TelegraphMarkdown.js +346 -0
  28. package/dist/cjs/lib/TelegraphMarkdown.js.map +1 -0
  29. package/dist/cjs/schemas/CredentialSchemas.js +31 -0
  30. package/dist/cjs/schemas/CredentialSchemas.js.map +1 -0
  31. package/dist/cjs/schemas/GitHubSchemas.js +60 -0
  32. package/dist/cjs/schemas/GitHubSchemas.js.map +1 -0
  33. package/dist/cjs/schemas/LinearSchemas.js +63 -0
  34. package/dist/cjs/schemas/LinearSchemas.js.map +1 -0
  35. package/dist/cjs/schemas/ProjectSchemas.js +26 -0
  36. package/dist/cjs/schemas/ProjectSchemas.js.map +1 -0
  37. package/dist/cjs/schemas/TrackerSchemas.js +35 -0
  38. package/dist/cjs/schemas/TrackerSchemas.js.map +1 -0
  39. package/dist/cjs/services/AppContext.js +57 -0
  40. package/dist/cjs/services/AppContext.js.map +1 -0
  41. package/dist/cjs/services/AppRuntimeConfig.js +35 -0
  42. package/dist/cjs/services/AppRuntimeConfig.js.map +1 -0
  43. package/dist/cjs/services/AutoMerge.js +140 -0
  44. package/dist/cjs/services/AutoMerge.js.map +1 -0
  45. package/dist/cjs/services/ChatMachine.js +873 -0
  46. package/dist/cjs/services/ChatMachine.js.map +1 -0
  47. package/dist/cjs/services/CommentTimer.js +81 -0
  48. package/dist/cjs/services/CommentTimer.js.map +1 -0
  49. package/dist/cjs/services/CredentialStore.js +68 -0
  50. package/dist/cjs/services/CredentialStore.js.map +1 -0
  51. package/dist/cjs/services/CredentialWatcher.js +76 -0
  52. package/dist/cjs/services/CredentialWatcher.js.map +1 -0
  53. package/dist/cjs/services/Credentials.js +130 -0
  54. package/dist/cjs/services/Credentials.js.map +1 -0
  55. package/dist/cjs/services/EventLoop.js +203 -0
  56. package/dist/cjs/services/EventLoop.js.map +1 -0
  57. package/dist/cjs/services/GitHubClient/GitHubClient.js +236 -0
  58. package/dist/cjs/services/GitHubClient/GitHubClient.js.map +1 -0
  59. package/dist/cjs/services/GitHubClient/OctokitClient.js +329 -0
  60. package/dist/cjs/services/GitHubClient/OctokitClient.js.map +1 -0
  61. package/dist/cjs/services/GitHubClient.js +236 -0
  62. package/dist/cjs/services/GitHubClient.js.map +1 -0
  63. package/dist/cjs/services/GitHubEventSource.js +145 -0
  64. package/dist/cjs/services/GitHubEventSource.js.map +1 -0
  65. package/dist/cjs/services/GitHubIssueTracker.js +118 -0
  66. package/dist/cjs/services/GitHubIssueTracker.js.map +1 -0
  67. package/dist/cjs/services/LalphConfig.js +139 -0
  68. package/dist/cjs/services/LalphConfig.js.map +1 -0
  69. package/dist/cjs/services/LalphConfigReader.js +82 -0
  70. package/dist/cjs/services/LalphConfigReader.js.map +1 -0
  71. package/dist/cjs/services/LalphDirectory.js +45 -0
  72. package/dist/cjs/services/LalphDirectory.js.map +1 -0
  73. package/dist/cjs/services/LinearSdkClient.js +149 -0
  74. package/dist/cjs/services/LinearSdkClient.js.map +1 -0
  75. package/dist/cjs/services/LinearTracker.js +89 -0
  76. package/dist/cjs/services/LinearTracker.js.map +1 -0
  77. package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js +30 -0
  78. package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
  79. package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js +131 -0
  80. package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
  81. package/dist/cjs/services/MessengerAdapter/TelegramConfig.js +81 -0
  82. package/dist/cjs/services/MessengerAdapter/TelegramConfig.js.map +1 -0
  83. package/dist/cjs/services/MessengerAdapter.js +30 -0
  84. package/dist/cjs/services/MessengerAdapter.js.map +1 -0
  85. package/dist/cjs/services/OctokitClient.js +350 -0
  86. package/dist/cjs/services/OctokitClient.js.map +1 -0
  87. package/dist/cjs/services/PlanOverviewUploader.js +119 -0
  88. package/dist/cjs/services/PlanOverviewUploader.js.map +1 -0
  89. package/dist/cjs/services/PlanOverviewUploaderMap.js +25 -0
  90. package/dist/cjs/services/PlanOverviewUploaderMap.js.map +1 -0
  91. package/dist/cjs/services/PlanSession.js +489 -0
  92. package/dist/cjs/services/PlanSession.js.map +1 -0
  93. package/dist/cjs/services/ProjectStore.js +107 -0
  94. package/dist/cjs/services/ProjectStore.js.map +1 -0
  95. package/dist/cjs/services/PullRequestTracker.js +186 -0
  96. package/dist/cjs/services/PullRequestTracker.js.map +1 -0
  97. package/dist/cjs/services/SpecUploader.js +111 -0
  98. package/dist/cjs/services/SpecUploader.js.map +1 -0
  99. package/dist/cjs/services/SpecUploaderMap.js +25 -0
  100. package/dist/cjs/services/SpecUploaderMap.js.map +1 -0
  101. package/dist/cjs/services/TaskEventSource.js +58 -0
  102. package/dist/cjs/services/TaskEventSource.js.map +1 -0
  103. package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js +155 -0
  104. package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
  105. package/dist/cjs/services/TaskTracker/LinearSdkClient.js +149 -0
  106. package/dist/cjs/services/TaskTracker/LinearSdkClient.js.map +1 -0
  107. package/dist/cjs/services/TaskTracker/LinearTracker.js +126 -0
  108. package/dist/cjs/services/TaskTracker/LinearTracker.js.map +1 -0
  109. package/dist/cjs/services/TaskTracker/TaskTracker.js +20 -0
  110. package/dist/cjs/services/TaskTracker/TaskTracker.js.map +1 -0
  111. package/dist/cjs/services/TaskTracker/TrackerLayerMap.js +27 -0
  112. package/dist/cjs/services/TaskTracker/TrackerLayerMap.js.map +1 -0
  113. package/dist/cjs/services/TaskTracker/buildEventStream.js +55 -0
  114. package/dist/cjs/services/TaskTracker/buildEventStream.js.map +1 -0
  115. package/dist/cjs/services/TaskTracker.js +20 -0
  116. package/dist/cjs/services/TaskTracker.js.map +1 -0
  117. package/dist/cjs/services/TelegramAdapter.js +125 -0
  118. package/dist/cjs/services/TelegramAdapter.js.map +1 -0
  119. package/dist/cjs/services/TelegramConfig.js +81 -0
  120. package/dist/cjs/services/TelegramConfig.js.map +1 -0
  121. package/dist/cjs/services/TelegramConfigStore.js +81 -0
  122. package/dist/cjs/services/TelegramConfigStore.js.map +1 -0
  123. package/dist/cjs/services/TelegramNotifier.js +50 -0
  124. package/dist/cjs/services/TelegramNotifier.js.map +1 -0
  125. package/dist/cjs/services/TrackerLayerMap.js +27 -0
  126. package/dist/cjs/services/TrackerLayerMap.js.map +1 -0
  127. package/dist/cjs/services/TrackerResolver.js +45 -0
  128. package/dist/cjs/services/TrackerResolver.js.map +1 -0
  129. package/dist/cjs/services/messenger/MessengerAdapter.js +30 -0
  130. package/dist/cjs/services/messenger/MessengerAdapter.js.map +1 -0
  131. package/dist/cjs/services/messenger/TelegramAdapter.js +125 -0
  132. package/dist/cjs/services/messenger/TelegramAdapter.js.map +1 -0
  133. package/dist/cjs/services/task-tracker/GitHubIssueTracker.js +157 -0
  134. package/dist/cjs/services/task-tracker/GitHubIssueTracker.js.map +1 -0
  135. package/dist/cjs/services/task-tracker/LinearTracker.js +127 -0
  136. package/dist/cjs/services/task-tracker/LinearTracker.js.map +1 -0
  137. package/dist/cjs/services/task-tracker/TaskTracker.js +20 -0
  138. package/dist/cjs/services/task-tracker/TaskTracker.js.map +1 -0
  139. package/dist/cjs/services/task-tracker/TrackerLayerMap.js +27 -0
  140. package/dist/cjs/services/task-tracker/TrackerLayerMap.js.map +1 -0
  141. package/dist/cjs/shim/bin.js +31 -0
  142. package/dist/cjs/shim/bin.js.map +1 -0
  143. package/dist/cjs/shim/main.js +217 -0
  144. package/dist/cjs/shim/main.js.map +1 -0
  145. package/dist/cjs/shim/parseArgs.js +45 -0
  146. package/dist/cjs/shim/parseArgs.js.map +1 -0
  147. package/dist/cjs/shim/schemas.js +35 -0
  148. package/dist/cjs/shim/schemas.js.map +1 -0
  149. package/dist/dts/Events.d.ts +108 -0
  150. package/dist/dts/Events.d.ts.map +1 -0
  151. package/dist/dts/LalphMain.d.ts +2 -0
  152. package/dist/dts/LalphMain.d.ts.map +1 -0
  153. package/dist/dts/Main.d.ts +2 -0
  154. package/dist/dts/Main.d.ts.map +1 -0
  155. package/dist/dts/index.d.ts +101 -0
  156. package/dist/dts/index.d.ts.map +1 -0
  157. package/dist/dts/lib/AnalysisPrompts.d.ts +12 -0
  158. package/dist/dts/lib/AnalysisPrompts.d.ts.map +1 -0
  159. package/dist/dts/lib/BranchParser.d.ts +40 -0
  160. package/dist/dts/lib/BranchParser.d.ts.map +1 -0
  161. package/dist/dts/lib/MermaidToPlantUml.d.ts +19 -0
  162. package/dist/dts/lib/MermaidToPlantUml.d.ts.map +1 -0
  163. package/dist/dts/lib/SpecHtmlGenerator.d.ts +18 -0
  164. package/dist/dts/lib/SpecHtmlGenerator.d.ts.map +1 -0
  165. package/dist/dts/lib/StreamJsonParser.d.ts +147 -0
  166. package/dist/dts/lib/StreamJsonParser.d.ts.map +1 -0
  167. package/dist/dts/lib/TelegramFormatter.d.ts +35 -0
  168. package/dist/dts/lib/TelegramFormatter.d.ts.map +1 -0
  169. package/dist/dts/lib/TelegraphHtml.d.ts +11 -0
  170. package/dist/dts/lib/TelegraphHtml.d.ts.map +1 -0
  171. package/dist/dts/lib/TelegraphMarkdown.d.ts +21 -0
  172. package/dist/dts/lib/TelegraphMarkdown.d.ts.map +1 -0
  173. package/dist/dts/schemas/CredentialSchemas.d.ts +41 -0
  174. package/dist/dts/schemas/CredentialSchemas.d.ts.map +1 -0
  175. package/dist/dts/schemas/GitHubSchemas.d.ts +130 -0
  176. package/dist/dts/schemas/GitHubSchemas.d.ts.map +1 -0
  177. package/dist/dts/schemas/LinearSchemas.d.ts +121 -0
  178. package/dist/dts/schemas/LinearSchemas.d.ts.map +1 -0
  179. package/dist/dts/schemas/ProjectSchemas.d.ts +40 -0
  180. package/dist/dts/schemas/ProjectSchemas.d.ts.map +1 -0
  181. package/dist/dts/schemas/TrackerSchemas.d.ts +57 -0
  182. package/dist/dts/schemas/TrackerSchemas.d.ts.map +1 -0
  183. package/dist/dts/services/AppContext.d.ts +40 -0
  184. package/dist/dts/services/AppContext.d.ts.map +1 -0
  185. package/dist/dts/services/AppRuntimeConfig.d.ts +51 -0
  186. package/dist/dts/services/AppRuntimeConfig.d.ts.map +1 -0
  187. package/dist/dts/services/AutoMerge.d.ts +42 -0
  188. package/dist/dts/services/AutoMerge.d.ts.map +1 -0
  189. package/dist/dts/services/ChatMachine.d.ts +478 -0
  190. package/dist/dts/services/ChatMachine.d.ts.map +1 -0
  191. package/dist/dts/services/CommentTimer.d.ts +44 -0
  192. package/dist/dts/services/CommentTimer.d.ts.map +1 -0
  193. package/dist/dts/services/CredentialStore.d.ts +43 -0
  194. package/dist/dts/services/CredentialStore.d.ts.map +1 -0
  195. package/dist/dts/services/CredentialWatcher.d.ts +41 -0
  196. package/dist/dts/services/CredentialWatcher.d.ts.map +1 -0
  197. package/dist/dts/services/Credentials.d.ts +44 -0
  198. package/dist/dts/services/Credentials.d.ts.map +1 -0
  199. package/dist/dts/services/EventLoop.d.ts +26 -0
  200. package/dist/dts/services/EventLoop.d.ts.map +1 -0
  201. package/dist/dts/services/GitHubClient/GitHubClient.d.ts +69 -0
  202. package/dist/dts/services/GitHubClient/GitHubClient.d.ts.map +1 -0
  203. package/dist/dts/services/GitHubClient/OctokitClient.d.ts +214 -0
  204. package/dist/dts/services/GitHubClient/OctokitClient.d.ts.map +1 -0
  205. package/dist/dts/services/GitHubClient.d.ts +69 -0
  206. package/dist/dts/services/GitHubClient.d.ts.map +1 -0
  207. package/dist/dts/services/GitHubEventSource.d.ts +43 -0
  208. package/dist/dts/services/GitHubEventSource.d.ts.map +1 -0
  209. package/dist/dts/services/GitHubIssueTracker.d.ts +9 -0
  210. package/dist/dts/services/GitHubIssueTracker.d.ts.map +1 -0
  211. package/dist/dts/services/LalphConfig.d.ts +44 -0
  212. package/dist/dts/services/LalphConfig.d.ts.map +1 -0
  213. package/dist/dts/services/LalphConfigReader.d.ts +66 -0
  214. package/dist/dts/services/LalphConfigReader.d.ts.map +1 -0
  215. package/dist/dts/services/LalphDirectory.d.ts +39 -0
  216. package/dist/dts/services/LalphDirectory.d.ts.map +1 -0
  217. package/dist/dts/services/LinearSdkClient.d.ts +71 -0
  218. package/dist/dts/services/LinearSdkClient.d.ts.map +1 -0
  219. package/dist/dts/services/LinearTracker.d.ts +9 -0
  220. package/dist/dts/services/LinearTracker.d.ts.map +1 -0
  221. package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts +69 -0
  222. package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts.map +1 -0
  223. package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts +13 -0
  224. package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts.map +1 -0
  225. package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts +58 -0
  226. package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts.map +1 -0
  227. package/dist/dts/services/MessengerAdapter.d.ts +69 -0
  228. package/dist/dts/services/MessengerAdapter.d.ts.map +1 -0
  229. package/dist/dts/services/OctokitClient.d.ts +232 -0
  230. package/dist/dts/services/OctokitClient.d.ts.map +1 -0
  231. package/dist/dts/services/PlanOverviewUploader.d.ts +55 -0
  232. package/dist/dts/services/PlanOverviewUploader.d.ts.map +1 -0
  233. package/dist/dts/services/PlanOverviewUploaderMap.d.ts +14 -0
  234. package/dist/dts/services/PlanOverviewUploaderMap.d.ts.map +1 -0
  235. package/dist/dts/services/PlanSession.d.ts +169 -0
  236. package/dist/dts/services/PlanSession.d.ts.map +1 -0
  237. package/dist/dts/services/ProjectStore.d.ts +50 -0
  238. package/dist/dts/services/ProjectStore.d.ts.map +1 -0
  239. package/dist/dts/services/PullRequestTracker.d.ts +42 -0
  240. package/dist/dts/services/PullRequestTracker.d.ts.map +1 -0
  241. package/dist/dts/services/SpecUploader.d.ts +51 -0
  242. package/dist/dts/services/SpecUploader.d.ts.map +1 -0
  243. package/dist/dts/services/SpecUploaderMap.d.ts +14 -0
  244. package/dist/dts/services/SpecUploaderMap.d.ts.map +1 -0
  245. package/dist/dts/services/TaskEventSource.d.ts +21 -0
  246. package/dist/dts/services/TaskEventSource.d.ts.map +1 -0
  247. package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts +10 -0
  248. package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts.map +1 -0
  249. package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts +71 -0
  250. package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts.map +1 -0
  251. package/dist/dts/services/TaskTracker/LinearTracker.d.ts +10 -0
  252. package/dist/dts/services/TaskTracker/LinearTracker.d.ts.map +1 -0
  253. package/dist/dts/services/TaskTracker/TaskTracker.d.ts +39 -0
  254. package/dist/dts/services/TaskTracker/TaskTracker.d.ts.map +1 -0
  255. package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts +14 -0
  256. package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts.map +1 -0
  257. package/dist/dts/services/TaskTracker/buildEventStream.d.ts +16 -0
  258. package/dist/dts/services/TaskTracker/buildEventStream.d.ts.map +1 -0
  259. package/dist/dts/services/TaskTracker.d.ts +38 -0
  260. package/dist/dts/services/TaskTracker.d.ts.map +1 -0
  261. package/dist/dts/services/TelegramAdapter.d.ts +13 -0
  262. package/dist/dts/services/TelegramAdapter.d.ts.map +1 -0
  263. package/dist/dts/services/TelegramConfig.d.ts +58 -0
  264. package/dist/dts/services/TelegramConfig.d.ts.map +1 -0
  265. package/dist/dts/services/TelegramConfigStore.d.ts +57 -0
  266. package/dist/dts/services/TelegramConfigStore.d.ts.map +1 -0
  267. package/dist/dts/services/TelegramNotifier.d.ts +40 -0
  268. package/dist/dts/services/TelegramNotifier.d.ts.map +1 -0
  269. package/dist/dts/services/TrackerLayerMap.d.ts +14 -0
  270. package/dist/dts/services/TrackerLayerMap.d.ts.map +1 -0
  271. package/dist/dts/services/TrackerResolver.d.ts +43 -0
  272. package/dist/dts/services/TrackerResolver.d.ts.map +1 -0
  273. package/dist/dts/services/messenger/MessengerAdapter.d.ts +69 -0
  274. package/dist/dts/services/messenger/MessengerAdapter.d.ts.map +1 -0
  275. package/dist/dts/services/messenger/TelegramAdapter.d.ts +13 -0
  276. package/dist/dts/services/messenger/TelegramAdapter.d.ts.map +1 -0
  277. package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts +10 -0
  278. package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts.map +1 -0
  279. package/dist/dts/services/task-tracker/LinearTracker.d.ts +10 -0
  280. package/dist/dts/services/task-tracker/LinearTracker.d.ts.map +1 -0
  281. package/dist/dts/services/task-tracker/TaskTracker.d.ts +38 -0
  282. package/dist/dts/services/task-tracker/TaskTracker.d.ts.map +1 -0
  283. package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts +14 -0
  284. package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts.map +1 -0
  285. package/dist/dts/shim/bin.d.ts +3 -0
  286. package/dist/dts/shim/bin.d.ts.map +1 -0
  287. package/dist/dts/shim/main.d.ts +36 -0
  288. package/dist/dts/shim/main.d.ts.map +1 -0
  289. package/dist/dts/shim/parseArgs.d.ts +11 -0
  290. package/dist/dts/shim/parseArgs.d.ts.map +1 -0
  291. package/dist/dts/shim/schemas.d.ts +55 -0
  292. package/dist/dts/shim/schemas.d.ts.map +1 -0
  293. package/dist/esm/Events.js +41 -0
  294. package/dist/esm/Events.js.map +1 -0
  295. package/dist/esm/LalphMain.js +56 -0
  296. package/dist/esm/LalphMain.js.map +1 -0
  297. package/dist/esm/Main.js +112 -0
  298. package/dist/esm/Main.js.map +1 -0
  299. package/dist/esm/index.js +101 -0
  300. package/dist/esm/index.js.map +1 -0
  301. package/dist/esm/lib/AnalysisPrompts.js +54 -0
  302. package/dist/esm/lib/AnalysisPrompts.js.map +1 -0
  303. package/dist/esm/lib/BranchParser.js +36 -0
  304. package/dist/esm/lib/BranchParser.js.map +1 -0
  305. package/dist/esm/lib/MermaidToPlantUml.js +89 -0
  306. package/dist/esm/lib/MermaidToPlantUml.js.map +1 -0
  307. package/dist/esm/lib/SpecHtmlGenerator.js +153 -0
  308. package/dist/esm/lib/SpecHtmlGenerator.js.map +1 -0
  309. package/dist/esm/lib/StreamJsonParser.js +79 -0
  310. package/dist/esm/lib/StreamJsonParser.js.map +1 -0
  311. package/dist/esm/lib/TelegramFormatter.js +114 -0
  312. package/dist/esm/lib/TelegramFormatter.js.map +1 -0
  313. package/dist/esm/lib/TelegraphHtml.js +57 -0
  314. package/dist/esm/lib/TelegraphHtml.js.map +1 -0
  315. package/dist/esm/lib/TelegraphMarkdown.js +338 -0
  316. package/dist/esm/lib/TelegraphMarkdown.js.map +1 -0
  317. package/dist/esm/package.json +4 -0
  318. package/dist/esm/schemas/CredentialSchemas.js +22 -0
  319. package/dist/esm/schemas/CredentialSchemas.js.map +1 -0
  320. package/dist/esm/schemas/GitHubSchemas.js +50 -0
  321. package/dist/esm/schemas/GitHubSchemas.js.map +1 -0
  322. package/dist/esm/schemas/LinearSchemas.js +52 -0
  323. package/dist/esm/schemas/LinearSchemas.js.map +1 -0
  324. package/dist/esm/schemas/ProjectSchemas.js +18 -0
  325. package/dist/esm/schemas/ProjectSchemas.js.map +1 -0
  326. package/dist/esm/schemas/TrackerSchemas.js +26 -0
  327. package/dist/esm/schemas/TrackerSchemas.js.map +1 -0
  328. package/dist/esm/services/AppContext.js +48 -0
  329. package/dist/esm/services/AppContext.js.map +1 -0
  330. package/dist/esm/services/AppRuntimeConfig.js +26 -0
  331. package/dist/esm/services/AppRuntimeConfig.js.map +1 -0
  332. package/dist/esm/services/AutoMerge.js +131 -0
  333. package/dist/esm/services/AutoMerge.js.map +1 -0
  334. package/dist/esm/services/ChatMachine.js +855 -0
  335. package/dist/esm/services/ChatMachine.js.map +1 -0
  336. package/dist/esm/services/CommentTimer.js +72 -0
  337. package/dist/esm/services/CommentTimer.js.map +1 -0
  338. package/dist/esm/services/CredentialStore.js +59 -0
  339. package/dist/esm/services/CredentialStore.js.map +1 -0
  340. package/dist/esm/services/CredentialWatcher.js +67 -0
  341. package/dist/esm/services/CredentialWatcher.js.map +1 -0
  342. package/dist/esm/services/Credentials.js +121 -0
  343. package/dist/esm/services/Credentials.js.map +1 -0
  344. package/dist/esm/services/EventLoop.js +128 -0
  345. package/dist/esm/services/EventLoop.js.map +1 -0
  346. package/dist/esm/services/GitHubClient/GitHubClient.js +227 -0
  347. package/dist/esm/services/GitHubClient/GitHubClient.js.map +1 -0
  348. package/dist/esm/services/GitHubClient/OctokitClient.js +320 -0
  349. package/dist/esm/services/GitHubClient/OctokitClient.js.map +1 -0
  350. package/dist/esm/services/GitHubClient.js +227 -0
  351. package/dist/esm/services/GitHubClient.js.map +1 -0
  352. package/dist/esm/services/GitHubEventSource.js +136 -0
  353. package/dist/esm/services/GitHubEventSource.js.map +1 -0
  354. package/dist/esm/services/GitHubIssueTracker.js +111 -0
  355. package/dist/esm/services/GitHubIssueTracker.js.map +1 -0
  356. package/dist/esm/services/LalphConfig.js +130 -0
  357. package/dist/esm/services/LalphConfig.js.map +1 -0
  358. package/dist/esm/services/LalphConfigReader.js +71 -0
  359. package/dist/esm/services/LalphConfigReader.js.map +1 -0
  360. package/dist/esm/services/LalphDirectory.js +36 -0
  361. package/dist/esm/services/LalphDirectory.js.map +1 -0
  362. package/dist/esm/services/LinearSdkClient.js +140 -0
  363. package/dist/esm/services/LinearSdkClient.js.map +1 -0
  364. package/dist/esm/services/LinearTracker.js +82 -0
  365. package/dist/esm/services/LinearTracker.js.map +1 -0
  366. package/dist/esm/services/MessengerAdapter/MessengerAdapter.js +21 -0
  367. package/dist/esm/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
  368. package/dist/esm/services/MessengerAdapter/TelegramAdapter.js +124 -0
  369. package/dist/esm/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
  370. package/dist/esm/services/MessengerAdapter/TelegramConfig.js +71 -0
  371. package/dist/esm/services/MessengerAdapter/TelegramConfig.js.map +1 -0
  372. package/dist/esm/services/MessengerAdapter.js +21 -0
  373. package/dist/esm/services/MessengerAdapter.js.map +1 -0
  374. package/dist/esm/services/OctokitClient.js +341 -0
  375. package/dist/esm/services/OctokitClient.js.map +1 -0
  376. package/dist/esm/services/PlanOverviewUploader.js +109 -0
  377. package/dist/esm/services/PlanOverviewUploader.js.map +1 -0
  378. package/dist/esm/services/PlanOverviewUploaderMap.js +17 -0
  379. package/dist/esm/services/PlanOverviewUploaderMap.js.map +1 -0
  380. package/dist/esm/services/PlanSession.js +471 -0
  381. package/dist/esm/services/PlanSession.js.map +1 -0
  382. package/dist/esm/services/ProjectStore.js +98 -0
  383. package/dist/esm/services/ProjectStore.js.map +1 -0
  384. package/dist/esm/services/PullRequestTracker.js +177 -0
  385. package/dist/esm/services/PullRequestTracker.js.map +1 -0
  386. package/dist/esm/services/SpecUploader.js +101 -0
  387. package/dist/esm/services/SpecUploader.js.map +1 -0
  388. package/dist/esm/services/SpecUploaderMap.js +17 -0
  389. package/dist/esm/services/SpecUploaderMap.js.map +1 -0
  390. package/dist/esm/services/TaskEventSource.js +50 -0
  391. package/dist/esm/services/TaskEventSource.js.map +1 -0
  392. package/dist/esm/services/TaskTracker/GitHubIssueTracker.js +148 -0
  393. package/dist/esm/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
  394. package/dist/esm/services/TaskTracker/LinearSdkClient.js +140 -0
  395. package/dist/esm/services/TaskTracker/LinearSdkClient.js.map +1 -0
  396. package/dist/esm/services/TaskTracker/LinearTracker.js +119 -0
  397. package/dist/esm/services/TaskTracker/LinearTracker.js.map +1 -0
  398. package/dist/esm/services/TaskTracker/TaskTracker.js +12 -0
  399. package/dist/esm/services/TaskTracker/TaskTracker.js.map +1 -0
  400. package/dist/esm/services/TaskTracker/TrackerLayerMap.js +19 -0
  401. package/dist/esm/services/TaskTracker/TrackerLayerMap.js.map +1 -0
  402. package/dist/esm/services/TaskTracker/buildEventStream.js +47 -0
  403. package/dist/esm/services/TaskTracker/buildEventStream.js.map +1 -0
  404. package/dist/esm/services/TaskTracker.js +12 -0
  405. package/dist/esm/services/TaskTracker.js.map +1 -0
  406. package/dist/esm/services/TelegramAdapter.js +118 -0
  407. package/dist/esm/services/TelegramAdapter.js.map +1 -0
  408. package/dist/esm/services/TelegramConfig.js +71 -0
  409. package/dist/esm/services/TelegramConfig.js.map +1 -0
  410. package/dist/esm/services/TelegramConfigStore.js +71 -0
  411. package/dist/esm/services/TelegramConfigStore.js.map +1 -0
  412. package/dist/esm/services/TelegramNotifier.js +41 -0
  413. package/dist/esm/services/TelegramNotifier.js.map +1 -0
  414. package/dist/esm/services/TrackerLayerMap.js +19 -0
  415. package/dist/esm/services/TrackerLayerMap.js.map +1 -0
  416. package/dist/esm/services/TrackerResolver.js +36 -0
  417. package/dist/esm/services/TrackerResolver.js.map +1 -0
  418. package/dist/esm/services/messenger/MessengerAdapter.js +21 -0
  419. package/dist/esm/services/messenger/MessengerAdapter.js.map +1 -0
  420. package/dist/esm/services/messenger/TelegramAdapter.js +118 -0
  421. package/dist/esm/services/messenger/TelegramAdapter.js.map +1 -0
  422. package/dist/esm/services/task-tracker/GitHubIssueTracker.js +150 -0
  423. package/dist/esm/services/task-tracker/GitHubIssueTracker.js.map +1 -0
  424. package/dist/esm/services/task-tracker/LinearTracker.js +120 -0
  425. package/dist/esm/services/task-tracker/LinearTracker.js.map +1 -0
  426. package/dist/esm/services/task-tracker/TaskTracker.js +12 -0
  427. package/dist/esm/services/task-tracker/TaskTracker.js.map +1 -0
  428. package/dist/esm/services/task-tracker/TrackerLayerMap.js +19 -0
  429. package/dist/esm/services/task-tracker/TrackerLayerMap.js.map +1 -0
  430. package/dist/esm/shim/bin.js +28 -0
  431. package/dist/esm/shim/bin.js.map +1 -0
  432. package/dist/esm/shim/main.js +196 -0
  433. package/dist/esm/shim/main.js.map +1 -0
  434. package/dist/esm/shim/parseArgs.js +39 -0
  435. package/dist/esm/shim/parseArgs.js.map +1 -0
  436. package/dist/esm/shim/schemas.js +28 -0
  437. package/dist/esm/shim/schemas.js.map +1 -0
  438. package/lib/AnalysisPrompts/package.json +6 -0
  439. package/lib/BranchParser/package.json +6 -0
  440. package/lib/MermaidToPlantUml/package.json +6 -0
  441. package/lib/SpecHtmlGenerator/package.json +6 -0
  442. package/lib/StreamJsonParser/package.json +6 -0
  443. package/lib/TelegramFormatter/package.json +6 -0
  444. package/lib/TelegraphMarkdown/package.json +6 -0
  445. package/package.json +360 -0
  446. package/schemas/CredentialSchemas/package.json +6 -0
  447. package/schemas/GitHubSchemas/package.json +6 -0
  448. package/schemas/LinearSchemas/package.json +6 -0
  449. package/schemas/ProjectSchemas/package.json +6 -0
  450. package/schemas/TrackerSchemas/package.json +6 -0
  451. package/services/AppContext/package.json +6 -0
  452. package/services/AppRuntimeConfig/package.json +6 -0
  453. package/services/AutoMerge/package.json +6 -0
  454. package/services/ChatMachine/package.json +6 -0
  455. package/services/CommentTimer/package.json +6 -0
  456. package/services/EventLoop/package.json +6 -0
  457. package/services/GitHubClient/package.json +6 -0
  458. package/services/LalphConfig/package.json +6 -0
  459. package/services/LinearSdkClient/package.json +6 -0
  460. package/services/MessengerAdapter/MessengerAdapter/package.json +6 -0
  461. package/services/MessengerAdapter/TelegramAdapter/package.json +6 -0
  462. package/services/OctokitClient/package.json +6 -0
  463. package/services/PlanOverviewUploader/package.json +6 -0
  464. package/services/PlanOverviewUploaderMap/package.json +6 -0
  465. package/services/PlanSession/package.json +6 -0
  466. package/services/ProjectStore/package.json +6 -0
  467. package/services/PullRequestTracker/package.json +6 -0
  468. package/services/TaskTracker/GitHubIssueTracker/package.json +6 -0
  469. package/services/TaskTracker/LinearTracker/package.json +6 -0
  470. package/services/TaskTracker/TaskTracker/package.json +6 -0
  471. package/services/TelegramConfig/package.json +6 -0
  472. package/services/TrackerLayerMap/package.json +6 -0
  473. package/shim/bin/package.json +6 -0
  474. package/shim/main/package.json +6 -0
  475. package/shim/parseArgs/package.json +6 -0
  476. package/shim/schemas/package.json +6 -0
  477. package/src/Events.ts +98 -0
  478. package/src/Main.ts +177 -0
  479. package/src/index.ts +124 -0
  480. package/src/lib/AnalysisPrompts.ts +54 -0
  481. package/src/lib/BranchParser.ts +58 -0
  482. package/src/lib/MermaidToPlantUml.ts +103 -0
  483. package/src/lib/SpecHtmlGenerator.ts +199 -0
  484. package/src/lib/StreamJsonParser.ts +99 -0
  485. package/src/lib/TelegramFormatter.ts +151 -0
  486. package/src/lib/TelegraphMarkdown.ts +305 -0
  487. package/src/schemas/CredentialSchemas.ts +23 -0
  488. package/src/schemas/GitHubSchemas.ts +50 -0
  489. package/src/schemas/LinearSchemas.ts +57 -0
  490. package/src/schemas/ProjectSchemas.ts +18 -0
  491. package/src/schemas/TrackerSchemas.ts +27 -0
  492. package/src/services/AppContext.ts +72 -0
  493. package/src/services/AppRuntimeConfig.ts +23 -0
  494. package/src/services/AutoMerge.ts +198 -0
  495. package/src/services/ChatMachine.ts +911 -0
  496. package/src/services/CommentTimer.ts +133 -0
  497. package/src/services/EventLoop.ts +321 -0
  498. package/src/services/GitHubClient.ts +282 -0
  499. package/src/services/LalphConfig.ts +218 -0
  500. package/src/services/LinearSdkClient.ts +181 -0
  501. package/src/services/MessengerAdapter/MessengerAdapter.ts +53 -0
  502. package/src/services/MessengerAdapter/TelegramAdapter.ts +145 -0
  503. package/src/services/OctokitClient.ts +628 -0
  504. package/src/services/PlanOverviewUploader.ts +160 -0
  505. package/src/services/PlanOverviewUploaderMap.ts +17 -0
  506. package/src/services/PlanSession.ts +589 -0
  507. package/src/services/ProjectStore.ts +140 -0
  508. package/src/services/PullRequestTracker.ts +253 -0
  509. package/src/services/TaskTracker/GitHubIssueTracker.ts +162 -0
  510. package/src/services/TaskTracker/LinearTracker.ts +141 -0
  511. package/src/services/TaskTracker/TaskTracker.ts +34 -0
  512. package/src/services/TelegramConfig.ts +120 -0
  513. package/src/services/TrackerLayerMap.ts +19 -0
  514. package/src/shim/bin.ts +36 -0
  515. package/src/shim/main.ts +255 -0
  516. package/src/shim/parseArgs.ts +43 -0
  517. package/src/shim/schemas.ts +38 -0
@@ -0,0 +1,282 @@
1
+ /**
2
+ * GitHub REST API client service
3
+ * @since 1.0.0
4
+ */
5
+ import { Array, Context, Data, Effect, Layer } from "effect"
6
+ import { GitHubComment, GitHubPullRequest, GitHubRepo } from "../schemas/GitHubSchemas.js"
7
+ import { OctokitClient } from "./OctokitClient.js"
8
+
9
+ /**
10
+ * @since 1.0.0
11
+ * @category errors
12
+ */
13
+ export class GitHubClientError extends Data.TaggedError("GitHubClientError")<{
14
+ message: string
15
+ cause: unknown
16
+ }> {}
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ * @category models
21
+ */
22
+ export interface GitHubCheckRun {
23
+ readonly id: number
24
+ readonly name: string
25
+ readonly status: string
26
+ readonly conclusion: string | null
27
+ readonly html_url: string
28
+ }
29
+
30
+ /**
31
+ * @since 1.0.0
32
+ * @category models
33
+ */
34
+ export interface GitHubCIStatus {
35
+ readonly state: string
36
+ readonly checkRuns: ReadonlyArray<GitHubCheckRun>
37
+ }
38
+
39
+ /**
40
+ * @since 1.0.0
41
+ * @category services
42
+ */
43
+ export interface GitHubClientService {
44
+ readonly getAuthenticatedUser: () => Effect.Effect<{ readonly login: string }, GitHubClientError>
45
+ readonly listUserRepos: () => Effect.Effect<ReadonlyArray<GitHubRepo>, GitHubClientError>
46
+ readonly listOpenPRs: (repo: GitHubRepo) => Effect.Effect<ReadonlyArray<GitHubPullRequest>, GitHubClientError>
47
+ readonly getPR: (repo: GitHubRepo, prNumber: number) => Effect.Effect<GitHubPullRequest, GitHubClientError>
48
+ readonly postComment: (
49
+ repo: GitHubRepo,
50
+ prNumber: number,
51
+ body: string
52
+ ) => Effect.Effect<void, GitHubClientError>
53
+ readonly listComments: (
54
+ repo: GitHubRepo,
55
+ prNumber: number
56
+ ) => Effect.Effect<ReadonlyArray<GitHubComment>, GitHubClientError>
57
+ readonly listReviewComments: (
58
+ repo: GitHubRepo,
59
+ prNumber: number
60
+ ) => Effect.Effect<ReadonlyArray<GitHubComment>, GitHubClientError>
61
+ readonly getCIStatus: (
62
+ repo: GitHubRepo,
63
+ ref: string
64
+ ) => Effect.Effect<GitHubCIStatus, GitHubClientError>
65
+ readonly mergePR: (
66
+ repo: GitHubRepo,
67
+ prNumber: number
68
+ ) => Effect.Effect<void, GitHubClientError>
69
+ }
70
+
71
+ /**
72
+ * @since 1.0.0
73
+ * @category context
74
+ */
75
+ export class GitHubClient extends Context.Tag("GitHubClient")<GitHubClient, GitHubClientService>() {}
76
+
77
+ const splitFullName = (fullName: string): { owner: string; repo: string } => {
78
+ const slashIndex = fullName.indexOf("/")
79
+ return {
80
+ owner: fullName.substring(0, slashIndex),
81
+ repo: fullName.substring(slashIndex + 1)
82
+ }
83
+ }
84
+
85
+ /**
86
+ * @since 1.0.0
87
+ * @category layers
88
+ */
89
+ export const GitHubClientLive = Layer.effect(
90
+ GitHubClient,
91
+ Effect.gen(function*() {
92
+ const octokit = yield* OctokitClient
93
+
94
+ const getAuthenticatedUser = () =>
95
+ octokit.getAuthenticatedUser().pipe(
96
+ Effect.map((user) => ({ login: user.login })),
97
+ Effect.mapError((err) =>
98
+ new GitHubClientError({ message: `Failed to get authenticated user: ${err.message}`, cause: err })
99
+ )
100
+ )
101
+
102
+ const listUserRepos = () =>
103
+ octokit.listUserRepos({ perPage: 100, type: "owner" }).pipe(
104
+ Effect.map((repos) =>
105
+ Array.map(repos, (r) =>
106
+ new GitHubRepo({
107
+ id: r.id,
108
+ name: r.name,
109
+ full_name: r.fullName,
110
+ owner: { login: r.owner.login },
111
+ html_url: r.htmlUrl
112
+ }))
113
+ ),
114
+ Effect.mapError((err) =>
115
+ new GitHubClientError({ message: `Failed to list user repos: ${err.message}`, cause: err })
116
+ )
117
+ )
118
+
119
+ const listOpenPRs = (repo: GitHubRepo) => {
120
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
121
+ return octokit.listPulls({ owner, repo: repoName, state: "open", perPage: 100 }).pipe(
122
+ Effect.flatMap((pulls) =>
123
+ Effect.forEach(pulls, (raw) =>
124
+ octokit.getPull({ owner, repo: repoName, pullNumber: raw.number }).pipe(
125
+ Effect.map((detail) =>
126
+ new GitHubPullRequest({
127
+ id: raw.id,
128
+ number: raw.number,
129
+ title: raw.title,
130
+ state: raw.state,
131
+ html_url: raw.htmlUrl,
132
+ headRef: raw.head.ref,
133
+ headSha: raw.head.sha,
134
+ hasConflicts: detail.mergeable === false,
135
+ repo: repo.full_name
136
+ })
137
+ )
138
+ ))
139
+ ),
140
+ Effect.mapError((err) =>
141
+ new GitHubClientError({
142
+ message: `Failed to list open PRs for ${repo.full_name}: ${err.message}`,
143
+ cause: err
144
+ })
145
+ )
146
+ )
147
+ }
148
+
149
+ const getPR = (repo: GitHubRepo, prNumber: number) => {
150
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
151
+ return octokit.getPull({ owner, repo: repoName, pullNumber: prNumber }).pipe(
152
+ Effect.map((raw) =>
153
+ new GitHubPullRequest({
154
+ id: raw.id,
155
+ number: raw.number,
156
+ title: raw.title,
157
+ state: raw.state,
158
+ html_url: raw.htmlUrl,
159
+ headRef: raw.head.ref,
160
+ headSha: raw.head.sha,
161
+ hasConflicts: raw.mergeable === false,
162
+ repo: repo.full_name
163
+ })
164
+ ),
165
+ Effect.mapError((err) =>
166
+ new GitHubClientError({
167
+ message: `Failed to get PR #${prNumber} for ${repo.full_name}: ${err.message}`,
168
+ cause: err
169
+ })
170
+ )
171
+ )
172
+ }
173
+
174
+ const postComment = (repo: GitHubRepo, prNumber: number, body: string) => {
175
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
176
+ return octokit.createIssueComment({ owner, repo: repoName, issueNumber: prNumber, body }).pipe(
177
+ Effect.mapError((err) =>
178
+ new GitHubClientError({
179
+ message: `Failed to post comment on PR #${prNumber} for ${repo.full_name}: ${err.message}`,
180
+ cause: err
181
+ })
182
+ )
183
+ )
184
+ }
185
+
186
+ const listComments = (repo: GitHubRepo, prNumber: number) => {
187
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
188
+ return octokit.listIssueComments({ owner, repo: repoName, issueNumber: prNumber, perPage: 100 }).pipe(
189
+ Effect.map((comments) =>
190
+ Array.map(comments, (raw) =>
191
+ new GitHubComment({
192
+ id: raw.id,
193
+ body: raw.body ?? "",
194
+ user: { login: raw.user?.login ?? "" },
195
+ created_at: raw.createdAt,
196
+ html_url: raw.htmlUrl,
197
+ repo: repo.full_name
198
+ }))
199
+ ),
200
+ Effect.mapError((err) =>
201
+ new GitHubClientError({
202
+ message: `Failed to list comments on PR #${prNumber} for ${repo.full_name}: ${err.message}`,
203
+ cause: err
204
+ })
205
+ )
206
+ )
207
+ }
208
+
209
+ const listReviewComments = (repo: GitHubRepo, prNumber: number) => {
210
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
211
+ return octokit.listPullReviewComments({ owner, repo: repoName, pullNumber: prNumber, perPage: 100 }).pipe(
212
+ Effect.map((comments) =>
213
+ Array.map(comments, (raw) =>
214
+ new GitHubComment({
215
+ id: raw.id,
216
+ body: raw.body ?? "",
217
+ user: { login: raw.user?.login ?? "" },
218
+ created_at: raw.createdAt,
219
+ html_url: raw.htmlUrl,
220
+ repo: repo.full_name
221
+ }))
222
+ ),
223
+ Effect.mapError((err) =>
224
+ new GitHubClientError({
225
+ message: `Failed to list review comments on PR #${prNumber} for ${repo.full_name}: ${err.message}`,
226
+ cause: err
227
+ })
228
+ )
229
+ )
230
+ }
231
+
232
+ const getCIStatus = (repo: GitHubRepo, ref: string) => {
233
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
234
+ return Effect.all({
235
+ combinedStatus: octokit.getCombinedStatusForRef({ owner, repo: repoName, ref }),
236
+ checkRuns: octokit.listCheckRunsForRef({ owner, repo: repoName, ref })
237
+ }).pipe(
238
+ Effect.map(({ checkRuns, combinedStatus }) => ({
239
+ state: combinedStatus.state,
240
+ checkRuns: Array.map(checkRuns, (cr) => ({
241
+ id: cr.id,
242
+ name: cr.name,
243
+ status: cr.status,
244
+ conclusion: cr.conclusion,
245
+ html_url: cr.htmlUrl
246
+ }))
247
+ })),
248
+ Effect.mapError((err) =>
249
+ new GitHubClientError({
250
+ message: `Failed to get CI status for ${repo.full_name} ref ${ref}: ${err.message}`,
251
+ cause: err
252
+ })
253
+ )
254
+ )
255
+ }
256
+
257
+ const mergePR = (repo: GitHubRepo, prNumber: number) => {
258
+ const { owner, repo: repoName } = splitFullName(repo.full_name)
259
+ return octokit.mergePull({ owner, repo: repoName, pullNumber: prNumber }).pipe(
260
+ Effect.asVoid,
261
+ Effect.mapError((err) =>
262
+ new GitHubClientError({
263
+ message: `Failed to merge PR #${prNumber} for ${repo.full_name}: ${err.message}`,
264
+ cause: err
265
+ })
266
+ )
267
+ )
268
+ }
269
+
270
+ return GitHubClient.of({
271
+ getAuthenticatedUser,
272
+ listUserRepos,
273
+ listOpenPRs,
274
+ getPR,
275
+ postComment,
276
+ listComments,
277
+ listReviewComments,
278
+ getCIStatus,
279
+ mergePR
280
+ })
281
+ })
282
+ )
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Provides current GitHub and Linear tokens, refreshing from .lalph/config/ file changes
3
+ * @since 1.0.0
4
+ */
5
+ import { Command, FileSystem, Path } from "@effect/platform"
6
+ import { Context, Data, Effect, Layer, Ref, Schema, Stream } from "effect"
7
+ import { LalphGithubToken, LalphLinearToken } from "../schemas/CredentialSchemas.js"
8
+ import { AppContext } from "./AppContext.js"
9
+
10
+ /**
11
+ * Parse owner/repo from SSH or HTTPS git URL
12
+ */
13
+ const parseRepoFullName = (url: string): string => {
14
+ // SSH: git@github.com:owner/repo.git
15
+ const sshMatch = url.match(/git@[^:]+:([^/]+\/[^/]+?)(?:\.git)?$/)
16
+ if (sshMatch?.[1] !== undefined) {
17
+ return sshMatch[1]
18
+ }
19
+ // HTTPS: https://github.com/owner/repo.git
20
+ const httpsMatch = url.match(/https?:\/\/[^/]+\/([^/]+\/[^/]+?)(?:\.git)?$/)
21
+ if (httpsMatch?.[1] !== undefined) {
22
+ return httpsMatch[1]
23
+ }
24
+ return url
25
+ }
26
+
27
+ /**
28
+ * @since 1.0.0
29
+ * @category errors
30
+ */
31
+ export class LalphConfigError extends Data.TaggedError("LalphConfigError")<{
32
+ message: string
33
+ cause: unknown
34
+ }> {}
35
+
36
+ /**
37
+ * @since 1.0.0
38
+ * @category services
39
+ */
40
+ export interface LalphConfigService {
41
+ readonly githubToken: Effect.Effect<string, LalphConfigError>
42
+ readonly linearToken: Effect.Effect<string, LalphConfigError>
43
+ readonly issueSource: "linear" | "github"
44
+ readonly specUploader: "gist" | "telegraph"
45
+ readonly repoFullName: string
46
+ }
47
+
48
+ /**
49
+ * @since 1.0.0
50
+ * @category context
51
+ */
52
+ export class LalphConfig extends Context.Tag("lalph-notifier/services/LalphConfig")<
53
+ LalphConfig,
54
+ LalphConfigService
55
+ >() {}
56
+
57
+ const githubTokenFileName = encodeURIComponent("github.accessToken")
58
+ const linearTokenFileName = encodeURIComponent("linear.accessToken")
59
+
60
+ /**
61
+ * @since 1.0.0
62
+ * @category layers
63
+ */
64
+ export const LalphConfigLive = Layer.scoped(
65
+ LalphConfig,
66
+ Effect.gen(function*() {
67
+ const fs = yield* FileSystem.FileSystem
68
+ const pathService = yield* Path.Path
69
+ const appContext = yield* AppContext
70
+
71
+ const configDir = appContext.configDir
72
+
73
+ const readFile = <A extends { token: string }, I>(key: string, schema: Schema.Schema<A, I>) =>
74
+ Effect.gen(function*() {
75
+ const filePath = pathService.join(configDir, encodeURIComponent(key))
76
+ const content = yield* fs.readFileString(filePath).pipe(
77
+ Effect.mapError((err) =>
78
+ new LalphConfigError({
79
+ message: `Failed to read config file: ${key}`,
80
+ cause: err
81
+ })
82
+ )
83
+ )
84
+ const json = yield* Effect.try({
85
+ try: () => JSON.parse(content),
86
+ catch: (err) =>
87
+ new LalphConfigError({
88
+ message: `Failed to parse JSON in config file: ${key}`,
89
+ cause: err
90
+ })
91
+ })
92
+ return yield* Schema.decodeUnknown(schema)(json).pipe(
93
+ Effect.mapError((err) =>
94
+ new LalphConfigError({
95
+ message: `Failed to decode config file: ${key}`,
96
+ cause: err
97
+ })
98
+ )
99
+ )
100
+ })
101
+
102
+ const readStringFile = (key: string) =>
103
+ Effect.gen(function*() {
104
+ const filePath = pathService.join(configDir, encodeURIComponent(key))
105
+ const content = yield* fs.readFileString(filePath).pipe(
106
+ Effect.mapError((err) =>
107
+ new LalphConfigError({
108
+ message: `Failed to read config file: ${key}`,
109
+ cause: err
110
+ })
111
+ )
112
+ )
113
+ return yield* Effect.try({
114
+ try: () => JSON.parse(content),
115
+ catch: (err) =>
116
+ new LalphConfigError({
117
+ message: `Failed to parse JSON in config file: ${key}`,
118
+ cause: err
119
+ })
120
+ })
121
+ }).pipe(
122
+ Effect.flatMap(Schema.decodeUnknown(Schema.String)),
123
+ Effect.mapError((err) =>
124
+ new LalphConfigError({
125
+ message: `Failed to decode config file: ${key}`,
126
+ cause: err
127
+ })
128
+ )
129
+ )
130
+
131
+ const githubTokenData = yield* readFile("github.accessToken", LalphGithubToken)
132
+ const issueSourceRaw = yield* readStringFile("settings.issueSource")
133
+ const issueSource = issueSourceRaw === "linear" ? "linear" as const : "github" as const
134
+
135
+ const specUploaderRaw = yield* readStringFile("settings.specUploader").pipe(
136
+ Effect.orElseSucceed(() => "telegraph")
137
+ )
138
+ const specUploader = specUploaderRaw === "gist"
139
+ ? "gist" as const
140
+ : "telegraph" as const
141
+
142
+ const linearAccessToken = issueSource === "linear"
143
+ ? yield* readFile("linear.accessToken", LalphLinearToken).pipe(
144
+ Effect.map((t) => t.token)
145
+ )
146
+ : ""
147
+
148
+ const repoFullName = yield* Effect.gen(function*() {
149
+ const cmd = Command.make("git", "remote", "get-url", "origin").pipe(
150
+ Command.workingDirectory(appContext.projectRoot)
151
+ )
152
+ const output = yield* Command.string(cmd).pipe(
153
+ Effect.mapError((err) =>
154
+ new LalphConfigError({
155
+ message: "Failed to detect git remote origin URL",
156
+ cause: err
157
+ })
158
+ )
159
+ )
160
+ return parseRepoFullName(output.trim())
161
+ })
162
+
163
+ const githubTokenRef = yield* Ref.make(githubTokenData.token)
164
+ const linearTokenRef = yield* Ref.make(linearAccessToken)
165
+
166
+ const readAndDecodeToken = <A extends { token: string }, I>(
167
+ fileName: string,
168
+ schema: Schema.Schema<A, I>
169
+ ) =>
170
+ Effect.gen(function*() {
171
+ const filePath = pathService.join(configDir, fileName)
172
+ const content = yield* fs.readFileString(filePath)
173
+ const json = yield* Effect.try({
174
+ try: () => JSON.parse(content),
175
+ catch: (err) => err
176
+ })
177
+ return yield* Schema.decodeUnknown(schema)(json)
178
+ })
179
+
180
+ yield* fs.watch(configDir).pipe(
181
+ Stream.filter((event) => event._tag === "Update"),
182
+ Stream.mapEffect((event) => {
183
+ const fileName = pathService.basename(event.path)
184
+ if (fileName === githubTokenFileName) {
185
+ return readAndDecodeToken(githubTokenFileName, LalphGithubToken).pipe(
186
+ Effect.flatMap((decoded) => Ref.set(githubTokenRef, decoded.token)),
187
+ Effect.tapError((err) => Effect.logWarning(`Failed to refresh GitHub token from file: ${String(err)}`)),
188
+ Effect.orElseSucceed(() => undefined)
189
+ )
190
+ }
191
+ if (fileName === linearTokenFileName) {
192
+ return readAndDecodeToken(linearTokenFileName, LalphLinearToken).pipe(
193
+ Effect.flatMap((decoded) => Ref.set(linearTokenRef, decoded.token)),
194
+ Effect.tapError((err) => Effect.logWarning(`Failed to refresh Linear token from file: ${String(err)}`)),
195
+ Effect.orElseSucceed(() => undefined)
196
+ )
197
+ }
198
+ return Effect.void
199
+ }),
200
+ Stream.runDrain,
201
+ Effect.annotateLogs("service", "LalphConfig"),
202
+ Effect.catchAll((err) => Effect.logError(`Credential watcher stream ended: ${String(err)}`)),
203
+ Effect.forkScoped
204
+ )
205
+
206
+ return LalphConfig.of({
207
+ githubToken: Ref.get(githubTokenRef).pipe(
208
+ Effect.mapError((cause) => new LalphConfigError({ message: "Failed to get GitHub token", cause }))
209
+ ),
210
+ linearToken: Ref.get(linearTokenRef).pipe(
211
+ Effect.mapError((cause) => new LalphConfigError({ message: "Failed to get Linear token", cause }))
212
+ ),
213
+ issueSource,
214
+ specUploader,
215
+ repoFullName
216
+ })
217
+ })
218
+ )
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Linear SDK client service
3
+ * @since 1.0.0
4
+ */
5
+ import { LinearClient } from "@linear/sdk"
6
+ import { Context, Data, Effect, Layer } from "effect"
7
+ import { LalphConfig } from "./LalphConfig.js"
8
+
9
+ /**
10
+ * @since 1.0.0
11
+ * @category errors
12
+ */
13
+ export class LinearSdkClientError extends Data.TaggedError("LinearSdkClientError")<{
14
+ message: string
15
+ cause: unknown
16
+ }> {}
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ * @category models
21
+ */
22
+ export interface LinearSdkIssue {
23
+ readonly id: string
24
+ readonly identifier: string
25
+ readonly title: string
26
+ readonly url: string
27
+ readonly createdAt: string
28
+ readonly updatedAt: string
29
+ readonly stateName: string
30
+ }
31
+
32
+ /**
33
+ * @since 1.0.0
34
+ * @category models
35
+ */
36
+ export interface LinearSdkWorkflowState {
37
+ readonly id: string
38
+ readonly name: string
39
+ readonly type: string
40
+ }
41
+
42
+ /**
43
+ * @since 1.0.0
44
+ * @category services
45
+ */
46
+ export interface LinearSdkClientService {
47
+ readonly listIssues: (params: {
48
+ readonly since: string
49
+ }) => Effect.Effect<ReadonlyArray<LinearSdkIssue>, LinearSdkClientError>
50
+ readonly getIssue: (params: {
51
+ readonly id: string
52
+ }) => Effect.Effect<LinearSdkIssue, LinearSdkClientError>
53
+ readonly listWorkflowStates: () => Effect.Effect<ReadonlyArray<LinearSdkWorkflowState>, LinearSdkClientError>
54
+ readonly updateIssue: (params: {
55
+ readonly id: string
56
+ readonly stateId: string
57
+ }) => Effect.Effect<void, LinearSdkClientError>
58
+ readonly updateIssuePriority: (params: {
59
+ readonly id: string
60
+ readonly priority: number
61
+ }) => Effect.Effect<void, LinearSdkClientError>
62
+ }
63
+
64
+ /**
65
+ * @since 1.0.0
66
+ * @category context
67
+ */
68
+ export class LinearSdkClient extends Context.Tag("LinearSdkClient")<LinearSdkClient, LinearSdkClientService>() {}
69
+
70
+ /**
71
+ * @since 1.0.0
72
+ * @category layers
73
+ */
74
+ export const LinearSdkClientLive = Layer.effect(
75
+ LinearSdkClient,
76
+ Effect.gen(function*() {
77
+ const watcher = yield* LalphConfig
78
+ const initialToken = yield* watcher.linearToken.pipe(
79
+ Effect.mapError((err) => new LinearSdkClientError({ message: err.message, cause: err }))
80
+ )
81
+
82
+ let currentToken = initialToken
83
+ let client = new LinearClient({ accessToken: currentToken })
84
+
85
+ const getClient = Effect.gen(function*() {
86
+ const latestToken = yield* watcher.linearToken.pipe(
87
+ Effect.mapError((err) => new LinearSdkClientError({ message: err.message, cause: err }))
88
+ )
89
+ if (latestToken !== currentToken) {
90
+ currentToken = latestToken
91
+ client = new LinearClient({ accessToken: latestToken })
92
+ }
93
+ return client
94
+ })
95
+
96
+ return LinearSdkClient.of({
97
+ listIssues: (params) =>
98
+ Effect.gen(function*() {
99
+ const c = yield* getClient
100
+ return yield* Effect.tryPromise({
101
+ try: async () => {
102
+ const connection = await c.issues({ filter: { updatedAt: { gte: new Date(params.since) } } })
103
+ const results: Array<LinearSdkIssue> = []
104
+ for (const node of connection.nodes) {
105
+ const state = await node.state
106
+ results.push({
107
+ id: node.id,
108
+ identifier: node.identifier,
109
+ title: node.title,
110
+ url: node.url,
111
+ createdAt: node.createdAt.toISOString(),
112
+ updatedAt: node.updatedAt.toISOString(),
113
+ stateName: state?.name ?? "Unknown"
114
+ })
115
+ }
116
+ return results
117
+ },
118
+ catch: (err) => new LinearSdkClientError({ message: `Failed to list issues: ${String(err)}`, cause: err })
119
+ })
120
+ }),
121
+
122
+ getIssue: (params) =>
123
+ Effect.gen(function*() {
124
+ const c = yield* getClient
125
+ return yield* Effect.tryPromise({
126
+ try: async () => {
127
+ const node = await c.issue(params.id)
128
+ const state = await node.state
129
+ return {
130
+ id: node.id,
131
+ identifier: node.identifier,
132
+ title: node.title,
133
+ url: node.url,
134
+ createdAt: node.createdAt.toISOString(),
135
+ updatedAt: node.updatedAt.toISOString(),
136
+ stateName: state?.name ?? "Unknown"
137
+ }
138
+ },
139
+ catch: (err) => new LinearSdkClientError({ message: `Failed to get issue: ${String(err)}`, cause: err })
140
+ })
141
+ }),
142
+
143
+ listWorkflowStates: () =>
144
+ Effect.gen(function*() {
145
+ const c = yield* getClient
146
+ return yield* Effect.tryPromise({
147
+ try: () => c.workflowStates(),
148
+ catch: (err) =>
149
+ new LinearSdkClientError({ message: `Failed to list workflow states: ${String(err)}`, cause: err })
150
+ }).pipe(
151
+ Effect.map((connection) =>
152
+ connection.nodes.map((node): LinearSdkWorkflowState => ({
153
+ id: node.id,
154
+ name: node.name,
155
+ type: node.type
156
+ }))
157
+ )
158
+ )
159
+ }),
160
+
161
+ updateIssue: (params) =>
162
+ Effect.gen(function*() {
163
+ const c = yield* getClient
164
+ return yield* Effect.tryPromise({
165
+ try: () => c.updateIssue(params.id, { stateId: params.stateId }),
166
+ catch: (err) => new LinearSdkClientError({ message: `Failed to update issue: ${String(err)}`, cause: err })
167
+ }).pipe(Effect.asVoid)
168
+ }),
169
+
170
+ updateIssuePriority: (params) =>
171
+ Effect.gen(function*() {
172
+ const c = yield* getClient
173
+ return yield* Effect.tryPromise({
174
+ try: () => c.updateIssue(params.id, { priority: params.priority }),
175
+ catch: (err) =>
176
+ new LinearSdkClientError({ message: `Failed to update issue priority: ${String(err)}`, cause: err })
177
+ }).pipe(Effect.asVoid)
178
+ })
179
+ })
180
+ })
181
+ )