renovate-log-parser 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 (325) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +402 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +30 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/analyze.d.ts +24 -0
  7. package/dist/commands/analyze.js +114 -0
  8. package/dist/commands/analyze.js.map +1 -0
  9. package/dist/commands/detect-errors.d.ts +17 -0
  10. package/dist/commands/detect-errors.js +119 -0
  11. package/dist/commands/detect-errors.js.map +1 -0
  12. package/dist/commands/install-analyze-skill.d.ts +27 -0
  13. package/dist/commands/install-analyze-skill.js +181 -0
  14. package/dist/commands/install-analyze-skill.js.map +1 -0
  15. package/dist/commands/web.d.ts +12 -0
  16. package/dist/commands/web.js +103 -0
  17. package/dist/commands/web.js.map +1 -0
  18. package/dist/core/analyzer.d.ts +89 -0
  19. package/dist/core/analyzer.js +179 -0
  20. package/dist/core/analyzer.js.map +1 -0
  21. package/dist/core/error-detector.d.ts +56 -0
  22. package/dist/core/error-detector.js +236 -0
  23. package/dist/core/error-detector.js.map +1 -0
  24. package/dist/core/filters.d.ts +136 -0
  25. package/dist/core/filters.js +95 -0
  26. package/dist/core/filters.js.map +1 -0
  27. package/dist/core/ignore-file.d.ts +52 -0
  28. package/dist/core/ignore-file.js +104 -0
  29. package/dist/core/ignore-file.js.map +1 -0
  30. package/dist/core/levels.d.ts +33 -0
  31. package/dist/core/levels.js +35 -0
  32. package/dist/core/levels.js.map +1 -0
  33. package/dist/core/parser.d.ts +57 -0
  34. package/dist/core/parser.js +201 -0
  35. package/dist/core/parser.js.map +1 -0
  36. package/dist/core/query-builder.d.ts +47 -0
  37. package/dist/core/query-builder.js +155 -0
  38. package/dist/core/query-builder.js.map +1 -0
  39. package/dist/core/skill-template.d.ts +34 -0
  40. package/dist/core/skill-template.js +259 -0
  41. package/dist/core/skill-template.js.map +1 -0
  42. package/package.json +68 -0
  43. package/web/.output/nitro.json +15 -0
  44. package/web/.output/public/_fonts/57NSSoFy1VLVs2gqly8Ls9awBnZMFyXGrefpmqvdqmc-zJfbBtpgM4cDmcXBsqZNW79_kFnlpPd62b48glgdydA.woff2 +0 -0
  45. package/web/.output/public/_fonts/8VR2wSMN-3U4NbWAVYXlkRV6hA0jFBXP-0RtL3X7fko-x2gYI4qfmkRdxyQQUPaBZdZdgl1TeVrquF_TxHeM4lM.woff2 +0 -0
  46. package/web/.output/public/_fonts/GsKUclqeNLJ96g5AU593ug6yanivOiwjW_7zESNPChw-jHA4tBeM1bjF7LATGUpfBuSTyomIFrWBTzjF7txVYfg.woff2 +0 -0
  47. package/web/.output/public/_fonts/Ld1FnTo3yTIwDyGfTQ5-Fws9AWsCbKfMvgxduXr7JcY-W25bL8NF1fjpLRSOgJb7RoZPHqGQNwMTM7S9tHVoxx8.woff2 +0 -0
  48. package/web/.output/public/_fonts/NdzqRASp2bovDUhQT1IRE_EMqKJ2KYQdTCfFcBvL8yw-KhwZiS86o3fErOe5GGMExHUemmI_dBfaEFxjISZrBd0.woff2 +0 -0
  49. package/web/.output/public/_fonts/iTkrULNFJJkTvihIg1Vqi5IODRH_9btXCioVF5l98I8-AndUyau2HR2felA_ra8V2mutQgschhasE5FD1dXGJX8.woff2 +0 -0
  50. package/web/.output/public/_nuxt/BWja8e3M.js +37 -0
  51. package/web/.output/public/_nuxt/BgApMHS1.js +1 -0
  52. package/web/.output/public/_nuxt/CGPWRqbc.js +1 -0
  53. package/web/.output/public/_nuxt/DlAUqK2U.js +1 -0
  54. package/web/.output/public/_nuxt/Sgtec1U0.js +1 -0
  55. package/web/.output/public/_nuxt/builds/latest.json +1 -0
  56. package/web/.output/public/_nuxt/builds/meta/c4723e49-0623-47af-ae79-9ab6428bdcc1.json +1 -0
  57. package/web/.output/public/_nuxt/entry.9mB-pyEY.css +1 -0
  58. package/web/.output/public/_nuxt/error-404.B_PvSG-P.css +1 -0
  59. package/web/.output/public/_nuxt/error-500.CghkKCEr.css +1 -0
  60. package/web/.output/public/_nuxt/index.BlvAG7F6.css +1 -0
  61. package/web/.output/public/favicon.ico +0 -0
  62. package/web/.output/server/chunks/_/error-500.mjs +19 -0
  63. package/web/.output/server/chunks/_/error-500.mjs.map +1 -0
  64. package/web/.output/server/chunks/_/icons.mjs +6153 -0
  65. package/web/.output/server/chunks/_/icons.mjs.map +1 -0
  66. package/web/.output/server/chunks/_/icons2.mjs +11494 -0
  67. package/web/.output/server/chunks/_/icons2.mjs.map +1 -0
  68. package/web/.output/server/chunks/build/_plugin-vue_export-helper-1tPrXgE0.mjs +10 -0
  69. package/web/.output/server/chunks/build/_plugin-vue_export-helper-1tPrXgE0.mjs.map +1 -0
  70. package/web/.output/server/chunks/build/client.precomputed.mjs +4 -0
  71. package/web/.output/server/chunks/build/client.precomputed.mjs.map +1 -0
  72. package/web/.output/server/chunks/build/error-404-DyaaQUIS.mjs +106 -0
  73. package/web/.output/server/chunks/build/error-404-DyaaQUIS.mjs.map +1 -0
  74. package/web/.output/server/chunks/build/error-404-styles.9cNA4arh.mjs +8 -0
  75. package/web/.output/server/chunks/build/error-404-styles.9cNA4arh.mjs.map +1 -0
  76. package/web/.output/server/chunks/build/error-500-CVSP-p02.mjs +89 -0
  77. package/web/.output/server/chunks/build/error-500-CVSP-p02.mjs.map +1 -0
  78. package/web/.output/server/chunks/build/error-500-styles.BX54ZlkH.mjs +8 -0
  79. package/web/.output/server/chunks/build/error-500-styles.BX54ZlkH.mjs.map +1 -0
  80. package/web/.output/server/chunks/build/index-88dXYOxO.mjs +19675 -0
  81. package/web/.output/server/chunks/build/index-88dXYOxO.mjs.map +1 -0
  82. package/web/.output/server/chunks/build/index-styles.V2iua2bE.mjs +8 -0
  83. package/web/.output/server/chunks/build/index-styles.V2iua2bE.mjs.map +1 -0
  84. package/web/.output/server/chunks/build/server.mjs +7910 -0
  85. package/web/.output/server/chunks/build/server.mjs.map +1 -0
  86. package/web/.output/server/chunks/build/styles.mjs +10 -0
  87. package/web/.output/server/chunks/build/styles.mjs.map +1 -0
  88. package/web/.output/server/chunks/nitro/nitro.mjs +6944 -0
  89. package/web/.output/server/chunks/nitro/nitro.mjs.map +1 -0
  90. package/web/.output/server/chunks/routes/api/fields.get.mjs +27 -0
  91. package/web/.output/server/chunks/routes/api/fields.get.mjs.map +1 -0
  92. package/web/.output/server/chunks/routes/api/findings.get.mjs +30 -0
  93. package/web/.output/server/chunks/routes/api/findings.get.mjs.map +1 -0
  94. package/web/.output/server/chunks/routes/api/log/contents.post.mjs +29 -0
  95. package/web/.output/server/chunks/routes/api/log/contents.post.mjs.map +1 -0
  96. package/web/.output/server/chunks/routes/api/log/path.post.mjs +30 -0
  97. package/web/.output/server/chunks/routes/api/log/path.post.mjs.map +1 -0
  98. package/web/.output/server/chunks/routes/api/repositories.get.mjs +27 -0
  99. package/web/.output/server/chunks/routes/api/repositories.get.mjs.map +1 -0
  100. package/web/.output/server/chunks/routes/api/rows.get.mjs +48 -0
  101. package/web/.output/server/chunks/routes/api/rows.get.mjs.map +1 -0
  102. package/web/.output/server/chunks/routes/renderer.mjs +451 -0
  103. package/web/.output/server/chunks/routes/renderer.mjs.map +1 -0
  104. package/web/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
  105. package/web/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
  106. package/web/.output/server/index.mjs +16 -0
  107. package/web/.output/server/index.mjs.map +1 -0
  108. package/web/.output/server/node_modules/.nitro/hookable@5.5.3/dist/index.mjs +290 -0
  109. package/web/.output/server/node_modules/.nitro/hookable@5.5.3/package.json +49 -0
  110. package/web/.output/server/node_modules/.nitro/hookable@6.1.1/dist/index.mjs +257 -0
  111. package/web/.output/server/node_modules/.nitro/hookable@6.1.1/package.json +53 -0
  112. package/web/.output/server/node_modules/@babel/parser/lib/index.js +14599 -0
  113. package/web/.output/server/node_modules/@babel/parser/package.json +50 -0
  114. package/web/.output/server/node_modules/@floating-ui/core/dist/floating-ui.core.mjs +1038 -0
  115. package/web/.output/server/node_modules/@floating-ui/core/package.json +63 -0
  116. package/web/.output/server/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs +789 -0
  117. package/web/.output/server/node_modules/@floating-ui/dom/package.json +72 -0
  118. package/web/.output/server/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs +165 -0
  119. package/web/.output/server/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs +136 -0
  120. package/web/.output/server/node_modules/@floating-ui/utils/package.json +70 -0
  121. package/web/.output/server/node_modules/@floating-ui/vue/dist/floating-ui.vue.mjs +190 -0
  122. package/web/.output/server/node_modules/@floating-ui/vue/package.json +71 -0
  123. package/web/.output/server/node_modules/@iconify/utils/lib/colors/index.js +295 -0
  124. package/web/.output/server/node_modules/@iconify/utils/lib/colors/keywords.js +701 -0
  125. package/web/.output/server/node_modules/@iconify/utils/lib/css/common.js +75 -0
  126. package/web/.output/server/node_modules/@iconify/utils/lib/css/format.js +39 -0
  127. package/web/.output/server/node_modules/@iconify/utils/lib/css/icon.js +47 -0
  128. package/web/.output/server/node_modules/@iconify/utils/lib/css/icons.js +128 -0
  129. package/web/.output/server/node_modules/@iconify/utils/lib/customisations/bool.js +19 -0
  130. package/web/.output/server/node_modules/@iconify/utils/lib/customisations/defaults.js +13 -0
  131. package/web/.output/server/node_modules/@iconify/utils/lib/customisations/flip.js +17 -0
  132. package/web/.output/server/node_modules/@iconify/utils/lib/customisations/merge.js +16 -0
  133. package/web/.output/server/node_modules/@iconify/utils/lib/customisations/rotate.js +30 -0
  134. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +78 -0
  135. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/convert.js +100 -0
  136. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/data.js +28 -0
  137. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/format.js +58 -0
  138. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/parse.js +48 -0
  139. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +203 -0
  140. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +33 -0
  141. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +132 -0
  142. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +165 -0
  143. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +79 -0
  144. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +92 -0
  145. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +26 -0
  146. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/components.js +76 -0
  147. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +66 -0
  148. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/name.js +45 -0
  149. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +103 -0
  150. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +36 -0
  151. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +92 -0
  152. package/web/.output/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +62 -0
  153. package/web/.output/server/node_modules/@iconify/utils/lib/icon/defaults.js +25 -0
  154. package/web/.output/server/node_modules/@iconify/utils/lib/icon/merge.js +16 -0
  155. package/web/.output/server/node_modules/@iconify/utils/lib/icon/name.js +57 -0
  156. package/web/.output/server/node_modules/@iconify/utils/lib/icon/square.js +33 -0
  157. package/web/.output/server/node_modules/@iconify/utils/lib/icon/transformations.js +12 -0
  158. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +125 -0
  159. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/expand.js +19 -0
  160. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +25 -0
  161. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +36 -0
  162. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/minify.js +91 -0
  163. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/parse.js +46 -0
  164. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/tree.js +23 -0
  165. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +42 -0
  166. package/web/.output/server/node_modules/@iconify/utils/lib/icon-set/validate.js +123 -0
  167. package/web/.output/server/node_modules/@iconify/utils/lib/index.js +52 -0
  168. package/web/.output/server/node_modules/@iconify/utils/lib/loader/custom.js +30 -0
  169. package/web/.output/server/node_modules/@iconify/utils/lib/loader/loader.js +26 -0
  170. package/web/.output/server/node_modules/@iconify/utils/lib/loader/modern.js +27 -0
  171. package/web/.output/server/node_modules/@iconify/utils/lib/loader/utils.js +105 -0
  172. package/web/.output/server/node_modules/@iconify/utils/lib/misc/objects.js +26 -0
  173. package/web/.output/server/node_modules/@iconify/utils/lib/misc/strings.js +26 -0
  174. package/web/.output/server/node_modules/@iconify/utils/lib/misc/title.js +9 -0
  175. package/web/.output/server/node_modules/@iconify/utils/lib/svg/build.js +113 -0
  176. package/web/.output/server/node_modules/@iconify/utils/lib/svg/defs.js +31 -0
  177. package/web/.output/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +13 -0
  178. package/web/.output/server/node_modules/@iconify/utils/lib/svg/html.js +9 -0
  179. package/web/.output/server/node_modules/@iconify/utils/lib/svg/id.js +41 -0
  180. package/web/.output/server/node_modules/@iconify/utils/lib/svg/inner-html.js +22 -0
  181. package/web/.output/server/node_modules/@iconify/utils/lib/svg/parse.js +67 -0
  182. package/web/.output/server/node_modules/@iconify/utils/lib/svg/pretty.js +54 -0
  183. package/web/.output/server/node_modules/@iconify/utils/lib/svg/size.js +27 -0
  184. package/web/.output/server/node_modules/@iconify/utils/lib/svg/trim.js +7 -0
  185. package/web/.output/server/node_modules/@iconify/utils/lib/svg/url.js +22 -0
  186. package/web/.output/server/node_modules/@iconify/utils/lib/svg/viewbox.js +8 -0
  187. package/web/.output/server/node_modules/@iconify/utils/package.json +119 -0
  188. package/web/.output/server/node_modules/@iconify/vue/dist/iconify.mjs +1896 -0
  189. package/web/.output/server/node_modules/@iconify/vue/package.json +62 -0
  190. package/web/.output/server/node_modules/@tanstack/virtual-core/dist/esm/index.js +1268 -0
  191. package/web/.output/server/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js +34 -0
  192. package/web/.output/server/node_modules/@tanstack/virtual-core/dist/esm/utils.js +74 -0
  193. package/web/.output/server/node_modules/@tanstack/virtual-core/package.json +56 -0
  194. package/web/.output/server/node_modules/@tanstack/vue-virtual/dist/esm/index.js +66 -0
  195. package/web/.output/server/node_modules/@tanstack/vue-virtual/package.json +68 -0
  196. package/web/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6759 -0
  197. package/web/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
  198. package/web/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +689 -0
  199. package/web/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
  200. package/web/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1413 -0
  201. package/web/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
  202. package/web/.output/server/node_modules/@vue/devtools-api/dist/index.js +2 -0
  203. package/web/.output/server/node_modules/@vue/devtools-api/package.json +34 -0
  204. package/web/.output/server/node_modules/@vue/devtools-kit/dist/index.js +5670 -0
  205. package/web/.output/server/node_modules/@vue/devtools-kit/node_modules/hookable/dist/index.mjs +290 -0
  206. package/web/.output/server/node_modules/@vue/devtools-kit/node_modules/hookable/package.json +49 -0
  207. package/web/.output/server/node_modules/@vue/devtools-kit/package.json +44 -0
  208. package/web/.output/server/node_modules/@vue/devtools-shared/dist/index.js +239 -0
  209. package/web/.output/server/node_modules/@vue/devtools-shared/package.json +33 -0
  210. package/web/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1899 -0
  211. package/web/.output/server/node_modules/@vue/reactivity/package.json +55 -0
  212. package/web/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6940 -0
  213. package/web/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
  214. package/web/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1822 -0
  215. package/web/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
  216. package/web/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +896 -0
  217. package/web/.output/server/node_modules/@vue/server-renderer/package.json +55 -0
  218. package/web/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +604 -0
  219. package/web/.output/server/node_modules/@vue/shared/package.json +47 -0
  220. package/web/.output/server/node_modules/@vueuse/core/dist/index.js +8464 -0
  221. package/web/.output/server/node_modules/@vueuse/core/package.json +49 -0
  222. package/web/.output/server/node_modules/@vueuse/shared/dist/index.js +2013 -0
  223. package/web/.output/server/node_modules/@vueuse/shared/package.json +42 -0
  224. package/web/.output/server/node_modules/aria-hidden/dist/es5/index.js +174 -0
  225. package/web/.output/server/node_modules/aria-hidden/package.json +71 -0
  226. package/web/.output/server/node_modules/birpc/dist/index.mjs +291 -0
  227. package/web/.output/server/node_modules/birpc/package.json +57 -0
  228. package/web/.output/server/node_modules/consola/dist/chunks/prompt.mjs +280 -0
  229. package/web/.output/server/node_modules/consola/dist/core.mjs +512 -0
  230. package/web/.output/server/node_modules/consola/dist/index.mjs +651 -0
  231. package/web/.output/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
  232. package/web/.output/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
  233. package/web/.output/server/node_modules/consola/package.json +136 -0
  234. package/web/.output/server/node_modules/devalue/index.js +4 -0
  235. package/web/.output/server/node_modules/devalue/package.json +40 -0
  236. package/web/.output/server/node_modules/devalue/src/base64.js +60 -0
  237. package/web/.output/server/node_modules/devalue/src/constants.js +12 -0
  238. package/web/.output/server/node_modules/devalue/src/parse.js +283 -0
  239. package/web/.output/server/node_modules/devalue/src/stringify.js +401 -0
  240. package/web/.output/server/node_modules/devalue/src/uneval.js +552 -0
  241. package/web/.output/server/node_modules/devalue/src/utils.js +160 -0
  242. package/web/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  243. package/web/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
  244. package/web/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
  245. package/web/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
  246. package/web/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
  247. package/web/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
  248. package/web/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
  249. package/web/.output/server/node_modules/entities/package.json +120 -0
  250. package/web/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
  251. package/web/.output/server/node_modules/estree-walker/package.json +37 -0
  252. package/web/.output/server/node_modules/hookable/dist/index.mjs +257 -0
  253. package/web/.output/server/node_modules/hookable/package.json +53 -0
  254. package/web/.output/server/node_modules/nostics/dist/index.mjs +179 -0
  255. package/web/.output/server/node_modules/nostics/package.json +124 -0
  256. package/web/.output/server/node_modules/perfect-debounce/dist/index.mjs +89 -0
  257. package/web/.output/server/node_modules/perfect-debounce/package.json +41 -0
  258. package/web/.output/server/node_modules/rou3/dist/index.mjs +501 -0
  259. package/web/.output/server/node_modules/rou3/package.json +48 -0
  260. package/web/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
  261. package/web/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
  262. package/web/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
  263. package/web/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
  264. package/web/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
  265. package/web/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
  266. package/web/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
  267. package/web/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
  268. package/web/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
  269. package/web/.output/server/node_modules/source-map-js/lib/util.js +594 -0
  270. package/web/.output/server/node_modules/source-map-js/package.json +71 -0
  271. package/web/.output/server/node_modules/source-map-js/source-map.js +8 -0
  272. package/web/.output/server/node_modules/srvx/dist/_chunks/_body-limit.mjs +39 -0
  273. package/web/.output/server/node_modules/srvx/dist/_chunks/_plugins.mjs +56 -0
  274. package/web/.output/server/node_modules/srvx/dist/_chunks/_trust-proxy.mjs +58 -0
  275. package/web/.output/server/node_modules/srvx/dist/_chunks/_url.mjs +134 -0
  276. package/web/.output/server/node_modules/srvx/dist/_chunks/_utils.mjs +15 -0
  277. package/web/.output/server/node_modules/srvx/dist/_chunks/_utils2.mjs +75 -0
  278. package/web/.output/server/node_modules/srvx/dist/adapters/node.mjs +976 -0
  279. package/web/.output/server/node_modules/srvx/package.json +102 -0
  280. package/web/.output/server/node_modules/tailwind-merge/dist/bundle-mjs.mjs +3365 -0
  281. package/web/.output/server/node_modules/tailwind-merge/package.json +93 -0
  282. package/web/.output/server/node_modules/tailwind-variants/dist/chunk-LQJYWU4O.js +112 -0
  283. package/web/.output/server/node_modules/tailwind-variants/dist/chunk-RZF76H2U.js +269 -0
  284. package/web/.output/server/node_modules/tailwind-variants/dist/index.js +38 -0
  285. package/web/.output/server/node_modules/tailwind-variants/package.json +122 -0
  286. package/web/.output/server/node_modules/tailwindcss/dist/chunk-X4GG3EDV.mjs +1 -0
  287. package/web/.output/server/node_modules/tailwindcss/dist/colors.mjs +1 -0
  288. package/web/.output/server/node_modules/tailwindcss/package.json +89 -0
  289. package/web/.output/server/node_modules/ufo/dist/index.mjs +645 -0
  290. package/web/.output/server/node_modules/ufo/package.json +48 -0
  291. package/web/.output/server/node_modules/unhead/dist/index.mjs +9 -0
  292. package/web/.output/server/node_modules/unhead/dist/parser.mjs +508 -0
  293. package/web/.output/server/node_modules/unhead/dist/plugins.mjs +101 -0
  294. package/web/.output/server/node_modules/unhead/dist/scripts.mjs +30 -0
  295. package/web/.output/server/node_modules/unhead/dist/server.mjs +180 -0
  296. package/web/.output/server/node_modules/unhead/dist/shared/unhead.B3VbJo7Y.mjs +207 -0
  297. package/web/.output/server/node_modules/unhead/dist/shared/unhead.BYvz9V1x.mjs +43 -0
  298. package/web/.output/server/node_modules/unhead/dist/shared/unhead.BnoAbrHA.mjs +269 -0
  299. package/web/.output/server/node_modules/unhead/dist/shared/unhead.CaI5ZD4O.mjs +182 -0
  300. package/web/.output/server/node_modules/unhead/dist/shared/unhead.CbpEuj3y.mjs +71 -0
  301. package/web/.output/server/node_modules/unhead/dist/shared/unhead.D4vSFytZ.mjs +236 -0
  302. package/web/.output/server/node_modules/unhead/dist/shared/unhead.DQc16pHI.mjs +196 -0
  303. package/web/.output/server/node_modules/unhead/dist/shared/unhead.Dh1cQCTe.mjs +44 -0
  304. package/web/.output/server/node_modules/unhead/dist/shared/unhead.TxTMM7cM.mjs +166 -0
  305. package/web/.output/server/node_modules/unhead/dist/shared/unhead.yem5I2v_.mjs +38 -0
  306. package/web/.output/server/node_modules/unhead/dist/utils.mjs +5 -0
  307. package/web/.output/server/node_modules/unhead/node_modules/hookable/dist/index.mjs +257 -0
  308. package/web/.output/server/node_modules/unhead/node_modules/hookable/package.json +53 -0
  309. package/web/.output/server/node_modules/unhead/package.json +105 -0
  310. package/web/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
  311. package/web/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
  312. package/web/.output/server/node_modules/vue/index.js +7 -0
  313. package/web/.output/server/node_modules/vue/index.mjs +1 -0
  314. package/web/.output/server/node_modules/vue/package.json +112 -0
  315. package/web/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
  316. package/web/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +249 -0
  317. package/web/.output/server/node_modules/vue-bundle-renderer/package.json +57 -0
  318. package/web/.output/server/node_modules/vue-demi/lib/index.mjs +34 -0
  319. package/web/.output/server/node_modules/vue-demi/package.json +47 -0
  320. package/web/.output/server/node_modules/vue-router/dist/devtools-Bpr7ZAVB.js +1056 -0
  321. package/web/.output/server/node_modules/vue-router/dist/useApi-CROJJdhE.js +436 -0
  322. package/web/.output/server/node_modules/vue-router/dist/vue-router.js +1543 -0
  323. package/web/.output/server/node_modules/vue-router/package.json +214 -0
  324. package/web/.output/server/node_modules/vue-router/vue-router.node.mjs +2 -0
  325. package/web/.output/server/package.json +51 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Marius Shekow
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,402 @@
1
+ # renovate-log-parser
2
+
3
+ `renovate-log-parser` is a CLI and web interface for manual and automated analyses of Renovate Bot debug logs (JSONL-formatted), which you get by either downloading a run's log from [https://developer.mend.io](https://developer.mend.io) (if you use Mend's _hosted_ GitHub app), or by setting the `LOG_FILE` environment variable for self-hosted Renovate.
4
+
5
+ `renovate-log-parser` offers the following commands:
6
+
7
+ - `detect-errors` is meant for CI pipelines; it scans the log for build-breaking problems and warnings and exits with error, helping you detect and solve hidden Renovate issues you would otherwise miss
8
+ - `analyze` (with a corresponding SKILL.md) tells your coding agent (Codex, Copilot, Claude Code, etc.) about the log's structure, allowing it to efficiently read only the most relevant log lines in a token-efficient way, so that it can quickly (and cheaply) diagnose Renovate problems
9
+ - `web` starts a temporary local web server that parses the log and serves a browser-based interface that you use to analyze and filter Renovate logs of _any_ length; this solves the problem of tedious, manual “grep”-like analyses where your text editor chokes on too large files
10
+
11
+ ## Background (why do I need this)
12
+
13
+ This tool was born out of the need to solve various problems, such as:
14
+
15
+ - Setting up Renovate in a project with many repositories (and development teams) is easy. But over time, subtle problems creep in that no one seems to notice. For instance, Renovate might stop creating PRs for intricate reasons, and it only posts a small notice-block about this problem to the _Dependency dashboard_ GitHub issue. Unfortunately, the development teams use _Jira_ for issues and never look at GitHub issues, so the problems remain unnoticed.
16
+ - In practice, developers sometimes have problems with Renovate Bot. They wonder why Renovate does not do certain things (even though they think it should), or they are annoyed that Renovate does certain things they don't want it to do. Manual analysis (given the huge debug-level log) is very difficult for non-experts, as important information is often buried in _debug_\-level log lines rather than warning- or error-level log lines. And AI agents miss important information in large log files, or spend enormous amounts of tokens for the analysis. As a consequence, people tend to accept a sub-optimal Renovate configuration or become frustrated with Renovate in general.
17
+
18
+ Consequently, a tool was needed that detects such subtle problems automatically, and that simplifies manual and AI-assisted analyses of Renovate log files.
19
+
20
+ ## Usage
21
+
22
+ Run directly with `npx` (no install required):
23
+
24
+ ```bash
25
+ # Detect build-breaking problems in a Renovate JSONL log (CI-friendly)
26
+ npx renovate-log-parser detect-errors path/to/renovate.jsonl
27
+
28
+ # Also write a machine-readable JSON report
29
+ npx renovate-log-parser detect-errors path/to/renovate.jsonl --out report.json
30
+
31
+ # Emit token-efficient stats for an AI coding agent
32
+ npx renovate-log-parser analyze path/to/renovate.jsonl
33
+
34
+ # Explore a log interactively in the Nuxt-based web UI
35
+ npx renovate-log-parser web path/to/renovate.jsonl
36
+ ```
37
+
38
+ Or install globally:
39
+
40
+ ```bash
41
+ npm install -g renovate-log-parser
42
+ renovate-log-parser --help
43
+ ```
44
+
45
+ ## Commands
46
+
47
+ ### `detect-errors <path>`
48
+
49
+ Deterministically scans a Renovate debug log (JSONL) for build-breaking
50
+ problems and warnings — designed to gate CI. It prints a human-readable summary
51
+ to stdout and, with `--out`, writes a stable machine-readable JSON report.
52
+
53
+ ```bash
54
+ renovate-log-parser detect-errors renovate.jsonl [--out report.json] \
55
+ [--ignore-file rules.json] [--fail-on-warn]
56
+ ```
57
+
58
+ | Arg / option | Default | Description |
59
+ | ---------------- | ----------------------------------- | ------------------------------------------------- |
60
+ | `<path>` | **required** | Path to the Renovate JSONL log |
61
+ | `--out` | (none) | Also write the machine-readable JSON report here |
62
+ | `--ignore-file` | `./renovate-log-parser.ignore.json` | Ignore-rules file (a missing file means no rules) |
63
+ | `--fail-on-warn` | `false` | Make warning findings affect the exit code |
64
+
65
+ **Exit codes:**
66
+
67
+ - `0` = no non-ignored errors
68
+ - `1` = ≥1 non-ignored error (or, with `--fail-on-warn`, ≥1 non-ignored warning)
69
+ - `2` = tool/usage error (bad path, unreadable, bad args, malformed ignore file)
70
+
71
+ **Detected categories**:
72
+
73
+ - **Errors** (things Renovate would _not_ otherwise flag in a PR comment):
74
+ - `host-error-abort`: when Renovate skipped creating/updating PRs for a repository because one or more well-known registries were unreachable; looks for a `Repository finished` entry with `result: "external-host-error"`
75
+ - `log-error`: lines with error level (level=50)
76
+ - `log-fatal`: lines with fatal level (level=60)
77
+ - `config-migration`: when a repository needs a renovate.json migration; looks for a `Config migration necessary` entry carrying `oldConfig` + `newConfig`
78
+ - `abandoned-package`: when a repository contains one or more abandoned packages for which Renovate would not create a PR; reports one finding per package in an `Abandoned package statistics` entry
79
+ - **Warnings**:
80
+ - `log-warn`: lines with warning level (level=40)
81
+ - `err-object`: reports lines with an `err` object, such as rawExec errors
82
+ - `repo-problem`: reports entries in `repoProblems` lines (which is a string-array)
83
+
84
+ The JSON report's `counts` map always lists every category (zeros included) for stable run-over-run diffing in CI.
85
+
86
+ **Ignore file** — silence expected findings with stable keys (line numbers shift
87
+ as logs grow). A finding is ignored iff an active rule matches on `category` AND
88
+ (optional `message` glob) AND (optional exact `repository`). Rules past their
89
+ optional `expires` date are reported to stderr and skipped:
90
+
91
+ ```jsonc
92
+ {
93
+ "version": 1,
94
+ "rules": [
95
+ {
96
+ "category": "err-object",
97
+ "message": "*lock file error*", // optional glob (* and ?)
98
+ "repository": "owner/repo", // optional exact match
99
+ "reason": "flaky nuget restore, JIRA-123", // optional, for humans
100
+ "expires": "2026-09-01", // optional ISO date; past => inactive + warn
101
+ },
102
+ ],
103
+ }
104
+ ```
105
+
106
+ Ignored findings still appear in the report with `"ignored": true`, but are
107
+ excluded from the summary counts and the exit code.
108
+
109
+ ### `analyze <path>`
110
+
111
+ Emits token-efficient structure for an AI coding agent (or a human). Without
112
+ `--print` it writes compact single-line JSON whole-log **stats** to stdout; with `--print` it
113
+ streams a filtered, line-ranged, limited **JSONL** slice of the log (one entry
114
+ per line). The intended loop is: read the stats, pick the interesting line
115
+ range, then `--print` just that range — reading only what you need.
116
+
117
+ ```bash
118
+ # Whole-log stats: level counts + per-repository structure
119
+ renovate-log-parser analyze renovate.jsonl
120
+
121
+ # Print lines 500–560, keeping only npm-manager entries, first 20
122
+ renovate-log-parser analyze renovate.jsonl --print \
123
+ --line-from 500 --line-to 560 --filter manager:npm --limit 20
124
+
125
+ # Print every entry whose msg starts with "Found match at" (case-insensitive)
126
+ renovate-log-parser analyze renovate.jsonl --print \
127
+ --filter-with-wildcard "msg:Found match at*"
128
+ ```
129
+
130
+ | Arg / option | Default | Description |
131
+ | --------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------- |
132
+ | `<path>` | **required** | Path to the Renovate JSONL log |
133
+ | `--print` | `false` | Print matching log lines (JSONL) instead of stats |
134
+ | `--ignored-fields` | `v,time,logContext,pid,hostname,name` | CSV of root keys to strip in print mode (`msg` kept) |
135
+ | `--line-from` / `--line-to` | (none) | Inclusive 0-indexed line range (print mode) |
136
+ | `--limit` | `50` | Max lines to print (print mode) |
137
+ | `--filter` | (none) | `key:val` scalar-**equals** filter, repeatable, AND'd |
138
+ | `--filter-with-wildcard` | (none) | `key:pattern` wildcard filter (`*` = any run), case-insensitive, repeatable, AND'd |
139
+ | `--include-original-line` | `false` | Add `_oL` (0-indexed source line) to each object |
140
+
141
+ **Stats mode** reports `levelCounts` (entries per numeric level) and a `repos`
142
+ array — each repository's line span, unique branches, the rowids of its
143
+ `branches info extended` and `packageFiles with updates` entries, its
144
+ `repoProblems`, and its dependency inventory (`depNames`/`packageNames`, unioning
145
+ root-level keys with the `packageFiles with updates` config).
146
+
147
+ **Print mode** selects rows in order line-range -> filters -> `--limit` (first N
148
+ by line order). Output is JSONL on stdout with the ignored root fields stripped
149
+ (`msg` is never stripped); when the limit caps the result, a truncation notice is
150
+ written to **stderr** so stdout stays a clean, pipeable stream.
151
+
152
+ Both filter flags target a single root-level key and can be repeated (all
153
+ conditions are AND'd, alongside any line range). `--filter` matches the value
154
+ **exactly**; its value is auto-typed so it compares against the correctly-typed
155
+ JSON — `true`/`false` become booleans and plain numbers become numbers (so
156
+ `level:30` matches the numeric `level`), while everything else (including
157
+ leading-zero or dotted values like `007` / `1.2.3`) stays a string.
158
+ `--filter-with-wildcard` treats `*` as "any run of characters" (nothing else is
159
+ special — `?` and `%` are literal) and matches case-insensitively. A pattern is
160
+ anchored as written, so use a leading/trailing `*` for prefix/suffix/contains
161
+ matching (e.g. `msg:*lock file*`).
162
+
163
+ **Exit codes:** `0` = success · `2` = tool/usage error (bad path, unreadable, bad
164
+ filter token).
165
+
166
+ ### `install-analyze-skill`
167
+
168
+ Writes (or updates) a `renovate-log-analyzer` **SKILL.md** that teaches an AI
169
+ coding agent (Codex, Copilot, Claude Code, …) how to drive the `analyze` command
170
+ token-efficiently. It can optionally embed instructions for fetching the
171
+ log from GitHub self-hosted Renovate workflows via the `gh` CLI.
172
+
173
+ The command is interactive by default: it asks whether to install the skill
174
+ **locally** or **globally**, and whether to include the GitHub-fetch section
175
+ (and if so, the base URL, organization, repository, and Renovate workflow
176
+ filename). All answers can also be supplied as flags to run non-interactively
177
+ (e.g. in CI); any flag you pass skips its prompt.
178
+
179
+ ```bash
180
+ # Interactive
181
+ npx renovate-log-parser install-analyze-skill
182
+
183
+ # Non-interactive, local, with a GitHub Enterprise fetch section
184
+ npx renovate-log-parser install-analyze-skill --scope local --with-gh \
185
+ --gh-base-url github.example.com \
186
+ --gh-org acme --gh-repo app --gh-workflow renovate.yml
187
+ ```
188
+
189
+ The skill is written to
190
+ `<root>/.agents/skills/renovate-log-analyzer/SKILL.md`, where `<root>` is the
191
+ current working directory (`local`) or your home directory (`global`).
192
+
193
+ | Arg / option | Default | Description |
194
+ | --------------- | -------------- | ---------------------------------------------------------------------- |
195
+ | `--scope` | (prompt) | `local` (`<cwd>/.agents/skills`) or `global` (`~/.agents/skills`) |
196
+ | `--with-gh` | (prompt) | Include a "fetch logs from GitHub via `gh`" section |
197
+ | `--gh-base-url` | (prompt if gh) | GitHub Enterprise host (e.g. `github.example.com`); blank = github.com |
198
+ | `--gh-org` | (prompt if gh) | GitHub organization/owner |
199
+ | `--gh-repo` | (prompt if gh) | Repository name |
200
+ | `--gh-workflow` | (prompt if gh) | Filename of the workflow that runs Renovate (e.g. `renovate.yml`) |
201
+ | `--yes` | `false` | Skip all prompts; fail if a required answer is missing |
202
+
203
+ **Exit codes:** `0` = success · `2` = tool/usage error (missing required answer
204
+ when non-interactive, or a write failure).
205
+
206
+ ### `web`
207
+
208
+ Starts the bundled [Nuxt](https://nuxt.com) web UI (with [Nuxt UI](https://ui.nuxt.com)
209
+ and Nuxt's built-in Nitro server) for interactive, filtered log exploration. Pass
210
+ an optional log path to open it automatically; otherwise use the in-app file
211
+ picker. The server keeps the parsed log in memory (SQLite-backed) and streams
212
+ paged rows to the client.
213
+
214
+ | Arg / option | Default | Description |
215
+ | ------------ | ----------- | -------------------------------------------------- |
216
+ | `[path]` | (none) | Renovate JSONL log to open automatically in the UI |
217
+ | `--port` | `3000` | Port to listen on |
218
+ | `--host` | `localhost` | Host to bind to |
219
+ | `--open` | `true` | Open the web UI in your browser |
220
+
221
+ ```bash
222
+ # Open the UI on a specific log
223
+ renovate-log-parser web path/to/renovate.jsonl
224
+
225
+ # Just start the server (pick a file from inside the UI)
226
+ renovate-log-parser web --port 4000 --no-open
227
+ ```
228
+
229
+ **The viewer** renders every log line in a virtualized, fixed-height list — a
230
+ colored level glyph (`T/D/I/W/E/F`) plus the entry's `msg`.
231
+ Clicking a row's arrow opens a details slide-over with a recursive,
232
+ collapsible JSON tree of the full entry.
233
+
234
+ **Filtering** (all AND'd, debounced):
235
+
236
+ - **Log levels** — a dropdown to show/hide entries by level.
237
+ - **Repositories** — include/exclude by repository, plus a
238
+ "Repository-independent" pseudo-group for entries with no `repository`.
239
+ - **Ignored fields** — hide noisy root keys from the row list (`msg` is always
240
+ kept).
241
+ - **Free-text search** — a field selector whose first entry, **Raw search**,
242
+ matches the whole line (any key or value); any other field does a
243
+ case-insensitive `*`-wildcard match scoped to that field.
244
+ - **Pills** — dynamic, individually toggleable/removable filters created from row
245
+ and JSON-tree context menus (e.g. show-only/hide a `field`, or a
246
+ `field == value`; nested keys create a scoped "contains" search on their
247
+ top-level ancestor).
248
+
249
+ ## Development
250
+
251
+ This repository is an npm workspace: the publishable CLI lives at the root and
252
+ the Nuxt app lives in [`web/`](./web).
253
+
254
+ ```bash
255
+ # Install all workspace dependencies
256
+ npm install
257
+
258
+ # Run the CLI from source (no build step) via tsx
259
+ npm run dev:cli -- detect-errors path/to/renovate.jsonl
260
+ npm run dev:cli -- web
261
+
262
+ # Run the Nuxt app in dev mode (HMR) directly
263
+ npm run dev:web
264
+
265
+ # Build everything (Nuxt .output + compiled CLI)
266
+ npm run build
267
+
268
+ # Run the compiled CLI
269
+ node dist/cli.js --help
270
+ ```
271
+
272
+ ### Testing
273
+
274
+ ```bash
275
+ npm test # Unit + fixture tests (fast; no build, no network)
276
+ npm run test:fixtures # Only the fixture tests
277
+ npm run test:e2e # Packaging E2E tests (slow: builds, packs, installs)
278
+
279
+ # One-off, needed by the browser tests inside the E2E suite:
280
+ npx playwright-core install chromium
281
+ ```
282
+
283
+ Three suites, each catching a different failure class:
284
+
285
+ - **Unit tests** (`src/core/__tests__/*.test.ts`) — synthetic, hand-written
286
+ JSONL logs asserting the detection contracts in isolation.
287
+ - **Fixture tests** (`src/core/__tests__/fixtures.test.ts`) — the full
288
+ Parser → ErrorDetector/Analyzer pipeline run over _real_ Renovate logs
289
+ captured against
290
+ [`MShekow/renovate-log-parser-test`](https://github.com/MShekow/renovate-log-parser-test)
291
+ and committed under `src/core/__tests__/fixtures/`:
292
+
293
+ | Fixture | What it demonstrates |
294
+ | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
295
+ | `external-host-error.jsonl` | NPM registry blocked → the run aborts with `result: "external-host-error"` |
296
+ | `various-issues.jsonl` | Abandoned packages, a required config migration, and an npm `lock file error` whose `err.stderr` reports a `Conflicting peer dependency` |
297
+ | `failed-dotnet-install.jsonl` | `builds.dotnet.microsoft.com` blocked → `Datasource connection error` (`DEPTH_ZERO_SELF_SIGNED_CERT`) and `Failed to generate lock file` / "No tool releases found." |
298
+
299
+ The assertions are deliberately _semantic_ rather than snapshot-based, since a
300
+ Renovate log is full of volatile data (timestamps, pid, hostname, logContext,
301
+ dependency versions). They assert only the signals each scenario was captured
302
+ to demonstrate.
303
+
304
+ - **Packaging E2E tests** (`e2e/pack-install.e2e.ts`) — build, `npm pack`,
305
+ install the tarball into an empty throwaway project, then drive the installed
306
+ `renovate-log-parser` binary against a fixture. This is the only suite that
307
+ can catch a missing `package.json#files` entry, a dropped Nuxt `.output`
308
+ symlink, or a `dist/` import that only resolved because `src/` sat next to it.
309
+ Set `SKIP_E2E=1` to skip.
310
+
311
+ Its nested `web UI` block starts the installed `web` command and drives the
312
+ real UI in a headless Chromium, using the `playwright-core` _library_ — there
313
+ is no second test runner or config file, these are plain `node:test` cases in
314
+ the same file. Because they run against the installed tarball, they assert
315
+ that the shipped Nuxt bundle actually boots and serves, not merely that its
316
+ files are present. Chromium must be installed once with
317
+ `npx playwright-core install chromium`; when a browser test fails, a
318
+ screenshot, an HTML dump and the captured console/server output are written to
319
+ `e2e-artifacts/` (CI uploads them as a build artifact).
320
+
321
+ ### Regenerating the log fixtures
322
+
323
+ The [`compose.yml`](./compose.yml) stack runs Renovate against the test
324
+ repository, with an NGINX "firewall" that Docker DNS points selected hostnames
325
+ at, so outbound access to them fails exactly as it would behind a corporate
326
+ proxy. The base file blocks nothing; each scenario layers on an override that
327
+ adds the hostnames it needs to block:
328
+
329
+ ```bash
330
+ # Requires a .env with GITHUB_PAT (+ optionally LOCAL_UID / LOCAL_GID)
331
+ docker compose -f compose.yml up -d # various-issues
332
+ docker compose -f compose.yml -f compose.external-host-error.yml up -d # external-host-error
333
+ docker compose -f compose.yml -f compose.failed-dotnet-install.yml up -d # failed-dotnet-install
334
+
335
+ docker compose ... wait renovate # block until Renovate exits
336
+ cp container-out-logs/out.log src/core/__tests__/fixtures/<scenario>.jsonl
337
+ docker compose ... down -v # discard the generated certificate
338
+ ```
339
+
340
+ Renovate must start from a _pristine_ repository — leftover `renovate/*`
341
+ branches make it take a different code path ("Branch already exists") and skip
342
+ the very work the fixture captures. Close and delete them first.
343
+
344
+ [`.github/workflows/verify-fixtures.yml`](./.github/workflows/verify-fixtures.yml)
345
+ automates all of this weekly (and on demand): one job per scenario, run strictly
346
+ in sequence since they share one test repository, each starting by wiping every
347
+ Renovate PR and branch. It overwrites the committed fixture with the freshly
348
+ generated log and re-runs the fixture tests against it — so a Renovate release
349
+ that renames a message or drops a field turns the workflow red. Nothing is
350
+ committed back; the regenerated log is uploaded as an artifact so the fixture
351
+ can be updated deliberately. The workflow needs a `TEST_REPO_PAT` secret (a
352
+ fine-grained PAT with contents + pull-request write access to the test repo).
353
+
354
+ ### Linting & formatting
355
+
356
+ [ESLint](https://eslint.org) (flat config) and [Prettier](https://prettier.io) are set up at the workspace root.
357
+
358
+ ```bash
359
+ npm run lint # ESLint for src/ (type-aware) + web/ (Nuxt rules)
360
+ npm run format # Prettier write pass over all non-ignored files
361
+ npm run format:check # Prettier check (no writes — useful in CI)
362
+ ```
363
+
364
+ - **Root (`src/`)** — [`eslint.config.mjs`](./eslint.config.mjs) uses `typescript-eslint` `recommendedTypeChecked` rules against `src/**/*.ts`, with `eslint-config-prettier` appended to disable any rules that conflict with Prettier. Prettier itself runs with its defaults (semicolons, double quotes, trailing commas).
365
+ - **Web (`web/`)** — [`web/eslint.config.mjs`](./web/eslint.config.mjs) delegates to the auto-generated `@nuxt/eslint` config, which covers Vue, TypeScript, and Nuxt-specific rules. The `web/` directory is excluded from the root ESLint and Prettier configs so the two setups stay independent.
366
+
367
+ ### How it's built
368
+
369
+ - **CLI** — TypeScript compiled with `tsc` to ESM in `dist/`. Uses
370
+ [`yargs`](https://yargs.js.org) for command parsing. `yargs` is the only
371
+ runtime dependency.
372
+ - **Web** — a Nuxt UI app built with `nuxt build`. It shares the CLI's parsing
373
+ and filtering logic from `src/core/` (aliased into the bundle as
374
+ `renovate-core`), so the browser and the CLI query the same SQLite-backed
375
+ model. The `web` command runs the self-contained Nitro server
376
+ (`web/.output/server/index.mjs`) as a child process; when given a log path it
377
+ hands it off to the UI via a `?log=` query parameter.
378
+
379
+ ### What gets published
380
+
381
+ Two `package.json` mechanisms cooperate so that both build outputs ship to npm:
382
+
383
+ - **`files: ["dist", "web/.output"]`** — an allow-list of what goes into the
384
+ published tarball. npm always adds `package.json`, `README`, `LICENSE`, and the
385
+ `bin` target, then includes everything matched here — both directories,
386
+ recursively. This list takes precedence over `.gitignore`, which is why
387
+ `web/.output/` (gitignored as a build artifact) is still published.
388
+ - **`prepublishOnly: "npm run build"`** — a lifecycle hook npm runs automatically
389
+ before packing on `npm publish`. It builds the Nuxt `.output` and compiles the
390
+ CLI `dist`, so both directories exist and are current by the time the `files`
391
+ allow-list is evaluated.
392
+
393
+ ```
394
+ npm publish
395
+ └─ prepublishOnly → npm run build → build:web (nuxt build → web/.output/)
396
+ → build:cli (tsc → dist/)
397
+ └─ pack tarball using `files`: dist/ + web/.output/ (+ package.json, README, LICENSE)
398
+ └─ upload to registry
399
+ ```
400
+
401
+ The result is a lean, self-contained package (no source or `node_modules` leak).
402
+ Verify locally with `npm pack --dry-run`.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import yargs from "yargs";
3
+ import { hideBin } from "yargs/helpers";
4
+ import { detectErrorsCommand } from "./commands/detect-errors.js";
5
+ import { analyzeCommand } from "./commands/analyze.js";
6
+ import { webCommand } from "./commands/web.js";
7
+ import { installAnalyzeSkillCommand } from "./commands/install-analyze-skill.js";
8
+ await yargs(hideBin(process.argv))
9
+ .scriptName("renovate-log-parser")
10
+ .usage("$0 <command> [options]")
11
+ .command(detectErrorsCommand)
12
+ .command(analyzeCommand)
13
+ .command(webCommand)
14
+ .command(installAnalyzeSkillCommand)
15
+ .demandCommand(1, "You need to specify a command. Try --help.")
16
+ .strict()
17
+ .alias("h", "help")
18
+ .alias("v", "version")
19
+ .fail((msg, err) => {
20
+ // Genuine thrown errors propagate; usage/validation failures exit with the
21
+ // tool/usage exit code (2).
22
+ if (err)
23
+ throw err;
24
+ console.error(msg);
25
+ console.error("\nRun with --help for usage.");
26
+ process.exit(2);
27
+ })
28
+ .help()
29
+ .parseAsync();
30
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/B,UAAU,CAAC,qBAAqB,CAAC;KACjC,KAAK,CAAC,wBAAwB,CAAC;KAC/B,OAAO,CAAC,mBAAmB,CAAC;KAC5B,OAAO,CAAC,cAAc,CAAC;KACvB,OAAO,CAAC,UAAU,CAAC;KACnB,OAAO,CAAC,0BAA0B,CAAC;KACnC,aAAa,CAAC,CAAC,EAAE,4CAA4C,CAAC;KAC9D,MAAM,EAAE;KACR,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;KAClB,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;KACrB,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjB,2EAA2E;IAC3E,4BAA4B;IAC5B,IAAI,GAAG;QAAE,MAAM,GAAG,CAAC;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,IAAI,EAAE;KACN,UAAU,EAAE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { CommandModule } from "yargs";
2
+ interface AnalyzeArgs {
3
+ path: string;
4
+ print: boolean;
5
+ "ignored-fields": string;
6
+ "line-from"?: number;
7
+ "line-to"?: number;
8
+ limit: number;
9
+ filter?: string[];
10
+ "filter-with-wildcard"?: string[];
11
+ "include-original-line": boolean;
12
+ }
13
+ /**
14
+ * `analyze <path>` — emit token-efficient structure for an AI coding agent.
15
+ *
16
+ * Without `--print` it prints compact single-line JSON whole-log stats (level counts +
17
+ * per-repository structure). With `--print` it streams a filtered, line-ranged,
18
+ * limited JSONL slice to stdout (truncation notices go to stderr so stdout stays
19
+ * clean).
20
+ *
21
+ * Exit codes: 0 = success; 2 = tool/usage error (bad path, unreadable, bad args).
22
+ */
23
+ export declare const analyzeCommand: CommandModule<object, AnalyzeArgs>;
24
+ export {};
@@ -0,0 +1,114 @@
1
+ import { resolve } from "node:path";
2
+ import { Parser } from "../core/parser.js";
3
+ import { Analyzer } from "../core/analyzer.js";
4
+ import { parseKeyValueFilter, parseWildcardFilter } from "../core/filters.js";
5
+ /** Default root keys stripped from print-mode output. `msg` is never stripped. */
6
+ const DEFAULT_IGNORED_FIELDS = "v,time,logContext,pid,hostname,name";
7
+ /**
8
+ * `analyze <path>` — emit token-efficient structure for an AI coding agent.
9
+ *
10
+ * Without `--print` it prints compact single-line JSON whole-log stats (level counts +
11
+ * per-repository structure). With `--print` it streams a filtered, line-ranged,
12
+ * limited JSONL slice to stdout (truncation notices go to stderr so stdout stays
13
+ * clean).
14
+ *
15
+ * Exit codes: 0 = success; 2 = tool/usage error (bad path, unreadable, bad args).
16
+ */
17
+ export const analyzeCommand = {
18
+ command: "analyze <path>",
19
+ describe: "Emit token-efficient structure/stats for an AI coding agent",
20
+ builder: (yargs) => yargs
21
+ .positional("path", {
22
+ type: "string",
23
+ describe: "Path to the Renovate JSONL log",
24
+ demandOption: true,
25
+ })
26
+ .option("print", {
27
+ type: "boolean",
28
+ default: false,
29
+ describe: "Print matching log lines (JSONL) instead of stats",
30
+ })
31
+ .option("ignored-fields", {
32
+ type: "string",
33
+ default: DEFAULT_IGNORED_FIELDS,
34
+ describe: "CSV of root keys to strip in print mode (msg never stripped)",
35
+ })
36
+ .option("line-from", {
37
+ type: "number",
38
+ describe: "Inclusive 0-indexed lower line bound (print mode)",
39
+ })
40
+ .option("line-to", {
41
+ type: "number",
42
+ describe: "Inclusive 0-indexed upper line bound (print mode)",
43
+ })
44
+ .option("limit", {
45
+ type: "number",
46
+ default: 50,
47
+ describe: "Max lines to print (print mode)",
48
+ })
49
+ .option("filter", {
50
+ type: "string",
51
+ array: true,
52
+ describe: "key:val scalar-equals filter, repeatable, AND'd (print mode)",
53
+ })
54
+ .option("filter-with-wildcard", {
55
+ type: "string",
56
+ array: true,
57
+ describe: "key:pattern wildcard filter (* = any run), case-insensitive, " +
58
+ "repeatable, AND'd (print mode)",
59
+ })
60
+ .option("include-original-line", {
61
+ type: "boolean",
62
+ default: false,
63
+ describe: "Add _oL (0-indexed source line) to each printed object",
64
+ }),
65
+ handler: (argv) => {
66
+ const parser = new Parser();
67
+ try {
68
+ const logPath = resolve(process.cwd(), argv.path);
69
+ parser.load(logPath);
70
+ const analyzer = new Analyzer(parser);
71
+ if (argv.print) {
72
+ const filters = [
73
+ ...(argv.filter ?? []).map(parseKeyValueFilter),
74
+ ...(argv["filter-with-wildcard"] ?? []).map(parseWildcardFilter),
75
+ ];
76
+ const result = analyzer.print({
77
+ ignoredFields: splitCsv(argv["ignored-fields"]),
78
+ lineFrom: argv["line-from"],
79
+ lineTo: argv["line-to"],
80
+ limit: argv.limit,
81
+ filters,
82
+ includeOriginalLine: argv["include-original-line"],
83
+ });
84
+ if (result.entries.length > 0) {
85
+ process.stdout.write(result.entries.map((e) => JSON.stringify(e)).join("\n") + "\n");
86
+ }
87
+ if (result.truncated) {
88
+ process.stderr.write(`Truncated: printed ${result.emitted} of ${result.totalMatched} ` +
89
+ `matching lines (--limit ${argv.limit}).\n`);
90
+ }
91
+ }
92
+ else {
93
+ const stats = analyzer.stats();
94
+ process.stdout.write(JSON.stringify(stats) + "\n");
95
+ }
96
+ }
97
+ catch (err) {
98
+ // Tool/usage error (bad path, unreadable, bad --filter token, …).
99
+ console.error(`analyze: ${err.message}`);
100
+ process.exitCode = 2;
101
+ }
102
+ finally {
103
+ parser.close();
104
+ }
105
+ },
106
+ };
107
+ /** Split a CSV option value into trimmed, non-empty tokens. */
108
+ function splitCsv(value) {
109
+ return value
110
+ .split(",")
111
+ .map((token) => token.trim())
112
+ .filter((token) => token.length > 0);
113
+ }
114
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CommandModule } from "yargs";
2
+ interface DetectErrorsArgs {
3
+ path: string;
4
+ out?: string;
5
+ "ignore-file"?: string;
6
+ "fail-on-warn": boolean;
7
+ }
8
+ /**
9
+ * `detect-errors <path>` — deterministically scan a Renovate JSONL log for
10
+ * build-breaking problems (exit 1) and warnings, optionally writing a stable
11
+ * machine-readable JSON report.
12
+ *
13
+ * Exit codes: 0 = no non-ignored errors; 1 = ≥1 non-ignored error (or, with
14
+ * `--fail-on-warn`, ≥1 non-ignored warning); 2 = tool/usage error.
15
+ */
16
+ export declare const detectErrorsCommand: CommandModule<object, DetectErrorsArgs>;
17
+ export {};