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,223 @@
1
+ (function () {
2
+ var Ui = window.VibeSquireUi;
3
+ if (!Ui) return;
4
+
5
+ var root = document.getElementById('activity-runs-root');
6
+ if (!root) return;
7
+
8
+ var POLL_WHILE_RUNNING_MS = 2500;
9
+ var esc = Ui.esc;
10
+ var fmtIso = Ui.fmtIso;
11
+
12
+ function fmtCount(v) {
13
+ return v == null ? '—' : String(v);
14
+ }
15
+
16
+ function renderItemsTable(items) {
17
+ if (!items || !items.length) return '';
18
+ var rows = items
19
+ .map(function (it) {
20
+ var detailParts = [];
21
+ if (it.kanbanIssueId) {
22
+ detailParts.push(
23
+ '<span class="mono">issue ' + esc(it.kanbanIssueId) + '</span>',
24
+ );
25
+ }
26
+ if (it.detail) {
27
+ detailParts.push(esc(it.detail));
28
+ }
29
+ var detail =
30
+ detailParts.length > 1
31
+ ? detailParts.join(' · ')
32
+ : detailParts[0] || '';
33
+ var author =
34
+ it.authorLogin &&
35
+ '<div class="muted" style="font-size:0.8rem">@' +
36
+ esc(it.authorLogin) +
37
+ '</div>';
38
+ return (
39
+ '<tr>' +
40
+ '<td class="mono">' +
41
+ '<a href="' +
42
+ esc(it.prUrl) +
43
+ '" target="_blank" rel="noopener noreferrer">#' +
44
+ esc(it.prNumber) +
45
+ '</a>' +
46
+ '<div class="activity-pr-title muted">' +
47
+ esc(it.prTitle) +
48
+ '</div>' +
49
+ (author || '') +
50
+ '</td>' +
51
+ '<td class="mono wrap">' +
52
+ esc(it.githubRepo) +
53
+ '</td>' +
54
+ '<td>' +
55
+ esc(it.decisionLabel) +
56
+ '</td>' +
57
+ '<td class="wrap muted">' +
58
+ detail +
59
+ '</td>' +
60
+ '</tr>'
61
+ );
62
+ })
63
+ .join('');
64
+ return (
65
+ '<details class="activity-details">' +
66
+ '<summary class="activity-details-summary">PR details (' +
67
+ items.length +
68
+ ')</summary>' +
69
+ '<div class="table-wrap activity-items-wrap">' +
70
+ '<table class="data-table activity-items-table">' +
71
+ '<thead><tr><th>PR</th><th>Repo</th><th>Outcome</th><th>Detail</th></tr></thead>' +
72
+ '<tbody>' +
73
+ rows +
74
+ '</tbody></table></div></details>'
75
+ );
76
+ }
77
+
78
+ function renderRun(r) {
79
+ var meta =
80
+ '<div class="activity-run-meta">' +
81
+ '<span class="activity-run-time mono">' +
82
+ esc(r.startedAtLabel || fmtIso(r.startedAt)) +
83
+ '</span>' +
84
+ '<span class="activity-pill activity-pill-trigger">' +
85
+ esc(r.trigger) +
86
+ '</span>' +
87
+ '<span class="activity-pill activity-pill-phase activity-pill-phase-' +
88
+ esc(r.phase) +
89
+ '">' +
90
+ esc(r.phaseLabel) +
91
+ '</span></div>';
92
+
93
+ var summaryBody = '';
94
+ if (r.phase === 'running') {
95
+ summaryBody +=
96
+ '<p class="muted activity-run-counts" style="margin:0.35rem 0 0">Sync in progress… ' +
97
+ (r.itemCount || 0) +
98
+ ' PR row(s) recorded so far.</p>';
99
+ }
100
+ if (r.phase === 'completed') {
101
+ summaryBody +=
102
+ '<p class="muted activity-run-counts" style="margin:0.35rem 0 0">' +
103
+ fmtCount(r.candidatesCount) +
104
+ ' PR(s) seen · ' +
105
+ fmtCount(r.issuesCreated) +
106
+ ' created · ' +
107
+ fmtCount(r.skippedUnmapped) +
108
+ ' unmapped · ' +
109
+ fmtCount(r.skippedBot) +
110
+ ' bot · ' +
111
+ fmtCount(r.skippedBoardLimit) +
112
+ ' board limit · ' +
113
+ fmtCount(r.skippedAlreadyTracked) +
114
+ ' already tracked · ' +
115
+ fmtCount(r.skippedLinkedExisting) +
116
+ ' linked existing</p>';
117
+ }
118
+ if (r.phase === 'aborted') {
119
+ summaryBody +=
120
+ '<p class="muted activity-run-msg" style="margin:0.35rem 0 0">' +
121
+ (r.abortReason
122
+ ? '<code class="mono">' + esc(r.abortReason) + '</code>'
123
+ : 'Aborted') +
124
+ '</p>';
125
+ }
126
+ if (r.phase === 'failed') {
127
+ summaryBody +=
128
+ '<p class="banner banner-error activity-run-msg" style="margin:0.5rem 0 0">' +
129
+ esc(r.errorMessage || 'Sync failed') +
130
+ '</p>';
131
+ }
132
+
133
+ var details = r.itemCount ? renderItemsTable(r.items) : '';
134
+
135
+ return (
136
+ '<div class="card activity-run">' +
137
+ '<div class="activity-run-summary">' +
138
+ meta +
139
+ summaryBody +
140
+ '</div>' +
141
+ details +
142
+ '</div>'
143
+ );
144
+ }
145
+
146
+ function renderRuns(runs) {
147
+ if (!runs || !runs.length) {
148
+ return (
149
+ '<div class="card activity-empty-card">' +
150
+ '<p class="muted" style="margin:0">No sync runs recorded yet. Runs appear when a sync starts.</p>' +
151
+ '</div>'
152
+ );
153
+ }
154
+ return runs.map(renderRun).join('');
155
+ }
156
+
157
+ var pollTimer = null;
158
+ var pollWanted = false;
159
+
160
+ function anyRunning(runs) {
161
+ if (!runs || !runs.length) return false;
162
+ for (var i = 0; i < runs.length; i++) {
163
+ if (runs[i].phase === 'running') return true;
164
+ }
165
+ return false;
166
+ }
167
+
168
+ function stopPoll() {
169
+ if (pollTimer != null) {
170
+ clearInterval(pollTimer);
171
+ pollTimer = null;
172
+ }
173
+ }
174
+
175
+ function startPollInterval() {
176
+ stopPoll();
177
+ if (!pollWanted || document.visibilityState !== 'visible') return;
178
+ pollTimer = window.setInterval(function () {
179
+ void load();
180
+ }, POLL_WHILE_RUNNING_MS);
181
+ }
182
+
183
+ document.addEventListener('visibilitychange', function () {
184
+ if (document.visibilityState === 'hidden') {
185
+ stopPoll();
186
+ } else if (pollWanted) {
187
+ void load();
188
+ startPollInterval();
189
+ }
190
+ });
191
+
192
+ function schedulePollIfNeeded(runs) {
193
+ pollWanted = anyRunning(runs);
194
+ if (!pollWanted) {
195
+ stopPoll();
196
+ return;
197
+ }
198
+ startPollInterval();
199
+ }
200
+
201
+ async function load() {
202
+ try {
203
+ var res = await fetch('/api/activity/runs');
204
+ var text = await res.text();
205
+ if (!res.ok) throw new Error('HTTP ' + res.status);
206
+ var data = text ? JSON.parse(text) : { runs: [] };
207
+ var runs = data.runs || [];
208
+ root.innerHTML = renderRuns(runs);
209
+ schedulePollIfNeeded(runs);
210
+ } catch {
211
+ root.innerHTML =
212
+ '<div class="card"><p class="muted" style="margin:0">Could not load activity. Try refreshing the page.</p></div>';
213
+ stopPoll();
214
+ pollWanted = false;
215
+ }
216
+ }
217
+
218
+ Ui.onStatusSnapshot(function () {
219
+ void load();
220
+ });
221
+
222
+ void load();
223
+ })();
@@ -0,0 +1,295 @@
1
+ (function () {
2
+ const Ui = window.VibeSquireUi;
3
+ if (!Ui) return;
4
+
5
+ const pre = document.getElementById('status-snap');
6
+ const overview = document.getElementById('status-overview');
7
+ const bootEl = document.getElementById('boot-snapshot');
8
+ const msgEl = document.getElementById('action-msg');
9
+ const btnSync = document.getElementById('btn-sync');
10
+ const btnReinit = document.getElementById('btn-reinit');
11
+
12
+ const POLL_MS = 5 * 60 * 1000;
13
+ const esc = Ui.esc;
14
+ const fmtIso = Ui.fmtIso;
15
+
16
+ var reasonMap = {};
17
+ try {
18
+ var el = document.getElementById('setup-reasons');
19
+ if (el && el.textContent) reasonMap = JSON.parse(el.textContent);
20
+ } catch { /* embedded map unavailable — fall through to reason code */ }
21
+
22
+ function setupReasonHuman(reason) {
23
+ if (!reason) return 'Incomplete setup.';
24
+ return reasonMap[reason] || String(reason);
25
+ }
26
+
27
+ function ghHuman(state, message) {
28
+ if (state === 'ok') return 'Authenticated and ready.';
29
+ if (state === 'error') {
30
+ return message && String(message).trim()
31
+ ? String(message)
32
+ : 'GitHub CLI error — check `gh` output.';
33
+ }
34
+ if (state === 'unknown') return 'GitHub CLI status unknown.';
35
+ return String(state);
36
+ }
37
+
38
+ function destHuman(d) {
39
+ const m = {
40
+ ok: 'Reachable.',
41
+ degraded: 'Degraded — some calls may fail.',
42
+ error: 'Error — check MCP stdio command and server.',
43
+ unknown: 'Not probed yet.',
44
+ };
45
+ return m[d.state] || String(d.state);
46
+ }
47
+
48
+ /** Show Reinit when DB, gh, destination, or scout looks unhealthy (not mere setup skip). */
49
+ function needsReinit(snap) {
50
+ if (!snap || typeof snap !== 'object') return false;
51
+ const db = snap.database || {};
52
+ if (db.state === 'error') return true;
53
+ const gh = snap.gh || {};
54
+ if (gh.state && gh.state !== 'ok') return true;
55
+ const dest = (snap.destinations && snap.destinations[0]) || {};
56
+ if (dest.state === 'degraded' || dest.state === 'error') return true;
57
+ const scout = snap.scouts && snap.scouts[0];
58
+ if (scout && scout.state === 'error') return true;
59
+ return false;
60
+ }
61
+
62
+ function card(title, dotClass, lines) {
63
+ const body = (lines || [])
64
+ .filter(Boolean)
65
+ .map((l) => '<p>' + esc(l) + '</p>')
66
+ .join('');
67
+ return (
68
+ '<div class="status-card">' +
69
+ '<div class="status-card-head">' +
70
+ '<span class="status-dot ' +
71
+ esc(dotClass) +
72
+ '" aria-hidden="true"></span>' +
73
+ '<h3>' +
74
+ esc(title) +
75
+ '</h3></div>' +
76
+ '<div class="status-card-body">' +
77
+ body +
78
+ '</div></div>'
79
+ );
80
+ }
81
+
82
+ function renderOverview(snap) {
83
+ if (!overview || !snap) return;
84
+ const parts = [];
85
+
86
+ const gh = snap.gh || {};
87
+ let ghDot = 'status-neutral';
88
+ if (gh.state === 'ok') ghDot = 'status-ok';
89
+ else if (gh.state === 'error') ghDot = 'status-err';
90
+ else ghDot = 'status-warn';
91
+ const ghLines = [ghHuman(gh.state, gh.message)];
92
+ parts.push(card('GitHub CLI', ghDot, ghLines));
93
+
94
+ const db = snap.database || {};
95
+ const dbDot = db.state === 'ok' ? 'status-ok' : 'status-err';
96
+ const dbLines = [
97
+ db.state === 'ok' ? 'Database connected.' : 'Database error.',
98
+ ];
99
+ if (db.message) dbLines.push(db.message);
100
+ parts.push(card('Database', dbDot, dbLines));
101
+
102
+ const setup = snap.setup || {};
103
+ const setupDot = setup.complete ? 'status-ok' : 'status-warn';
104
+ const cfg = snap.configuration || {};
105
+ const setupLines = setup.complete
106
+ ? [
107
+ 'Setup complete (sync allowed).',
108
+ 'PR source: ' + String(cfg.source_type ?? '—'),
109
+ 'Board: ' + String(cfg.destination_type ?? '—'),
110
+ 'Mappings: ' + String(setup.mappingCount ?? 0),
111
+ ]
112
+ : [
113
+ 'Finish MCP and routing (see checklist on dashboard).',
114
+ setupReasonHuman(setup.reason),
115
+ ];
116
+ parts.push(card('Setup', setupDot, setupLines));
117
+
118
+ const dest = (snap.destinations && snap.destinations[0]) || {};
119
+ let destDot = 'status-neutral';
120
+ if (dest.state === 'ok') destDot = 'status-ok';
121
+ else if (dest.state === 'degraded') destDot = 'status-warn';
122
+ else if (dest.state === 'error') destDot = 'status-err';
123
+ const destLines = ['Vibe Kanban (MCP).', destHuman(dest)];
124
+ if (dest.message) destLines.push(dest.message);
125
+ if (dest.lastOkAt) destLines.push('Last OK: ' + fmtIso(dest.lastOkAt));
126
+ parts.push(card('Destination', destDot, destLines));
127
+
128
+ const scout = snap.scouts && snap.scouts[0];
129
+ if (scout) {
130
+ let scDot = 'status-neutral';
131
+ if (scout.state === 'running') scDot = 'status-warn';
132
+ else if (scout.state === 'error') scDot = 'status-err';
133
+ else if (scout.state === 'skipped') scDot = 'status-warn';
134
+ else scDot = 'status-ok';
135
+ const scLines = [];
136
+ const sched = snap.scheduled_sync || {};
137
+ if (sched.enabled === false) {
138
+ scLines.push(
139
+ 'Automatic polling is disabled — enable scheduled_sync_enabled in General settings (or SCHEDULED_SYNC_ENABLED).',
140
+ );
141
+ }
142
+ if (scout.state === 'running') {
143
+ scLines.push('Sync cycle running…');
144
+ } else {
145
+ scLines.push('GitHub PR scout: ' + String(scout.state));
146
+ }
147
+ if (scout.skipReason) {
148
+ scLines.push('Reason: ' + String(scout.skipReason));
149
+ }
150
+ if (scout.lastError && scout.state === 'error') {
151
+ scLines.push(String(scout.lastError));
152
+ }
153
+ const lp = scout.last_poll || {};
154
+ if (
155
+ lp.candidates_count != null ||
156
+ lp.skipped_unmapped != null ||
157
+ lp.issues_created != null
158
+ ) {
159
+ scLines.push(
160
+ 'Last run: ' +
161
+ (lp.candidates_count ?? '—') +
162
+ ' PR(s), ' +
163
+ (lp.issues_created ?? '—') +
164
+ ' created, ' +
165
+ (lp.skipped_unmapped ?? '—') +
166
+ ' skipped (unmapped)',
167
+ );
168
+ }
169
+ scLines.push('Last poll: ' + fmtIso(scout.lastPollAt));
170
+ if (sched.enabled === false) {
171
+ scLines.push('Next scheduled: — (timer off)');
172
+ } else {
173
+ scLines.push('Next scheduled: ' + fmtIso(scout.nextPollAt));
174
+ }
175
+ parts.push(card('Sync & scout', scDot, scLines));
176
+ }
177
+
178
+ const ms = snap.manual_sync || {};
179
+ let manDot = 'status-ok';
180
+ if (ms.canRun === false) manDot = 'status-warn';
181
+ const manLines = [];
182
+ if (ms.canRun !== false) {
183
+ manLines.push('You can run “Sync now” anytime (respects cooldown after a run).');
184
+ } else if (ms.reason === 'cooldown' && ms.cooldownUntil) {
185
+ manLines.push('Manual sync on cooldown until ' + fmtIso(ms.cooldownUntil));
186
+ } else if (ms.reason === 'already_running') {
187
+ manDot = 'status-warn';
188
+ manLines.push('Wait — a sync cycle is already running.');
189
+ } else {
190
+ manLines.push('Manual sync unavailable: ' + String(ms.reason || 'unknown'));
191
+ }
192
+ parts.push(card('Manual sync', manDot, manLines));
193
+
194
+ overview.innerHTML = parts.join('');
195
+ }
196
+
197
+ function setMsg(t) {
198
+ if (!msgEl) return;
199
+ msgEl.textContent = t || '';
200
+ msgEl.style.display = t ? 'block' : 'none';
201
+ }
202
+
203
+ function renderManual(m) {
204
+ if (!m || !btnSync) return;
205
+ btnSync.disabled = m.canRun === false;
206
+ btnSync.title =
207
+ m.reason === 'cooldown' && m.cooldownUntil
208
+ ? 'Cooldown until ' + m.cooldownUntil
209
+ : 'Run one full sync cycle now (same as the scheduler, but immediate)';
210
+ }
211
+
212
+ function applySnapshot(snap) {
213
+ if (!snap) return;
214
+ renderOverview(snap);
215
+ if (pre) pre.textContent = JSON.stringify(snap, null, 2);
216
+ renderManual(snap.manual_sync);
217
+ if (btnReinit) {
218
+ btnReinit.style.display = needsReinit(snap) ? '' : 'none';
219
+ }
220
+ }
221
+
222
+ function readBoot() {
223
+ if (!bootEl || !bootEl.textContent.trim()) return null;
224
+ try {
225
+ return JSON.parse(bootEl.textContent);
226
+ } catch {
227
+ return null;
228
+ }
229
+ }
230
+
231
+ async function load() {
232
+ try {
233
+ const res = await fetch('/api/status');
234
+ const text = await res.text();
235
+ const snap = text ? JSON.parse(text) : null;
236
+ if (!res.ok) throw new Error('HTTP ' + res.status);
237
+ applySnapshot(snap);
238
+ setMsg('');
239
+ } catch (e) {
240
+ const err = e instanceof Error ? e.message : String(e);
241
+ if (pre) pre.textContent = 'Error: ' + err;
242
+ }
243
+ }
244
+
245
+ const boot = readBoot();
246
+ if (boot) applySnapshot(boot);
247
+
248
+ try {
249
+ const w = window;
250
+ if (w.__VS_STATUS_SNAPSHOT__) {
251
+ applySnapshot(w.__VS_STATUS_SNAPSHOT__);
252
+ }
253
+ } catch {
254
+ /* ignore */
255
+ }
256
+
257
+ Ui.onStatusSnapshot((snap) => applySnapshot(snap));
258
+
259
+ window.setInterval(() => void load(), POLL_MS);
260
+ void load();
261
+
262
+ btnSync?.addEventListener('click', async () => {
263
+ setMsg('');
264
+ const res = await fetch('/api/sync/run', { method: 'POST' });
265
+ const text = await res.text();
266
+ if (res.status === 429) {
267
+ try {
268
+ const j = JSON.parse(text);
269
+ setMsg('Cooldown — try after ' + (j.cooldownUntil || 'later'));
270
+ } catch {
271
+ setMsg('Cooldown');
272
+ }
273
+ return;
274
+ }
275
+ if (!res.ok) {
276
+ setMsg(text || 'HTTP ' + res.status);
277
+ return;
278
+ }
279
+ setMsg('Sync finished.');
280
+ void load();
281
+ });
282
+
283
+ btnReinit?.addEventListener('click', async () => {
284
+ if (!confirm('Run soft reinit? This resets scout backoff flags.')) return;
285
+ setMsg('');
286
+ const res = await fetch('/api/reinit', { method: 'POST' });
287
+ const text = await res.text();
288
+ if (!res.ok) {
289
+ setMsg(text || 'HTTP ' + res.status);
290
+ return;
291
+ }
292
+ setMsg('Reinit completed.');
293
+ void load();
294
+ });
295
+ })();
@@ -0,0 +1,97 @@
1
+ (function () {
2
+ const form = document.getElementById('new-mapping-form');
3
+ const repoSel = document.getElementById('mk-repo');
4
+ const hVkRepo = document.getElementById('h-vk-repo');
5
+ const mkErr = document.getElementById('mk-err');
6
+ function setMkErr(t) {
7
+ if (!mkErr) return;
8
+ mkErr.textContent = t || '';
9
+ mkErr.style.display = t ? 'block' : 'none';
10
+ }
11
+
12
+ if (form && repoSel && hVkRepo) {
13
+ async function loadRepos() {
14
+ repoSel.innerHTML = '<option value="">Loading…</option>';
15
+ hVkRepo.value = '';
16
+ setMkErr('');
17
+ try {
18
+ const res = await fetch('/api/vibe-kanban/repos');
19
+ const data = await res.json().catch(() => ({}));
20
+ if (!res.ok) {
21
+ const msg =
22
+ typeof data.message === 'string'
23
+ ? data.message
24
+ : 'Could not load repositories (' + res.status + ').';
25
+ setMkErr(msg);
26
+ repoSel.innerHTML = '<option value="">—</option>';
27
+ return;
28
+ }
29
+ const repos = data.repos || [];
30
+ repoSel.innerHTML =
31
+ '<option value="">Select Vibe Kanban repository…</option>';
32
+ for (const r of repos) {
33
+ const opt = document.createElement('option');
34
+ opt.value = r.id;
35
+ opt.textContent = r.name ? r.name + ' — ' + r.id : r.id;
36
+ repoSel.appendChild(opt);
37
+ }
38
+ if (!repos.length) {
39
+ setMkErr('No repositories returned from MCP.');
40
+ }
41
+ } catch (e) {
42
+ setMkErr(e instanceof Error ? e.message : String(e));
43
+ repoSel.innerHTML = '<option value="">—</option>';
44
+ }
45
+ }
46
+
47
+ repoSel.addEventListener('change', () => {
48
+ hVkRepo.value = repoSel.value.trim();
49
+ });
50
+
51
+ form.addEventListener('submit', (e) => {
52
+ if (!hVkRepo.value.trim()) {
53
+ e.preventDefault();
54
+ alert('Choose a Vibe Kanban repository from the list.');
55
+ }
56
+ });
57
+
58
+ void loadRepos();
59
+ }
60
+
61
+ function wireRow(row) {
62
+ const id = row.getAttribute('data-id');
63
+ if (!id) return;
64
+ const editBtn = row.querySelector('.js-edit');
65
+ const saveBtn = row.querySelector('.js-save');
66
+ const cancelBtn = row.querySelector('.js-cancel');
67
+ const inputs = row.querySelectorAll('input.edit');
68
+
69
+ editBtn?.addEventListener('click', () => {
70
+ row.classList.add('is-editing');
71
+ });
72
+ cancelBtn?.addEventListener('click', () => {
73
+ location.reload();
74
+ });
75
+ saveBtn?.addEventListener('click', async () => {
76
+ if (inputs.length < 3) return;
77
+ const body = {
78
+ githubRepo: inputs[0].value.trim(),
79
+ vibeKanbanRepoId: inputs[1].value.trim(),
80
+ label: inputs[2].value.trim() || undefined,
81
+ };
82
+ const res = await fetch('/api/mappings/' + encodeURIComponent(id), {
83
+ method: 'PATCH',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify(body),
86
+ });
87
+ if (!res.ok) {
88
+ const t = await res.text();
89
+ alert(t || 'HTTP ' + res.status);
90
+ return;
91
+ }
92
+ location.reload();
93
+ });
94
+ }
95
+
96
+ document.querySelectorAll('.js-mapping-row').forEach(wireRow);
97
+ })();
@@ -0,0 +1,43 @@
1
+ (function () {
2
+ var g = window;
3
+ var VS = g.VibeSquireUi || {};
4
+ var SSE_EVENT =
5
+ VS.STATUS_SNAPSHOT_EVENT || g.__VS_SSE_EVENT__ || 'vibesquire:status-snapshot';
6
+ var stateEl = document.getElementById('nav-sse-state');
7
+
8
+ function setSse(s) {
9
+ if (!stateEl) return;
10
+ stateEl.textContent = s;
11
+ stateEl.className = 'sse sse-' + s;
12
+ }
13
+
14
+ function publishSnapshot(snap) {
15
+ if (!snap || typeof snap !== 'object') return;
16
+ try {
17
+ g.__VS_STATUS_SNAPSHOT__ = snap;
18
+ } catch {
19
+ /* ignore */
20
+ }
21
+ g.dispatchEvent(new CustomEvent(SSE_EVENT, { detail: snap }));
22
+ }
23
+
24
+ var es = new EventSource('/api/status/stream');
25
+ setSse('connecting');
26
+ es.onopen = function () {
27
+ setSse('open');
28
+ };
29
+ es.onerror = function () {
30
+ setSse('closed');
31
+ };
32
+ es.onmessage = function (ev) {
33
+ if (!ev.data || !String(ev.data).trim()) {
34
+ return;
35
+ }
36
+ try {
37
+ var snap = JSON.parse(ev.data);
38
+ publishSnapshot(snap);
39
+ } catch {
40
+ /* ignore */
41
+ }
42
+ };
43
+ })();
@@ -0,0 +1,40 @@
1
+ (function (g) {
2
+ var VS = (g.VibeSquireUi = g.VibeSquireUi || {});
3
+
4
+ VS.STATUS_SNAPSHOT_EVENT = 'vibesquire:status-snapshot';
5
+ g.__VS_SSE_EVENT__ = VS.STATUS_SNAPSHOT_EVENT;
6
+
7
+ VS.esc = function (s) {
8
+ if (s == null || s === undefined) return '';
9
+ return String(s)
10
+ .replace(/&/g, '&amp;')
11
+ .replace(/</g, '&lt;')
12
+ .replace(/>/g, '&gt;')
13
+ .replace(/"/g, '&quot;');
14
+ };
15
+
16
+ VS.fmtIso = function (iso) {
17
+ if (!iso) return '—';
18
+ try {
19
+ var d = new Date(iso);
20
+ return Number.isNaN(d.getTime()) ? String(iso) : d.toLocaleString();
21
+ } catch {
22
+ return String(iso);
23
+ }
24
+ };
25
+
26
+ /**
27
+ * Subscribe to status snapshots dispatched by operator-shell (SSE).
28
+ * @param {(snap: object) => void} callback
29
+ * @returns {() => void} unsubscribe
30
+ */
31
+ VS.onStatusSnapshot = function (callback) {
32
+ var handler = function (ev) {
33
+ if (ev && ev.detail) callback(ev.detail);
34
+ };
35
+ g.addEventListener(VS.STATUS_SNAPSHOT_EVENT, handler);
36
+ return function () {
37
+ g.removeEventListener(VS.STATUS_SNAPSHOT_EVENT, handler);
38
+ };
39
+ };
40
+ })(window);