@urateam/core 0.1.41 → 0.1.43

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 (108) hide show
  1. package/dist/__tests__/audit-events-config-reloaded.test.d.ts +2 -0
  2. package/dist/__tests__/audit-events-config-reloaded.test.d.ts.map +1 -0
  3. package/dist/__tests__/audit-events-config-reloaded.test.js +33 -0
  4. package/dist/__tests__/audit-events-config-reloaded.test.js.map +1 -0
  5. package/dist/__tests__/bitbucket-webhook.test.d.ts +13 -0
  6. package/dist/__tests__/bitbucket-webhook.test.d.ts.map +1 -0
  7. package/dist/__tests__/bitbucket-webhook.test.js +379 -0
  8. package/dist/__tests__/bitbucket-webhook.test.js.map +1 -0
  9. package/dist/__tests__/bitbucket.test.d.ts +15 -0
  10. package/dist/__tests__/bitbucket.test.d.ts.map +1 -0
  11. package/dist/__tests__/bitbucket.test.js +237 -0
  12. package/dist/__tests__/bitbucket.test.js.map +1 -0
  13. package/dist/__tests__/gitlab-webhook.test.d.ts +13 -0
  14. package/dist/__tests__/gitlab-webhook.test.d.ts.map +1 -0
  15. package/dist/__tests__/gitlab-webhook.test.js +388 -0
  16. package/dist/__tests__/gitlab-webhook.test.js.map +1 -0
  17. package/dist/__tests__/runner-multi-vcs.test.d.ts +19 -0
  18. package/dist/__tests__/runner-multi-vcs.test.d.ts.map +1 -0
  19. package/dist/__tests__/runner-multi-vcs.test.js +346 -0
  20. package/dist/__tests__/runner-multi-vcs.test.js.map +1 -0
  21. package/dist/__tests__/triage-v2-prediction.test.d.ts +2 -0
  22. package/dist/__tests__/triage-v2-prediction.test.d.ts.map +1 -0
  23. package/dist/__tests__/triage-v2-prediction.test.js +70 -0
  24. package/dist/__tests__/triage-v2-prediction.test.js.map +1 -0
  25. package/dist/__tests__/triage-v2-prompt.test.d.ts +2 -0
  26. package/dist/__tests__/triage-v2-prompt.test.d.ts.map +1 -0
  27. package/dist/__tests__/triage-v2-prompt.test.js +127 -0
  28. package/dist/__tests__/triage-v2-prompt.test.js.map +1 -0
  29. package/dist/__tests__/triage-v2-render.test.d.ts +2 -0
  30. package/dist/__tests__/triage-v2-render.test.d.ts.map +1 -0
  31. package/dist/__tests__/triage-v2-render.test.js +200 -0
  32. package/dist/__tests__/triage-v2-render.test.js.map +1 -0
  33. package/dist/__tests__/triage-v2-schema.test.d.ts +2 -0
  34. package/dist/__tests__/triage-v2-schema.test.d.ts.map +1 -0
  35. package/dist/__tests__/triage-v2-schema.test.js +115 -0
  36. package/dist/__tests__/triage-v2-schema.test.js.map +1 -0
  37. package/dist/audit/events.d.ts +11 -0
  38. package/dist/audit/events.d.ts.map +1 -1
  39. package/dist/audit/events.js +18 -0
  40. package/dist/audit/events.js.map +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/pipeline/feedback-pipeline.d.ts +2 -0
  45. package/dist/pipeline/feedback-pipeline.d.ts.map +1 -1
  46. package/dist/pipeline/feedback-pipeline.js +4 -1
  47. package/dist/pipeline/feedback-pipeline.js.map +1 -1
  48. package/dist/pipeline/runner.d.ts +11 -0
  49. package/dist/pipeline/runner.d.ts.map +1 -1
  50. package/dist/pipeline/runner.js +314 -114
  51. package/dist/pipeline/runner.js.map +1 -1
  52. package/dist/pm/actions/triage-prompt.d.ts +42 -0
  53. package/dist/pm/actions/triage-prompt.d.ts.map +1 -0
  54. package/dist/pm/actions/triage-prompt.js +192 -0
  55. package/dist/pm/actions/triage-prompt.js.map +1 -0
  56. package/dist/pm/actions/triage-render.d.ts +39 -0
  57. package/dist/pm/actions/triage-render.d.ts.map +1 -0
  58. package/dist/pm/actions/triage-render.js +158 -0
  59. package/dist/pm/actions/triage-render.js.map +1 -0
  60. package/dist/pm/actions/triage.d.ts +2 -1
  61. package/dist/pm/actions/triage.d.ts.map +1 -1
  62. package/dist/pm/actions/triage.js +44 -58
  63. package/dist/pm/actions/triage.js.map +1 -1
  64. package/dist/pm/triage-prediction-quality.d.ts +26 -0
  65. package/dist/pm/triage-prediction-quality.d.ts.map +1 -0
  66. package/dist/pm/triage-prediction-quality.js +41 -0
  67. package/dist/pm/triage-prediction-quality.js.map +1 -0
  68. package/dist/pm/types.d.ts +60 -0
  69. package/dist/pm/types.d.ts.map +1 -1
  70. package/dist/pm/types.js +119 -0
  71. package/dist/pm/types.js.map +1 -1
  72. package/dist/repo/bitbucket.d.ts +136 -0
  73. package/dist/repo/bitbucket.d.ts.map +1 -0
  74. package/dist/repo/bitbucket.js +237 -0
  75. package/dist/repo/bitbucket.js.map +1 -0
  76. package/dist/repo/gitlab.d.ts +11 -0
  77. package/dist/repo/gitlab.d.ts.map +1 -1
  78. package/dist/repo/gitlab.js +37 -0
  79. package/dist/repo/gitlab.js.map +1 -1
  80. package/dist/repo/index.d.ts +3 -1
  81. package/dist/repo/index.d.ts.map +1 -1
  82. package/dist/repo/index.js +2 -1
  83. package/dist/repo/index.js.map +1 -1
  84. package/dist/server.d.ts +14 -0
  85. package/dist/server.d.ts.map +1 -1
  86. package/dist/server.js +32 -0
  87. package/dist/server.js.map +1 -1
  88. package/dist/types.d.ts +3 -0
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +7 -2
  91. package/dist/types.js.map +1 -1
  92. package/dist/webhook/bitbucket-handler.d.ts +65 -0
  93. package/dist/webhook/bitbucket-handler.d.ts.map +1 -0
  94. package/dist/webhook/bitbucket-handler.js +153 -0
  95. package/dist/webhook/bitbucket-handler.js.map +1 -0
  96. package/dist/webhook/gitlab-handler.d.ts +66 -0
  97. package/dist/webhook/gitlab-handler.d.ts.map +1 -0
  98. package/dist/webhook/gitlab-handler.js +159 -0
  99. package/dist/webhook/gitlab-handler.js.map +1 -0
  100. package/dist/webhook/index.d.ts +3 -0
  101. package/dist/webhook/index.d.ts.map +1 -1
  102. package/dist/webhook/index.js +3 -0
  103. package/dist/webhook/index.js.map +1 -1
  104. package/dist/webhook/shared-handlers.d.ts +110 -0
  105. package/dist/webhook/shared-handlers.d.ts.map +1 -0
  106. package/dist/webhook/shared-handlers.js +251 -0
  107. package/dist/webhook/shared-handlers.js.map +1 -0
  108. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab-webhook.test.js","sourceRoot":"","sources":["../../src/__tests__/gitlab-webhook.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAI7F,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,MAAM,cAAc,GAAmB;IACrC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;IACjD,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE;IACpD,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;IAChC,UAAU,EAAE,OAAO;CACpB,CAAC;AAEF,MAAM,UAAU,GAAe;IAC7B,GAAG,EAAE,6BAA6B;IAClC,aAAa,EAAE,MAAM;IACrB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,QAAQ;IAClB,cAAc,EAAE;QACd,SAAS,EAAE,CAAC,UAAU,CAAC;QACvB,WAAW,EAAE,IAAI;KAClB;CACF,CAAC;AAEF,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,YAAY;IAChB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,6BAA6B;IACtC,MAAM,EAAE,8BAA8B;IACtC,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,gDAAgD;IACvD,OAAO,EAAE,UAAU;IACnB,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,SAAS,UAAU,CAAC,MAA6B,OAAO;IACtD,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YAC9B,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBAC5B,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;oBAC7B,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnD,CAAC;aACH,CAAC;SACH,CAAC;QACF,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YAC9B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBAC3B,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;aAC5C,CAAC;SACH,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;QACL,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QACnD,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,YAAiD,EAAE;IAEnD,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,cAAc,EAAS;QAC/B,eAAe,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE;QACrD,WAAW,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE;QACvC,EAAE,EAAE,UAAU,EAAS;QACvB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,YAAiC,EAAE;IAC1D,OAAO;QACL,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE;QACpC,iBAAiB,EAAE;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,0CAA0C;YAChD,aAAa,EAAE,cAAc;YAC7B,GAAG,EAAE,2DAA2D;YAChE,GAAG,SAAS,CAAC,iBAAiB;SAC/B;QACD,aAAa,EAAE;YACb,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,gDAAgD;YACrD,aAAa,EAAE,8BAA8B;YAC7C,KAAK,EAAE,KAAK;YACZ,gBAAgB,EAAE,KAAK;YACvB,GAAG,SAAS,CAAC,aAAa;SAC3B;QACD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAkC,EAClC,OAA4B,EAC5B,UAAkC,EAAE;IAEpC,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,kCAAkC,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,KAAK;YACvB,GAAG,OAAO;SACX;QACD,IAAI;KACL,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE;YACvD,gBAAgB,EAAE,aAAa;SAChC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,kCAAkC,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI;SACL,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,kCAAkC,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI;SACL,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC9E,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC3F,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,iBAAiB,EAAE;gBACjB,EAAE,EAAE,EAAE;gBACN,IAAI,EAAE,qBAAqB;gBAC3B,aAAa,EAAE,OAAO;gBACtB,GAAG,EAAE,gDAAgD;aACtD;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,MAAM,EACN,eAAe,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,gDAAgD,EAAE,aAAa,EAAE,8BAA8B,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC,CAC3L,CAAC;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,MAAM,EACN,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CACpD,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,MAAM,EAAE,MAAa;YACrB,WAAW,EAAE;gBACX,UAAU,EAAE;oBACV,GAAG,UAAU;oBACb,cAAc,EAAE;wBACd,gBAAgB,EAAE,CAAC,OAAO,CAAC;wBAC3B,SAAS,EAAE,EAAE;wBACb,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,MAAM,EACN,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAC1D,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,MAAM,EAAE,MAAa;YACrB,WAAW,EAAE;gBACX,UAAU,EAAE;oBACV,GAAG,UAAU;oBACb,cAAc,EAAE;wBACd,cAAc,EAAE,QAAQ;wBACxB,WAAW,EAAE,KAAK;qBACnB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,MAAM,EAAE,MAAa;YACrB,WAAW,EAAE;gBACX,UAAU,EAAE;oBACV,GAAG,UAAU;oBACb,cAAc,EAAE;wBACd,cAAc,EAAE,QAAQ;qBACzB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,MAAM,EACN,eAAe,CAAC;YACd,iBAAiB,EAAE;gBACjB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,wBAAwB;gBAC9B,aAAa,EAAE,cAAc;gBAC7B,GAAG,EAAE,2DAA2D;aACjE;SACF,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAU,CAAA,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,MAAM,EACN,eAAe,CAAC;YACd,iBAAiB,EAAE;gBACjB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,KAAK;gBACX,aAAa,EAAE,cAAc;gBAC7B,GAAG,EAAE,2DAA2D;aACjE;SACF,CAAC,CACH,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;QACrD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAS,EAAE,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAS,EAAE,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,eAAe;YAC5B,iBAAiB,EAAE;gBACjB,MAAM,EAAE,OAAO;gBACf,GAAG,EAAE,gDAAgD;gBACrD,aAAa,EAAE,8BAA8B;gBAC7C,KAAK,EAAE,QAAQ;aAChB;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAS,EAAE,QAAQ,EAAE,QAAe,EAAE,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,eAAe;YAC5B,iBAAiB,EAAE;gBACjB,MAAM,EAAE,OAAO;gBACf,GAAG,EAAE,gDAAgD;gBACrD,aAAa,EAAE,8BAA8B;gBAC7C,KAAK,EAAE,QAAQ;aAChB;SACF,CAAC;QAEF,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,kCAAkC,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,KAAK;aACxB;YACD,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * BEC-206 — runner multi-VCS integration test
3
+ *
4
+ * Verifies that `PipelineRunner` routes comment-posting calls to the correct
5
+ * provider when `repoConfig.provider` is `"gitlab"` or `"bitbucket"`:
6
+ *
7
+ * - When `URATEAM_PR_COST_SUMMARY=true` and the run completes with a PR URL,
8
+ * the runner calls `addMRComment` (GitLab) / `addBitbucketPRComment`
9
+ * (Bitbucket) with the cost summary body.
10
+ * - When `runType === "review-feedback"`, the runner calls those same
11
+ * functions with a rendered change-summary body.
12
+ *
13
+ * The test stubs the executor (`executeStage`), git helpers, and PR-creation
14
+ * functions so the pipeline runs end-to-end without touching the network or
15
+ * the filesystem. The real `addMRComment` / `addBitbucketPRComment` are
16
+ * replaced with `vi.fn()` so we can assert on call arguments.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=runner-multi-vcs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-multi-vcs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/runner-multi-vcs.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,346 @@
1
+ /**
2
+ * BEC-206 — runner multi-VCS integration test
3
+ *
4
+ * Verifies that `PipelineRunner` routes comment-posting calls to the correct
5
+ * provider when `repoConfig.provider` is `"gitlab"` or `"bitbucket"`:
6
+ *
7
+ * - When `URATEAM_PR_COST_SUMMARY=true` and the run completes with a PR URL,
8
+ * the runner calls `addMRComment` (GitLab) / `addBitbucketPRComment`
9
+ * (Bitbucket) with the cost summary body.
10
+ * - When `runType === "review-feedback"`, the runner calls those same
11
+ * functions with a rendered change-summary body.
12
+ *
13
+ * The test stubs the executor (`executeStage`), git helpers, and PR-creation
14
+ * functions so the pipeline runs end-to-end without touching the network or
15
+ * the filesystem. The real `addMRComment` / `addBitbucketPRComment` are
16
+ * replaced with `vi.fn()` so we can assert on call arguments.
17
+ */
18
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
19
+ import { createDb } from "../db/client.js";
20
+ import { PipelineRunner } from "../pipeline/runner.js";
21
+ import { pipelineRuns } from "../db/schema.js";
22
+ import { eq } from "drizzle-orm";
23
+ import { installTestProLicense, restoreLicense } from "./helpers/license.js";
24
+ // ---------------------------------------------------------------------------
25
+ // Mock surface
26
+ // ---------------------------------------------------------------------------
27
+ const { mockCreateMR, mockAddMRComment, mockMergeMR, mockCreateBitbucketPR, mockAddBitbucketPRComment, mockMergeBitbucketPR, mockExecFile, } = vi.hoisted(() => ({
28
+ mockCreateMR: vi
29
+ .fn()
30
+ .mockResolvedValue("https://gitlab.com/myorg/myrepo/-/merge_requests/42"),
31
+ mockAddMRComment: vi.fn().mockResolvedValue(undefined),
32
+ mockMergeMR: vi.fn().mockResolvedValue(true),
33
+ mockCreateBitbucketPR: vi
34
+ .fn()
35
+ .mockResolvedValue("https://bitbucket.org/myws/myrepo/pull-requests/42"),
36
+ mockAddBitbucketPRComment: vi.fn().mockResolvedValue(undefined),
37
+ mockMergeBitbucketPR: vi.fn().mockResolvedValue(true),
38
+ mockExecFile: vi.fn().mockImplementation((...args) => {
39
+ const cb = args.find((a) => typeof a === "function");
40
+ if (cb)
41
+ cb(null, "", "");
42
+ }),
43
+ }));
44
+ let stageResultsQueue = [];
45
+ let executeStageCalls = [];
46
+ function handoffFor(runId, issueId, stage) {
47
+ return {
48
+ runId,
49
+ issueId,
50
+ stage,
51
+ timestamp: new Date().toISOString(),
52
+ summary: `Stage ${stage} done`,
53
+ filesChanged: ["src/feature.ts"],
54
+ approach: `approach for ${stage}`,
55
+ context: {
56
+ issueIntent: "test multi-VCS routing",
57
+ constraints: [],
58
+ assumptions: [],
59
+ },
60
+ tokenBudget: { contextTokensUsed: 100, recommendedMaxTurns: 3 },
61
+ };
62
+ }
63
+ vi.mock("../executor/executor.js", () => ({
64
+ executeStage: vi.fn().mockImplementation(async ({ runId, issueId, stage, db }) => {
65
+ const { nanoid } = await import("nanoid");
66
+ const { stageRuns: stageRunsTable } = await import("../db/schema.js");
67
+ const { eq: drizzleEq } = await import("drizzle-orm");
68
+ executeStageCalls.push({ stage });
69
+ const verdict = stageResultsQueue.shift() ?? "completed";
70
+ const stageRunId = nanoid();
71
+ await db.insert(stageRunsTable).values({
72
+ id: stageRunId,
73
+ pipelineRunId: runId,
74
+ stage,
75
+ status: "running",
76
+ });
77
+ await db
78
+ .update(stageRunsTable)
79
+ .set({
80
+ status: verdict,
81
+ completedAt: new Date(),
82
+ inputTokens: 100,
83
+ outputTokens: 50,
84
+ turns: 1,
85
+ handoffArtifact: JSON.stringify(handoffFor(runId, issueId, stage)),
86
+ errorMessage: verdict === "failed" ? "simulated stage failure" : null,
87
+ })
88
+ .where(drizzleEq(stageRunsTable.id, stageRunId));
89
+ return {
90
+ status: verdict,
91
+ inputTokens: 100,
92
+ outputTokens: 50,
93
+ turns: 1,
94
+ ...(verdict === "completed"
95
+ ? {
96
+ handoffArtifact: handoffFor(runId, issueId, stage),
97
+ handoffIsStructured: true,
98
+ }
99
+ : { errorMessage: "simulated stage failure" }),
100
+ stageRunId,
101
+ };
102
+ }),
103
+ }));
104
+ vi.mock("../repo/git.js", () => ({
105
+ cloneRepo: vi.fn().mockResolvedValue(undefined),
106
+ createWorktree: vi.fn().mockResolvedValue("/tmp/multi-vcs-worktree"),
107
+ deleteWorktree: vi.fn().mockResolvedValue(undefined),
108
+ pushBranch: vi.fn().mockResolvedValue(undefined),
109
+ pushBranchForce: vi.fn().mockResolvedValue(undefined),
110
+ rebaseBranch: vi.fn().mockResolvedValue({ success: true, hasConflicts: false }),
111
+ abortRebase: vi.fn().mockResolvedValue(undefined),
112
+ autoCommitChanges: vi.fn().mockResolvedValue(false),
113
+ // createPRViaCli is the gh CLI fallback — not used on gitlab/bitbucket paths
114
+ // but the module export must exist for the runner's import to resolve.
115
+ createPRViaCli: vi.fn().mockResolvedValue(""),
116
+ mergePRViaCli: vi.fn().mockResolvedValue(true),
117
+ getDiffLineCount: vi.fn().mockResolvedValue(50),
118
+ getChangedFiles: vi.fn().mockResolvedValue(["src/feature.ts"]),
119
+ checkDuplicateBranch: vi.fn().mockResolvedValue(null),
120
+ cleanupWorktrees: vi.fn().mockResolvedValue([]),
121
+ branchName: vi.fn().mockImplementation((id, slug) => `agent/${id}-${slug}`),
122
+ gitExecSafe: vi.fn().mockResolvedValue(""),
123
+ gitExecRaw: vi.fn().mockResolvedValue(""),
124
+ gitExec: vi.fn().mockResolvedValue(""),
125
+ choosePushStrategy: vi.fn().mockReturnValue("standard"),
126
+ getAgentCommits: vi.fn().mockResolvedValue([]),
127
+ installPrePushHook: vi.fn().mockResolvedValue(undefined),
128
+ }));
129
+ // Replace the real GitLab/Bitbucket clients so we can assert on their call
130
+ // arguments without making any real HTTP requests.
131
+ vi.mock("../repo/gitlab.js", async () => {
132
+ const actual = await vi.importActual("../repo/gitlab.js");
133
+ return {
134
+ ...actual,
135
+ createMR: mockCreateMR,
136
+ addMRComment: mockAddMRComment,
137
+ mergeMRWhenPipelineSucceeds: mockMergeMR,
138
+ };
139
+ });
140
+ vi.mock("../repo/bitbucket.js", async () => {
141
+ const actual = await vi.importActual("../repo/bitbucket.js");
142
+ return {
143
+ ...actual,
144
+ createBitbucketPR: mockCreateBitbucketPR,
145
+ addBitbucketPRComment: mockAddBitbucketPRComment,
146
+ mergeBitbucketPR: mockMergeBitbucketPR,
147
+ };
148
+ });
149
+ vi.mock("../executor/test-quality.js", () => ({
150
+ checkTestQuality: vi.fn().mockResolvedValue({ violations: [] }),
151
+ }));
152
+ vi.mock("../repo/tech-stack.js", () => ({
153
+ detectTechStack: vi.fn().mockResolvedValue({
154
+ languages: ["typescript"],
155
+ frameworks: [],
156
+ buildSystems: ["pnpm"],
157
+ }),
158
+ }));
159
+ vi.mock("../repo/devcontainer.js", () => ({
160
+ shouldUseDevcontainer: vi.fn().mockResolvedValue(false),
161
+ devcontainerUp: vi.fn().mockResolvedValue(undefined),
162
+ devcontainerDown: vi.fn().mockResolvedValue(undefined),
163
+ }));
164
+ vi.mock("../pm/coordination.js", () => ({
165
+ upsertActiveWork: vi.fn().mockResolvedValue(undefined),
166
+ removeActiveWork: vi.fn().mockResolvedValue(undefined),
167
+ checkFileOverlap: vi.fn().mockResolvedValue({
168
+ hasOverlap: false,
169
+ overlappingFiles: [],
170
+ conflictingRunIds: [],
171
+ }),
172
+ getModifiedFiles: vi.fn().mockResolvedValue([]),
173
+ }));
174
+ vi.mock("node:child_process", () => ({
175
+ execFile: mockExecFile,
176
+ }));
177
+ // ---------------------------------------------------------------------------
178
+ // Fixtures
179
+ // ---------------------------------------------------------------------------
180
+ const GITLAB_REPO_CONFIG = {
181
+ url: "https://gitlab.com/myorg/myrepo.git",
182
+ defaultBranch: "main",
183
+ testCommand: "pnpm test",
184
+ buildCommand: "pnpm build",
185
+ provider: "gitlab",
186
+ };
187
+ const BITBUCKET_REPO_CONFIG = {
188
+ url: "https://bitbucket.org/myws/myrepo.git",
189
+ defaultBranch: "main",
190
+ testCommand: "pnpm test",
191
+ buildCommand: "pnpm build",
192
+ provider: "bitbucket",
193
+ };
194
+ function makePipelineConfig() {
195
+ return {
196
+ name: "Auto Implement",
197
+ stages: ["implement"],
198
+ retry: { maxAttempts: 1, strategy: "fail-fast" },
199
+ review: { requiredApprovals: 0 },
200
+ prStrategy: "ready",
201
+ validateHandoffs: false,
202
+ ralphIterations: 0,
203
+ reviewFixIterations: 0,
204
+ deepReviewPasses: 0,
205
+ };
206
+ }
207
+ const ISSUE = {
208
+ id: "issue-mv-1",
209
+ identifier: "MV-1",
210
+ title: "multi-VCS test issue",
211
+ description: "Test multi-VCS routing",
212
+ priority: 2,
213
+ };
214
+ async function waitForRunComplete(db, issueId, timeoutMs = 5_000) {
215
+ const deadline = Date.now() + timeoutMs;
216
+ while (Date.now() < deadline) {
217
+ const rows = await db
218
+ .select()
219
+ .from(pipelineRuns)
220
+ .where(eq(pipelineRuns.issueId, issueId));
221
+ if (rows.length > 0) {
222
+ const run = rows[0];
223
+ if (["completed", "failed", "retriable", "aborted"].includes(run.status)) {
224
+ return run;
225
+ }
226
+ }
227
+ await new Promise((r) => setTimeout(r, 25));
228
+ }
229
+ throw new Error(`Pipeline for ${issueId} did not finish within ${timeoutMs}ms`);
230
+ }
231
+ // ---------------------------------------------------------------------------
232
+ // Tests
233
+ // ---------------------------------------------------------------------------
234
+ describe("PipelineRunner multi-VCS routing (BEC-206)", () => {
235
+ let db;
236
+ let notifier;
237
+ let originalCostSummaryEnv;
238
+ beforeEach(async () => {
239
+ await installTestProLicense();
240
+ stageResultsQueue = [];
241
+ executeStageCalls = [];
242
+ mockCreateMR.mockClear();
243
+ mockAddMRComment.mockClear();
244
+ mockMergeMR.mockClear();
245
+ mockCreateBitbucketPR.mockClear();
246
+ mockAddBitbucketPRComment.mockClear();
247
+ mockMergeBitbucketPR.mockClear();
248
+ // Enable the cost-summary path
249
+ originalCostSummaryEnv = process.env.URATEAM_PR_COST_SUMMARY;
250
+ process.env.URATEAM_PR_COST_SUMMARY = "true";
251
+ db = await createDb({ driver: "sqlite", connectionString: ":memory:" });
252
+ notifier = {
253
+ onPipelineStart: vi.fn(async () => { }),
254
+ onStageComplete: vi.fn(async () => { }),
255
+ onPipelineComplete: vi.fn(async () => { }),
256
+ onPipelineFailed: vi.fn(async () => { }),
257
+ };
258
+ });
259
+ afterEach(async () => {
260
+ await restoreLicense();
261
+ if (originalCostSummaryEnv === undefined) {
262
+ delete process.env.URATEAM_PR_COST_SUMMARY;
263
+ }
264
+ else {
265
+ process.env.URATEAM_PR_COST_SUMMARY = originalCostSummaryEnv;
266
+ }
267
+ });
268
+ function makeRunner(opts = {}) {
269
+ return new PipelineRunner({
270
+ db,
271
+ notifier,
272
+ concurrency: 1,
273
+ agentRunDir: "/tmp/multi-vcs-runs",
274
+ repoCloneDir: "/tmp/multi-vcs-repos",
275
+ gitlab: opts.gitlabConfig,
276
+ bitbucket: opts.bitbucketConfig,
277
+ });
278
+ }
279
+ // -------------------------------------------------------------------------
280
+ // GitLab path
281
+ // -------------------------------------------------------------------------
282
+ it("GitLab provider: completes pipeline and posts MR cost summary via addMRComment", async () => {
283
+ stageResultsQueue = ["completed"];
284
+ const runner = makeRunner({
285
+ gitlabConfig: { token: "glpat-fake", host: "https://gitlab.com" },
286
+ });
287
+ const issue = { ...ISSUE, identifier: "MV-GL-1" };
288
+ await runner.start(issue, "auto-implement", makePipelineConfig(), GITLAB_REPO_CONFIG, issue);
289
+ const run = await waitForRunComplete(db, "MV-GL-1");
290
+ expect(run.status).toBe("completed");
291
+ // createMR was used to open the MR
292
+ expect(mockCreateMR).toHaveBeenCalledTimes(1);
293
+ const createMRArgs = mockCreateMR.mock.calls[0];
294
+ expect(createMRArgs[1]).toMatchObject({
295
+ projectPath: "myorg/myrepo",
296
+ sourceBranch: expect.stringContaining("agent/MV-GL-1"),
297
+ targetBranch: "main",
298
+ });
299
+ // Cost summary was posted via addMRComment (BEC-175 + BEC-206)
300
+ expect(mockAddMRComment).toHaveBeenCalled();
301
+ const costCall = mockAddMRComment.mock.calls.find((c) => typeof c[3] === "string" && c[3].includes("Pipeline cost summary"));
302
+ expect(costCall).toBeDefined();
303
+ // Args: (config, projectPath, mrIid, body)
304
+ expect(costCall[1]).toBe("myorg/myrepo");
305
+ expect(costCall[2]).toBe(42);
306
+ expect(typeof costCall[3]).toBe("string");
307
+ // Bitbucket helpers must NOT be called on the GitLab path
308
+ expect(mockCreateBitbucketPR).not.toHaveBeenCalled();
309
+ expect(mockAddBitbucketPRComment).not.toHaveBeenCalled();
310
+ });
311
+ // -------------------------------------------------------------------------
312
+ // Bitbucket path
313
+ // -------------------------------------------------------------------------
314
+ it("Bitbucket provider: completes pipeline and posts PR cost summary via addBitbucketPRComment", async () => {
315
+ stageResultsQueue = ["completed"];
316
+ const runner = makeRunner({
317
+ bitbucketConfig: { accessToken: "bbtoken-fake" },
318
+ });
319
+ const issue = { ...ISSUE, identifier: "MV-BB-1" };
320
+ await runner.start(issue, "auto-implement", makePipelineConfig(), BITBUCKET_REPO_CONFIG, issue);
321
+ const run = await waitForRunComplete(db, "MV-BB-1");
322
+ expect(run.status).toBe("completed");
323
+ // createBitbucketPR was used to open the PR
324
+ expect(mockCreateBitbucketPR).toHaveBeenCalledTimes(1);
325
+ const createPRArgs = mockCreateBitbucketPR.mock.calls[0];
326
+ expect(createPRArgs[1]).toMatchObject({
327
+ workspace: "myws",
328
+ repoSlug: "myrepo",
329
+ sourceBranch: expect.stringContaining("agent/MV-BB-1"),
330
+ targetBranch: "main",
331
+ });
332
+ // Cost summary was posted via addBitbucketPRComment (BEC-175 + BEC-206)
333
+ expect(mockAddBitbucketPRComment).toHaveBeenCalled();
334
+ const costCall = mockAddBitbucketPRComment.mock.calls.find((c) => typeof c[4] === "string" && c[4].includes("Pipeline cost summary"));
335
+ expect(costCall).toBeDefined();
336
+ // Args: (config, workspace, repoSlug, prId, body)
337
+ expect(costCall[1]).toBe("myws");
338
+ expect(costCall[2]).toBe("myrepo");
339
+ expect(costCall[3]).toBe(42);
340
+ expect(typeof costCall[4]).toBe("string");
341
+ // GitLab helpers must NOT be called on the Bitbucket path
342
+ expect(mockCreateMR).not.toHaveBeenCalled();
343
+ expect(mockAddMRComment).not.toHaveBeenCalled();
344
+ });
345
+ });
346
+ //# sourceMappingURL=runner-multi-vcs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-multi-vcs.test.js","sourceRoot":"","sources":["../../src/__tests__/runner-multi-vcs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triage-v2-prediction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-v2-prediction.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/triage-v2-prediction.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { computeAffectedFilesPredictionQuality } from "../pm/triage-prediction-quality.js";
3
+ describe("computeAffectedFilesPredictionQuality", () => {
4
+ it("returns hasV2Prediction:false when predicted is undefined (v1 triage)", () => {
5
+ const result = computeAffectedFilesPredictionQuality(undefined, ["a.ts"]);
6
+ expect(result).toEqual({
7
+ hasV2Prediction: false,
8
+ predicted: 0,
9
+ actual: 1,
10
+ intersection: 0,
11
+ missed: [],
12
+ unexpected: ["a.ts"],
13
+ });
14
+ });
15
+ it("returns hasV2Prediction:true when predicted is an empty array", () => {
16
+ const result = computeAffectedFilesPredictionQuality([], ["a.ts"]);
17
+ expect(result.hasV2Prediction).toBe(true);
18
+ expect(result.predicted).toBe(0);
19
+ expect(result.unexpected).toEqual(["a.ts"]);
20
+ });
21
+ it("computes intersection / missed / unexpected for partial prediction", () => {
22
+ const result = computeAffectedFilesPredictionQuality(["a.ts", "b.ts"], ["a.ts", "c.ts"]);
23
+ expect(result).toEqual({
24
+ hasV2Prediction: true,
25
+ predicted: 2,
26
+ actual: 2,
27
+ intersection: 1,
28
+ missed: ["b.ts"],
29
+ unexpected: ["c.ts"],
30
+ });
31
+ });
32
+ it("returns intersection equal to length when prediction is perfect", () => {
33
+ const result = computeAffectedFilesPredictionQuality(["a.ts", "b.ts"], ["a.ts", "b.ts"]);
34
+ expect(result.intersection).toBe(2);
35
+ expect(result.missed).toEqual([]);
36
+ expect(result.unexpected).toEqual([]);
37
+ });
38
+ it("returns zero intersection when prediction is a complete miss", () => {
39
+ const result = computeAffectedFilesPredictionQuality(["a.ts", "b.ts"], ["x.ts", "y.ts"]);
40
+ expect(result.intersection).toBe(0);
41
+ expect(result.missed.sort()).toEqual(["a.ts", "b.ts"]);
42
+ expect(result.unexpected.sort()).toEqual(["x.ts", "y.ts"]);
43
+ });
44
+ it("handles both inputs empty", () => {
45
+ const result = computeAffectedFilesPredictionQuality([], []);
46
+ expect(result).toEqual({
47
+ hasV2Prediction: true,
48
+ predicted: 0,
49
+ actual: 0,
50
+ intersection: 0,
51
+ missed: [],
52
+ unexpected: [],
53
+ });
54
+ });
55
+ it("deduplicates within each input (paths repeated count once)", () => {
56
+ const result = computeAffectedFilesPredictionQuality(["a.ts", "a.ts", "b.ts"], ["a.ts", "c.ts", "c.ts"]);
57
+ expect(result.predicted).toBe(2);
58
+ expect(result.actual).toBe(2);
59
+ expect(result.intersection).toBe(1);
60
+ expect(result.missed).toEqual(["b.ts"]);
61
+ expect(result.unexpected).toEqual(["c.ts"]);
62
+ });
63
+ it("returns the missed/unexpected arrays in deterministic order", () => {
64
+ const r1 = computeAffectedFilesPredictionQuality(["b.ts", "a.ts"], ["c.ts", "d.ts"]);
65
+ const r2 = computeAffectedFilesPredictionQuality(["a.ts", "b.ts"], ["d.ts", "c.ts"]);
66
+ expect(r1.missed).toEqual(r2.missed);
67
+ expect(r1.unexpected).toEqual(r2.unexpected);
68
+ });
69
+ });
70
+ //# sourceMappingURL=triage-v2-prediction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-v2-prediction.test.js","sourceRoot":"","sources":["../../src/__tests__/triage-v2-prediction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triage-v2-prompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-v2-prompt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/triage-v2-prompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, } from "../pm/actions/triage-prompt.js";
3
+ const FIXTURE_ISSUE = {
4
+ identifier: "BEC-100",
5
+ title: "Login throws 500 on empty email",
6
+ description: "When the email field is empty, POST /auth/login returns 500 instead of 400.",
7
+ };
8
+ const identitySanitize = (s) => s;
9
+ describe("buildTriageV1Prompt — pure refactor of the v1 inline prompt", () => {
10
+ it("contains the v1 instruction preamble", () => {
11
+ const prompt = buildTriageV1Prompt(FIXTURE_ISSUE, identitySanitize);
12
+ expect(prompt).toContain("Classify this software issue, generate acceptance criteria");
13
+ });
14
+ it("includes issue identifier, title, and sanitized description", () => {
15
+ const prompt = buildTriageV1Prompt(FIXTURE_ISSUE, identitySanitize);
16
+ expect(prompt).toContain("Issue: BEC-100");
17
+ expect(prompt).toContain("Title: Login throws 500 on empty email");
18
+ expect(prompt).toContain("Description: When the email field is empty");
19
+ });
20
+ it("includes the Tier 4 DESIGN DOC instructions (regression — must still ship)", () => {
21
+ const prompt = buildTriageV1Prompt(FIXTURE_ISSUE, identitySanitize);
22
+ expect(prompt).toContain("Tier 4 — DESIGN DOC fields:");
23
+ expect(prompt).toContain("approachSummary:");
24
+ expect(prompt).toContain("openQuestions:");
25
+ expect(prompt).toContain("antiAcceptanceCriteria:");
26
+ });
27
+ it("matches a canonical snapshot", () => {
28
+ expect(buildTriageV1Prompt(FIXTURE_ISSUE, identitySanitize)).toMatchSnapshot();
29
+ });
30
+ });
31
+ describe("buildTriageV2Prompt — Tier 6a structured prompt", () => {
32
+ it("opens with role + audience priming inside <role> tags", () => {
33
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
34
+ expect(prompt).toMatch(/<role>[\s\S]*senior engineer[\s\S]*<\/role>/);
35
+ expect(prompt).toContain("downstream Claude coding agent");
36
+ });
37
+ it("contains XML-delineated sections for role, output_format, examples, issue, reasoning", () => {
38
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
39
+ expect(prompt).toMatch(/<role>/);
40
+ expect(prompt).toMatch(/<output_format>/);
41
+ expect(prompt).toMatch(/<examples>/);
42
+ expect(prompt).toMatch(/<issue>/);
43
+ expect(prompt).toMatch(/<reasoning>/);
44
+ });
45
+ it("includes multishot examples for each pipeline label (auto-implement, bug, quick-fix, needs-design)", () => {
46
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
47
+ expect(prompt).toMatch(/auto-implement/);
48
+ expect(prompt).toMatch(/bug/);
49
+ expect(prompt).toMatch(/quick-fix/);
50
+ expect(prompt).toMatch(/needs-design/);
51
+ });
52
+ it("includes at least one anti-example (type=\"anti-example\")", () => {
53
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
54
+ expect(prompt).toMatch(/type="anti-example"/);
55
+ });
56
+ it("instructs the model that examples are reference, not output", () => {
57
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
58
+ expect(prompt.toLowerCase()).toContain("reference examples");
59
+ expect(prompt.toLowerCase()).toContain("not your output");
60
+ });
61
+ it("ends with the JSON prefill anchor (single open brace)", () => {
62
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
63
+ expect(prompt.trimEnd().endsWith("{")).toBe(true);
64
+ });
65
+ it("documents the five new Tier 6b output fields in <output_format>", () => {
66
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
67
+ expect(prompt).toMatch(/assumptions/);
68
+ expect(prompt).toMatch(/examples/);
69
+ expect(prompt).toMatch(/affectedFiles/);
70
+ expect(prompt).toMatch(/testStrategy/);
71
+ expect(prompt).toMatch(/riskAssessment/);
72
+ });
73
+ it("includes issue identifier, title, and sanitized description inside the real <issue> block (after <examples>)", () => {
74
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
75
+ // The multishot examples block also contains <issue> tags — match the
76
+ // LAST occurrence to get the real issue block.
77
+ const matches = [...prompt.matchAll(/<issue>([\s\S]*?)<\/issue>/g)];
78
+ expect(matches.length).toBeGreaterThanOrEqual(1);
79
+ const realIssueBlock = matches[matches.length - 1][1];
80
+ expect(realIssueBlock).toContain("BEC-100");
81
+ expect(realIssueBlock).toContain("Login throws 500 on empty email");
82
+ expect(realIssueBlock).toContain("empty");
83
+ });
84
+ it("prefix (everything before <issue>) stays under 15000 characters", () => {
85
+ const prompt = buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize);
86
+ const issueIdx = prompt.indexOf("<issue>");
87
+ expect(issueIdx).toBeGreaterThan(0);
88
+ const prefix = prompt.slice(0, issueIdx);
89
+ expect(prefix.length).toBeLessThan(15000);
90
+ });
91
+ it("matches a canonical snapshot", () => {
92
+ expect(buildTriageV2Prompt(FIXTURE_ISSUE, identitySanitize)).toMatchSnapshot();
93
+ });
94
+ });
95
+ describe("isV2Disabled — env-var escape hatch", () => {
96
+ it("returns false when env var is unset", () => {
97
+ expect(isV2Disabled({})).toBe(false);
98
+ });
99
+ it('returns true only on strict equality with "true"', () => {
100
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "true" })).toBe(true);
101
+ });
102
+ it("returns false on any other truthy-looking value", () => {
103
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "1" })).toBe(false);
104
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "yes" })).toBe(false);
105
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "TRUE" })).toBe(false);
106
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "" })).toBe(false);
107
+ expect(isV2Disabled({ URATEAM_DISABLE_TRIAGE_V2: "false" })).toBe(false);
108
+ });
109
+ it("reads from process.env by default", () => {
110
+ const orig = process.env.URATEAM_DISABLE_TRIAGE_V2;
111
+ try {
112
+ process.env.URATEAM_DISABLE_TRIAGE_V2 = "true";
113
+ expect(isV2Disabled()).toBe(true);
114
+ process.env.URATEAM_DISABLE_TRIAGE_V2 = "false";
115
+ expect(isV2Disabled()).toBe(false);
116
+ }
117
+ finally {
118
+ if (orig === undefined) {
119
+ delete process.env.URATEAM_DISABLE_TRIAGE_V2;
120
+ }
121
+ else {
122
+ process.env.URATEAM_DISABLE_TRIAGE_V2 = orig;
123
+ }
124
+ }
125
+ });
126
+ });
127
+ //# sourceMappingURL=triage-v2-prompt.test.js.map