@sentry/warden 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/.github/workflows/ci.yml +1 -1
  2. package/.github/workflows/release.yml +6 -1
  3. package/.github/workflows/warden.yml +1 -1
  4. package/dist/action/159.index.js +523 -0
  5. package/dist/action/159.index.js.map +1 -0
  6. package/dist/action/action/index.d.ts +2 -0
  7. package/dist/action/action/index.d.ts.map +1 -0
  8. package/dist/action/action/main.d.ts +2 -0
  9. package/dist/action/action/main.d.ts.map +1 -0
  10. package/dist/action/cli/args.d.ts +74 -0
  11. package/dist/action/cli/args.d.ts.map +1 -0
  12. package/dist/action/cli/args.test.d.ts +2 -0
  13. package/dist/action/cli/args.test.d.ts.map +1 -0
  14. package/dist/action/cli/commands/add.d.ts +7 -0
  15. package/dist/action/cli/commands/add.d.ts.map +1 -0
  16. package/dist/action/cli/commands/init.d.ts +10 -0
  17. package/dist/action/cli/commands/init.d.ts.map +1 -0
  18. package/dist/action/cli/commands/init.test.d.ts +2 -0
  19. package/dist/action/cli/commands/init.test.d.ts.map +1 -0
  20. package/dist/action/cli/commands/setup-app/browser.d.ts +9 -0
  21. package/dist/action/cli/commands/setup-app/browser.d.ts.map +1 -0
  22. package/dist/action/cli/commands/setup-app/credentials.d.ts +15 -0
  23. package/dist/action/cli/commands/setup-app/credentials.d.ts.map +1 -0
  24. package/dist/action/cli/commands/setup-app/manifest.d.ts +24 -0
  25. package/dist/action/cli/commands/setup-app/manifest.d.ts.map +1 -0
  26. package/dist/action/cli/commands/setup-app/server.d.ts +28 -0
  27. package/dist/action/cli/commands/setup-app/server.d.ts.map +1 -0
  28. package/dist/action/cli/commands/setup-app.d.ts +11 -0
  29. package/dist/action/cli/commands/setup-app.d.ts.map +1 -0
  30. package/dist/action/cli/commands/sync.d.ts +9 -0
  31. package/dist/action/cli/commands/sync.d.ts.map +1 -0
  32. package/dist/action/cli/context.d.ts +27 -0
  33. package/dist/action/cli/context.d.ts.map +1 -0
  34. package/dist/action/cli/files.d.ts +22 -0
  35. package/dist/action/cli/files.d.ts.map +1 -0
  36. package/dist/action/cli/files.test.d.ts +2 -0
  37. package/dist/action/cli/files.test.d.ts.map +1 -0
  38. package/dist/action/cli/fix.d.ts +41 -0
  39. package/dist/action/cli/fix.d.ts.map +1 -0
  40. package/dist/action/cli/fix.test.d.ts +2 -0
  41. package/dist/action/cli/fix.test.d.ts.map +1 -0
  42. package/dist/action/cli/git.d.ts +73 -0
  43. package/dist/action/cli/git.d.ts.map +1 -0
  44. package/dist/action/cli/git.test.d.ts +2 -0
  45. package/dist/action/cli/git.test.d.ts.map +1 -0
  46. package/dist/action/cli/index.d.ts +3 -0
  47. package/dist/action/cli/index.d.ts.map +1 -0
  48. package/dist/action/cli/main.d.ts +7 -0
  49. package/dist/action/cli/main.d.ts.map +1 -0
  50. package/dist/action/cli/output/box.d.ts +75 -0
  51. package/dist/action/cli/output/box.d.ts.map +1 -0
  52. package/dist/action/cli/output/formatters.d.ts +90 -0
  53. package/dist/action/cli/output/formatters.d.ts.map +1 -0
  54. package/dist/action/cli/output/formatters.test.d.ts +2 -0
  55. package/dist/action/cli/output/formatters.test.d.ts.map +1 -0
  56. package/dist/action/cli/output/icons.d.ts +11 -0
  57. package/dist/action/cli/output/icons.d.ts.map +1 -0
  58. package/dist/action/cli/output/index.d.ts +10 -0
  59. package/dist/action/cli/output/index.d.ts.map +1 -0
  60. package/dist/action/cli/output/ink-runner.d.ts +9 -0
  61. package/dist/action/cli/output/ink-runner.d.ts.map +1 -0
  62. package/dist/action/cli/output/jsonl.d.ts +43 -0
  63. package/dist/action/cli/output/jsonl.d.ts.map +1 -0
  64. package/dist/action/cli/output/jsonl.test.d.ts +2 -0
  65. package/dist/action/cli/output/jsonl.test.d.ts.map +1 -0
  66. package/dist/action/cli/output/reporter.d.ts +108 -0
  67. package/dist/action/cli/output/reporter.d.ts.map +1 -0
  68. package/dist/action/cli/output/tasks.d.ts +89 -0
  69. package/dist/action/cli/output/tasks.d.ts.map +1 -0
  70. package/dist/action/cli/output/tty.d.ts +21 -0
  71. package/dist/action/cli/output/tty.d.ts.map +1 -0
  72. package/dist/action/cli/output/tty.test.d.ts +2 -0
  73. package/dist/action/cli/output/tty.test.d.ts.map +1 -0
  74. package/dist/action/cli/output/verbosity.d.ts +20 -0
  75. package/dist/action/cli/output/verbosity.d.ts.map +1 -0
  76. package/dist/action/cli/output/verbosity.test.d.ts +2 -0
  77. package/dist/action/cli/output/verbosity.test.d.ts.map +1 -0
  78. package/dist/action/cli/terminal.d.ts +19 -0
  79. package/dist/action/cli/terminal.d.ts.map +1 -0
  80. package/dist/action/cli/terminal.test.d.ts +2 -0
  81. package/dist/action/cli/terminal.test.d.ts.map +1 -0
  82. package/dist/action/config/index.d.ts +4 -0
  83. package/dist/action/config/index.d.ts.map +1 -0
  84. package/dist/action/config/loader.d.ts +27 -0
  85. package/dist/action/config/loader.d.ts.map +1 -0
  86. package/dist/action/config/loader.test.d.ts +2 -0
  87. package/dist/action/config/loader.test.d.ts.map +1 -0
  88. package/dist/action/config/schema.d.ts +318 -0
  89. package/dist/action/config/schema.d.ts.map +1 -0
  90. package/dist/action/config/writer.d.ts +11 -0
  91. package/dist/action/config/writer.d.ts.map +1 -0
  92. package/dist/action/config/writer.test.d.ts +2 -0
  93. package/dist/action/config/writer.test.d.ts.map +1 -0
  94. package/dist/action/diff/classify.d.ts +29 -0
  95. package/dist/action/diff/classify.d.ts.map +1 -0
  96. package/dist/action/diff/classify.test.d.ts +2 -0
  97. package/dist/action/diff/classify.test.d.ts.map +1 -0
  98. package/dist/action/diff/coalesce.d.ts +42 -0
  99. package/dist/action/diff/coalesce.d.ts.map +1 -0
  100. package/dist/action/diff/coalesce.test.d.ts +2 -0
  101. package/dist/action/diff/coalesce.test.d.ts.map +1 -0
  102. package/dist/action/diff/context.d.ts +30 -0
  103. package/dist/action/diff/context.d.ts.map +1 -0
  104. package/dist/action/diff/context.test.d.ts +2 -0
  105. package/dist/action/diff/context.test.d.ts.map +1 -0
  106. package/dist/action/diff/index.d.ts +5 -0
  107. package/dist/action/diff/index.d.ts.map +1 -0
  108. package/dist/action/diff/parser.d.ts +52 -0
  109. package/dist/action/diff/parser.d.ts.map +1 -0
  110. package/dist/action/diff/parser.test.d.ts +2 -0
  111. package/dist/action/diff/parser.test.d.ts.map +1 -0
  112. package/dist/action/event/context.d.ts +9 -0
  113. package/dist/action/event/context.d.ts.map +1 -0
  114. package/dist/action/event/index.d.ts +3 -0
  115. package/dist/action/event/index.d.ts.map +1 -0
  116. package/dist/action/event/schedule-context.d.ts +30 -0
  117. package/dist/action/event/schedule-context.d.ts.map +1 -0
  118. package/dist/action/examples/examples.integration.test.d.ts +2 -0
  119. package/dist/action/examples/examples.integration.test.d.ts.map +1 -0
  120. package/dist/action/examples/index.d.ts +50 -0
  121. package/dist/action/examples/index.d.ts.map +1 -0
  122. package/dist/action/examples/index.test.d.ts +2 -0
  123. package/dist/action/examples/index.test.d.ts.map +1 -0
  124. package/dist/action/examples/setup.d.ts +2 -0
  125. package/dist/action/examples/setup.d.ts.map +1 -0
  126. package/dist/action/index.d.ts +11 -0
  127. package/dist/action/index.d.ts.map +1 -0
  128. package/dist/action/index.js +38231 -0
  129. package/dist/action/index.js.map +1 -0
  130. package/dist/action/licenses.txt +992 -0
  131. package/dist/action/main.d.ts +2 -0
  132. package/dist/action/main.d.ts.map +1 -0
  133. package/dist/action/main.js +707 -0
  134. package/dist/action/main.js.map +1 -0
  135. package/dist/action/output/dedup.d.ts +153 -0
  136. package/dist/action/output/dedup.d.ts.map +1 -0
  137. package/dist/action/output/dedup.test.d.ts +2 -0
  138. package/dist/action/output/dedup.test.d.ts.map +1 -0
  139. package/dist/action/output/github-checks.d.ts +106 -0
  140. package/dist/action/output/github-checks.d.ts.map +1 -0
  141. package/dist/action/output/github-checks.test.d.ts +2 -0
  142. package/dist/action/output/github-checks.test.d.ts.map +1 -0
  143. package/dist/action/output/github-issues.d.ts +35 -0
  144. package/dist/action/output/github-issues.d.ts.map +1 -0
  145. package/dist/action/output/index.d.ts +6 -0
  146. package/dist/action/output/index.d.ts.map +1 -0
  147. package/dist/action/output/issue-renderer.d.ts +20 -0
  148. package/dist/action/output/issue-renderer.d.ts.map +1 -0
  149. package/dist/action/output/renderer.d.ts +4 -0
  150. package/dist/action/output/renderer.d.ts.map +1 -0
  151. package/dist/action/output/renderer.test.d.ts +2 -0
  152. package/dist/action/output/renderer.test.d.ts.map +1 -0
  153. package/dist/action/output/stale.d.ts +31 -0
  154. package/dist/action/output/stale.d.ts.map +1 -0
  155. package/dist/action/output/stale.test.d.ts +2 -0
  156. package/dist/action/output/stale.test.d.ts.map +1 -0
  157. package/dist/action/output/types.d.ts +31 -0
  158. package/dist/action/output/types.d.ts.map +1 -0
  159. package/dist/action/package.json +3 -0
  160. package/dist/action/sdk/index.d.ts +2 -0
  161. package/dist/action/sdk/index.d.ts.map +1 -0
  162. package/dist/action/sdk/runner.d.ts +202 -0
  163. package/dist/action/sdk/runner.d.ts.map +1 -0
  164. package/dist/action/sdk/runner.test.d.ts +2 -0
  165. package/dist/action/sdk/runner.test.d.ts.map +1 -0
  166. package/dist/action/skills/index.d.ts +5 -0
  167. package/dist/action/skills/index.d.ts.map +1 -0
  168. package/dist/action/skills/loader.d.ts +111 -0
  169. package/dist/action/skills/loader.d.ts.map +1 -0
  170. package/dist/action/skills/loader.test.d.ts +2 -0
  171. package/dist/action/skills/loader.test.d.ts.map +1 -0
  172. package/dist/action/skills/remote.d.ts +117 -0
  173. package/dist/action/skills/remote.d.ts.map +1 -0
  174. package/dist/action/skills/remote.test.d.ts +2 -0
  175. package/dist/action/skills/remote.test.d.ts.map +1 -0
  176. package/dist/action/sourcemap-register.cjs +1 -0
  177. package/dist/action/triggers/matcher.d.ts +30 -0
  178. package/dist/action/triggers/matcher.d.ts.map +1 -0
  179. package/dist/action/triggers/matcher.test.d.ts +2 -0
  180. package/dist/action/triggers/matcher.test.d.ts.map +1 -0
  181. package/dist/action/types/index.d.ts +269 -0
  182. package/dist/action/types/index.d.ts.map +1 -0
  183. package/dist/action/utils/async.d.ts +5 -0
  184. package/dist/action/utils/async.d.ts.map +1 -0
  185. package/dist/action/utils/index.d.ts +16 -0
  186. package/dist/action/utils/index.d.ts.map +1 -0
  187. package/dist/action/utils/index.test.d.ts +2 -0
  188. package/dist/action/utils/index.test.d.ts.map +1 -0
  189. package/dist/action/utils/version.d.ts +3 -0
  190. package/dist/action/utils/version.d.ts.map +1 -0
  191. package/dist/cli/args.d.ts +74 -0
  192. package/dist/cli/args.d.ts.map +1 -0
  193. package/dist/cli/args.js +359 -0
  194. package/dist/cli/args.js.map +1 -0
  195. package/dist/cli/args.test.d.ts +2 -0
  196. package/dist/cli/args.test.d.ts.map +1 -0
  197. package/dist/cli/args.test.js +392 -0
  198. package/dist/cli/args.test.js.map +1 -0
  199. package/dist/cli/commands/add.d.ts +7 -0
  200. package/dist/cli/commands/add.d.ts.map +1 -0
  201. package/dist/cli/commands/add.js +380 -0
  202. package/dist/cli/commands/add.js.map +1 -0
  203. package/dist/cli/commands/init.d.ts +10 -0
  204. package/dist/cli/commands/init.d.ts.map +1 -0
  205. package/dist/cli/commands/init.js +113 -0
  206. package/dist/cli/commands/init.js.map +1 -0
  207. package/dist/cli/commands/init.test.d.ts +2 -0
  208. package/dist/cli/commands/init.test.d.ts.map +1 -0
  209. package/dist/cli/commands/init.test.js +117 -0
  210. package/dist/cli/commands/init.test.js.map +1 -0
  211. package/dist/cli/commands/setup-app/browser.d.ts +9 -0
  212. package/dist/cli/commands/setup-app/browser.d.ts.map +1 -0
  213. package/dist/cli/commands/setup-app/browser.js +36 -0
  214. package/dist/cli/commands/setup-app/browser.js.map +1 -0
  215. package/dist/cli/commands/setup-app/credentials.d.ts +15 -0
  216. package/dist/cli/commands/setup-app/credentials.d.ts.map +1 -0
  217. package/dist/cli/commands/setup-app/credentials.js +29 -0
  218. package/dist/cli/commands/setup-app/credentials.js.map +1 -0
  219. package/dist/cli/commands/setup-app/manifest.d.ts +24 -0
  220. package/dist/cli/commands/setup-app/manifest.d.ts.map +1 -0
  221. package/dist/cli/commands/setup-app/manifest.js +29 -0
  222. package/dist/cli/commands/setup-app/manifest.js.map +1 -0
  223. package/dist/cli/commands/setup-app/server.d.ts +28 -0
  224. package/dist/cli/commands/setup-app/server.d.ts.map +1 -0
  225. package/dist/cli/commands/setup-app/server.js +136 -0
  226. package/dist/cli/commands/setup-app/server.js.map +1 -0
  227. package/dist/cli/commands/setup-app.d.ts +11 -0
  228. package/dist/cli/commands/setup-app.d.ts.map +1 -0
  229. package/dist/cli/commands/setup-app.js +139 -0
  230. package/dist/cli/commands/setup-app.js.map +1 -0
  231. package/dist/cli/commands/sync.d.ts +9 -0
  232. package/dist/cli/commands/sync.d.ts.map +1 -0
  233. package/dist/cli/commands/sync.js +96 -0
  234. package/dist/cli/commands/sync.js.map +1 -0
  235. package/dist/cli/context.d.ts +27 -0
  236. package/dist/cli/context.d.ts.map +1 -0
  237. package/dist/cli/context.js +101 -0
  238. package/dist/cli/context.js.map +1 -0
  239. package/dist/cli/files.d.ts +22 -0
  240. package/dist/cli/files.d.ts.map +1 -0
  241. package/dist/cli/files.js +66 -0
  242. package/dist/cli/files.js.map +1 -0
  243. package/dist/cli/files.test.d.ts +2 -0
  244. package/dist/cli/files.test.d.ts.map +1 -0
  245. package/dist/cli/files.test.js +117 -0
  246. package/dist/cli/files.test.js.map +1 -0
  247. package/dist/cli/fix.d.ts +41 -0
  248. package/dist/cli/fix.d.ts.map +1 -0
  249. package/dist/cli/fix.js +320 -0
  250. package/dist/cli/fix.js.map +1 -0
  251. package/dist/cli/fix.test.d.ts +2 -0
  252. package/dist/cli/fix.test.d.ts.map +1 -0
  253. package/dist/cli/fix.test.js +251 -0
  254. package/dist/cli/fix.test.js.map +1 -0
  255. package/dist/cli/git.d.ts +73 -0
  256. package/dist/cli/git.d.ts.map +1 -0
  257. package/dist/cli/git.js +267 -0
  258. package/dist/cli/git.js.map +1 -0
  259. package/dist/cli/git.test.d.ts +2 -0
  260. package/dist/cli/git.test.d.ts.map +1 -0
  261. package/dist/cli/git.test.js +96 -0
  262. package/dist/cli/git.test.js.map +1 -0
  263. package/dist/cli/index.d.ts +3 -0
  264. package/dist/cli/index.d.ts.map +1 -0
  265. package/dist/cli/index.js +13 -0
  266. package/dist/cli/index.js.map +1 -0
  267. package/dist/cli/main.d.ts +7 -0
  268. package/dist/cli/main.d.ts.map +1 -0
  269. package/dist/cli/main.js +560 -0
  270. package/dist/cli/main.js.map +1 -0
  271. package/dist/cli/output/box.d.ts +75 -0
  272. package/dist/cli/output/box.d.ts.map +1 -0
  273. package/dist/cli/output/box.js +191 -0
  274. package/dist/cli/output/box.js.map +1 -0
  275. package/dist/cli/output/formatters.d.ts +90 -0
  276. package/dist/cli/output/formatters.d.ts.map +1 -0
  277. package/dist/cli/output/formatters.js +248 -0
  278. package/dist/cli/output/formatters.js.map +1 -0
  279. package/dist/cli/output/formatters.test.d.ts +2 -0
  280. package/dist/cli/output/formatters.test.d.ts.map +1 -0
  281. package/dist/cli/output/formatters.test.js +152 -0
  282. package/dist/cli/output/formatters.test.js.map +1 -0
  283. package/dist/cli/output/icons.d.ts +11 -0
  284. package/dist/cli/output/icons.d.ts.map +1 -0
  285. package/dist/cli/output/icons.js +11 -0
  286. package/dist/cli/output/icons.js.map +1 -0
  287. package/dist/cli/output/index.d.ts +10 -0
  288. package/dist/cli/output/index.d.ts.map +1 -0
  289. package/dist/cli/output/index.js +10 -0
  290. package/dist/cli/output/index.js.map +1 -0
  291. package/dist/cli/output/ink-runner.d.ts +9 -0
  292. package/dist/cli/output/ink-runner.d.ts.map +1 -0
  293. package/dist/cli/output/ink-runner.js +207 -0
  294. package/dist/cli/output/ink-runner.js.map +1 -0
  295. package/dist/cli/output/jsonl.d.ts +43 -0
  296. package/dist/cli/output/jsonl.d.ts.map +1 -0
  297. package/dist/cli/output/jsonl.js +89 -0
  298. package/dist/cli/output/jsonl.js.map +1 -0
  299. package/dist/cli/output/jsonl.test.d.ts +2 -0
  300. package/dist/cli/output/jsonl.test.d.ts.map +1 -0
  301. package/dist/cli/output/jsonl.test.js +284 -0
  302. package/dist/cli/output/jsonl.test.js.map +1 -0
  303. package/dist/cli/output/reporter.d.ts +108 -0
  304. package/dist/cli/output/reporter.d.ts.map +1 -0
  305. package/dist/cli/output/reporter.js +378 -0
  306. package/dist/cli/output/reporter.js.map +1 -0
  307. package/dist/cli/output/tasks.d.ts +89 -0
  308. package/dist/cli/output/tasks.d.ts.map +1 -0
  309. package/dist/cli/output/tasks.js +251 -0
  310. package/dist/cli/output/tasks.js.map +1 -0
  311. package/dist/cli/output/tty.d.ts +21 -0
  312. package/dist/cli/output/tty.d.ts.map +1 -0
  313. package/dist/cli/output/tty.js +44 -0
  314. package/dist/cli/output/tty.js.map +1 -0
  315. package/dist/cli/output/tty.test.d.ts +2 -0
  316. package/dist/cli/output/tty.test.d.ts.map +1 -0
  317. package/dist/cli/output/tty.test.js +105 -0
  318. package/dist/cli/output/tty.test.js.map +1 -0
  319. package/dist/cli/output/verbosity.d.ts +20 -0
  320. package/dist/cli/output/verbosity.d.ts.map +1 -0
  321. package/dist/cli/output/verbosity.js +32 -0
  322. package/dist/cli/output/verbosity.js.map +1 -0
  323. package/dist/cli/output/verbosity.test.d.ts +2 -0
  324. package/dist/cli/output/verbosity.test.d.ts.map +1 -0
  325. package/dist/cli/output/verbosity.test.js +35 -0
  326. package/dist/cli/output/verbosity.test.js.map +1 -0
  327. package/dist/cli/terminal.d.ts +19 -0
  328. package/dist/cli/terminal.d.ts.map +1 -0
  329. package/dist/cli/terminal.js +247 -0
  330. package/dist/cli/terminal.js.map +1 -0
  331. package/dist/cli/terminal.test.d.ts +2 -0
  332. package/dist/cli/terminal.test.d.ts.map +1 -0
  333. package/dist/cli/terminal.test.js +123 -0
  334. package/dist/cli/terminal.test.js.map +1 -0
  335. package/dist/config/index.d.ts +4 -0
  336. package/dist/config/index.d.ts.map +1 -0
  337. package/dist/config/index.js +4 -0
  338. package/dist/config/index.js.map +1 -0
  339. package/dist/config/loader.d.ts +27 -0
  340. package/dist/config/loader.d.ts.map +1 -0
  341. package/dist/config/loader.js +77 -0
  342. package/dist/config/loader.js.map +1 -0
  343. package/dist/config/loader.test.d.ts +2 -0
  344. package/dist/config/loader.test.d.ts.map +1 -0
  345. package/dist/config/loader.test.js +263 -0
  346. package/dist/config/loader.test.js.map +1 -0
  347. package/dist/config/schema.d.ts +318 -0
  348. package/dist/config/schema.d.ts.map +1 -0
  349. package/dist/config/schema.js +137 -0
  350. package/dist/config/schema.js.map +1 -0
  351. package/dist/config/writer.d.ts +11 -0
  352. package/dist/config/writer.d.ts.map +1 -0
  353. package/dist/config/writer.js +74 -0
  354. package/dist/config/writer.js.map +1 -0
  355. package/dist/config/writer.test.d.ts +2 -0
  356. package/dist/config/writer.test.d.ts.map +1 -0
  357. package/dist/config/writer.test.js +98 -0
  358. package/dist/config/writer.test.js.map +1 -0
  359. package/dist/diff/classify.d.ts +29 -0
  360. package/dist/diff/classify.d.ts.map +1 -0
  361. package/dist/diff/classify.js +74 -0
  362. package/dist/diff/classify.js.map +1 -0
  363. package/dist/diff/classify.test.d.ts +2 -0
  364. package/dist/diff/classify.test.d.ts.map +1 -0
  365. package/dist/diff/classify.test.js +140 -0
  366. package/dist/diff/classify.test.js.map +1 -0
  367. package/dist/diff/coalesce.d.ts +42 -0
  368. package/dist/diff/coalesce.d.ts.map +1 -0
  369. package/dist/diff/coalesce.js +104 -0
  370. package/dist/diff/coalesce.js.map +1 -0
  371. package/dist/diff/coalesce.test.d.ts +2 -0
  372. package/dist/diff/coalesce.test.d.ts.map +1 -0
  373. package/dist/diff/coalesce.test.js +159 -0
  374. package/dist/diff/coalesce.test.js.map +1 -0
  375. package/dist/diff/context.d.ts +30 -0
  376. package/dist/diff/context.d.ts.map +1 -0
  377. package/dist/diff/context.js +144 -0
  378. package/dist/diff/context.js.map +1 -0
  379. package/dist/diff/context.test.d.ts +2 -0
  380. package/dist/diff/context.test.d.ts.map +1 -0
  381. package/dist/diff/context.test.js +190 -0
  382. package/dist/diff/context.test.js.map +1 -0
  383. package/dist/diff/index.d.ts +5 -0
  384. package/dist/diff/index.d.ts.map +1 -0
  385. package/dist/diff/index.js +5 -0
  386. package/dist/diff/index.js.map +1 -0
  387. package/dist/diff/parser.d.ts +52 -0
  388. package/dist/diff/parser.d.ts.map +1 -0
  389. package/dist/diff/parser.js +95 -0
  390. package/dist/diff/parser.js.map +1 -0
  391. package/dist/diff/parser.test.d.ts +2 -0
  392. package/dist/diff/parser.test.d.ts.map +1 -0
  393. package/dist/diff/parser.test.js +178 -0
  394. package/dist/diff/parser.test.js.map +1 -0
  395. package/dist/event/context.d.ts +9 -0
  396. package/dist/event/context.d.ts.map +1 -0
  397. package/dist/event/context.js +94 -0
  398. package/dist/event/context.js.map +1 -0
  399. package/dist/event/index.d.ts +3 -0
  400. package/dist/event/index.d.ts.map +1 -0
  401. package/dist/event/index.js +3 -0
  402. package/dist/event/index.js.map +1 -0
  403. package/dist/event/schedule-context.d.ts +30 -0
  404. package/dist/event/schedule-context.d.ts.map +1 -0
  405. package/dist/event/schedule-context.js +57 -0
  406. package/dist/event/schedule-context.js.map +1 -0
  407. package/dist/examples/examples.integration.test.d.ts +2 -0
  408. package/dist/examples/examples.integration.test.d.ts.map +1 -0
  409. package/dist/examples/examples.integration.test.js +55 -0
  410. package/dist/examples/examples.integration.test.js.map +1 -0
  411. package/dist/examples/index.d.ts +50 -0
  412. package/dist/examples/index.d.ts.map +1 -0
  413. package/dist/examples/index.js +104 -0
  414. package/dist/examples/index.js.map +1 -0
  415. package/dist/examples/index.test.d.ts +2 -0
  416. package/dist/examples/index.test.d.ts.map +1 -0
  417. package/dist/examples/index.test.js +88 -0
  418. package/dist/examples/index.test.js.map +1 -0
  419. package/dist/examples/setup.d.ts +2 -0
  420. package/dist/examples/setup.d.ts.map +1 -0
  421. package/dist/examples/setup.js +22 -0
  422. package/dist/examples/setup.js.map +1 -0
  423. package/dist/index.d.ts +12 -0
  424. package/dist/index.d.ts.map +1 -0
  425. package/dist/index.js +57 -0
  426. package/dist/index.js.map +1 -0
  427. package/dist/output/dedup.d.ts +153 -0
  428. package/dist/output/dedup.d.ts.map +1 -0
  429. package/dist/output/dedup.js +416 -0
  430. package/dist/output/dedup.js.map +1 -0
  431. package/dist/output/dedup.test.d.ts +2 -0
  432. package/dist/output/dedup.test.d.ts.map +1 -0
  433. package/dist/output/dedup.test.js +357 -0
  434. package/dist/output/dedup.test.js.map +1 -0
  435. package/dist/output/github-checks.d.ts +106 -0
  436. package/dist/output/github-checks.d.ts.map +1 -0
  437. package/dist/output/github-checks.js +321 -0
  438. package/dist/output/github-checks.js.map +1 -0
  439. package/dist/output/github-checks.test.d.ts +2 -0
  440. package/dist/output/github-checks.test.d.ts.map +1 -0
  441. package/dist/output/github-checks.test.js +255 -0
  442. package/dist/output/github-checks.test.js.map +1 -0
  443. package/dist/output/github-issues.d.ts +35 -0
  444. package/dist/output/github-issues.d.ts.map +1 -0
  445. package/dist/output/github-issues.js +246 -0
  446. package/dist/output/github-issues.js.map +1 -0
  447. package/dist/output/index.d.ts +6 -0
  448. package/dist/output/index.d.ts.map +1 -0
  449. package/dist/output/index.js +6 -0
  450. package/dist/output/index.js.map +1 -0
  451. package/dist/output/issue-renderer.d.ts +20 -0
  452. package/dist/output/issue-renderer.d.ts.map +1 -0
  453. package/dist/output/issue-renderer.js +154 -0
  454. package/dist/output/issue-renderer.js.map +1 -0
  455. package/dist/output/renderer.d.ts +4 -0
  456. package/dist/output/renderer.d.ts.map +1 -0
  457. package/dist/output/renderer.js +168 -0
  458. package/dist/output/renderer.js.map +1 -0
  459. package/dist/output/renderer.test.d.ts +2 -0
  460. package/dist/output/renderer.test.d.ts.map +1 -0
  461. package/dist/output/renderer.test.js +645 -0
  462. package/dist/output/renderer.test.js.map +1 -0
  463. package/dist/output/stale.d.ts +31 -0
  464. package/dist/output/stale.d.ts.map +1 -0
  465. package/dist/output/stale.js +114 -0
  466. package/dist/output/stale.js.map +1 -0
  467. package/dist/output/stale.test.d.ts +2 -0
  468. package/dist/output/stale.test.d.ts.map +1 -0
  469. package/dist/output/stale.test.js +330 -0
  470. package/dist/output/stale.test.js.map +1 -0
  471. package/dist/output/types.d.ts +31 -0
  472. package/dist/output/types.d.ts.map +1 -0
  473. package/dist/output/types.js +2 -0
  474. package/dist/output/types.js.map +1 -0
  475. package/dist/sdk/index.d.ts +2 -0
  476. package/dist/sdk/index.d.ts.map +1 -0
  477. package/dist/sdk/index.js +2 -0
  478. package/dist/sdk/index.js.map +1 -0
  479. package/dist/sdk/runner.d.ts +202 -0
  480. package/dist/sdk/runner.d.ts.map +1 -0
  481. package/dist/sdk/runner.js +888 -0
  482. package/dist/sdk/runner.js.map +1 -0
  483. package/dist/sdk/runner.test.d.ts +2 -0
  484. package/dist/sdk/runner.test.d.ts.map +1 -0
  485. package/dist/sdk/runner.test.js +677 -0
  486. package/dist/sdk/runner.test.js.map +1 -0
  487. package/dist/skills/index.d.ts +5 -0
  488. package/dist/skills/index.d.ts.map +1 -0
  489. package/dist/skills/index.js +3 -0
  490. package/dist/skills/index.js.map +1 -0
  491. package/dist/skills/loader.d.ts +111 -0
  492. package/dist/skills/loader.d.ts.map +1 -0
  493. package/dist/skills/loader.js +319 -0
  494. package/dist/skills/loader.js.map +1 -0
  495. package/dist/skills/loader.test.d.ts +2 -0
  496. package/dist/skills/loader.test.d.ts.map +1 -0
  497. package/dist/skills/loader.test.js +241 -0
  498. package/dist/skills/loader.test.js.map +1 -0
  499. package/dist/skills/remote.d.ts +117 -0
  500. package/dist/skills/remote.d.ts.map +1 -0
  501. package/dist/skills/remote.js +496 -0
  502. package/dist/skills/remote.js.map +1 -0
  503. package/dist/skills/remote.test.d.ts +2 -0
  504. package/dist/skills/remote.test.d.ts.map +1 -0
  505. package/dist/skills/remote.test.js +582 -0
  506. package/dist/skills/remote.test.js.map +1 -0
  507. package/dist/triggers/matcher.d.ts +30 -0
  508. package/dist/triggers/matcher.d.ts.map +1 -0
  509. package/dist/triggers/matcher.js +122 -0
  510. package/dist/triggers/matcher.js.map +1 -0
  511. package/dist/triggers/matcher.test.d.ts +2 -0
  512. package/dist/triggers/matcher.test.d.ts.map +1 -0
  513. package/dist/triggers/matcher.test.js +234 -0
  514. package/dist/triggers/matcher.test.js.map +1 -0
  515. package/dist/types/index.d.ts +269 -0
  516. package/dist/types/index.d.ts.map +1 -0
  517. package/dist/types/index.js +162 -0
  518. package/dist/types/index.js.map +1 -0
  519. package/dist/utils/async.d.ts +5 -0
  520. package/dist/utils/async.d.ts.map +1 -0
  521. package/dist/utils/async.js +13 -0
  522. package/dist/utils/async.js.map +1 -0
  523. package/dist/utils/index.d.ts +16 -0
  524. package/dist/utils/index.d.ts.map +1 -0
  525. package/dist/utils/index.js +44 -0
  526. package/dist/utils/index.js.map +1 -0
  527. package/dist/utils/index.test.d.ts +2 -0
  528. package/dist/utils/index.test.d.ts.map +1 -0
  529. package/dist/utils/index.test.js +68 -0
  530. package/dist/utils/index.test.js.map +1 -0
  531. package/dist/utils/version.d.ts +3 -0
  532. package/dist/utils/version.d.ts.map +1 -0
  533. package/dist/utils/version.js +16 -0
  534. package/dist/utils/version.js.map +1 -0
  535. package/docs/src/pages/config.astro +2 -1
  536. package/docs/src/pages/guide.astro +2 -1
  537. package/docs/src/utils/version.ts +6 -0
  538. package/package.json +12 -2
  539. package/src/cli/args.ts +2 -3
  540. package/src/cli/commands/init.test.ts +2 -1
  541. package/src/cli/commands/init.ts +3 -1
  542. package/src/cli/output/reporter.ts +3 -4
  543. package/src/utils/index.ts +1 -0
  544. package/src/utils/version.ts +17 -0
  545. package/.claude/settings.local.json +0 -88
  546. package/docs/.claude/settings.local.json +0 -11
package/dist/index.js ADDED
@@ -0,0 +1,57 @@
1
+ // =============================================================================
2
+ // Warden Public API
3
+ // =============================================================================
4
+ // This file exports the intentional public API for Warden consumers.
5
+ // Internal implementation details are not exported.
6
+ // =============================================================================
7
+ // -----------------------------------------------------------------------------
8
+ // Core Types and Schemas
9
+ // -----------------------------------------------------------------------------
10
+ export {
11
+ // Severity
12
+ SeveritySchema, SEVERITY_ORDER,
13
+ // Location
14
+ LocationSchema,
15
+ // Suggested Fix
16
+ SuggestedFixSchema,
17
+ // Finding
18
+ FindingSchema,
19
+ // Skill Report
20
+ SkillReportSchema,
21
+ // GitHub Events
22
+ GitHubEventTypeSchema, PullRequestActionSchema,
23
+ // File Changes
24
+ FileChangeSchema,
25
+ // Context
26
+ PullRequestContextSchema, RepositoryContextSchema, EventContextSchema, } from './types/index.js';
27
+ // -----------------------------------------------------------------------------
28
+ // Configuration
29
+ // -----------------------------------------------------------------------------
30
+ export {
31
+ // Schemas
32
+ SkillDefinitionSchema, TriggerSchema, WardenConfigSchema, PathFilterSchema, OutputConfigSchema,
33
+ // Functions
34
+ loadWardenConfig, resolveTrigger,
35
+ // Errors
36
+ ConfigLoadError, } from './config/index.js';
37
+ // -----------------------------------------------------------------------------
38
+ // SDK Runner
39
+ // -----------------------------------------------------------------------------
40
+ export { runSkill, SkillRunnerError } from './sdk/runner.js';
41
+ // -----------------------------------------------------------------------------
42
+ // Skills
43
+ // -----------------------------------------------------------------------------
44
+ export { resolveSkillAsync, SkillLoaderError, } from './skills/index.js';
45
+ // -----------------------------------------------------------------------------
46
+ // Event Context
47
+ // -----------------------------------------------------------------------------
48
+ export { buildEventContext, EventContextError } from './event/context.js';
49
+ // -----------------------------------------------------------------------------
50
+ // Trigger Matching
51
+ // -----------------------------------------------------------------------------
52
+ export { matchTrigger, matchGlob, shouldFail, countFindingsAtOrAbove, countSeverity, } from './triggers/matcher.js';
53
+ // -----------------------------------------------------------------------------
54
+ // Output Rendering
55
+ // -----------------------------------------------------------------------------
56
+ export { renderSkillReport } from './output/renderer.js';
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAChF,qEAAqE;AACrE,oDAAoD;AACpD,gFAAgF;AAEhF,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAChF,OAAO;AACL,WAAW;AACX,cAAc,EACd,cAAc;AACd,WAAW;AACX,cAAc;AACd,gBAAgB;AAChB,kBAAkB;AAClB,UAAU;AACV,aAAa;AACb,eAAe;AACf,iBAAiB;AACjB,gBAAgB;AAChB,qBAAqB,EACrB,uBAAuB;AACvB,eAAe;AACf,gBAAgB;AAChB,UAAU;AACV,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAgB1B,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAChF,OAAO;AACL,UAAU;AACV,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB;AAClB,YAAY;AACZ,gBAAgB,EAChB,cAAc;AACd,SAAS;AACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAW3B,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAChF,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAI7D,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAChF,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAChF,OAAO,EACL,YAAY,EACZ,SAAS,EACT,UAAU,EACV,sBAAsB,EACtB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,153 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { Finding } from '../types/index.js';
3
+ /**
4
+ * Parsed marker data from a Warden comment.
5
+ */
6
+ export interface WardenMarker {
7
+ path: string;
8
+ line: number;
9
+ contentHash: string;
10
+ }
11
+ /**
12
+ * Existing comment from GitHub (either Warden or external).
13
+ */
14
+ export interface ExistingComment {
15
+ id: number;
16
+ path: string;
17
+ line: number;
18
+ title: string;
19
+ description: string;
20
+ contentHash: string;
21
+ /** GraphQL node ID for the review thread (used to resolve stale comments) */
22
+ threadId?: string;
23
+ /** Whether the thread has been resolved (resolved comments are used for dedup but not stale detection) */
24
+ isResolved?: boolean;
25
+ /** Whether this is a Warden-generated comment */
26
+ isWarden?: boolean;
27
+ /** Skills that have already detected this issue (for Warden comments) */
28
+ skills?: string[];
29
+ /** The raw comment body (needed for updating Warden comments) */
30
+ body?: string;
31
+ /** GraphQL node ID for the comment (needed for adding reactions) */
32
+ commentNodeId?: string;
33
+ }
34
+ /**
35
+ * Type of action to take for a duplicate finding.
36
+ */
37
+ export type DuplicateActionType = 'update_warden' | 'react_external';
38
+ /**
39
+ * Action to take for a duplicate finding.
40
+ */
41
+ export interface DuplicateAction {
42
+ type: DuplicateActionType;
43
+ finding: Finding;
44
+ existingComment: ExistingComment;
45
+ /** Whether this was a hash match or semantic match */
46
+ matchType: 'hash' | 'semantic';
47
+ }
48
+ /**
49
+ * Result of deduplication with actions for duplicates.
50
+ */
51
+ export interface DeduplicateResult {
52
+ /** Findings that are not duplicates - should be posted */
53
+ newFindings: Finding[];
54
+ /** Actions to take for duplicate findings */
55
+ duplicateActions: DuplicateAction[];
56
+ }
57
+ /**
58
+ * Generate a short content hash from title and description.
59
+ * Used for exact-match deduplication.
60
+ */
61
+ export declare function generateContentHash(title: string, description: string): string;
62
+ /**
63
+ * Generate the marker HTML comment to embed in comment body.
64
+ * Format: <!-- warden:v1:{path}:{line}:{contentHash} -->
65
+ */
66
+ export declare function generateMarker(path: string, line: number, contentHash: string): string;
67
+ /**
68
+ * Parse a Warden marker from a comment body.
69
+ * Returns null if no valid marker is found.
70
+ */
71
+ export declare function parseMarker(body: string): WardenMarker | null;
72
+ /**
73
+ * Parse title and description from a Warden comment body.
74
+ * Expected format: **:emoji: Title**\n\nDescription
75
+ */
76
+ export declare function parseWardenComment(body: string): {
77
+ title: string;
78
+ description: string;
79
+ } | null;
80
+ /**
81
+ * Check if a comment body is a Warden-generated comment.
82
+ */
83
+ export declare function isWardenComment(body: string): boolean;
84
+ /**
85
+ * Parse skill names from a Warden comment's attribution line.
86
+ * Handles both single skill: "<sub>warden: skill-name</sub>"
87
+ * And multiple skills: "<sub>warden: skill1, skill2</sub>"
88
+ */
89
+ export declare function parseWardenSkills(body: string): string[];
90
+ /**
91
+ * Update a Warden comment body to add a new skill to the attribution.
92
+ * Changes "<sub>warden: skill1</sub>" to "<sub>warden: skill1, skill2</sub>"
93
+ * Returns null if skill is already listed or if no <sub>warden:...</sub> tag exists.
94
+ */
95
+ export declare function updateWardenCommentBody(body: string, newSkill: string): string | null;
96
+ /**
97
+ * Fetch all existing review comments for a PR (both Warden and external).
98
+ * Uses GraphQL to get thread IDs for stale comment resolution and node IDs for reactions.
99
+ */
100
+ export declare function fetchExistingComments(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<ExistingComment[]>;
101
+ /**
102
+ * @deprecated Use fetchExistingComments instead
103
+ */
104
+ export declare function fetchExistingWardenComments(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<ExistingComment[]>;
105
+ /**
106
+ * Options for deduplication.
107
+ */
108
+ export interface DeduplicateOptions {
109
+ /** Anthropic API key for LLM-based semantic deduplication */
110
+ apiKey?: string;
111
+ /** Skip LLM deduplication and only use exact hash matching */
112
+ hashOnly?: boolean;
113
+ /** Current skill name (for updating Warden comment attribution) */
114
+ currentSkill?: string;
115
+ }
116
+ /**
117
+ * Update an existing Warden PR review comment via REST API.
118
+ */
119
+ export declare function updateWardenComment(octokit: Octokit, owner: string, repo: string, commentId: number, newBody: string): Promise<void>;
120
+ /**
121
+ * Add a reaction to an existing PR review comment.
122
+ * Uses GraphQL to handle review comments.
123
+ */
124
+ export declare function addReactionToComment(octokit: Octokit, commentNodeId: string, reaction?: 'THUMBS_UP' | 'EYES'): Promise<void>;
125
+ /**
126
+ * Process duplicate actions - update Warden comments and add reactions.
127
+ * Returns counts of actions taken for logging.
128
+ */
129
+ export declare function processDuplicateActions(octokit: Octokit, owner: string, repo: string, actions: DuplicateAction[], currentSkill: string): Promise<{
130
+ updated: number;
131
+ reacted: number;
132
+ skipped: number;
133
+ failed: number;
134
+ }>;
135
+ /**
136
+ * Convert a Finding to an ExistingComment for cross-trigger deduplication.
137
+ * Returns null if the finding has no location.
138
+ */
139
+ export declare function findingToExistingComment(finding: Finding, skill?: string): ExistingComment | null;
140
+ /**
141
+ * Deduplicate findings against existing comments.
142
+ * Returns non-duplicate findings and actions to take for duplicates.
143
+ *
144
+ * Deduplication is two-pass:
145
+ * 1. Exact content hash match - instant match
146
+ * 2. LLM semantic comparison for remaining findings (if API key provided)
147
+ *
148
+ * For duplicates:
149
+ * - If matching a Warden comment: action to update attribution with new skill
150
+ * - If matching an external comment: action to add reaction
151
+ */
152
+ export declare function deduplicateFindings(findings: Finding[], existingComments: ExistingComment[], options?: DeduplicateOptions): Promise<DeduplicateResult>;
153
+ //# sourceMappingURL=dedup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/output/dedup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0GAA0G;IAC1G,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,sDAAsD;IACtD,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,6CAA6C;IAC7C,gBAAgB,EAAE,eAAe,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAc7D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB9F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASxD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBrF;AA6DD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CA4D5B;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAG5B;AAoFD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAYD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,GAAE,WAAW,GAAG,MAAe,GACtC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsChF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAejG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,EAAE,eAAe,EAAE,EACnC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAmE5B"}
@@ -0,0 +1,416 @@
1
+ import { createHash } from 'node:crypto';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { z } from 'zod';
4
+ /**
5
+ * Generate a short content hash from title and description.
6
+ * Used for exact-match deduplication.
7
+ */
8
+ export function generateContentHash(title, description) {
9
+ const content = `${title}\n${description}`;
10
+ return createHash('sha256').update(content).digest('hex').slice(0, 8);
11
+ }
12
+ /**
13
+ * Generate the marker HTML comment to embed in comment body.
14
+ * Format: <!-- warden:v1:{path}:{line}:{contentHash} -->
15
+ */
16
+ export function generateMarker(path, line, contentHash) {
17
+ return `<!-- warden:v1:${path}:${line}:${contentHash} -->`;
18
+ }
19
+ /**
20
+ * Parse a Warden marker from a comment body.
21
+ * Returns null if no valid marker is found.
22
+ */
23
+ export function parseMarker(body) {
24
+ const match = body.match(/<!-- warden:v1:([^:]+):(\d+):([a-f0-9]+) -->/);
25
+ if (!match) {
26
+ return null;
27
+ }
28
+ // Capture groups are guaranteed to exist when the regex matches
29
+ const [, path, lineStr, contentHash] = match;
30
+ return {
31
+ path,
32
+ line: parseInt(lineStr, 10),
33
+ contentHash,
34
+ };
35
+ }
36
+ /**
37
+ * Parse title and description from a Warden comment body.
38
+ * Expected format: **:emoji: Title**\n\nDescription
39
+ */
40
+ export function parseWardenComment(body) {
41
+ // Match the title pattern: **:emoji: Title** or **Title**
42
+ // Use non-greedy match to handle titles containing asterisks
43
+ const titleMatch = body.match(/\*\*(?::[a-z_]+:\s*)?(.+?)\*\*/);
44
+ if (!titleMatch || !titleMatch[1]) {
45
+ return null;
46
+ }
47
+ const title = titleMatch[1].trim();
48
+ // Get the description - everything after the title until the first ---
49
+ const titleEnd = body.indexOf('**', body.indexOf('**') + 2) + 2;
50
+ const separatorIndex = body.indexOf('---');
51
+ const descEnd = separatorIndex > -1 ? separatorIndex : body.length;
52
+ const description = body.slice(titleEnd, descEnd).trim();
53
+ return { title, description };
54
+ }
55
+ /**
56
+ * Check if a comment body is a Warden-generated comment.
57
+ */
58
+ export function isWardenComment(body) {
59
+ return body.includes('<sub>warden:') || body.includes('<!-- warden:v1:');
60
+ }
61
+ /**
62
+ * Parse skill names from a Warden comment's attribution line.
63
+ * Handles both single skill: "<sub>warden: skill-name</sub>"
64
+ * And multiple skills: "<sub>warden: skill1, skill2</sub>"
65
+ */
66
+ export function parseWardenSkills(body) {
67
+ const match = body.match(/<sub>warden:\s*([^<]+)<\/sub>/);
68
+ if (!match || !match[1]) {
69
+ return [];
70
+ }
71
+ return match[1]
72
+ .split(',')
73
+ .map((s) => s.trim())
74
+ .filter(Boolean);
75
+ }
76
+ /**
77
+ * Update a Warden comment body to add a new skill to the attribution.
78
+ * Changes "<sub>warden: skill1</sub>" to "<sub>warden: skill1, skill2</sub>"
79
+ * Returns null if skill is already listed or if no <sub>warden:...</sub> tag exists.
80
+ */
81
+ export function updateWardenCommentBody(body, newSkill) {
82
+ const existingSkills = parseWardenSkills(body);
83
+ // If no existing <sub>warden:...</sub> tag exists, we can't update it
84
+ if (existingSkills.length === 0) {
85
+ return null;
86
+ }
87
+ // Don't update if skill already listed
88
+ if (existingSkills.includes(newSkill)) {
89
+ return null;
90
+ }
91
+ const allSkills = [...existingSkills, newSkill].join(', ');
92
+ // Use a replacer function to avoid special $ character interpretation in skill names
93
+ return body.replace(/<sub>warden:\s*[^<]+<\/sub>/, () => `<sub>warden: ${allSkills}</sub>`);
94
+ }
95
+ const REVIEW_THREADS_QUERY = `
96
+ query($owner: String!, $repo: String!, $prNumber: Int!, $cursor: String) {
97
+ repository(owner: $owner, name: $repo) {
98
+ pullRequest(number: $prNumber) {
99
+ reviewThreads(first: 100, after: $cursor) {
100
+ pageInfo {
101
+ hasNextPage
102
+ endCursor
103
+ }
104
+ nodes {
105
+ id
106
+ isResolved
107
+ comments(first: 1) {
108
+ nodes {
109
+ id
110
+ databaseId
111
+ body
112
+ path
113
+ line
114
+ originalLine
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ `;
123
+ /**
124
+ * Fetch all existing review comments for a PR (both Warden and external).
125
+ * Uses GraphQL to get thread IDs for stale comment resolution and node IDs for reactions.
126
+ */
127
+ export async function fetchExistingComments(octokit, owner, repo, prNumber) {
128
+ const comments = [];
129
+ // Use GraphQL to get thread IDs along with comment data
130
+ let cursor = null;
131
+ let hasNextPage = true;
132
+ while (hasNextPage) {
133
+ const response = await octokit.graphql(REVIEW_THREADS_QUERY, {
134
+ owner,
135
+ repo,
136
+ prNumber,
137
+ cursor,
138
+ });
139
+ const pullRequest = response.repository?.pullRequest;
140
+ if (!pullRequest) {
141
+ // PR doesn't exist or was deleted
142
+ return comments;
143
+ }
144
+ const threads = pullRequest.reviewThreads;
145
+ for (const thread of threads.nodes) {
146
+ // Get the first comment in the thread
147
+ const firstComment = thread.comments.nodes[0];
148
+ if (!firstComment) {
149
+ continue;
150
+ }
151
+ const isWarden = isWardenComment(firstComment.body);
152
+ const marker = isWarden ? parseMarker(firstComment.body) : null;
153
+ const parsed = parseWardenComment(firstComment.body);
154
+ // For Warden comments, we need parsed title/description
155
+ // For external comments, we extract what we can or use body as description
156
+ const title = parsed?.title ?? '';
157
+ const description = parsed?.description ?? firstComment.body.slice(0, 500);
158
+ comments.push({
159
+ id: firstComment.databaseId,
160
+ path: marker?.path ?? firstComment.path,
161
+ line: marker?.line ?? firstComment.line ?? firstComment.originalLine ?? 0,
162
+ title,
163
+ description,
164
+ contentHash: marker?.contentHash ?? generateContentHash(title, description),
165
+ threadId: thread.id,
166
+ isResolved: thread.isResolved,
167
+ isWarden,
168
+ skills: isWarden ? parseWardenSkills(firstComment.body) : undefined,
169
+ body: firstComment.body,
170
+ commentNodeId: firstComment.id,
171
+ });
172
+ }
173
+ hasNextPage = threads.pageInfo.hasNextPage;
174
+ cursor = threads.pageInfo.endCursor;
175
+ }
176
+ return comments;
177
+ }
178
+ /**
179
+ * @deprecated Use fetchExistingComments instead
180
+ */
181
+ export async function fetchExistingWardenComments(octokit, owner, repo, prNumber) {
182
+ const allComments = await fetchExistingComments(octokit, owner, repo, prNumber);
183
+ return allComments.filter((c) => c.isWarden);
184
+ }
185
+ /** Schema for validating LLM deduplication response with matched indices */
186
+ const DuplicateMatchesSchema = z.array(z.object({
187
+ findingIndex: z.number().int(),
188
+ existingIndex: z.number().int(),
189
+ }));
190
+ /**
191
+ * Use LLM to identify which findings are semantic duplicates of existing comments.
192
+ * Returns a Map of finding ID to matched ExistingComment.
193
+ */
194
+ async function findSemanticDuplicates(findings, existingComments, apiKey) {
195
+ if (findings.length === 0 || existingComments.length === 0) {
196
+ return new Map();
197
+ }
198
+ const client = new Anthropic({ apiKey });
199
+ const existingList = existingComments
200
+ .map((c, i) => `${i + 1}. [${c.path}:${c.line}] "${c.title}" - ${c.description}`)
201
+ .join('\n');
202
+ const findingsList = findings
203
+ .map((f, i) => {
204
+ const line = f.location?.endLine ?? f.location?.startLine;
205
+ const loc = f.location ? `${f.location.path}:${line}` : 'general';
206
+ return `${i + 1}. [${loc}] "${f.title}" - ${f.description}`;
207
+ })
208
+ .join('\n');
209
+ const prompt = `Compare these code review findings and identify duplicates.
210
+
211
+ Existing comments:
212
+ ${existingList}
213
+
214
+ New findings:
215
+ ${findingsList}
216
+
217
+ Return a JSON array of objects identifying which findings are DUPLICATES of which existing comments.
218
+ Only mark as duplicate if they describe the SAME issue at the SAME location (within a few lines).
219
+ Different issues at the same location are NOT duplicates.
220
+
221
+ Return ONLY the JSON array in this format:
222
+ [{"findingIndex": 1, "existingIndex": 2}]
223
+ where findingIndex is the 1-based index of the new finding and existingIndex is the 1-based index of the matching existing comment.
224
+ Return [] if none are duplicates.`;
225
+ try {
226
+ const response = await client.messages.create({
227
+ model: 'claude-haiku-4-5',
228
+ max_tokens: 512,
229
+ messages: [{ role: 'user', content: prompt }],
230
+ });
231
+ const content = response.content[0];
232
+ if (!content || content.type !== 'text') {
233
+ throw new Error('Unexpected response type');
234
+ }
235
+ const parsed = DuplicateMatchesSchema.parse(JSON.parse(content.text));
236
+ const matches = new Map();
237
+ for (const match of parsed) {
238
+ const finding = findings[match.findingIndex - 1];
239
+ const existing = existingComments[match.existingIndex - 1];
240
+ if (finding && existing) {
241
+ matches.set(finding.id, existing);
242
+ }
243
+ }
244
+ return matches;
245
+ }
246
+ catch (error) {
247
+ console.warn(`LLM deduplication failed, falling back to hash-only: ${error}`);
248
+ return new Map();
249
+ }
250
+ }
251
+ const ADD_REACTION_MUTATION = `
252
+ mutation($subjectId: ID!, $content: ReactionContent!) {
253
+ addReaction(input: { subjectId: $subjectId, content: $content }) {
254
+ reaction {
255
+ content
256
+ }
257
+ }
258
+ }
259
+ `;
260
+ /**
261
+ * Update an existing Warden PR review comment via REST API.
262
+ */
263
+ export async function updateWardenComment(octokit, owner, repo, commentId, newBody) {
264
+ await octokit.pulls.updateReviewComment({
265
+ owner,
266
+ repo,
267
+ comment_id: commentId,
268
+ body: newBody,
269
+ });
270
+ }
271
+ /**
272
+ * Add a reaction to an existing PR review comment.
273
+ * Uses GraphQL to handle review comments.
274
+ */
275
+ export async function addReactionToComment(octokit, commentNodeId, reaction = 'EYES') {
276
+ await octokit.graphql(ADD_REACTION_MUTATION, {
277
+ subjectId: commentNodeId,
278
+ content: reaction,
279
+ });
280
+ }
281
+ /**
282
+ * Process duplicate actions - update Warden comments and add reactions.
283
+ * Returns counts of actions taken for logging.
284
+ */
285
+ export async function processDuplicateActions(octokit, owner, repo, actions, currentSkill) {
286
+ let updated = 0;
287
+ let reacted = 0;
288
+ let skipped = 0;
289
+ let failed = 0;
290
+ for (const action of actions) {
291
+ try {
292
+ if (action.type === 'update_warden') {
293
+ if (!action.existingComment.body) {
294
+ skipped++;
295
+ continue;
296
+ }
297
+ const newBody = updateWardenCommentBody(action.existingComment.body, currentSkill);
298
+ // Only update if body actually changed (skill wasn't already listed)
299
+ if (newBody) {
300
+ await updateWardenComment(octokit, owner, repo, action.existingComment.id, newBody);
301
+ // Update in-memory body so subsequent triggers see the updated content
302
+ action.existingComment.body = newBody;
303
+ updated++;
304
+ }
305
+ else {
306
+ skipped++;
307
+ }
308
+ }
309
+ else if (action.type === 'react_external') {
310
+ if (!action.existingComment.commentNodeId) {
311
+ skipped++;
312
+ continue;
313
+ }
314
+ await addReactionToComment(octokit, action.existingComment.commentNodeId);
315
+ reacted++;
316
+ }
317
+ }
318
+ catch (error) {
319
+ console.warn(`Failed to process duplicate action for ${action.finding.title}: ${error}`);
320
+ failed++;
321
+ }
322
+ }
323
+ return { updated, reacted, skipped, failed };
324
+ }
325
+ /**
326
+ * Convert a Finding to an ExistingComment for cross-trigger deduplication.
327
+ * Returns null if the finding has no location.
328
+ */
329
+ export function findingToExistingComment(finding, skill) {
330
+ if (!finding.location) {
331
+ return null;
332
+ }
333
+ return {
334
+ id: -1, // Newly posted comments don't have IDs yet
335
+ path: finding.location.path,
336
+ line: finding.location.endLine ?? finding.location.startLine,
337
+ title: finding.title,
338
+ description: finding.description,
339
+ contentHash: generateContentHash(finding.title, finding.description),
340
+ isWarden: true,
341
+ skills: skill ? [skill] : [],
342
+ };
343
+ }
344
+ /**
345
+ * Deduplicate findings against existing comments.
346
+ * Returns non-duplicate findings and actions to take for duplicates.
347
+ *
348
+ * Deduplication is two-pass:
349
+ * 1. Exact content hash match - instant match
350
+ * 2. LLM semantic comparison for remaining findings (if API key provided)
351
+ *
352
+ * For duplicates:
353
+ * - If matching a Warden comment: action to update attribution with new skill
354
+ * - If matching an external comment: action to add reaction
355
+ */
356
+ export async function deduplicateFindings(findings, existingComments, options = {}) {
357
+ if (findings.length === 0 || existingComments.length === 0) {
358
+ return { newFindings: findings, duplicateActions: [] };
359
+ }
360
+ // Build a map of existing comments by location+hash for fast lookup
361
+ const existingByKey = new Map();
362
+ for (const c of existingComments) {
363
+ const key = `${c.path}:${c.line}:${c.contentHash}`;
364
+ existingByKey.set(key, c);
365
+ }
366
+ // First pass: find exact matches (same content at same location)
367
+ const hashDedupedFindings = [];
368
+ const duplicateActions = [];
369
+ for (const finding of findings) {
370
+ const hash = generateContentHash(finding.title, finding.description);
371
+ const line = finding.location?.endLine ?? finding.location?.startLine ?? 0;
372
+ const path = finding.location?.path ?? '';
373
+ const key = `${path}:${line}:${hash}`;
374
+ const matchingComment = existingByKey.get(key);
375
+ if (matchingComment) {
376
+ duplicateActions.push({
377
+ type: matchingComment.isWarden ? 'update_warden' : 'react_external',
378
+ finding,
379
+ existingComment: matchingComment,
380
+ matchType: 'hash',
381
+ });
382
+ }
383
+ else {
384
+ hashDedupedFindings.push(finding);
385
+ }
386
+ }
387
+ if (duplicateActions.length > 0) {
388
+ console.log(`Dedup: ${duplicateActions.length} findings matched by content hash`);
389
+ }
390
+ // If hash-only mode, no API key, or no remaining findings, stop here
391
+ if (options.hashOnly || !options.apiKey || hashDedupedFindings.length === 0) {
392
+ return { newFindings: hashDedupedFindings, duplicateActions };
393
+ }
394
+ // Second pass: LLM semantic comparison for remaining findings
395
+ const semanticMatches = await findSemanticDuplicates(hashDedupedFindings, existingComments, options.apiKey);
396
+ if (semanticMatches.size > 0) {
397
+ console.log(`Dedup: ${semanticMatches.size} findings identified as semantic duplicates by LLM`);
398
+ }
399
+ const newFindings = [];
400
+ for (const finding of hashDedupedFindings) {
401
+ const matchingComment = semanticMatches.get(finding.id);
402
+ if (matchingComment) {
403
+ duplicateActions.push({
404
+ type: matchingComment.isWarden ? 'update_warden' : 'react_external',
405
+ finding,
406
+ existingComment: matchingComment,
407
+ matchType: 'semantic',
408
+ });
409
+ }
410
+ else {
411
+ newFindings.push(finding);
412
+ }
413
+ }
414
+ return { newFindings, duplicateActions };
415
+ }
416
+ //# sourceMappingURL=dedup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/output/dedup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dedup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.test.d.ts","sourceRoot":"","sources":["../../src/output/dedup.test.ts"],"names":[],"mappings":""}