@sentry/warden 0.1.1 → 0.2.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 (580) hide show
  1. package/dist/cli/commands/init.d.ts.map +1 -1
  2. package/dist/cli/commands/init.js +3 -1
  3. package/dist/cli/commands/init.js.map +1 -1
  4. package/dist/cli/commands/setup-app/manifest.d.ts.map +1 -1
  5. package/dist/cli/commands/setup-app/manifest.js +3 -1
  6. package/dist/cli/commands/setup-app/manifest.js.map +1 -1
  7. package/dist/cli/commands/setup-app.js +1 -1
  8. package/dist/cli/commands/setup-app.js.map +1 -1
  9. package/dist/cli/files.d.ts +11 -1
  10. package/dist/cli/files.d.ts.map +1 -1
  11. package/dist/cli/files.js +145 -4
  12. package/dist/cli/files.js.map +1 -1
  13. package/dist/cli/git.d.ts.map +1 -1
  14. package/dist/cli/git.js +5 -9
  15. package/dist/cli/git.js.map +1 -1
  16. package/dist/cli/index.js +0 -0
  17. package/dist/cli/output/tasks.d.ts.map +1 -1
  18. package/dist/cli/output/tasks.js +5 -1
  19. package/dist/cli/output/tasks.js.map +1 -1
  20. package/dist/config/schema.d.ts.map +1 -1
  21. package/dist/config/schema.js +15 -1
  22. package/dist/config/schema.js.map +1 -1
  23. package/dist/diff/coalesce.d.ts +32 -2
  24. package/dist/diff/coalesce.d.ts.map +1 -1
  25. package/dist/diff/coalesce.js +174 -2
  26. package/dist/diff/coalesce.js.map +1 -1
  27. package/dist/output/dedup.d.ts.map +1 -1
  28. package/dist/output/dedup.js +8 -3
  29. package/dist/output/dedup.js.map +1 -1
  30. package/dist/output/renderer.d.ts.map +1 -1
  31. package/dist/output/renderer.js +49 -5
  32. package/dist/output/renderer.js.map +1 -1
  33. package/dist/output/stale.d.ts.map +1 -1
  34. package/dist/output/stale.js +7 -0
  35. package/dist/output/stale.js.map +1 -1
  36. package/dist/output/types.d.ts +15 -1
  37. package/dist/output/types.d.ts.map +1 -1
  38. package/dist/sdk/analyze.d.ts +18 -0
  39. package/dist/sdk/analyze.d.ts.map +1 -0
  40. package/dist/sdk/analyze.js +425 -0
  41. package/dist/sdk/analyze.js.map +1 -0
  42. package/dist/sdk/errors.d.ts +23 -0
  43. package/dist/sdk/errors.d.ts.map +1 -0
  44. package/dist/sdk/errors.js +72 -0
  45. package/dist/sdk/errors.js.map +1 -0
  46. package/dist/sdk/extract.d.ts +44 -0
  47. package/dist/sdk/extract.d.ts.map +1 -0
  48. package/dist/sdk/extract.js +224 -0
  49. package/dist/sdk/extract.js.map +1 -0
  50. package/dist/sdk/prepare.d.ts +13 -0
  51. package/dist/sdk/prepare.d.ts.map +1 -0
  52. package/dist/sdk/prepare.js +73 -0
  53. package/dist/sdk/prepare.js.map +1 -0
  54. package/dist/sdk/prompt.d.ts +30 -0
  55. package/dist/sdk/prompt.d.ts.map +1 -0
  56. package/dist/sdk/prompt.js +109 -0
  57. package/dist/sdk/prompt.js.map +1 -0
  58. package/dist/sdk/retry.d.ts +12 -0
  59. package/dist/sdk/retry.d.ts.map +1 -0
  60. package/dist/sdk/retry.js +31 -0
  61. package/dist/sdk/retry.js.map +1 -0
  62. package/dist/sdk/runner.d.ts +22 -199
  63. package/dist/sdk/runner.d.ts.map +1 -1
  64. package/dist/sdk/runner.js +26 -884
  65. package/dist/sdk/runner.js.map +1 -1
  66. package/dist/sdk/types.d.ts +127 -0
  67. package/dist/sdk/types.d.ts.map +1 -0
  68. package/dist/sdk/types.js +5 -0
  69. package/dist/sdk/types.js.map +1 -0
  70. package/dist/sdk/usage.d.ts +20 -0
  71. package/dist/sdk/usage.d.ts.map +1 -0
  72. package/dist/sdk/usage.js +44 -0
  73. package/dist/sdk/usage.js.map +1 -0
  74. package/dist/skills/remote.d.ts.map +1 -1
  75. package/dist/skills/remote.js +3 -7
  76. package/dist/skills/remote.js.map +1 -1
  77. package/dist/types/index.d.ts +1 -0
  78. package/dist/types/index.d.ts.map +1 -1
  79. package/dist/types/index.js +2 -0
  80. package/dist/types/index.js.map +1 -1
  81. package/dist/utils/exec.d.ts +61 -0
  82. package/dist/utils/exec.d.ts.map +1 -0
  83. package/dist/utils/exec.js +111 -0
  84. package/dist/utils/exec.js.map +1 -0
  85. package/dist/utils/index.d.ts +2 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +1 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/package.json +15 -16
  90. package/.agents/skills/find-bugs/SKILL.md +0 -75
  91. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -2934
  92. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -136
  93. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  94. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  95. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  96. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  97. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  98. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  99. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  100. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  101. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  102. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  103. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  104. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  105. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  106. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  107. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  108. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  109. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  110. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  111. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  112. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  113. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  114. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  115. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  116. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  117. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  118. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  119. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  120. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  121. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  122. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  123. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  124. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  125. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  126. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  127. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  128. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  129. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  130. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  131. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  132. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  133. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  134. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  135. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  136. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  137. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  138. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  139. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  140. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  141. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  142. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  143. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  144. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  145. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  146. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  147. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  148. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  149. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  150. package/.claude/settings.json +0 -57
  151. package/.claude/skills/agent-prompt/SKILL.md +0 -54
  152. package/.claude/skills/agent-prompt/references/agentic-patterns.md +0 -94
  153. package/.claude/skills/agent-prompt/references/anti-patterns.md +0 -140
  154. package/.claude/skills/agent-prompt/references/context-design.md +0 -124
  155. package/.claude/skills/agent-prompt/references/core-principles.md +0 -75
  156. package/.claude/skills/agent-prompt/references/model-guidance.md +0 -118
  157. package/.claude/skills/agent-prompt/references/output-formats.md +0 -98
  158. package/.claude/skills/agent-prompt/references/skill-structure.md +0 -115
  159. package/.claude/skills/agent-prompt/references/system-prompts.md +0 -115
  160. package/.claude/skills/notseer/SKILL.md +0 -131
  161. package/.claude/skills/skill-writer/SKILL.md +0 -140
  162. package/.claude/skills/testing-guidelines/SKILL.md +0 -132
  163. package/.claude/skills/warden-skill/SKILL.md +0 -226
  164. package/.claude/skills/warden-skill/references/config-schema.md +0 -116
  165. package/.dex/config.toml +0 -2
  166. package/.github/workflows/ci.yml +0 -33
  167. package/.github/workflows/release.yml +0 -59
  168. package/.github/workflows/warden.yml +0 -40
  169. package/AGENTS.md +0 -89
  170. package/CONTRIBUTING.md +0 -60
  171. package/SPEC.md +0 -263
  172. package/action.yml +0 -87
  173. package/assets/favicon.png +0 -0
  174. package/assets/warden-icon-bw.svg +0 -5
  175. package/assets/warden-icon-purple.png +0 -0
  176. package/assets/warden-icon-purple.svg +0 -5
  177. package/dist/action/159.index.js +0 -523
  178. package/dist/action/159.index.js.map +0 -1
  179. package/dist/action/action/index.d.ts +0 -2
  180. package/dist/action/action/index.d.ts.map +0 -1
  181. package/dist/action/action/main.d.ts +0 -2
  182. package/dist/action/action/main.d.ts.map +0 -1
  183. package/dist/action/cli/args.d.ts +0 -74
  184. package/dist/action/cli/args.d.ts.map +0 -1
  185. package/dist/action/cli/args.test.d.ts +0 -2
  186. package/dist/action/cli/args.test.d.ts.map +0 -1
  187. package/dist/action/cli/commands/add.d.ts +0 -7
  188. package/dist/action/cli/commands/add.d.ts.map +0 -1
  189. package/dist/action/cli/commands/init.d.ts +0 -10
  190. package/dist/action/cli/commands/init.d.ts.map +0 -1
  191. package/dist/action/cli/commands/init.test.d.ts +0 -2
  192. package/dist/action/cli/commands/init.test.d.ts.map +0 -1
  193. package/dist/action/cli/commands/setup-app/browser.d.ts +0 -9
  194. package/dist/action/cli/commands/setup-app/browser.d.ts.map +0 -1
  195. package/dist/action/cli/commands/setup-app/credentials.d.ts +0 -15
  196. package/dist/action/cli/commands/setup-app/credentials.d.ts.map +0 -1
  197. package/dist/action/cli/commands/setup-app/manifest.d.ts +0 -24
  198. package/dist/action/cli/commands/setup-app/manifest.d.ts.map +0 -1
  199. package/dist/action/cli/commands/setup-app/server.d.ts +0 -28
  200. package/dist/action/cli/commands/setup-app/server.d.ts.map +0 -1
  201. package/dist/action/cli/commands/setup-app.d.ts +0 -11
  202. package/dist/action/cli/commands/setup-app.d.ts.map +0 -1
  203. package/dist/action/cli/commands/sync.d.ts +0 -9
  204. package/dist/action/cli/commands/sync.d.ts.map +0 -1
  205. package/dist/action/cli/context.d.ts +0 -27
  206. package/dist/action/cli/context.d.ts.map +0 -1
  207. package/dist/action/cli/files.d.ts +0 -22
  208. package/dist/action/cli/files.d.ts.map +0 -1
  209. package/dist/action/cli/files.test.d.ts +0 -2
  210. package/dist/action/cli/files.test.d.ts.map +0 -1
  211. package/dist/action/cli/fix.d.ts +0 -41
  212. package/dist/action/cli/fix.d.ts.map +0 -1
  213. package/dist/action/cli/fix.test.d.ts +0 -2
  214. package/dist/action/cli/fix.test.d.ts.map +0 -1
  215. package/dist/action/cli/git.d.ts +0 -73
  216. package/dist/action/cli/git.d.ts.map +0 -1
  217. package/dist/action/cli/git.test.d.ts +0 -2
  218. package/dist/action/cli/git.test.d.ts.map +0 -1
  219. package/dist/action/cli/index.d.ts +0 -3
  220. package/dist/action/cli/index.d.ts.map +0 -1
  221. package/dist/action/cli/main.d.ts +0 -7
  222. package/dist/action/cli/main.d.ts.map +0 -1
  223. package/dist/action/cli/output/box.d.ts +0 -75
  224. package/dist/action/cli/output/box.d.ts.map +0 -1
  225. package/dist/action/cli/output/formatters.d.ts +0 -90
  226. package/dist/action/cli/output/formatters.d.ts.map +0 -1
  227. package/dist/action/cli/output/formatters.test.d.ts +0 -2
  228. package/dist/action/cli/output/formatters.test.d.ts.map +0 -1
  229. package/dist/action/cli/output/icons.d.ts +0 -15
  230. package/dist/action/cli/output/icons.d.ts.map +0 -1
  231. package/dist/action/cli/output/index.d.ts +0 -10
  232. package/dist/action/cli/output/index.d.ts.map +0 -1
  233. package/dist/action/cli/output/ink-runner.d.ts +0 -29
  234. package/dist/action/cli/output/ink-runner.d.ts.map +0 -1
  235. package/dist/action/cli/output/jsonl.d.ts +0 -43
  236. package/dist/action/cli/output/jsonl.d.ts.map +0 -1
  237. package/dist/action/cli/output/jsonl.test.d.ts +0 -2
  238. package/dist/action/cli/output/jsonl.test.d.ts.map +0 -1
  239. package/dist/action/cli/output/reporter.d.ts +0 -108
  240. package/dist/action/cli/output/reporter.d.ts.map +0 -1
  241. package/dist/action/cli/output/tasks.d.ts +0 -89
  242. package/dist/action/cli/output/tasks.d.ts.map +0 -1
  243. package/dist/action/cli/output/tty.d.ts +0 -21
  244. package/dist/action/cli/output/tty.d.ts.map +0 -1
  245. package/dist/action/cli/output/tty.test.d.ts +0 -2
  246. package/dist/action/cli/output/tty.test.d.ts.map +0 -1
  247. package/dist/action/cli/output/verbosity.d.ts +0 -20
  248. package/dist/action/cli/output/verbosity.d.ts.map +0 -1
  249. package/dist/action/cli/output/verbosity.test.d.ts +0 -2
  250. package/dist/action/cli/output/verbosity.test.d.ts.map +0 -1
  251. package/dist/action/cli/terminal.d.ts +0 -19
  252. package/dist/action/cli/terminal.d.ts.map +0 -1
  253. package/dist/action/cli/terminal.test.d.ts +0 -2
  254. package/dist/action/cli/terminal.test.d.ts.map +0 -1
  255. package/dist/action/config/index.d.ts +0 -4
  256. package/dist/action/config/index.d.ts.map +0 -1
  257. package/dist/action/config/loader.d.ts +0 -27
  258. package/dist/action/config/loader.d.ts.map +0 -1
  259. package/dist/action/config/loader.test.d.ts +0 -2
  260. package/dist/action/config/loader.test.d.ts.map +0 -1
  261. package/dist/action/config/schema.d.ts +0 -318
  262. package/dist/action/config/schema.d.ts.map +0 -1
  263. package/dist/action/config/writer.d.ts +0 -11
  264. package/dist/action/config/writer.d.ts.map +0 -1
  265. package/dist/action/config/writer.test.d.ts +0 -2
  266. package/dist/action/config/writer.test.d.ts.map +0 -1
  267. package/dist/action/diff/classify.d.ts +0 -29
  268. package/dist/action/diff/classify.d.ts.map +0 -1
  269. package/dist/action/diff/classify.test.d.ts +0 -2
  270. package/dist/action/diff/classify.test.d.ts.map +0 -1
  271. package/dist/action/diff/coalesce.d.ts +0 -42
  272. package/dist/action/diff/coalesce.d.ts.map +0 -1
  273. package/dist/action/diff/coalesce.test.d.ts +0 -2
  274. package/dist/action/diff/coalesce.test.d.ts.map +0 -1
  275. package/dist/action/diff/context.d.ts +0 -30
  276. package/dist/action/diff/context.d.ts.map +0 -1
  277. package/dist/action/diff/context.test.d.ts +0 -2
  278. package/dist/action/diff/context.test.d.ts.map +0 -1
  279. package/dist/action/diff/index.d.ts +0 -5
  280. package/dist/action/diff/index.d.ts.map +0 -1
  281. package/dist/action/diff/parser.d.ts +0 -52
  282. package/dist/action/diff/parser.d.ts.map +0 -1
  283. package/dist/action/diff/parser.test.d.ts +0 -2
  284. package/dist/action/diff/parser.test.d.ts.map +0 -1
  285. package/dist/action/event/context.d.ts +0 -9
  286. package/dist/action/event/context.d.ts.map +0 -1
  287. package/dist/action/event/index.d.ts +0 -3
  288. package/dist/action/event/index.d.ts.map +0 -1
  289. package/dist/action/event/schedule-context.d.ts +0 -30
  290. package/dist/action/event/schedule-context.d.ts.map +0 -1
  291. package/dist/action/examples/examples.integration.test.d.ts +0 -2
  292. package/dist/action/examples/examples.integration.test.d.ts.map +0 -1
  293. package/dist/action/examples/index.d.ts +0 -50
  294. package/dist/action/examples/index.d.ts.map +0 -1
  295. package/dist/action/examples/index.test.d.ts +0 -2
  296. package/dist/action/examples/index.test.d.ts.map +0 -1
  297. package/dist/action/examples/setup.d.ts +0 -2
  298. package/dist/action/examples/setup.d.ts.map +0 -1
  299. package/dist/action/index.d.ts +0 -11
  300. package/dist/action/index.d.ts.map +0 -1
  301. package/dist/action/index.js +0 -38231
  302. package/dist/action/index.js.map +0 -1
  303. package/dist/action/licenses.txt +0 -992
  304. package/dist/action/main.d.ts +0 -2
  305. package/dist/action/main.d.ts.map +0 -1
  306. package/dist/action/main.js +0 -707
  307. package/dist/action/main.js.map +0 -1
  308. package/dist/action/output/dedup.d.ts +0 -153
  309. package/dist/action/output/dedup.d.ts.map +0 -1
  310. package/dist/action/output/dedup.test.d.ts +0 -2
  311. package/dist/action/output/dedup.test.d.ts.map +0 -1
  312. package/dist/action/output/github-checks.d.ts +0 -106
  313. package/dist/action/output/github-checks.d.ts.map +0 -1
  314. package/dist/action/output/github-checks.test.d.ts +0 -2
  315. package/dist/action/output/github-checks.test.d.ts.map +0 -1
  316. package/dist/action/output/github-issues.d.ts +0 -35
  317. package/dist/action/output/github-issues.d.ts.map +0 -1
  318. package/dist/action/output/index.d.ts +0 -6
  319. package/dist/action/output/index.d.ts.map +0 -1
  320. package/dist/action/output/issue-renderer.d.ts +0 -20
  321. package/dist/action/output/issue-renderer.d.ts.map +0 -1
  322. package/dist/action/output/renderer.d.ts +0 -4
  323. package/dist/action/output/renderer.d.ts.map +0 -1
  324. package/dist/action/output/renderer.test.d.ts +0 -2
  325. package/dist/action/output/renderer.test.d.ts.map +0 -1
  326. package/dist/action/output/stale.d.ts +0 -31
  327. package/dist/action/output/stale.d.ts.map +0 -1
  328. package/dist/action/output/stale.test.d.ts +0 -2
  329. package/dist/action/output/stale.test.d.ts.map +0 -1
  330. package/dist/action/output/types.d.ts +0 -31
  331. package/dist/action/output/types.d.ts.map +0 -1
  332. package/dist/action/package.json +0 -3
  333. package/dist/action/sdk/index.d.ts +0 -2
  334. package/dist/action/sdk/index.d.ts.map +0 -1
  335. package/dist/action/sdk/runner.d.ts +0 -202
  336. package/dist/action/sdk/runner.d.ts.map +0 -1
  337. package/dist/action/sdk/runner.test.d.ts +0 -2
  338. package/dist/action/sdk/runner.test.d.ts.map +0 -1
  339. package/dist/action/skills/index.d.ts +0 -5
  340. package/dist/action/skills/index.d.ts.map +0 -1
  341. package/dist/action/skills/loader.d.ts +0 -111
  342. package/dist/action/skills/loader.d.ts.map +0 -1
  343. package/dist/action/skills/loader.test.d.ts +0 -2
  344. package/dist/action/skills/loader.test.d.ts.map +0 -1
  345. package/dist/action/skills/remote.d.ts +0 -117
  346. package/dist/action/skills/remote.d.ts.map +0 -1
  347. package/dist/action/skills/remote.test.d.ts +0 -2
  348. package/dist/action/skills/remote.test.d.ts.map +0 -1
  349. package/dist/action/sourcemap-register.cjs +0 -1
  350. package/dist/action/triggers/matcher.d.ts +0 -30
  351. package/dist/action/triggers/matcher.d.ts.map +0 -1
  352. package/dist/action/triggers/matcher.test.d.ts +0 -2
  353. package/dist/action/triggers/matcher.test.d.ts.map +0 -1
  354. package/dist/action/types/index.d.ts +0 -269
  355. package/dist/action/types/index.d.ts.map +0 -1
  356. package/dist/action/utils/async.d.ts +0 -5
  357. package/dist/action/utils/async.d.ts.map +0 -1
  358. package/dist/action/utils/index.d.ts +0 -16
  359. package/dist/action/utils/index.d.ts.map +0 -1
  360. package/dist/action/utils/index.test.d.ts +0 -2
  361. package/dist/action/utils/index.test.d.ts.map +0 -1
  362. package/dist/action/utils/version.d.ts +0 -3
  363. package/dist/action/utils/version.d.ts.map +0 -1
  364. package/dist/cli/args.test.d.ts +0 -2
  365. package/dist/cli/args.test.d.ts.map +0 -1
  366. package/dist/cli/args.test.js +0 -392
  367. package/dist/cli/args.test.js.map +0 -1
  368. package/dist/cli/commands/init.test.d.ts +0 -2
  369. package/dist/cli/commands/init.test.d.ts.map +0 -1
  370. package/dist/cli/commands/init.test.js +0 -117
  371. package/dist/cli/commands/init.test.js.map +0 -1
  372. package/dist/cli/files.test.d.ts +0 -2
  373. package/dist/cli/files.test.d.ts.map +0 -1
  374. package/dist/cli/files.test.js +0 -117
  375. package/dist/cli/files.test.js.map +0 -1
  376. package/dist/cli/fix.test.d.ts +0 -2
  377. package/dist/cli/fix.test.d.ts.map +0 -1
  378. package/dist/cli/fix.test.js +0 -251
  379. package/dist/cli/fix.test.js.map +0 -1
  380. package/dist/cli/git.test.d.ts +0 -2
  381. package/dist/cli/git.test.d.ts.map +0 -1
  382. package/dist/cli/git.test.js +0 -96
  383. package/dist/cli/git.test.js.map +0 -1
  384. package/dist/cli/output/formatters.test.d.ts +0 -2
  385. package/dist/cli/output/formatters.test.d.ts.map +0 -1
  386. package/dist/cli/output/formatters.test.js +0 -152
  387. package/dist/cli/output/formatters.test.js.map +0 -1
  388. package/dist/cli/output/jsonl.test.d.ts +0 -2
  389. package/dist/cli/output/jsonl.test.d.ts.map +0 -1
  390. package/dist/cli/output/jsonl.test.js +0 -284
  391. package/dist/cli/output/jsonl.test.js.map +0 -1
  392. package/dist/cli/output/tty.test.d.ts +0 -2
  393. package/dist/cli/output/tty.test.d.ts.map +0 -1
  394. package/dist/cli/output/tty.test.js +0 -105
  395. package/dist/cli/output/tty.test.js.map +0 -1
  396. package/dist/cli/output/verbosity.test.d.ts +0 -2
  397. package/dist/cli/output/verbosity.test.d.ts.map +0 -1
  398. package/dist/cli/output/verbosity.test.js +0 -35
  399. package/dist/cli/output/verbosity.test.js.map +0 -1
  400. package/dist/cli/terminal.test.d.ts +0 -2
  401. package/dist/cli/terminal.test.d.ts.map +0 -1
  402. package/dist/cli/terminal.test.js +0 -123
  403. package/dist/cli/terminal.test.js.map +0 -1
  404. package/dist/config/loader.test.d.ts +0 -2
  405. package/dist/config/loader.test.d.ts.map +0 -1
  406. package/dist/config/loader.test.js +0 -263
  407. package/dist/config/loader.test.js.map +0 -1
  408. package/dist/config/writer.test.d.ts +0 -2
  409. package/dist/config/writer.test.d.ts.map +0 -1
  410. package/dist/config/writer.test.js +0 -98
  411. package/dist/config/writer.test.js.map +0 -1
  412. package/dist/diff/classify.test.d.ts +0 -2
  413. package/dist/diff/classify.test.d.ts.map +0 -1
  414. package/dist/diff/classify.test.js +0 -140
  415. package/dist/diff/classify.test.js.map +0 -1
  416. package/dist/diff/coalesce.test.d.ts +0 -2
  417. package/dist/diff/coalesce.test.d.ts.map +0 -1
  418. package/dist/diff/coalesce.test.js +0 -159
  419. package/dist/diff/coalesce.test.js.map +0 -1
  420. package/dist/diff/context.test.d.ts +0 -2
  421. package/dist/diff/context.test.d.ts.map +0 -1
  422. package/dist/diff/context.test.js +0 -190
  423. package/dist/diff/context.test.js.map +0 -1
  424. package/dist/diff/parser.test.d.ts +0 -2
  425. package/dist/diff/parser.test.d.ts.map +0 -1
  426. package/dist/diff/parser.test.js +0 -178
  427. package/dist/diff/parser.test.js.map +0 -1
  428. package/dist/examples/examples.integration.test.d.ts +0 -2
  429. package/dist/examples/examples.integration.test.d.ts.map +0 -1
  430. package/dist/examples/examples.integration.test.js +0 -55
  431. package/dist/examples/examples.integration.test.js.map +0 -1
  432. package/dist/examples/index.test.d.ts +0 -2
  433. package/dist/examples/index.test.d.ts.map +0 -1
  434. package/dist/examples/index.test.js +0 -88
  435. package/dist/examples/index.test.js.map +0 -1
  436. package/dist/output/dedup.test.d.ts +0 -2
  437. package/dist/output/dedup.test.d.ts.map +0 -1
  438. package/dist/output/dedup.test.js +0 -357
  439. package/dist/output/dedup.test.js.map +0 -1
  440. package/dist/output/github-checks.test.d.ts +0 -2
  441. package/dist/output/github-checks.test.d.ts.map +0 -1
  442. package/dist/output/github-checks.test.js +0 -255
  443. package/dist/output/github-checks.test.js.map +0 -1
  444. package/dist/output/renderer.test.d.ts +0 -2
  445. package/dist/output/renderer.test.d.ts.map +0 -1
  446. package/dist/output/renderer.test.js +0 -645
  447. package/dist/output/renderer.test.js.map +0 -1
  448. package/dist/output/stale.test.d.ts +0 -2
  449. package/dist/output/stale.test.d.ts.map +0 -1
  450. package/dist/output/stale.test.js +0 -330
  451. package/dist/output/stale.test.js.map +0 -1
  452. package/dist/sdk/runner.test.d.ts +0 -2
  453. package/dist/sdk/runner.test.d.ts.map +0 -1
  454. package/dist/sdk/runner.test.js +0 -677
  455. package/dist/sdk/runner.test.js.map +0 -1
  456. package/dist/skills/loader.test.d.ts +0 -2
  457. package/dist/skills/loader.test.d.ts.map +0 -1
  458. package/dist/skills/loader.test.js +0 -241
  459. package/dist/skills/loader.test.js.map +0 -1
  460. package/dist/skills/remote.test.d.ts +0 -2
  461. package/dist/skills/remote.test.d.ts.map +0 -1
  462. package/dist/skills/remote.test.js +0 -582
  463. package/dist/skills/remote.test.js.map +0 -1
  464. package/dist/triggers/matcher.test.d.ts +0 -2
  465. package/dist/triggers/matcher.test.d.ts.map +0 -1
  466. package/dist/triggers/matcher.test.js +0 -234
  467. package/dist/triggers/matcher.test.js.map +0 -1
  468. package/dist/utils/index.test.d.ts +0 -2
  469. package/dist/utils/index.test.d.ts.map +0 -1
  470. package/dist/utils/index.test.js +0 -68
  471. package/dist/utils/index.test.js.map +0 -1
  472. package/docs/astro.config.mjs +0 -43
  473. package/docs/package.json +0 -19
  474. package/docs/pnpm-lock.yaml +0 -4000
  475. package/docs/public/favicon.svg +0 -5
  476. package/docs/src/components/Code.astro +0 -141
  477. package/docs/src/components/PackageManagerTabs.astro +0 -183
  478. package/docs/src/components/Terminal.astro +0 -212
  479. package/docs/src/layouts/Base.astro +0 -380
  480. package/docs/src/pages/cli.astro +0 -167
  481. package/docs/src/pages/config.astro +0 -395
  482. package/docs/src/pages/guide.astro +0 -450
  483. package/docs/src/pages/index.astro +0 -490
  484. package/docs/src/styles/global.css +0 -551
  485. package/docs/src/utils/version.ts +0 -6
  486. package/docs/tsconfig.json +0 -3
  487. package/docs/vercel.json +0 -5
  488. package/eslint.config.js +0 -33
  489. package/src/action/index.ts +0 -1
  490. package/src/action/main.ts +0 -868
  491. package/src/cli/args.test.ts +0 -477
  492. package/src/cli/args.ts +0 -414
  493. package/src/cli/commands/add.ts +0 -447
  494. package/src/cli/commands/init.test.ts +0 -137
  495. package/src/cli/commands/init.ts +0 -134
  496. package/src/cli/commands/setup-app/browser.ts +0 -38
  497. package/src/cli/commands/setup-app/credentials.ts +0 -45
  498. package/src/cli/commands/setup-app/manifest.ts +0 -48
  499. package/src/cli/commands/setup-app/server.ts +0 -172
  500. package/src/cli/commands/setup-app.ts +0 -156
  501. package/src/cli/commands/sync.ts +0 -114
  502. package/src/cli/context.ts +0 -131
  503. package/src/cli/files.test.ts +0 -155
  504. package/src/cli/files.ts +0 -89
  505. package/src/cli/fix.test.ts +0 -310
  506. package/src/cli/fix.ts +0 -387
  507. package/src/cli/git.test.ts +0 -119
  508. package/src/cli/git.ts +0 -318
  509. package/src/cli/index.ts +0 -14
  510. package/src/cli/main.ts +0 -672
  511. package/src/cli/output/box.ts +0 -235
  512. package/src/cli/output/formatters.test.ts +0 -187
  513. package/src/cli/output/formatters.ts +0 -269
  514. package/src/cli/output/icons.ts +0 -19
  515. package/src/cli/output/index.ts +0 -44
  516. package/src/cli/output/ink-runner.tsx +0 -366
  517. package/src/cli/output/jsonl.test.ts +0 -347
  518. package/src/cli/output/jsonl.ts +0 -126
  519. package/src/cli/output/reporter.ts +0 -434
  520. package/src/cli/output/tasks.ts +0 -374
  521. package/src/cli/output/tty.test.ts +0 -117
  522. package/src/cli/output/tty.ts +0 -60
  523. package/src/cli/output/verbosity.test.ts +0 -40
  524. package/src/cli/output/verbosity.ts +0 -31
  525. package/src/cli/terminal.test.ts +0 -148
  526. package/src/cli/terminal.ts +0 -301
  527. package/src/config/index.ts +0 -3
  528. package/src/config/loader.test.ts +0 -313
  529. package/src/config/loader.ts +0 -103
  530. package/src/config/schema.ts +0 -168
  531. package/src/config/writer.test.ts +0 -119
  532. package/src/config/writer.ts +0 -84
  533. package/src/diff/classify.test.ts +0 -162
  534. package/src/diff/classify.ts +0 -92
  535. package/src/diff/coalesce.test.ts +0 -208
  536. package/src/diff/coalesce.ts +0 -133
  537. package/src/diff/context.test.ts +0 -226
  538. package/src/diff/context.ts +0 -201
  539. package/src/diff/index.ts +0 -4
  540. package/src/diff/parser.test.ts +0 -212
  541. package/src/diff/parser.ts +0 -149
  542. package/src/event/context.ts +0 -132
  543. package/src/event/index.ts +0 -2
  544. package/src/event/schedule-context.ts +0 -101
  545. package/src/examples/examples.integration.test.ts +0 -66
  546. package/src/examples/index.test.ts +0 -101
  547. package/src/examples/index.ts +0 -122
  548. package/src/examples/setup.ts +0 -25
  549. package/src/index.ts +0 -115
  550. package/src/output/dedup.test.ts +0 -419
  551. package/src/output/dedup.ts +0 -607
  552. package/src/output/github-checks.test.ts +0 -300
  553. package/src/output/github-checks.ts +0 -476
  554. package/src/output/github-issues.ts +0 -329
  555. package/src/output/index.ts +0 -5
  556. package/src/output/issue-renderer.ts +0 -197
  557. package/src/output/renderer.test.ts +0 -727
  558. package/src/output/renderer.ts +0 -217
  559. package/src/output/stale.test.ts +0 -375
  560. package/src/output/stale.ts +0 -155
  561. package/src/output/types.ts +0 -34
  562. package/src/sdk/index.ts +0 -1
  563. package/src/sdk/runner.test.ts +0 -806
  564. package/src/sdk/runner.ts +0 -1232
  565. package/src/skills/index.ts +0 -36
  566. package/src/skills/loader.test.ts +0 -300
  567. package/src/skills/loader.ts +0 -423
  568. package/src/skills/remote.test.ts +0 -704
  569. package/src/skills/remote.ts +0 -604
  570. package/src/triggers/matcher.test.ts +0 -277
  571. package/src/triggers/matcher.ts +0 -152
  572. package/src/types/index.ts +0 -194
  573. package/src/utils/async.ts +0 -18
  574. package/src/utils/index.test.ts +0 -84
  575. package/src/utils/index.ts +0 -51
  576. package/src/utils/version.ts +0 -17
  577. package/tsconfig.json +0 -25
  578. package/vitest.config.ts +0 -8
  579. package/vitest.integration.config.ts +0 -11
  580. package/warden.toml +0 -19
@@ -1,313 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { resolveTrigger } from './loader.js';
3
- import { WardenConfigSchema, type Trigger, type WardenConfig } from './schema.js';
4
-
5
- describe('resolveTrigger', () => {
6
- const baseTrigger: Trigger = {
7
- name: 'test-trigger',
8
- event: 'pull_request',
9
- actions: ['opened'],
10
- skill: 'test-skill',
11
- };
12
-
13
- const baseConfig: WardenConfig = {
14
- version: 1,
15
- triggers: [baseTrigger],
16
- };
17
-
18
- it('returns trigger with empty filters and output when no defaults', () => {
19
- const resolved = resolveTrigger(baseTrigger, baseConfig);
20
-
21
- expect(resolved.filters).toEqual({
22
- paths: undefined,
23
- ignorePaths: undefined,
24
- });
25
- expect(resolved.output).toEqual({
26
- failOn: undefined,
27
- commentOn: undefined,
28
- maxFindings: undefined,
29
- });
30
- expect(resolved.model).toBeUndefined();
31
- });
32
-
33
- it('applies defaults when trigger has no config', () => {
34
- const config: WardenConfig = {
35
- ...baseConfig,
36
- defaults: {
37
- filters: { paths: ['src/**'], ignorePaths: ['*.test.ts'] },
38
- output: { failOn: 'high', commentOn: 'critical', maxFindings: 10 },
39
- model: 'claude-sonnet-4-20250514',
40
- },
41
- };
42
-
43
- const resolved = resolveTrigger(baseTrigger, config);
44
-
45
- expect(resolved.filters.paths).toEqual(['src/**']);
46
- expect(resolved.filters.ignorePaths).toEqual(['*.test.ts']);
47
- expect(resolved.output.failOn).toBe('high');
48
- expect(resolved.output.commentOn).toBe('critical');
49
- expect(resolved.output.maxFindings).toBe(10);
50
- expect(resolved.model).toBe('claude-sonnet-4-20250514');
51
- });
52
-
53
- it('trigger config overrides defaults', () => {
54
- const trigger: Trigger = {
55
- ...baseTrigger,
56
- filters: { paths: ['lib/**'] },
57
- output: { failOn: 'critical', commentOn: 'high' },
58
- model: 'claude-opus-4-20250514',
59
- };
60
-
61
- const config: WardenConfig = {
62
- ...baseConfig,
63
- triggers: [trigger],
64
- defaults: {
65
- filters: { paths: ['src/**'], ignorePaths: ['*.test.ts'] },
66
- output: { failOn: 'high', commentOn: 'critical', maxFindings: 10 },
67
- model: 'claude-sonnet-4-20250514',
68
- },
69
- };
70
-
71
- const resolved = resolveTrigger(trigger, config);
72
-
73
- // Trigger overrides
74
- expect(resolved.filters.paths).toEqual(['lib/**']);
75
- expect(resolved.output.failOn).toBe('critical');
76
- expect(resolved.output.commentOn).toBe('high');
77
- expect(resolved.model).toBe('claude-opus-4-20250514');
78
-
79
- // Defaults still applied where trigger doesn't specify
80
- expect(resolved.filters.ignorePaths).toEqual(['*.test.ts']);
81
- expect(resolved.output.maxFindings).toBe(10);
82
- });
83
-
84
- it('partial defaults are applied correctly', () => {
85
- const config: WardenConfig = {
86
- ...baseConfig,
87
- defaults: {
88
- filters: { ignorePaths: ['*.md'] },
89
- },
90
- };
91
-
92
- const resolved = resolveTrigger(baseTrigger, config);
93
-
94
- expect(resolved.filters.paths).toBeUndefined();
95
- expect(resolved.filters.ignorePaths).toEqual(['*.md']);
96
- expect(resolved.output.failOn).toBeUndefined();
97
- expect(resolved.model).toBeUndefined();
98
- });
99
-
100
- it('preserves other trigger properties', () => {
101
- const trigger: Trigger = {
102
- ...baseTrigger,
103
- name: 'my-trigger',
104
- skill: 'security-review',
105
- };
106
-
107
- const resolved = resolveTrigger(trigger, baseConfig);
108
-
109
- expect(resolved.name).toBe('my-trigger');
110
- expect(resolved.event).toBe('pull_request');
111
- expect(resolved.actions).toEqual(['opened']);
112
- expect(resolved.skill).toBe('security-review');
113
- });
114
-
115
- describe('model precedence', () => {
116
- it('trigger.model takes precedence over cliModel', () => {
117
- const trigger: Trigger = {
118
- ...baseTrigger,
119
- model: 'claude-opus-4-20250514',
120
- };
121
-
122
- const resolved = resolveTrigger(trigger, baseConfig, 'claude-haiku-3-5-20241022');
123
-
124
- expect(resolved.model).toBe('claude-opus-4-20250514');
125
- });
126
-
127
- it('defaults.model takes precedence over cliModel', () => {
128
- const config: WardenConfig = {
129
- ...baseConfig,
130
- defaults: {
131
- model: 'claude-sonnet-4-20250514',
132
- },
133
- };
134
-
135
- const resolved = resolveTrigger(baseTrigger, config, 'claude-haiku-3-5-20241022');
136
-
137
- expect(resolved.model).toBe('claude-sonnet-4-20250514');
138
- });
139
-
140
- it('cliModel is used when no config model is set', () => {
141
- const resolved = resolveTrigger(baseTrigger, baseConfig, 'claude-haiku-3-5-20241022');
142
-
143
- expect(resolved.model).toBe('claude-haiku-3-5-20241022');
144
- });
145
-
146
- it('trigger.model takes precedence over defaults.model', () => {
147
- const trigger: Trigger = {
148
- ...baseTrigger,
149
- model: 'claude-opus-4-20250514',
150
- };
151
- const config: WardenConfig = {
152
- ...baseConfig,
153
- triggers: [trigger],
154
- defaults: {
155
- model: 'claude-sonnet-4-20250514',
156
- },
157
- };
158
-
159
- const resolved = resolveTrigger(trigger, config, 'claude-haiku-3-5-20241022');
160
-
161
- expect(resolved.model).toBe('claude-opus-4-20250514');
162
- });
163
-
164
- it('empty string cliModel is treated as undefined', () => {
165
- const config: WardenConfig = {
166
- ...baseConfig,
167
- defaults: {
168
- model: 'claude-sonnet-4-20250514',
169
- },
170
- };
171
-
172
- const resolved = resolveTrigger(baseTrigger, config, '');
173
-
174
- expect(resolved.model).toBe('claude-sonnet-4-20250514');
175
- });
176
-
177
- it('empty string model values fall through to next in precedence', () => {
178
- // Simulates GitHub Actions substituting unconfigured secrets with ''
179
- const trigger: Trigger = {
180
- ...baseTrigger,
181
- model: '',
182
- };
183
- const config: WardenConfig = {
184
- ...baseConfig,
185
- triggers: [trigger],
186
- defaults: {
187
- model: '',
188
- },
189
- };
190
-
191
- const resolved = resolveTrigger(trigger, config, 'claude-haiku-3-5-20241022');
192
-
193
- expect(resolved.model).toBe('claude-haiku-3-5-20241022');
194
- });
195
- });
196
- });
197
-
198
- describe('maxTurns config', () => {
199
- it('accepts maxTurns in defaults', () => {
200
- const config = {
201
- version: 1,
202
- defaults: {
203
- maxTurns: 25,
204
- },
205
- triggers: [],
206
- };
207
-
208
- const result = WardenConfigSchema.safeParse(config);
209
- expect(result.success).toBe(true);
210
- expect(result.data?.defaults?.maxTurns).toBe(25);
211
- });
212
-
213
- it('accepts maxTurns in trigger', () => {
214
- const config = {
215
- version: 1,
216
- triggers: [
217
- {
218
- name: 'test',
219
- event: 'pull_request',
220
- actions: ['opened'],
221
- skill: 'security-review',
222
- maxTurns: 30,
223
- },
224
- ],
225
- };
226
-
227
- const result = WardenConfigSchema.safeParse(config);
228
- expect(result.success).toBe(true);
229
- expect(result.data?.triggers[0]?.maxTurns).toBe(30);
230
- });
231
-
232
- it('rejects non-positive maxTurns', () => {
233
- const config = {
234
- version: 1,
235
- defaults: {
236
- maxTurns: 0,
237
- },
238
- triggers: [],
239
- };
240
-
241
- const result = WardenConfigSchema.safeParse(config);
242
- expect(result.success).toBe(false);
243
- });
244
-
245
- it('rejects non-integer maxTurns', () => {
246
- const config = {
247
- version: 1,
248
- defaults: {
249
- maxTurns: 10.5,
250
- },
251
- triggers: [],
252
- };
253
-
254
- const result = WardenConfigSchema.safeParse(config);
255
- expect(result.success).toBe(false);
256
- });
257
- });
258
-
259
- describe('batchDelayMs config', () => {
260
- it('accepts batchDelayMs in defaults', () => {
261
- const config = {
262
- version: 1,
263
- defaults: {
264
- batchDelayMs: 1000,
265
- },
266
- triggers: [],
267
- };
268
-
269
- const result = WardenConfigSchema.safeParse(config);
270
- expect(result.success).toBe(true);
271
- expect(result.data?.defaults?.batchDelayMs).toBe(1000);
272
- });
273
-
274
- it('accepts zero batchDelayMs', () => {
275
- const config = {
276
- version: 1,
277
- defaults: {
278
- batchDelayMs: 0,
279
- },
280
- triggers: [],
281
- };
282
-
283
- const result = WardenConfigSchema.safeParse(config);
284
- expect(result.success).toBe(true);
285
- expect(result.data?.defaults?.batchDelayMs).toBe(0);
286
- });
287
-
288
- it('rejects negative batchDelayMs', () => {
289
- const config = {
290
- version: 1,
291
- defaults: {
292
- batchDelayMs: -100,
293
- },
294
- triggers: [],
295
- };
296
-
297
- const result = WardenConfigSchema.safeParse(config);
298
- expect(result.success).toBe(false);
299
- });
300
-
301
- it('rejects non-integer batchDelayMs', () => {
302
- const config = {
303
- version: 1,
304
- defaults: {
305
- batchDelayMs: 100.5,
306
- },
307
- triggers: [],
308
- };
309
-
310
- const result = WardenConfigSchema.safeParse(config);
311
- expect(result.success).toBe(false);
312
- });
313
- });
@@ -1,103 +0,0 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { parse as parseToml } from 'smol-toml';
4
- import {
5
- WardenConfigSchema,
6
- type WardenConfig,
7
- type Trigger,
8
- type PathFilter,
9
- type OutputConfig,
10
- } from './schema.js';
11
-
12
- export class ConfigLoadError extends Error {
13
- constructor(message: string, options?: { cause?: unknown }) {
14
- super(message, options);
15
- this.name = 'ConfigLoadError';
16
- }
17
- }
18
-
19
- export function loadWardenConfig(repoPath: string): WardenConfig {
20
- const configPath = join(repoPath, 'warden.toml');
21
-
22
- if (!existsSync(configPath)) {
23
- throw new ConfigLoadError(`Configuration file not found: ${configPath}`);
24
- }
25
-
26
- let content: string;
27
- try {
28
- content = readFileSync(configPath, 'utf-8');
29
- } catch (error) {
30
- throw new ConfigLoadError(`Failed to read configuration file: ${configPath}`, { cause: error });
31
- }
32
-
33
- let rawConfig: unknown;
34
- try {
35
- rawConfig = parseToml(content);
36
- } catch (error) {
37
- throw new ConfigLoadError('Failed to parse TOML configuration', { cause: error });
38
- }
39
-
40
- const result = WardenConfigSchema.safeParse(rawConfig);
41
- if (!result.success) {
42
- const issues = result.error.issues.map(i => ` - ${i.path.join('.')}: ${i.message}`).join('\n');
43
- throw new ConfigLoadError(`Invalid configuration:\n${issues}`);
44
- }
45
-
46
- return result.data;
47
- }
48
-
49
- /**
50
- * Resolved trigger configuration with defaults applied.
51
- */
52
- export interface ResolvedTrigger extends Trigger {
53
- filters: PathFilter;
54
- output: OutputConfig;
55
- }
56
-
57
- /**
58
- * Convert empty strings to undefined.
59
- * GitHub Actions substitutes unconfigured secrets with empty strings,
60
- * so we need to treat '' as "not set" for optional config values.
61
- */
62
- function emptyToUndefined(value: string | undefined): string | undefined {
63
- return value === '' ? undefined : value;
64
- }
65
-
66
- /**
67
- * Resolve a trigger's configuration by merging with defaults.
68
- * Trigger-specific values override defaults.
69
- *
70
- * Model precedence (highest to lowest):
71
- * 1. trigger.model (warden.toml trigger-level)
72
- * 2. defaults.model (warden.toml [defaults])
73
- * 3. cliModel (--model flag)
74
- * 4. WARDEN_MODEL env var
75
- * 5. SDK default (not set here)
76
- */
77
- export function resolveTrigger(
78
- trigger: Trigger,
79
- config: WardenConfig,
80
- cliModel?: string
81
- ): ResolvedTrigger {
82
- const defaults = config.defaults;
83
- const envModel = emptyToUndefined(process.env['WARDEN_MODEL']);
84
-
85
- return {
86
- ...trigger,
87
- filters: {
88
- paths: trigger.filters?.paths ?? defaults?.filters?.paths,
89
- ignorePaths: trigger.filters?.ignorePaths ?? defaults?.filters?.ignorePaths,
90
- },
91
- output: {
92
- failOn: trigger.output?.failOn ?? defaults?.output?.failOn,
93
- commentOn: trigger.output?.commentOn ?? defaults?.output?.commentOn,
94
- maxFindings: trigger.output?.maxFindings ?? defaults?.output?.maxFindings,
95
- commentOnSuccess: trigger.output?.commentOnSuccess ?? defaults?.output?.commentOnSuccess,
96
- },
97
- model:
98
- emptyToUndefined(trigger.model) ??
99
- emptyToUndefined(defaults?.model) ??
100
- emptyToUndefined(cliModel) ??
101
- envModel,
102
- };
103
- }
@@ -1,168 +0,0 @@
1
- import { z } from 'zod';
2
- import { SeverityThresholdSchema } from '../types/index.js';
3
-
4
- // Tool names that can be allowed/denied
5
- export const ToolNameSchema = z.enum([
6
- 'Read',
7
- 'Write',
8
- 'Edit',
9
- 'Bash',
10
- 'Glob',
11
- 'Grep',
12
- 'WebFetch',
13
- 'WebSearch',
14
- ]);
15
- export type ToolName = z.infer<typeof ToolNameSchema>;
16
-
17
- // Tool configuration for skills
18
- export const ToolConfigSchema = z.object({
19
- allowed: z.array(ToolNameSchema).optional(),
20
- denied: z.array(ToolNameSchema).optional(),
21
- });
22
- export type ToolConfig = z.infer<typeof ToolConfigSchema>;
23
-
24
- // Skill definition
25
- export const SkillDefinitionSchema = z.object({
26
- name: z.string().min(1),
27
- description: z.string(),
28
- prompt: z.string(),
29
- tools: ToolConfigSchema.optional(),
30
- outputSchema: z.string().optional(),
31
- /** Directory where the skill was loaded from, for resolving resources (scripts/, references/, assets/) */
32
- rootDir: z.string().optional(),
33
- });
34
- export type SkillDefinition = z.infer<typeof SkillDefinitionSchema>;
35
-
36
- // Path filter for triggers
37
- export const PathFilterSchema = z.object({
38
- paths: z.array(z.string()).optional(),
39
- ignorePaths: z.array(z.string()).optional(),
40
- });
41
- export type PathFilter = z.infer<typeof PathFilterSchema>;
42
-
43
- // Output configuration per trigger
44
- export const OutputConfigSchema = z.object({
45
- failOn: SeverityThresholdSchema.optional(),
46
- commentOn: SeverityThresholdSchema.optional(),
47
- maxFindings: z.number().int().positive().optional(),
48
- /** Post a PR comment even when there are no findings (default: false) */
49
- commentOnSuccess: z.boolean().optional(),
50
- });
51
- export type OutputConfig = z.infer<typeof OutputConfigSchema>;
52
-
53
- // Schedule-specific configuration
54
- export const ScheduleConfigSchema = z.object({
55
- /** Title for the tracking issue (default: "Warden: {triggerName}") */
56
- issueTitle: z.string().optional(),
57
- /** Create PR with fixes when suggestedFix is available */
58
- createFixPR: z.boolean().default(false),
59
- /** Branch prefix for fix PRs (default: "warden-fix") */
60
- fixBranchPrefix: z.string().default('warden-fix'),
61
- });
62
- export type ScheduleConfig = z.infer<typeof ScheduleConfigSchema>;
63
-
64
- // Trigger definition
65
- export const TriggerSchema = z.object({
66
- name: z.string().min(1),
67
- event: z.enum(['pull_request', 'issues', 'issue_comment', 'schedule']),
68
- /** Actions to trigger on. Required for all events except 'schedule'. */
69
- actions: z.array(z.string()).min(1).optional(),
70
- skill: z.string().min(1),
71
- /** Remote repository reference for the skill (e.g., "owner/repo" or "owner/repo@sha") */
72
- remote: z.string().optional(),
73
- filters: PathFilterSchema.optional(),
74
- output: OutputConfigSchema.optional(),
75
- /** Model to use for this trigger (e.g., 'claude-sonnet-4-20250514'). Uses SDK default if not specified. */
76
- model: z.string().optional(),
77
- /** Maximum agentic turns (API round-trips) per hunk analysis. Overrides defaults.maxTurns. */
78
- maxTurns: z.number().int().positive().optional(),
79
- /** Schedule-specific configuration. Only used when event is 'schedule'. */
80
- schedule: ScheduleConfigSchema.optional(),
81
- }).refine(
82
- (data) => {
83
- // actions is required unless event is 'schedule'
84
- if (data.event !== 'schedule') {
85
- return data.actions !== undefined && data.actions.length > 0;
86
- }
87
- return true;
88
- },
89
- {
90
- message: "actions is required for non-schedule events",
91
- path: ["actions"],
92
- }
93
- ).refine(
94
- (data) => {
95
- // paths filter is required for schedule events
96
- if (data.event === 'schedule') {
97
- return data.filters?.paths !== undefined && data.filters.paths.length > 0;
98
- }
99
- return true;
100
- },
101
- {
102
- message: "filters.paths is required for schedule events",
103
- path: ["filters", "paths"],
104
- }
105
- );
106
- export type Trigger = z.infer<typeof TriggerSchema>;
107
-
108
- // Runner configuration
109
- export const RunnerConfigSchema = z.object({
110
- /** Max concurrent trigger executions (default: 4) */
111
- concurrency: z.number().int().positive().optional(),
112
- });
113
- export type RunnerConfig = z.infer<typeof RunnerConfigSchema>;
114
-
115
- // File pattern for chunking configuration
116
- export const FilePatternSchema = z.object({
117
- /** Glob pattern to match files (e.g., "**\/pnpm-lock.yaml") */
118
- pattern: z.string(),
119
- /** How to handle matching files: 'per-hunk' (default), 'whole-file', or 'skip' */
120
- mode: z.enum(['per-hunk', 'whole-file', 'skip']).default('skip'),
121
- });
122
- export type FilePattern = z.infer<typeof FilePatternSchema>;
123
-
124
- // Coalescing configuration for merging nearby hunks
125
- export const CoalesceConfigSchema = z.object({
126
- /** Enable hunk coalescing (default: true) */
127
- enabled: z.boolean().default(true),
128
- /** Max lines gap between hunks to merge (default: 30) */
129
- maxGapLines: z.number().int().nonnegative().default(30),
130
- /** Target max size per chunk in characters (default: 8000) */
131
- maxChunkSize: z.number().int().positive().default(8000),
132
- });
133
- export type CoalesceConfig = z.infer<typeof CoalesceConfigSchema>;
134
-
135
- // Chunking configuration for controlling how files are processed
136
- export const ChunkingConfigSchema = z.object({
137
- /** Patterns to control file processing mode */
138
- filePatterns: z.array(FilePatternSchema).optional(),
139
- /** Coalescing options for merging nearby hunks */
140
- coalesce: CoalesceConfigSchema.optional(),
141
- });
142
- export type ChunkingConfig = z.infer<typeof ChunkingConfigSchema>;
143
-
144
- // Default configuration that triggers inherit from
145
- export const DefaultsSchema = z.object({
146
- filters: PathFilterSchema.optional(),
147
- output: OutputConfigSchema.optional(),
148
- /** Default model for all triggers (e.g., 'claude-sonnet-4-20250514') */
149
- model: z.string().optional(),
150
- /** Maximum agentic turns (API round-trips) per hunk analysis. Default: 50 */
151
- maxTurns: z.number().int().positive().optional(),
152
- /** Default branch for the repository (e.g., 'main', 'master', 'develop'). Auto-detected if not specified. */
153
- defaultBranch: z.string().optional(),
154
- /** Chunking configuration for controlling how files are processed */
155
- chunking: ChunkingConfigSchema.optional(),
156
- /** Delay in milliseconds between batch starts when processing files in parallel. Default: 0 */
157
- batchDelayMs: z.number().int().nonnegative().optional(),
158
- });
159
- export type Defaults = z.infer<typeof DefaultsSchema>;
160
-
161
- // Main warden.toml configuration
162
- export const WardenConfigSchema = z.object({
163
- version: z.literal(1),
164
- defaults: DefaultsSchema.optional(),
165
- triggers: z.array(TriggerSchema).default([]),
166
- runner: RunnerConfigSchema.optional(),
167
- });
168
- export type WardenConfig = z.infer<typeof WardenConfigSchema>;
@@ -1,119 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { generateTriggerToml } from './writer.js';
3
- import type { Trigger } from './schema.js';
4
-
5
- describe('generateTriggerToml', () => {
6
- it('generates basic trigger TOML', () => {
7
- const trigger: Trigger = {
8
- name: 'security-review',
9
- event: 'pull_request',
10
- actions: ['opened', 'synchronize'],
11
- skill: 'security-review',
12
- };
13
-
14
- const result = generateTriggerToml(trigger);
15
-
16
- expect(result).toContain('[[triggers]]');
17
- expect(result).toContain('name = "security-review"');
18
- expect(result).toContain('event = "pull_request"');
19
- expect(result).toContain('actions = ["opened", "synchronize"]');
20
- expect(result).toContain('skill = "security-review"');
21
- });
22
-
23
- it('includes remote field when present', () => {
24
- const trigger: Trigger = {
25
- name: 'security-review',
26
- event: 'pull_request',
27
- actions: ['opened'],
28
- skill: 'security-review',
29
- remote: 'getsentry/skills@abc123',
30
- };
31
-
32
- const result = generateTriggerToml(trigger);
33
-
34
- expect(result).toContain('remote = "getsentry/skills@abc123"');
35
- });
36
-
37
- it('omits remote field when not present', () => {
38
- const trigger: Trigger = {
39
- name: 'security-review',
40
- event: 'pull_request',
41
- actions: ['opened'],
42
- skill: 'security-review',
43
- };
44
-
45
- const result = generateTriggerToml(trigger);
46
-
47
- expect(result).not.toContain('remote');
48
- });
49
-
50
- it('includes filters when present', () => {
51
- const trigger: Trigger = {
52
- name: 'security-review',
53
- event: 'pull_request',
54
- actions: ['opened'],
55
- skill: 'security-review',
56
- filters: {
57
- paths: ['src/**/*.ts'],
58
- ignorePaths: ['**/*.test.ts'],
59
- },
60
- };
61
-
62
- const result = generateTriggerToml(trigger);
63
-
64
- expect(result).toContain('[triggers.filters]');
65
- expect(result).toContain('paths = ["src/**/*.ts"]');
66
- expect(result).toContain('ignorePaths = ["**/*.test.ts"]');
67
- });
68
-
69
- it('includes output config when present', () => {
70
- const trigger: Trigger = {
71
- name: 'security-review',
72
- event: 'pull_request',
73
- actions: ['opened'],
74
- skill: 'security-review',
75
- output: {
76
- failOn: 'high',
77
- commentOn: 'medium',
78
- maxFindings: 10,
79
- },
80
- };
81
-
82
- const result = generateTriggerToml(trigger);
83
-
84
- expect(result).toContain('[triggers.output]');
85
- expect(result).toContain('failOn = "high"');
86
- expect(result).toContain('commentOn = "medium"');
87
- expect(result).toContain('maxFindings = 10');
88
- });
89
-
90
- it('includes model when present', () => {
91
- const trigger: Trigger = {
92
- name: 'security-review',
93
- event: 'pull_request',
94
- actions: ['opened'],
95
- skill: 'security-review',
96
- model: 'claude-sonnet-4-20250514',
97
- };
98
-
99
- const result = generateTriggerToml(trigger);
100
-
101
- expect(result).toContain('model = "claude-sonnet-4-20250514"');
102
- });
103
-
104
- it('handles schedule events without actions', () => {
105
- const trigger: Trigger = {
106
- name: 'weekly-scan',
107
- event: 'schedule',
108
- skill: 'security-review',
109
- filters: {
110
- paths: ['src/**/*.ts'],
111
- },
112
- };
113
-
114
- const result = generateTriggerToml(trigger);
115
-
116
- expect(result).toContain('event = "schedule"');
117
- expect(result).not.toContain('actions');
118
- });
119
- });