vibe-squire 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/README.md +179 -0
  2. package/bin/vibe-squire.js +3 -0
  3. package/dist/prisma.config.d.ts +3 -0
  4. package/dist/prisma.config.js +14 -0
  5. package/dist/prisma.config.js.map +1 -0
  6. package/dist/src/app.controller.d.ts +3 -0
  7. package/dist/src/app.controller.js +30 -0
  8. package/dist/src/app.controller.js.map +1 -0
  9. package/dist/src/app.module.d.ts +5 -0
  10. package/dist/src/app.module.js +56 -0
  11. package/dist/src/app.module.js.map +1 -0
  12. package/dist/src/config/app-env.token.d.ts +14 -0
  13. package/dist/src/config/app-env.token.js +5 -0
  14. package/dist/src/config/app-env.token.js.map +1 -0
  15. package/dist/src/config/env-schema.d.ts +28 -0
  16. package/dist/src/config/env-schema.js +43 -0
  17. package/dist/src/config/env-schema.js.map +1 -0
  18. package/dist/src/config/env.module.d.ts +5 -0
  19. package/dist/src/config/env.module.js +27 -0
  20. package/dist/src/config/env.module.js.map +1 -0
  21. package/dist/src/config/integration-types.d.ts +4 -0
  22. package/dist/src/config/integration-types.js +6 -0
  23. package/dist/src/config/integration-types.js.map +1 -0
  24. package/dist/src/config/vk-executors.d.ts +5 -0
  25. package/dist/src/config/vk-executors.js +21 -0
  26. package/dist/src/config/vk-executors.js.map +1 -0
  27. package/dist/src/configure-express-app.d.ts +2 -0
  28. package/dist/src/configure-express-app.js +74 -0
  29. package/dist/src/configure-express-app.js.map +1 -0
  30. package/dist/src/database/resolve-database-url.d.ts +2 -0
  31. package/dist/src/database/resolve-database-url.js +46 -0
  32. package/dist/src/database/resolve-database-url.js.map +1 -0
  33. package/dist/src/database/sqlite-migrate.d.ts +1 -0
  34. package/dist/src/database/sqlite-migrate.js +77 -0
  35. package/dist/src/database/sqlite-migrate.js.map +1 -0
  36. package/dist/src/events/integration-settings-emitter.service.d.ts +6 -0
  37. package/dist/src/events/integration-settings-emitter.service.js +30 -0
  38. package/dist/src/events/integration-settings-emitter.service.js.map +1 -0
  39. package/dist/src/events/integration-settings.events.d.ts +1 -0
  40. package/dist/src/events/integration-settings.events.js +5 -0
  41. package/dist/src/events/integration-settings.events.js.map +1 -0
  42. package/dist/src/events/status-events.module.d.ts +2 -0
  43. package/dist/src/events/status-events.module.js +23 -0
  44. package/dist/src/events/status-events.module.js.map +1 -0
  45. package/dist/src/events/status-events.service.d.ts +8 -0
  46. package/dist/src/events/status-events.service.js +32 -0
  47. package/dist/src/events/status-events.service.js.map +1 -0
  48. package/dist/src/generated/prisma/browser.d.ts +10 -0
  49. package/dist/src/generated/prisma/browser.js +44 -0
  50. package/dist/src/generated/prisma/browser.js.map +1 -0
  51. package/dist/src/generated/prisma/client.d.ts +14 -0
  52. package/dist/src/generated/prisma/client.js +46 -0
  53. package/dist/src/generated/prisma/client.js.map +1 -0
  54. package/dist/src/generated/prisma/commonInputTypes.d.ts +333 -0
  55. package/dist/src/generated/prisma/commonInputTypes.js +3 -0
  56. package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
  57. package/dist/src/generated/prisma/enums.d.ts +1 -0
  58. package/dist/src/generated/prisma/enums.js +3 -0
  59. package/dist/src/generated/prisma/enums.js.map +1 -0
  60. package/dist/src/generated/prisma/internal/class.d.ts +50 -0
  61. package/dist/src/generated/prisma/internal/class.js +75 -0
  62. package/dist/src/generated/prisma/internal/class.js.map +1 -0
  63. package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +789 -0
  64. package/dist/src/generated/prisma/internal/prismaNamespace.js +145 -0
  65. package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
  66. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +104 -0
  67. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +129 -0
  68. package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
  69. package/dist/src/generated/prisma/models/PollRun.d.ts +858 -0
  70. package/dist/src/generated/prisma/models/PollRun.js +3 -0
  71. package/dist/src/generated/prisma/models/PollRun.js.map +1 -0
  72. package/dist/src/generated/prisma/models/PollRunItem.d.ts +742 -0
  73. package/dist/src/generated/prisma/models/PollRunItem.js +3 -0
  74. package/dist/src/generated/prisma/models/PollRunItem.js.map +1 -0
  75. package/dist/src/generated/prisma/models/RepoProjectMapping.d.ts +429 -0
  76. package/dist/src/generated/prisma/models/RepoProjectMapping.js +3 -0
  77. package/dist/src/generated/prisma/models/RepoProjectMapping.js.map +1 -0
  78. package/dist/src/generated/prisma/models/ScoutState.d.ts +573 -0
  79. package/dist/src/generated/prisma/models/ScoutState.js +3 -0
  80. package/dist/src/generated/prisma/models/ScoutState.js.map +1 -0
  81. package/dist/src/generated/prisma/models/Setting.d.ts +348 -0
  82. package/dist/src/generated/prisma/models/Setting.js +3 -0
  83. package/dist/src/generated/prisma/models/Setting.js.map +1 -0
  84. package/dist/src/generated/prisma/models/SyncedPullRequest.d.ts +538 -0
  85. package/dist/src/generated/prisma/models/SyncedPullRequest.js +3 -0
  86. package/dist/src/generated/prisma/models/SyncedPullRequest.js.map +1 -0
  87. package/dist/src/generated/prisma/models.d.ts +7 -0
  88. package/dist/src/generated/prisma/models.js +3 -0
  89. package/dist/src/generated/prisma/models.js.map +1 -0
  90. package/dist/src/integrations/github/gh-cli.service.d.ts +7 -0
  91. package/dist/src/integrations/github/gh-cli.service.js +41 -0
  92. package/dist/src/integrations/github/gh-cli.service.js.map +1 -0
  93. package/dist/src/integrations/github/github-pr-scout.service.d.ts +6 -0
  94. package/dist/src/integrations/github/github-pr-scout.service.js +78 -0
  95. package/dist/src/integrations/github/github-pr-scout.service.js.map +1 -0
  96. package/dist/src/integrations/github/github-search-prs.schema.d.ts +28 -0
  97. package/dist/src/integrations/github/github-search-prs.schema.js +21 -0
  98. package/dist/src/integrations/github/github-search-prs.schema.js.map +1 -0
  99. package/dist/src/integrations/github/github-settings-group.service.d.ts +10 -0
  100. package/dist/src/integrations/github/github-settings-group.service.js +22 -0
  101. package/dist/src/integrations/github/github-settings-group.service.js.map +1 -0
  102. package/dist/src/integrations/github/github-settings.schema.d.ts +16 -0
  103. package/dist/src/integrations/github/github-settings.schema.js +57 -0
  104. package/dist/src/integrations/github/github-settings.schema.js.map +1 -0
  105. package/dist/src/integrations/github/github-settings.service.d.ts +10 -0
  106. package/dist/src/integrations/github/github-settings.service.js +46 -0
  107. package/dist/src/integrations/github/github-settings.service.js.map +1 -0
  108. package/dist/src/integrations/github/github-source-status.service.d.ts +8 -0
  109. package/dist/src/integrations/github/github-source-status.service.js +55 -0
  110. package/dist/src/integrations/github/github-source-status.service.js.map +1 -0
  111. package/dist/src/integrations/github/github-source.module.d.ts +2 -0
  112. package/dist/src/integrations/github/github-source.module.js +74 -0
  113. package/dist/src/integrations/github/github-source.module.js.map +1 -0
  114. package/dist/src/integrations/github/github-ui.controller.d.ts +14 -0
  115. package/dist/src/integrations/github/github-ui.controller.js +94 -0
  116. package/dist/src/integrations/github/github-ui.controller.js.map +1 -0
  117. package/dist/src/integrations/integrations.module.d.ts +5 -0
  118. package/dist/src/integrations/integrations.module.js +38 -0
  119. package/dist/src/integrations/integrations.module.js.map +1 -0
  120. package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.d.ts +2 -0
  121. package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.js +98 -0
  122. package/dist/src/integrations/vibe-kanban/vibe-kanban-destination.module.js.map +1 -0
  123. package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.d.ts +24 -0
  124. package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.js +73 -0
  125. package/dist/src/integrations/vibe-kanban/vk-board-adapter.service.js.map +1 -0
  126. package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.d.ts +18 -0
  127. package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.js +104 -0
  128. package/dist/src/integrations/vibe-kanban/vk-mcp-integration.listener.js.map +1 -0
  129. package/dist/src/integrations/vibe-kanban/vk-settings-group.service.d.ts +14 -0
  130. package/dist/src/integrations/vibe-kanban/vk-settings-group.service.js +22 -0
  131. package/dist/src/integrations/vibe-kanban/vk-settings-group.service.js.map +1 -0
  132. package/dist/src/integrations/vibe-kanban/vk-settings.schema.d.ts +16 -0
  133. package/dist/src/integrations/vibe-kanban/vk-settings.schema.js +38 -0
  134. package/dist/src/integrations/vibe-kanban/vk-settings.schema.js.map +1 -0
  135. package/dist/src/integrations/vibe-kanban/vk-settings.service.d.ts +12 -0
  136. package/dist/src/integrations/vibe-kanban/vk-settings.service.js +51 -0
  137. package/dist/src/integrations/vibe-kanban/vk-settings.service.js.map +1 -0
  138. package/dist/src/integrations/vibe-kanban/vk-status.service.d.ts +14 -0
  139. package/dist/src/integrations/vibe-kanban/vk-status.service.js +89 -0
  140. package/dist/src/integrations/vibe-kanban/vk-status.service.js.map +1 -0
  141. package/dist/src/integrations/vibe-kanban/vk-ui.controller.d.ts +16 -0
  142. package/dist/src/integrations/vibe-kanban/vk-ui.controller.js +100 -0
  143. package/dist/src/integrations/vibe-kanban/vk-ui.controller.js.map +1 -0
  144. package/dist/src/integrations/vibe-kanban/vk-workspace-executors.d.ts +1 -0
  145. package/dist/src/integrations/vibe-kanban/vk-workspace-executors.js +7 -0
  146. package/dist/src/integrations/vibe-kanban/vk-workspace-executors.js.map +1 -0
  147. package/dist/src/logging/create-logger-params.d.ts +3 -0
  148. package/dist/src/logging/create-logger-params.js +56 -0
  149. package/dist/src/logging/create-logger-params.js.map +1 -0
  150. package/dist/src/logging/redact-urls.d.ts +1 -0
  151. package/dist/src/logging/redact-urls.js +7 -0
  152. package/dist/src/logging/redact-urls.js.map +1 -0
  153. package/dist/src/main.d.ts +1 -0
  154. package/dist/src/main.js +40 -0
  155. package/dist/src/main.js.map +1 -0
  156. package/dist/src/mappings/dto/create-mapping.dto.d.ts +5 -0
  157. package/dist/src/mappings/dto/create-mapping.dto.js +42 -0
  158. package/dist/src/mappings/dto/create-mapping.dto.js.map +1 -0
  159. package/dist/src/mappings/dto/update-mapping.dto.d.ts +5 -0
  160. package/dist/src/mappings/dto/update-mapping.dto.js +44 -0
  161. package/dist/src/mappings/dto/update-mapping.dto.js.map +1 -0
  162. package/dist/src/mappings/mappings.controller.d.ts +36 -0
  163. package/dist/src/mappings/mappings.controller.js +97 -0
  164. package/dist/src/mappings/mappings.controller.js.map +1 -0
  165. package/dist/src/mappings/mappings.module.d.ts +2 -0
  166. package/dist/src/mappings/mappings.module.js +25 -0
  167. package/dist/src/mappings/mappings.module.js.map +1 -0
  168. package/dist/src/mappings/mappings.service.d.ts +34 -0
  169. package/dist/src/mappings/mappings.service.js +96 -0
  170. package/dist/src/mappings/mappings.service.js.map +1 -0
  171. package/dist/src/ports/destination-board.port.d.ts +37 -0
  172. package/dist/src/ports/destination-board.port.js +3 -0
  173. package/dist/src/ports/destination-board.port.js.map +1 -0
  174. package/dist/src/ports/destination-status.port.d.ts +17 -0
  175. package/dist/src/ports/destination-status.port.js +3 -0
  176. package/dist/src/ports/destination-status.port.js.map +1 -0
  177. package/dist/src/ports/github-pr-candidate.d.ts +9 -0
  178. package/dist/src/ports/github-pr-candidate.js +3 -0
  179. package/dist/src/ports/github-pr-candidate.js.map +1 -0
  180. package/dist/src/ports/github-scout.port.d.ts +2 -0
  181. package/dist/src/ports/github-scout.port.js +3 -0
  182. package/dist/src/ports/github-scout.port.js.map +1 -0
  183. package/dist/src/ports/injection-tokens.d.ts +8 -0
  184. package/dist/src/ports/injection-tokens.js +12 -0
  185. package/dist/src/ports/injection-tokens.js.map +1 -0
  186. package/dist/src/ports/source-status.port.d.ts +14 -0
  187. package/dist/src/ports/source-status.port.js +3 -0
  188. package/dist/src/ports/source-status.port.js.map +1 -0
  189. package/dist/src/ports/sync-pr-scout.port.d.ts +4 -0
  190. package/dist/src/ports/sync-pr-scout.port.js +3 -0
  191. package/dist/src/ports/sync-pr-scout.port.js.map +1 -0
  192. package/dist/src/ports/ui-nav.types.d.ts +5 -0
  193. package/dist/src/ports/ui-nav.types.js +3 -0
  194. package/dist/src/ports/ui-nav.types.js.map +1 -0
  195. package/dist/src/ports/vk-mcp-stdio-session.port.d.ts +5 -0
  196. package/dist/src/ports/vk-mcp-stdio-session.port.js +3 -0
  197. package/dist/src/ports/vk-mcp-stdio-session.port.js.map +1 -0
  198. package/dist/src/prisma/prisma.module.d.ts +2 -0
  199. package/dist/src/prisma/prisma.module.js +22 -0
  200. package/dist/src/prisma/prisma.module.js.map +1 -0
  201. package/dist/src/prisma/prisma.service.d.ts +8 -0
  202. package/dist/src/prisma/prisma.service.js +39 -0
  203. package/dist/src/prisma/prisma.service.js.map +1 -0
  204. package/dist/src/reinit/reinit.controller.d.ts +20 -0
  205. package/dist/src/reinit/reinit.controller.js +43 -0
  206. package/dist/src/reinit/reinit.controller.js.map +1 -0
  207. package/dist/src/reinit/reinit.module.d.ts +2 -0
  208. package/dist/src/reinit/reinit.module.js +25 -0
  209. package/dist/src/reinit/reinit.module.js.map +1 -0
  210. package/dist/src/reinit/reinit.service.d.ts +33 -0
  211. package/dist/src/reinit/reinit.service.js +150 -0
  212. package/dist/src/reinit/reinit.service.js.map +1 -0
  213. package/dist/src/settings/core-settings-group.service.d.ts +18 -0
  214. package/dist/src/settings/core-settings-group.service.js +22 -0
  215. package/dist/src/settings/core-settings-group.service.js.map +1 -0
  216. package/dist/src/settings/core-settings.schema.d.ts +35 -0
  217. package/dist/src/settings/core-settings.schema.js +72 -0
  218. package/dist/src/settings/core-settings.schema.js.map +1 -0
  219. package/dist/src/settings/core-settings.service.d.ts +13 -0
  220. package/dist/src/settings/core-settings.service.js +55 -0
  221. package/dist/src/settings/core-settings.service.js.map +1 -0
  222. package/dist/src/settings/dto/patch-settings-body.schema.d.ts +2 -0
  223. package/dist/src/settings/dto/patch-settings-body.schema.js +7 -0
  224. package/dist/src/settings/dto/patch-settings-body.schema.js.map +1 -0
  225. package/dist/src/settings/dto/patch-settings.dto.d.ts +8 -0
  226. package/dist/src/settings/dto/patch-settings.dto.js +14 -0
  227. package/dist/src/settings/dto/patch-settings.dto.js.map +1 -0
  228. package/dist/src/settings/parse-settings-patch.d.ts +6 -0
  229. package/dist/src/settings/parse-settings-patch.js +33 -0
  230. package/dist/src/settings/parse-settings-patch.js.map +1 -0
  231. package/dist/src/settings/resolve-effective-setting.d.ts +1 -0
  232. package/dist/src/settings/resolve-effective-setting.js +13 -0
  233. package/dist/src/settings/resolve-effective-setting.js.map +1 -0
  234. package/dist/src/settings/setting-definition.d.ts +4 -0
  235. package/dist/src/settings/setting-definition.js +3 -0
  236. package/dist/src/settings/setting-definition.js.map +1 -0
  237. package/dist/src/settings/settings-catalog.service.d.ts +15 -0
  238. package/dist/src/settings/settings-catalog.service.js +68 -0
  239. package/dist/src/settings/settings-catalog.service.js.map +1 -0
  240. package/dist/src/settings/settings-group.base.d.ts +15 -0
  241. package/dist/src/settings/settings-group.base.js +35 -0
  242. package/dist/src/settings/settings-group.base.js.map +1 -0
  243. package/dist/src/settings/settings-group.tokens.d.ts +3 -0
  244. package/dist/src/settings/settings-group.tokens.js +6 -0
  245. package/dist/src/settings/settings-group.tokens.js.map +1 -0
  246. package/dist/src/settings/settings.controller.d.ts +16 -0
  247. package/dist/src/settings/settings.controller.js +116 -0
  248. package/dist/src/settings/settings.controller.js.map +1 -0
  249. package/dist/src/settings/settings.module.d.ts +2 -0
  250. package/dist/src/settings/settings.module.js +39 -0
  251. package/dist/src/settings/settings.module.js.map +1 -0
  252. package/dist/src/settings/settings.service.d.ts +25 -0
  253. package/dist/src/settings/settings.service.js +112 -0
  254. package/dist/src/settings/settings.service.js.map +1 -0
  255. package/dist/src/setup/setup-complete.guard.d.ts +7 -0
  256. package/dist/src/setup/setup-complete.guard.js +36 -0
  257. package/dist/src/setup/setup-complete.guard.js.map +1 -0
  258. package/dist/src/setup/setup-evaluation.service.d.ts +19 -0
  259. package/dist/src/setup/setup-evaluation.service.js +64 -0
  260. package/dist/src/setup/setup-evaluation.service.js.map +1 -0
  261. package/dist/src/setup/setup.module.d.ts +2 -0
  262. package/dist/src/setup/setup.module.js +23 -0
  263. package/dist/src/setup/setup.module.js.map +1 -0
  264. package/dist/src/status/dto/status-snapshot.dto.d.ts +37 -0
  265. package/dist/src/status/dto/status-snapshot.dto.js +168 -0
  266. package/dist/src/status/dto/status-snapshot.dto.js.map +1 -0
  267. package/dist/src/status/status-snapshot.contract.d.ts +1 -0
  268. package/dist/src/status/status-snapshot.contract.js +7 -0
  269. package/dist/src/status/status-snapshot.contract.js.map +1 -0
  270. package/dist/src/status/status-snapshot.schema.d.ts +61 -0
  271. package/dist/src/status/status-snapshot.schema.js +60 -0
  272. package/dist/src/status/status-snapshot.schema.js.map +1 -0
  273. package/dist/src/status/status.controller.d.ts +57 -0
  274. package/dist/src/status/status.controller.js +63 -0
  275. package/dist/src/status/status.controller.js.map +1 -0
  276. package/dist/src/status/status.module.d.ts +2 -0
  277. package/dist/src/status/status.module.js +28 -0
  278. package/dist/src/status/status.module.js.map +1 -0
  279. package/dist/src/status/status.service.d.ts +67 -0
  280. package/dist/src/status/status.service.js +147 -0
  281. package/dist/src/status/status.service.js.map +1 -0
  282. package/dist/src/sync/poll-backoff.d.ts +10 -0
  283. package/dist/src/sync/poll-backoff.js +22 -0
  284. package/dist/src/sync/poll-backoff.js.map +1 -0
  285. package/dist/src/sync/poll-cycle/ensure-issue-for-pr.d.ts +18 -0
  286. package/dist/src/sync/poll-cycle/ensure-issue-for-pr.js +166 -0
  287. package/dist/src/sync/poll-cycle/ensure-issue-for-pr.js.map +1 -0
  288. package/dist/src/sync/poll-cycle/ensure-issue-outcome.d.ts +14 -0
  289. package/dist/src/sync/poll-cycle/ensure-issue-outcome.js +3 -0
  290. package/dist/src/sync/poll-cycle/ensure-issue-outcome.js.map +1 -0
  291. package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.d.ts +16 -0
  292. package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.js +37 -0
  293. package/dist/src/sync/poll-cycle/finalize-successful-poll-cycle.js.map +1 -0
  294. package/dist/src/sync/poll-cycle/kanban-terminal-status.d.ts +1 -0
  295. package/dist/src/sync/poll-cycle/kanban-terminal-status.js +15 -0
  296. package/dist/src/sync/poll-cycle/kanban-terminal-status.js.map +1 -0
  297. package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.d.ts +1 -0
  298. package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.js +13 -0
  299. package/dist/src/sync/poll-cycle/mcp-network-error-heuristic.js.map +1 -0
  300. package/dist/src/sync/poll-cycle/persist-scout-run-outcome.d.ts +16 -0
  301. package/dist/src/sync/poll-cycle/persist-scout-run-outcome.js +61 -0
  302. package/dist/src/sync/poll-cycle/persist-scout-run-outcome.js.map +1 -0
  303. package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.d.ts +4 -0
  304. package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.js +24 -0
  305. package/dist/src/sync/poll-cycle/poll-pr-kanban-copy.js.map +1 -0
  306. package/dist/src/sync/poll-cycle/poll-scout-context.d.ts +23 -0
  307. package/dist/src/sync/poll-cycle/poll-scout-context.js +46 -0
  308. package/dist/src/sync/poll-cycle/poll-scout-context.js.map +1 -0
  309. package/dist/src/sync/poll-cycle/process-poll-candidates.d.ts +26 -0
  310. package/dist/src/sync/poll-cycle/process-poll-candidates.js +69 -0
  311. package/dist/src/sync/poll-cycle/process-poll-candidates.js.map +1 -0
  312. package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.d.ts +9 -0
  313. package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.js +40 -0
  314. package/dist/src/sync/poll-cycle/reconcile-removed-sync-rows.js.map +1 -0
  315. package/dist/src/sync/poll-cycle/run-poll-prerequisites.d.ts +13 -0
  316. package/dist/src/sync/poll-cycle/run-poll-prerequisites.js +25 -0
  317. package/dist/src/sync/poll-cycle/run-poll-prerequisites.js.map +1 -0
  318. package/dist/src/sync/poll-run-decisions.d.ts +16 -0
  319. package/dist/src/sync/poll-run-decisions.js +18 -0
  320. package/dist/src/sync/poll-run-decisions.js.map +1 -0
  321. package/dist/src/sync/poll-run-history.service.d.ts +58 -0
  322. package/dist/src/sync/poll-run-history.service.js +126 -0
  323. package/dist/src/sync/poll-run-history.service.js.map +1 -0
  324. package/dist/src/sync/poll-run-labels.d.ts +2 -0
  325. package/dist/src/sync/poll-run-labels.js +32 -0
  326. package/dist/src/sync/poll-run-labels.js.map +1 -0
  327. package/dist/src/sync/poll-scheduler.service.d.ts +22 -0
  328. package/dist/src/sync/poll-scheduler.service.js +124 -0
  329. package/dist/src/sync/poll-scheduler.service.js.map +1 -0
  330. package/dist/src/sync/pr-ignore-author-logins.d.ts +1 -0
  331. package/dist/src/sync/pr-ignore-author-logins.js +11 -0
  332. package/dist/src/sync/pr-ignore-author-logins.js.map +1 -0
  333. package/dist/src/sync/pr-review-template.d.ts +2 -0
  334. package/dist/src/sync/pr-review-template.js +11 -0
  335. package/dist/src/sync/pr-review-template.js.map +1 -0
  336. package/dist/src/sync/run-poll-cycle.service.d.ts +32 -0
  337. package/dist/src/sync/run-poll-cycle.service.js +234 -0
  338. package/dist/src/sync/run-poll-cycle.service.js.map +1 -0
  339. package/dist/src/sync/sync-constants.d.ts +3 -0
  340. package/dist/src/sync/sync-constants.js +7 -0
  341. package/dist/src/sync/sync-constants.js.map +1 -0
  342. package/dist/src/sync/sync-dependencies.guard.d.ts +9 -0
  343. package/dist/src/sync/sync-dependencies.guard.js +54 -0
  344. package/dist/src/sync/sync-dependencies.guard.js.map +1 -0
  345. package/dist/src/sync/sync-run-state.module.d.ts +2 -0
  346. package/dist/src/sync/sync-run-state.module.js +21 -0
  347. package/dist/src/sync/sync-run-state.module.js.map +1 -0
  348. package/dist/src/sync/sync-run-state.service.d.ts +16 -0
  349. package/dist/src/sync/sync-run-state.service.js +38 -0
  350. package/dist/src/sync/sync-run-state.service.js.map +1 -0
  351. package/dist/src/sync/sync.controller.d.ts +10 -0
  352. package/dist/src/sync/sync.controller.js +60 -0
  353. package/dist/src/sync/sync.controller.js.map +1 -0
  354. package/dist/src/sync/sync.module.d.ts +2 -0
  355. package/dist/src/sync/sync.module.js +43 -0
  356. package/dist/src/sync/sync.module.js.map +1 -0
  357. package/dist/src/sync/sync.service.d.ts +18 -0
  358. package/dist/src/sync/sync.service.js +70 -0
  359. package/dist/src/sync/sync.service.js.map +1 -0
  360. package/dist/src/ui/activity-api.controller.d.ts +37 -0
  361. package/dist/src/ui/activity-api.controller.js +58 -0
  362. package/dist/src/ui/activity-api.controller.js.map +1 -0
  363. package/dist/src/ui/integration-ui-registry.d.ts +6 -0
  364. package/dist/src/ui/integration-ui-registry.js +27 -0
  365. package/dist/src/ui/integration-ui-registry.js.map +1 -0
  366. package/dist/src/ui/setting-labels.d.ts +11 -0
  367. package/dist/src/ui/setting-labels.js +34 -0
  368. package/dist/src/ui/setting-labels.js.map +1 -0
  369. package/dist/src/ui/ui-nav.service.d.ts +10 -0
  370. package/dist/src/ui/ui-nav.service.js +48 -0
  371. package/dist/src/ui/ui-nav.service.js.map +1 -0
  372. package/dist/src/ui/ui-presenter.d.ts +51 -0
  373. package/dist/src/ui/ui-presenter.js +116 -0
  374. package/dist/src/ui/ui-presenter.js.map +1 -0
  375. package/dist/src/ui/ui-vibe-kanban-presenter.d.ts +15 -0
  376. package/dist/src/ui/ui-vibe-kanban-presenter.js +70 -0
  377. package/dist/src/ui/ui-vibe-kanban-presenter.js.map +1 -0
  378. package/dist/src/ui/ui.controller.d.ts +32 -0
  379. package/dist/src/ui/ui.controller.js +212 -0
  380. package/dist/src/ui/ui.controller.js.map +1 -0
  381. package/dist/src/ui/ui.module.d.ts +2 -0
  382. package/dist/src/ui/ui.module.js +30 -0
  383. package/dist/src/ui/ui.module.js.map +1 -0
  384. package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.d.ts +3 -0
  385. package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.js +26 -0
  386. package/dist/src/vibe-kanban/mcp-result/mcp-tool-result-text.js.map +1 -0
  387. package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.d.ts +80 -0
  388. package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.js +58 -0
  389. package/dist/src/vibe-kanban/mcp-result/vk-mcp-list-get-issue-response.schema.js.map +1 -0
  390. package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.d.ts +10 -0
  391. package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.js +169 -0
  392. package/dist/src/vibe-kanban/mcp-result/vk-mcp-tool-result.js.map +1 -0
  393. package/dist/src/vibe-kanban/transport/mcp-transport-config.d.ts +5 -0
  394. package/dist/src/vibe-kanban/transport/mcp-transport-config.js +16 -0
  395. package/dist/src/vibe-kanban/transport/mcp-transport-config.js.map +1 -0
  396. package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.d.ts +20 -0
  397. package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.js +124 -0
  398. package/dist/src/vibe-kanban/transport/vk-mcp-stdio-session.service.js.map +1 -0
  399. package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.d.ts +9 -0
  400. package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.js +37 -0
  401. package/dist/src/vibe-kanban/transport/vk-stdio-command.schema.js.map +1 -0
  402. package/dist/src/vibe-kanban/vibe-kanban-context.controller.d.ts +14 -0
  403. package/dist/src/vibe-kanban/vibe-kanban-context.controller.js +105 -0
  404. package/dist/src/vibe-kanban/vibe-kanban-context.controller.js.map +1 -0
  405. package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.d.ts +7 -0
  406. package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.js +37 -0
  407. package/dist/src/vibe-kanban/vibe-kanban-mcp-configured.guard.js.map +1 -0
  408. package/dist/src/vibe-kanban/vibe-kanban-mcp.service.d.ts +51 -0
  409. package/dist/src/vibe-kanban/vibe-kanban-mcp.service.js +225 -0
  410. package/dist/src/vibe-kanban/vibe-kanban-mcp.service.js.map +1 -0
  411. package/dist/src/vibe-kanban/vibe-kanban-query.schema.d.ts +4 -0
  412. package/dist/src/vibe-kanban/vibe-kanban-query.schema.js +8 -0
  413. package/dist/src/vibe-kanban/vibe-kanban-query.schema.js.map +1 -0
  414. package/dist/src/vibe-kanban/vk-board-cap.d.ts +5 -0
  415. package/dist/src/vibe-kanban/vk-board-cap.js +31 -0
  416. package/dist/src/vibe-kanban/vk-board-cap.js.map +1 -0
  417. package/dist/src/vibe-kanban/vk-contract.d.ts +3 -0
  418. package/dist/src/vibe-kanban/vk-contract.js +10 -0
  419. package/dist/src/vibe-kanban/vk-contract.js.map +1 -0
  420. package/dist/src/vibe-kanban/vk-entities.d.ts +20 -0
  421. package/dist/src/vibe-kanban/vk-entities.js +3 -0
  422. package/dist/src/vibe-kanban/vk-entities.js.map +1 -0
  423. package/dist/tsconfig.build.tsbuildinfo +1 -0
  424. package/dist/ui/public/operator-activity.js +223 -0
  425. package/dist/ui/public/operator-dashboard.js +295 -0
  426. package/dist/ui/public/operator-mappings.js +97 -0
  427. package/dist/ui/public/operator-shell.js +43 -0
  428. package/dist/ui/public/operator-ui-shared.js +40 -0
  429. package/dist/ui/public/operator-vibe-kanban.js +90 -0
  430. package/dist/ui/public/operator.css +706 -0
  431. package/dist/ui/views/activity.hbs +14 -0
  432. package/dist/ui/views/dashboard.hbs +51 -0
  433. package/dist/ui/views/github.hbs +36 -0
  434. package/dist/ui/views/mappings.hbs +98 -0
  435. package/dist/ui/views/partials/layout.hbs +27 -0
  436. package/dist/ui/views/partials/nav.hbs +45 -0
  437. package/dist/ui/views/settings.hbs +69 -0
  438. package/dist/ui/views/vibe-kanban.hbs +95 -0
  439. package/package.json +115 -0
  440. package/prisma/migrations/20260325063706_init/migration.sql +29 -0
  441. package/prisma/migrations/20260325065127_synced_pull_requests/migration.sql +20 -0
  442. package/prisma/migrations/20260325070037_scout_failure_streak/migration.sql +16 -0
  443. package/prisma/migrations/20260325071958_scout_last_poll_stats/migration.sql +4 -0
  444. package/prisma/migrations/20260325120556_kanban_repo_and_workspace/migration.sql +28 -0
  445. package/prisma/migrations/20260325151849_poll_run_history/migration.sql +37 -0
  446. package/prisma/migrations/20260326064926_poll_run_skipped_board_limit/migration.sql +2 -0
  447. package/prisma/migrations/20260326120000_drop_runtime_integration_settings/migration.sql +2 -0
  448. package/prisma/migrations/migration_lock.toml +3 -0
  449. package/prisma/schema.prisma +100 -0
@@ -0,0 +1,51 @@
1
+ {{#> layout title="Dashboard" active="dashboard" pageScript="operator-dashboard.js" navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
2
+ <script type="application/json" id="boot-snapshot">{{{bootSnapshotJson}}}</script>
3
+ <script type="application/json" id="setup-reasons">{{{setupReasonMapJson}}}</script>
4
+ <div class="page">
5
+ <header class="page-head">
6
+ <h1>Dashboard</h1>
7
+ </header>
8
+
9
+ {{#if showSetupChecklist}}
10
+ <div class="card setup-checklist-card">
11
+ <h2>Finish configuration</h2>
12
+ <p class="muted">Complete these before scheduled sync can run safely.</p>
13
+ <ul class="setup-checklist">
14
+ {{#each setupChecklist}}
15
+ <li class="setup-checklist-item">
16
+ <span class="setup-checklist-mark" aria-hidden="true">○</span>
17
+ <span class="setup-checklist-text">{{text}}</span>
18
+ {{#if linkHref}}
19
+ <a href="{{linkHref}}" class="btn btn-sm ghost">{{linkLabel}}</a>
20
+ {{/if}}
21
+ </li>
22
+ {{/each}}
23
+ </ul>
24
+ </div>
25
+ {{/if}}
26
+
27
+ {{#if showScheduledSyncOff}}
28
+ <div class="card setup-checklist-card">
29
+ <h2>Automatic polling is off</h2>
30
+ <p class="muted">
31
+ The scheduled timer will not run until you enable <strong>scheduled_sync_enabled</strong> (General settings) or set <code>SCHEDULED_SYNC_ENABLED=true</code> in the environment. Manual &ldquo;Sync now&rdquo; still works.
32
+ </p>
33
+ <a href="/ui/settings" class="btn primary">Open General settings</a>
34
+ </div>
35
+ {{/if}}
36
+
37
+ <div id="action-msg" class="banner banner-info" style="display:none"></div>
38
+
39
+ <div class="card actions-row">
40
+ <button type="button" id="btn-sync" class="btn primary" {{#unless manualSync.canRun}}disabled{{/unless}} title="Run one full sync cycle now (same as the scheduler, but immediate)">Sync now</button>
41
+ <button type="button" id="btn-reinit" class="btn" style="display: none" title="Refresh settings cache, probe MCP if configured, reset scout backoff">Reinit</button>
42
+ </div>
43
+
44
+ <div id="status-overview" class="status-grid" aria-live="polite"></div>
45
+
46
+ <details class="card raw-details">
47
+ <summary>Technical details (raw JSON)</summary>
48
+ <pre id="status-snap" class="json-block">{{{snapshotPretty}}}</pre>
49
+ </details>
50
+ </div>
51
+ {{/layout}}
@@ -0,0 +1,36 @@
1
+ {{#> layout title="GitHub" active="github" navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
2
+ <div class="page">
3
+ <header class="page-head">
4
+ <h1>GitHub</h1>
5
+ <p class="muted">
6
+ PR review issue body template. PR discovery uses <code>gh search prs</code> with your default <code>gh</code> host and auth.
7
+ </p>
8
+ </header>
9
+
10
+ {{#if error}}
11
+ <div class="banner banner-error">{{error}}</div>
12
+ {{/if}}
13
+ {{#if saved}}
14
+ <div class="banner banner-ok">GitHub settings saved.</div>
15
+ {{/if}}
16
+
17
+ <form method="post" action="/ui/github" class="card form-grid">
18
+ {{#each fields}}
19
+ <label class="field">
20
+ <span class="field-label">{{label}}</span>
21
+ <span class="field-key muted">{{key}}</span>
22
+ {{#if (eq key "pr_ignore_author_logins")}}
23
+ <textarea name="{{key}}" class="input" rows="3" placeholder="login1; login2">{{value}}</textarea>
24
+ {{else if (eq key "pr_review_body_template")}}
25
+ <textarea name="{{key}}" class="input" rows="4">{{value}}</textarea>
26
+ {{else}}
27
+ <input name="{{key}}" class="input" type="text" value="{{value}}" />
28
+ {{/if}}
29
+ </label>
30
+ {{/each}}
31
+ <div class="actions-row">
32
+ <button type="submit" class="btn primary">Save</button>
33
+ </div>
34
+ </form>
35
+ </div>
36
+ {{/layout}}
@@ -0,0 +1,98 @@
1
+ {{#> layout title="Mappings" active="mappings" pageScript="operator-mappings.js" navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
2
+ <div class="page">
3
+ <header class="page-head">
4
+ <h1>Mappings</h1>
5
+ <p class="muted">GitHub repo (<code>owner/repo</code>) → Vibe Kanban repository. Default Kanban <strong>project</strong> for new issues is set on the <a href="/ui/vibe-kanban">Vibe Kanban</a> page.</p>
6
+ </header>
7
+
8
+ {{#if error}}
9
+ <div class="banner banner-error">{{error}}</div>
10
+ {{/if}}
11
+
12
+ <div class="card">
13
+ <h2>New mapping</h2>
14
+ <form id="new-mapping-form" method="post" action="/ui/mappings" class="form-stack">
15
+ <div class="form-row">
16
+ <label class="field inline grow">
17
+ <span class="field-label">GitHub repo</span>
18
+ <input name="githubRepo" class="input" placeholder="owner/repo" required autocomplete="off" />
19
+ </label>
20
+ </div>
21
+ {{#if kanbanMcpPicker}}
22
+ <input type="hidden" name="vibeKanbanRepoId" id="h-vk-repo" value="" />
23
+ <div class="form-row">
24
+ <label class="field inline grow">
25
+ <span class="field-label">Vibe Kanban repository</span>
26
+ <select id="mk-repo" class="input mono">
27
+ <option value="">Loading…</option>
28
+ </select>
29
+ </label>
30
+ </div>
31
+ <p id="mk-err" class="banner banner-error" style="display: none"></p>
32
+ {{else}}
33
+ <div class="form-row">
34
+ <label class="field inline grow">
35
+ <span class="field-label">vibeKanbanRepoId</span>
36
+ <input name="vibeKanbanRepoId" class="input mono" required autocomplete="off" />
37
+ </label>
38
+ </div>
39
+ {{/if}}
40
+ <div class="form-row">
41
+ <label class="field inline grow">
42
+ <span class="field-label">label (optional)</span>
43
+ <input name="label" class="input" autocomplete="off" />
44
+ </label>
45
+ </div>
46
+ <button type="submit" class="btn primary">Add</button>
47
+ </form>
48
+ </div>
49
+
50
+ <div class="card">
51
+ <div class="table-head">
52
+ <h2>Existing</h2>
53
+ <button type="button" class="btn ghost" onclick="location.reload()">Reload</button>
54
+ </div>
55
+ <div class="table-wrap">
56
+ <table class="data-table">
57
+ <thead>
58
+ <tr>
59
+ <th>GitHub repo</th>
60
+ <th>VK repository ID</th>
61
+ <th>Label</th>
62
+ <th></th>
63
+ </tr>
64
+ </thead>
65
+ <tbody>
66
+ {{#each rows}}
67
+ <tr class="js-mapping-row" data-id="{{id}}">
68
+ <td class="mono cell-d">
69
+ <span class="disp">{{githubRepo}}</span>
70
+ <input class="input input-sm edit" hidden value="{{githubRepo}}" />
71
+ </td>
72
+ <td class="mono wrap cell-d">
73
+ <span class="disp">{{vibeKanbanRepoId}}</span>
74
+ <input class="input input-sm mono edit" hidden value="{{vibeKanbanRepoId}}" />
75
+ </td>
76
+ <td class="cell-d">
77
+ <span class="disp">{{#if label}}{{label}}{{else}}—{{/if}}</span>
78
+ <input class="input input-sm edit" hidden value="{{#if label}}{{label}}{{/if}}" />
79
+ </td>
80
+ <td class="actions">
81
+ <button type="button" class="btn btn-sm js-edit">Edit</button>
82
+ <button type="button" class="btn btn-sm primary js-save" hidden>Save</button>
83
+ <button type="button" class="btn btn-sm ghost js-cancel" hidden>Cancel</button>
84
+ <form method="post" action="/ui/mappings/{{id}}/delete" class="inline-form" onsubmit="return confirm('Delete this mapping?');">
85
+ <button type="submit" class="btn btn-sm danger">Delete</button>
86
+ </form>
87
+ </td>
88
+ </tr>
89
+ {{/each}}
90
+ </tbody>
91
+ </table>
92
+ {{#unless rows.length}}
93
+ <p class="muted pad">No mappings yet.</p>
94
+ {{/unless}}
95
+ </div>
96
+ </div>
97
+ </div>
98
+ {{/layout}}
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>{{title}} · vibe-squire</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link
9
+ href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Source+Sans+3:wght@400;600;700&display=swap"
10
+ rel="stylesheet"
11
+ />
12
+ <link rel="stylesheet" href="/ui/assets/operator.css" />
13
+ </head>
14
+ <body>
15
+ <div class="shell">
16
+ {{> nav active=active navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
17
+ <main class="main">
18
+ {{{renderBlock}}}
19
+ </main>
20
+ </div>
21
+ <script src="/ui/assets/operator-ui-shared.js" defer></script>
22
+ <script src="/ui/assets/operator-shell.js" defer></script>
23
+ {{#if pageScript}}
24
+ <script src="/ui/assets/{{pageScript}}" defer></script>
25
+ {{/if}}
26
+ </body>
27
+ </html>
@@ -0,0 +1,45 @@
1
+ <aside class="nav-rail">
2
+ <div class="brand">
3
+ <span class="brand-mark">◇</span>
4
+ <span class="brand-text">vibe-squire</span>
5
+ </div>
6
+ <div class="nav-live" aria-live="polite">
7
+ <span class="nav-live-label muted">Status stream</span>
8
+ <span id="nav-sse-state" class="sse sse-connecting">connecting</span>
9
+ </div>
10
+ <nav class="nav">
11
+ {{#unless navMinimal}}
12
+ <a
13
+ href="/ui/dashboard"
14
+ class="nav-link {{#if (eq active 'dashboard')}}active{{/if}}"
15
+ >Dashboard</a>
16
+ <a
17
+ href="/ui/activity"
18
+ class="nav-link {{#if (eq active 'activity')}}active{{/if}}"
19
+ >Activity</a>
20
+ {{/unless}}
21
+
22
+ <div class="nav-settings-group">
23
+ <div class="nav-section-heading" id="nav-heading-settings">Settings</div>
24
+ <a
25
+ href="/ui/settings"
26
+ class="nav-link nav-link-nested {{#if (eq active 'general')}}active{{/if}}"
27
+ aria-labelledby="nav-heading-settings"
28
+ >General</a>
29
+ {{#unless navMinimal}}
30
+ {{#each integrationNavEntries}}
31
+ <a
32
+ href="{{href}}"
33
+ class="nav-link nav-link-nested {{#if (eq ../active id)}}active{{/if}}"
34
+ aria-labelledby="nav-heading-settings"
35
+ >{{label}}</a>
36
+ {{/each}}
37
+ {{/unless}}
38
+ </div>
39
+ </nav>
40
+ {{#if navMinimal}}
41
+ <p class="nav-foot muted">Choose integrations under Settings → General to unlock the operator UI.</p>
42
+ {{else}}
43
+ <p class="nav-foot muted">Operator UI · served by the API process</p>
44
+ {{/if}}
45
+ </aside>
@@ -0,0 +1,69 @@
1
+ {{#> layout title="General" active="general" navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
2
+ <div class="page">
3
+ <header class="page-head">
4
+ <h1>General</h1>
5
+ </header>
6
+
7
+ {{#if error}}
8
+ <div class="banner banner-error">{{error}}</div>
9
+ {{/if}}
10
+ {{#if saved}}
11
+ <div class="banner banner-ok">Poll schedule saved. Scheduler refreshed if the interval changed.</div>
12
+ {{/if}}
13
+
14
+ <div class="card">
15
+ <h2>Sync adapters</h2>
16
+ <p class="muted">
17
+ PR source and work board are set at <strong>process start</strong> via environment variables
18
+ <code>SOURCE_TYPE</code> and <code>DESTINATION_TYPE</code> (defaults: <code>github</code> → <code>vibe_kanban</code>).
19
+ They are not stored in the database. Change env and restart to switch adapters.
20
+ </p>
21
+ <p class="muted"><strong>Resolved for this process:</strong> {{resolvedSourceLabel}} → {{resolvedDestinationLabel}}</p>
22
+ </div>
23
+
24
+ <div class="card">
25
+ <h2>Poll schedule</h2>
26
+ <p class="muted">
27
+ Values shown are effective (env overrides database where configured). Manual &ldquo;Sync now&rdquo; is not limited by the interval.
28
+ </p>
29
+ <form method="post" action="/ui/settings" class="form-stack">
30
+ <fieldset class="fieldset-plain">
31
+ <legend class="field-label">Automatic polling</legend>
32
+ <p class="muted" style="margin: 0 0 0.75rem 0">
33
+ When off, the scheduled timer does not run. Env: <code>SCHEDULED_SYNC_ENABLED</code>. Setting key: <code>scheduled_sync_enabled</code>
34
+ </p>
35
+ <label class="check-row">
36
+ <input
37
+ type="radio"
38
+ name="scheduled_sync_enabled"
39
+ value="true"
40
+ {{#if scheduledSyncEnabled}}checked{{/if}}
41
+ />
42
+ <span>On — run sync on the interval below</span>
43
+ </label>
44
+ <label class="check-row">
45
+ <input
46
+ type="radio"
47
+ name="scheduled_sync_enabled"
48
+ value="false"
49
+ {{#unless scheduledSyncEnabled}}checked{{/unless}}
50
+ />
51
+ <span>Off — timer disabled only</span>
52
+ </label>
53
+ </fieldset>
54
+ <div class="form-grid" style="margin-top: 1rem">
55
+ {{#each fields}}
56
+ <label class="field">
57
+ <span class="field-label">{{label}}</span>
58
+ <span class="field-key muted">{{key}}</span>
59
+ <input name="{{key}}" class="input" type="text" value="{{value}}" />
60
+ </label>
61
+ {{/each}}
62
+ </div>
63
+ <div class="actions-row">
64
+ <button type="submit" class="btn primary">Save schedule</button>
65
+ </div>
66
+ </form>
67
+ </div>
68
+ </div>
69
+ {{/layout}}
@@ -0,0 +1,95 @@
1
+ {{#> layout title="Vibe Kanban" active="vibe_kanban" pageScript="operator-vibe-kanban.js" navMinimal=navMinimal integrationNavEntries=integrationNavEntries}}
2
+ <div class="page">
3
+ <header class="page-head">
4
+ <h1>Vibe Kanban</h1>
5
+ </header>
6
+
7
+ {{#if saved}}
8
+ <div class="banner banner-ok">Vibe Kanban settings saved.</div>
9
+ {{/if}}
10
+ {{#if error}}
11
+ <div class="banner banner-error">{{error}}</div>
12
+ {{/if}}
13
+
14
+ <form method="post" action="/ui/vibe-kanban" class="card form-grid" id="vk-settings-form">
15
+ <div class="field" style="grid-column: 1 / -1">
16
+ <span class="field-label">{{vkLabels.default_organization_id}}</span>
17
+ <span class="field-key muted">default_organization_id · default_project_id</span>
18
+ <p class="muted" style="margin: 0.25rem 0 0.75rem; font-size: 0.9rem">
19
+ Required for sync. {{#if mcpBoardPicker}}Choose organization, then project.{{else}}Paste UUIDs from Vibe Kanban (dropdowns require MCP configured outside this page).{{/if}}
20
+ Click <strong>Save</strong> when done.
21
+ </p>
22
+ {{#if mcpBoardPicker}}
23
+ <input type="hidden" name="default_organization_id" id="vk-in-org" value="{{boardOrg}}" />
24
+ <input type="hidden" name="default_project_id" id="vk-in-proj" value="{{boardProj}}" />
25
+ {{#if vkBoardListError}}
26
+ <div class="banner banner-error" style="margin-bottom: 0.75rem">{{vkBoardListError}}</div>
27
+ {{/if}}
28
+ {{#if vkBoardProjectsEmpty}}
29
+ <p class="muted" style="margin: 0 0 0.75rem; font-size: 0.9rem">
30
+ No projects returned for this organization.
31
+ </p>
32
+ {{/if}}
33
+ <div class="form-row" style="flex-wrap: wrap; gap: 0.75rem; margin-bottom: 0.75rem">
34
+ <label class="field inline grow" style="min-width: 12rem">
35
+ <span class="field-label">Organization</span>
36
+ <select id="vk-sel-org" class="input">
37
+ <option value="">Select organization…</option>
38
+ {{#each vkBoardOrganizations}}
39
+ <option value="{{id}}" {{#if (eq ../boardOrg id)}}selected{{/if}}>{{#if name}}{{name}} — {{id}}{{else}}{{id}}{{/if}}</option>
40
+ {{/each}}
41
+ </select>
42
+ </label>
43
+ <label class="field inline grow" style="min-width: 12rem">
44
+ <span class="field-label">Project</span>
45
+ <select id="vk-sel-proj" class="input mono" {{#unless hasVkProjectPick}}disabled="disabled"{{/unless}}>
46
+ {{#if hasVkProjectPick}}
47
+ <option value="">Select project…</option>
48
+ {{#each vkBoardProjects}}
49
+ <option value="{{id}}" {{#if (eq ../boardProj id)}}selected{{/if}}>{{#if name}}{{name}} — {{id}}{{else}}{{id}}{{/if}}</option>
50
+ {{/each}}
51
+ {{else}}
52
+ <option value="">Select organization first</option>
53
+ {{/if}}
54
+ </select>
55
+ </label>
56
+ </div>
57
+ <p id="vk-board-err" class="banner banner-error" style="display: none; margin-top: 0.5rem"></p>
58
+ {{else}}
59
+ <label class="field">
60
+ <span class="field-label">Organization UUID</span>
61
+ <input id="vk-txt-org" name="default_organization_id" class="input mono" type="text" value="{{boardOrg}}" autocomplete="off" />
62
+ </label>
63
+ <label class="field">
64
+ <span class="field-label">Project UUID</span>
65
+ <input id="vk-txt-proj" name="default_project_id" class="input mono" type="text" value="{{boardProj}}" autocomplete="off" />
66
+ </label>
67
+ {{/if}}
68
+ </div>
69
+
70
+ <label class="field">
71
+ <span class="field-label">{{vkLabels.vk_workspace_executor}}</span>
72
+ <span class="field-key muted">vk_workspace_executor</span>
73
+ <select name="vk_workspace_executor" class="input">
74
+ {{#each executorOptions}}
75
+ <option value="{{value}}" {{#if (eq ../vkExecutor value)}}selected{{/if}}>{{label}}</option>
76
+ {{/each}}
77
+ </select>
78
+ </label>
79
+
80
+ <label class="field">
81
+ <span class="field-label">{{vkLabels.kanban_done_status}}</span>
82
+ <span class="field-key muted">kanban_done_status</span>
83
+ <input name="kanban_done_status" class="input" type="text" value="{{kanbanDoneStatus}}" />
84
+ </label>
85
+
86
+ <div class="actions-row" style="grid-column: 1 / -1">
87
+ <button type="submit" class="btn primary">Save</button>
88
+ </div>
89
+ </form>
90
+
91
+ {{#if orgError}}
92
+ <div class="banner banner-error">{{orgError}}</div>
93
+ {{/if}}
94
+ </div>
95
+ {{/layout}}
package/package.json ADDED
@@ -0,0 +1,115 @@
1
+ {
2
+ "name": "vibe-squire",
3
+ "version": "1.0.0",
4
+ "description": "Local orchestrator: GitHub PR review queue → Vibe Kanban via MCP",
5
+ "author": "alexpialetski",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/alexpialetski/vibe-squire.git"
10
+ },
11
+ "engines": {
12
+ "node": ">=20.0.0"
13
+ },
14
+ "bin": {
15
+ "vibe-squire": "./bin/vibe-squire.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "prisma",
20
+ "bin"
21
+ ],
22
+ "scripts": {
23
+ "prepublishOnly": "prisma generate && nest build",
24
+ "build": "nest build",
25
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
26
+ "start": "node -r dotenv/config node_modules/.bin/nest start",
27
+ "start:dev": "node -r dotenv/config node_modules/.bin/nest start --watch",
28
+ "start:debug": "node -r dotenv/config node_modules/.bin/nest start --debug --watch",
29
+ "start:prod": "node dist/main",
30
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
31
+ "lint:check": "eslint \"{src,apps,libs,test}/**/*.ts\" --max-warnings 0",
32
+ "typecheck": "tsc --noEmit",
33
+ "test": "jest",
34
+ "test:watch": "jest --watch",
35
+ "test:cov": "jest --coverage",
36
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
37
+ "test:integration": "NODE_OPTIONS=--experimental-vm-modules jest --config ./test/jest-integration.json",
38
+ "prepare": "husky"
39
+ },
40
+ "dependencies": {
41
+ "@modelcontextprotocol/sdk": "^1.27.1",
42
+ "@nestjs/common": "^11.0.1",
43
+ "@nestjs/core": "^11.0.1",
44
+ "@nestjs/event-emitter": "^3.0.1",
45
+ "@nestjs/platform-express": "^11.0.1",
46
+ "@nestjs/schedule": "^6.1.1",
47
+ "@nestjs/swagger": "^11.2.6",
48
+ "@prisma/adapter-better-sqlite3": "^7.5.0",
49
+ "@prisma/client": "^7.5.0",
50
+ "better-sqlite3": "^12.8.0",
51
+ "class-transformer": "^0.5.1",
52
+ "class-validator": "^0.14.4",
53
+ "hbs": "^4.2.0",
54
+ "nestjs-pino": "^4.6.1",
55
+ "reflect-metadata": "^0.2.2",
56
+ "rxjs": "^7.8.1",
57
+ "zod": "^4.3.6"
58
+ },
59
+ "devDependencies": {
60
+ "@commitlint/cli": "^20.5.0",
61
+ "@commitlint/config-conventional": "^20.5.0",
62
+ "@eslint/eslintrc": "^3.2.0",
63
+ "@eslint/js": "^9.18.0",
64
+ "@nestjs/cli": "^11.0.0",
65
+ "@nestjs/schematics": "^11.0.0",
66
+ "@nestjs/testing": "^11.0.1",
67
+ "@types/better-sqlite3": "^7.6.13",
68
+ "@types/express": "^5.0.6",
69
+ "@types/hbs": "^4.0.5",
70
+ "@types/jest": "^30.0.0",
71
+ "@types/node": "^22.10.7",
72
+ "@types/supertest": "^6.0.2",
73
+ "dotenv": "^17.3.1",
74
+ "eslint": "^9.18.0",
75
+ "eslint-config-prettier": "^10.0.1",
76
+ "eslint-plugin-prettier": "^5.2.2",
77
+ "globals": "^16.0.0",
78
+ "husky": "^9.1.7",
79
+ "jest": "^30.0.0",
80
+ "lint-staged": "^16.4.0",
81
+ "pino-pretty": "^13.1.3",
82
+ "prettier": "^3.4.2",
83
+ "prisma": "^7.5.0",
84
+ "semantic-release": "^25.0.3",
85
+ "source-map-support": "^0.5.21",
86
+ "supertest": "^7.0.0",
87
+ "ts-jest": "^29.2.5",
88
+ "ts-loader": "^9.5.2",
89
+ "ts-node": "^10.9.2",
90
+ "tsconfig-paths": "^4.2.0",
91
+ "typescript": "^5.7.3",
92
+ "typescript-eslint": "^8.20.0"
93
+ },
94
+ "jest": {
95
+ "moduleFileExtensions": [
96
+ "js",
97
+ "json",
98
+ "ts"
99
+ ],
100
+ "rootDir": "src",
101
+ "testMatch": [
102
+ "**/__tests__/**/*.spec.ts"
103
+ ],
104
+ "transform": {
105
+ "^.+\\.(t|j)s$": "ts-jest"
106
+ },
107
+ "collectCoverageFrom": [
108
+ "**/*.(t|j)s",
109
+ "!**/*.spec.ts",
110
+ "!**/generated/**"
111
+ ],
112
+ "coverageDirectory": "../coverage",
113
+ "testEnvironment": "node"
114
+ }
115
+ }
@@ -0,0 +1,29 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Setting" (
3
+ "key" TEXT NOT NULL PRIMARY KEY,
4
+ "value" TEXT NOT NULL,
5
+ "updatedAt" DATETIME NOT NULL
6
+ );
7
+
8
+ -- CreateTable
9
+ CREATE TABLE "RepoProjectMapping" (
10
+ "id" TEXT NOT NULL PRIMARY KEY,
11
+ "githubRepo" TEXT NOT NULL,
12
+ "kanbanProjectId" TEXT NOT NULL,
13
+ "kanbanOrganizationId" TEXT,
14
+ "label" TEXT,
15
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ "updatedAt" DATETIME NOT NULL
17
+ );
18
+
19
+ -- CreateTable
20
+ CREATE TABLE "ScoutState" (
21
+ "scoutId" TEXT NOT NULL PRIMARY KEY,
22
+ "lastPollAt" DATETIME,
23
+ "nextPollAt" DATETIME,
24
+ "lastError" TEXT,
25
+ "updatedAt" DATETIME NOT NULL
26
+ );
27
+
28
+ -- CreateIndex
29
+ CREATE UNIQUE INDEX "RepoProjectMapping_githubRepo_key" ON "RepoProjectMapping"("githubRepo");
@@ -0,0 +1,20 @@
1
+ -- CreateTable
2
+ CREATE TABLE "SyncedPullRequest" (
3
+ "id" TEXT NOT NULL PRIMARY KEY,
4
+ "githubRepo" TEXT NOT NULL,
5
+ "prNumber" INTEGER NOT NULL,
6
+ "prUrl" TEXT NOT NULL,
7
+ "kanbanIssueId" TEXT NOT NULL,
8
+ "kanbanProjectId" TEXT NOT NULL,
9
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
10
+ "updatedAt" DATETIME NOT NULL
11
+ );
12
+
13
+ -- CreateIndex
14
+ CREATE UNIQUE INDEX "SyncedPullRequest_prUrl_key" ON "SyncedPullRequest"("prUrl");
15
+
16
+ -- CreateIndex
17
+ CREATE INDEX "SyncedPullRequest_githubRepo_idx" ON "SyncedPullRequest"("githubRepo");
18
+
19
+ -- CreateIndex
20
+ CREATE INDEX "SyncedPullRequest_kanbanProjectId_idx" ON "SyncedPullRequest"("kanbanProjectId");
@@ -0,0 +1,16 @@
1
+ -- RedefineTables
2
+ PRAGMA defer_foreign_keys=ON;
3
+ PRAGMA foreign_keys=OFF;
4
+ CREATE TABLE "new_ScoutState" (
5
+ "scoutId" TEXT NOT NULL PRIMARY KEY,
6
+ "lastPollAt" DATETIME,
7
+ "nextPollAt" DATETIME,
8
+ "lastError" TEXT,
9
+ "failureStreak" INTEGER NOT NULL DEFAULT 0,
10
+ "updatedAt" DATETIME NOT NULL
11
+ );
12
+ INSERT INTO "new_ScoutState" ("lastError", "lastPollAt", "nextPollAt", "scoutId", "updatedAt") SELECT "lastError", "lastPollAt", "nextPollAt", "scoutId", "updatedAt" FROM "ScoutState";
13
+ DROP TABLE "ScoutState";
14
+ ALTER TABLE "new_ScoutState" RENAME TO "ScoutState";
15
+ PRAGMA foreign_keys=ON;
16
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,4 @@
1
+ -- AlterTable
2
+ ALTER TABLE "ScoutState" ADD COLUMN "lastPollCandidatesCount" INTEGER;
3
+ ALTER TABLE "ScoutState" ADD COLUMN "lastPollIssuesCreated" INTEGER;
4
+ ALTER TABLE "ScoutState" ADD COLUMN "lastPollSkippedUnmapped" INTEGER;
@@ -0,0 +1,28 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `kanbanOrganizationId` on the `RepoProjectMapping` table. All the data in the column will be lost.
5
+ - You are about to drop the column `kanbanProjectId` on the `RepoProjectMapping` table. All the data in the column will be lost.
6
+ - Added the required column `vibeKanbanRepoId` to the `RepoProjectMapping` table without a default value. This is not possible if the table is not empty.
7
+
8
+ */
9
+ -- AlterTable
10
+ ALTER TABLE "SyncedPullRequest" ADD COLUMN "vibeKanbanWorkspaceId" TEXT;
11
+
12
+ -- RedefineTables
13
+ PRAGMA defer_foreign_keys=ON;
14
+ PRAGMA foreign_keys=OFF;
15
+ CREATE TABLE "new_RepoProjectMapping" (
16
+ "id" TEXT NOT NULL PRIMARY KEY,
17
+ "githubRepo" TEXT NOT NULL,
18
+ "vibeKanbanRepoId" TEXT NOT NULL,
19
+ "label" TEXT,
20
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
21
+ "updatedAt" DATETIME NOT NULL
22
+ );
23
+ INSERT INTO "new_RepoProjectMapping" ("createdAt", "githubRepo", "id", "label", "updatedAt", "vibeKanbanRepoId") SELECT "createdAt", "githubRepo", "id", "label", "updatedAt", '00000000-0000-4000-8000-000000000000' FROM "RepoProjectMapping";
24
+ DROP TABLE "RepoProjectMapping";
25
+ ALTER TABLE "new_RepoProjectMapping" RENAME TO "RepoProjectMapping";
26
+ CREATE UNIQUE INDEX "RepoProjectMapping_githubRepo_key" ON "RepoProjectMapping"("githubRepo");
27
+ PRAGMA foreign_keys=ON;
28
+ PRAGMA defer_foreign_keys=OFF;