@sentry/warden 0.1.1 → 0.3.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 (589) hide show
  1. package/dist/cli/commands/init.d.ts.map +1 -1
  2. package/dist/cli/commands/init.js +36 -2
  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/diff-apply.d.ts +15 -0
  10. package/dist/cli/diff-apply.d.ts.map +1 -0
  11. package/dist/cli/diff-apply.js +69 -0
  12. package/dist/cli/diff-apply.js.map +1 -0
  13. package/dist/cli/files.d.ts +11 -1
  14. package/dist/cli/files.d.ts.map +1 -1
  15. package/dist/cli/files.js +145 -4
  16. package/dist/cli/files.js.map +1 -1
  17. package/dist/cli/fix.d.ts +1 -5
  18. package/dist/cli/fix.d.ts.map +1 -1
  19. package/dist/cli/fix.js +3 -62
  20. package/dist/cli/fix.js.map +1 -1
  21. package/dist/cli/git.d.ts.map +1 -1
  22. package/dist/cli/git.js +5 -9
  23. package/dist/cli/git.js.map +1 -1
  24. package/dist/cli/index.js +0 -0
  25. package/dist/cli/output/tasks.d.ts.map +1 -1
  26. package/dist/cli/output/tasks.js +5 -1
  27. package/dist/cli/output/tasks.js.map +1 -1
  28. package/dist/config/schema.d.ts.map +1 -1
  29. package/dist/config/schema.js +15 -1
  30. package/dist/config/schema.js.map +1 -1
  31. package/dist/diff/coalesce.d.ts +32 -2
  32. package/dist/diff/coalesce.d.ts.map +1 -1
  33. package/dist/diff/coalesce.js +174 -2
  34. package/dist/diff/coalesce.js.map +1 -1
  35. package/dist/output/dedup.d.ts +7 -4
  36. package/dist/output/dedup.d.ts.map +1 -1
  37. package/dist/output/dedup.js +48 -12
  38. package/dist/output/dedup.js.map +1 -1
  39. package/dist/output/renderer.d.ts.map +1 -1
  40. package/dist/output/renderer.js +52 -7
  41. package/dist/output/renderer.js.map +1 -1
  42. package/dist/output/stale.d.ts.map +1 -1
  43. package/dist/output/stale.js +7 -0
  44. package/dist/output/stale.js.map +1 -1
  45. package/dist/output/types.d.ts +15 -1
  46. package/dist/output/types.d.ts.map +1 -1
  47. package/dist/sdk/analyze.d.ts +18 -0
  48. package/dist/sdk/analyze.d.ts.map +1 -0
  49. package/dist/sdk/analyze.js +421 -0
  50. package/dist/sdk/analyze.js.map +1 -0
  51. package/dist/sdk/errors.d.ts +23 -0
  52. package/dist/sdk/errors.d.ts.map +1 -0
  53. package/dist/sdk/errors.js +74 -0
  54. package/dist/sdk/errors.js.map +1 -0
  55. package/dist/sdk/extract.d.ts +44 -0
  56. package/dist/sdk/extract.d.ts.map +1 -0
  57. package/dist/sdk/extract.js +224 -0
  58. package/dist/sdk/extract.js.map +1 -0
  59. package/dist/sdk/prepare.d.ts +13 -0
  60. package/dist/sdk/prepare.d.ts.map +1 -0
  61. package/dist/sdk/prepare.js +73 -0
  62. package/dist/sdk/prepare.js.map +1 -0
  63. package/dist/sdk/prompt.d.ts +30 -0
  64. package/dist/sdk/prompt.d.ts.map +1 -0
  65. package/dist/sdk/prompt.js +109 -0
  66. package/dist/sdk/prompt.js.map +1 -0
  67. package/dist/sdk/retry.d.ts +12 -0
  68. package/dist/sdk/retry.d.ts.map +1 -0
  69. package/dist/sdk/retry.js +31 -0
  70. package/dist/sdk/retry.js.map +1 -0
  71. package/dist/sdk/runner.d.ts +22 -199
  72. package/dist/sdk/runner.d.ts.map +1 -1
  73. package/dist/sdk/runner.js +26 -884
  74. package/dist/sdk/runner.js.map +1 -1
  75. package/dist/sdk/types.d.ts +127 -0
  76. package/dist/sdk/types.d.ts.map +1 -0
  77. package/dist/sdk/types.js +5 -0
  78. package/dist/sdk/types.js.map +1 -0
  79. package/dist/sdk/usage.d.ts +20 -0
  80. package/dist/sdk/usage.d.ts.map +1 -0
  81. package/dist/sdk/usage.js +44 -0
  82. package/dist/sdk/usage.js.map +1 -0
  83. package/dist/skills/remote.d.ts.map +1 -1
  84. package/dist/skills/remote.js +3 -7
  85. package/dist/skills/remote.js.map +1 -1
  86. package/dist/types/index.d.ts +1 -0
  87. package/dist/types/index.d.ts.map +1 -1
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -1
  90. package/dist/utils/exec.d.ts +61 -0
  91. package/dist/utils/exec.d.ts.map +1 -0
  92. package/dist/utils/exec.js +111 -0
  93. package/dist/utils/exec.js.map +1 -0
  94. package/dist/utils/index.d.ts +2 -0
  95. package/dist/utils/index.d.ts.map +1 -1
  96. package/dist/utils/index.js +1 -0
  97. package/dist/utils/index.js.map +1 -1
  98. package/package.json +15 -16
  99. package/.agents/skills/find-bugs/SKILL.md +0 -75
  100. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -2934
  101. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -136
  102. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  103. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  104. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  105. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  106. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  107. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  108. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  109. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  110. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  111. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  112. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  113. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  114. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  115. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  116. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  117. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  118. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  119. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  120. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  121. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  122. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  123. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  124. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  125. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  126. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  127. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  128. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  129. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  130. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  131. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  132. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  133. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  134. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  135. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  136. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  137. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  138. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  139. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  140. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  141. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  142. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  143. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  144. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  145. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  146. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  147. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  148. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  149. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  150. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  151. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  152. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  153. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  154. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  155. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  156. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  157. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  158. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  159. package/.claude/settings.json +0 -57
  160. package/.claude/skills/agent-prompt/SKILL.md +0 -54
  161. package/.claude/skills/agent-prompt/references/agentic-patterns.md +0 -94
  162. package/.claude/skills/agent-prompt/references/anti-patterns.md +0 -140
  163. package/.claude/skills/agent-prompt/references/context-design.md +0 -124
  164. package/.claude/skills/agent-prompt/references/core-principles.md +0 -75
  165. package/.claude/skills/agent-prompt/references/model-guidance.md +0 -118
  166. package/.claude/skills/agent-prompt/references/output-formats.md +0 -98
  167. package/.claude/skills/agent-prompt/references/skill-structure.md +0 -115
  168. package/.claude/skills/agent-prompt/references/system-prompts.md +0 -115
  169. package/.claude/skills/notseer/SKILL.md +0 -131
  170. package/.claude/skills/skill-writer/SKILL.md +0 -140
  171. package/.claude/skills/testing-guidelines/SKILL.md +0 -132
  172. package/.claude/skills/warden-skill/SKILL.md +0 -226
  173. package/.claude/skills/warden-skill/references/config-schema.md +0 -116
  174. package/.dex/config.toml +0 -2
  175. package/.github/workflows/ci.yml +0 -33
  176. package/.github/workflows/release.yml +0 -59
  177. package/.github/workflows/warden.yml +0 -40
  178. package/AGENTS.md +0 -89
  179. package/CONTRIBUTING.md +0 -60
  180. package/SPEC.md +0 -263
  181. package/action.yml +0 -87
  182. package/assets/favicon.png +0 -0
  183. package/assets/warden-icon-bw.svg +0 -5
  184. package/assets/warden-icon-purple.png +0 -0
  185. package/assets/warden-icon-purple.svg +0 -5
  186. package/dist/action/159.index.js +0 -523
  187. package/dist/action/159.index.js.map +0 -1
  188. package/dist/action/action/index.d.ts +0 -2
  189. package/dist/action/action/index.d.ts.map +0 -1
  190. package/dist/action/action/main.d.ts +0 -2
  191. package/dist/action/action/main.d.ts.map +0 -1
  192. package/dist/action/cli/args.d.ts +0 -74
  193. package/dist/action/cli/args.d.ts.map +0 -1
  194. package/dist/action/cli/args.test.d.ts +0 -2
  195. package/dist/action/cli/args.test.d.ts.map +0 -1
  196. package/dist/action/cli/commands/add.d.ts +0 -7
  197. package/dist/action/cli/commands/add.d.ts.map +0 -1
  198. package/dist/action/cli/commands/init.d.ts +0 -10
  199. package/dist/action/cli/commands/init.d.ts.map +0 -1
  200. package/dist/action/cli/commands/init.test.d.ts +0 -2
  201. package/dist/action/cli/commands/init.test.d.ts.map +0 -1
  202. package/dist/action/cli/commands/setup-app/browser.d.ts +0 -9
  203. package/dist/action/cli/commands/setup-app/browser.d.ts.map +0 -1
  204. package/dist/action/cli/commands/setup-app/credentials.d.ts +0 -15
  205. package/dist/action/cli/commands/setup-app/credentials.d.ts.map +0 -1
  206. package/dist/action/cli/commands/setup-app/manifest.d.ts +0 -24
  207. package/dist/action/cli/commands/setup-app/manifest.d.ts.map +0 -1
  208. package/dist/action/cli/commands/setup-app/server.d.ts +0 -28
  209. package/dist/action/cli/commands/setup-app/server.d.ts.map +0 -1
  210. package/dist/action/cli/commands/setup-app.d.ts +0 -11
  211. package/dist/action/cli/commands/setup-app.d.ts.map +0 -1
  212. package/dist/action/cli/commands/sync.d.ts +0 -9
  213. package/dist/action/cli/commands/sync.d.ts.map +0 -1
  214. package/dist/action/cli/context.d.ts +0 -27
  215. package/dist/action/cli/context.d.ts.map +0 -1
  216. package/dist/action/cli/files.d.ts +0 -22
  217. package/dist/action/cli/files.d.ts.map +0 -1
  218. package/dist/action/cli/files.test.d.ts +0 -2
  219. package/dist/action/cli/files.test.d.ts.map +0 -1
  220. package/dist/action/cli/fix.d.ts +0 -41
  221. package/dist/action/cli/fix.d.ts.map +0 -1
  222. package/dist/action/cli/fix.test.d.ts +0 -2
  223. package/dist/action/cli/fix.test.d.ts.map +0 -1
  224. package/dist/action/cli/git.d.ts +0 -73
  225. package/dist/action/cli/git.d.ts.map +0 -1
  226. package/dist/action/cli/git.test.d.ts +0 -2
  227. package/dist/action/cli/git.test.d.ts.map +0 -1
  228. package/dist/action/cli/index.d.ts +0 -3
  229. package/dist/action/cli/index.d.ts.map +0 -1
  230. package/dist/action/cli/main.d.ts +0 -7
  231. package/dist/action/cli/main.d.ts.map +0 -1
  232. package/dist/action/cli/output/box.d.ts +0 -75
  233. package/dist/action/cli/output/box.d.ts.map +0 -1
  234. package/dist/action/cli/output/formatters.d.ts +0 -90
  235. package/dist/action/cli/output/formatters.d.ts.map +0 -1
  236. package/dist/action/cli/output/formatters.test.d.ts +0 -2
  237. package/dist/action/cli/output/formatters.test.d.ts.map +0 -1
  238. package/dist/action/cli/output/icons.d.ts +0 -15
  239. package/dist/action/cli/output/icons.d.ts.map +0 -1
  240. package/dist/action/cli/output/index.d.ts +0 -10
  241. package/dist/action/cli/output/index.d.ts.map +0 -1
  242. package/dist/action/cli/output/ink-runner.d.ts +0 -29
  243. package/dist/action/cli/output/ink-runner.d.ts.map +0 -1
  244. package/dist/action/cli/output/jsonl.d.ts +0 -43
  245. package/dist/action/cli/output/jsonl.d.ts.map +0 -1
  246. package/dist/action/cli/output/jsonl.test.d.ts +0 -2
  247. package/dist/action/cli/output/jsonl.test.d.ts.map +0 -1
  248. package/dist/action/cli/output/reporter.d.ts +0 -108
  249. package/dist/action/cli/output/reporter.d.ts.map +0 -1
  250. package/dist/action/cli/output/tasks.d.ts +0 -89
  251. package/dist/action/cli/output/tasks.d.ts.map +0 -1
  252. package/dist/action/cli/output/tty.d.ts +0 -21
  253. package/dist/action/cli/output/tty.d.ts.map +0 -1
  254. package/dist/action/cli/output/tty.test.d.ts +0 -2
  255. package/dist/action/cli/output/tty.test.d.ts.map +0 -1
  256. package/dist/action/cli/output/verbosity.d.ts +0 -20
  257. package/dist/action/cli/output/verbosity.d.ts.map +0 -1
  258. package/dist/action/cli/output/verbosity.test.d.ts +0 -2
  259. package/dist/action/cli/output/verbosity.test.d.ts.map +0 -1
  260. package/dist/action/cli/terminal.d.ts +0 -19
  261. package/dist/action/cli/terminal.d.ts.map +0 -1
  262. package/dist/action/cli/terminal.test.d.ts +0 -2
  263. package/dist/action/cli/terminal.test.d.ts.map +0 -1
  264. package/dist/action/config/index.d.ts +0 -4
  265. package/dist/action/config/index.d.ts.map +0 -1
  266. package/dist/action/config/loader.d.ts +0 -27
  267. package/dist/action/config/loader.d.ts.map +0 -1
  268. package/dist/action/config/loader.test.d.ts +0 -2
  269. package/dist/action/config/loader.test.d.ts.map +0 -1
  270. package/dist/action/config/schema.d.ts +0 -318
  271. package/dist/action/config/schema.d.ts.map +0 -1
  272. package/dist/action/config/writer.d.ts +0 -11
  273. package/dist/action/config/writer.d.ts.map +0 -1
  274. package/dist/action/config/writer.test.d.ts +0 -2
  275. package/dist/action/config/writer.test.d.ts.map +0 -1
  276. package/dist/action/diff/classify.d.ts +0 -29
  277. package/dist/action/diff/classify.d.ts.map +0 -1
  278. package/dist/action/diff/classify.test.d.ts +0 -2
  279. package/dist/action/diff/classify.test.d.ts.map +0 -1
  280. package/dist/action/diff/coalesce.d.ts +0 -42
  281. package/dist/action/diff/coalesce.d.ts.map +0 -1
  282. package/dist/action/diff/coalesce.test.d.ts +0 -2
  283. package/dist/action/diff/coalesce.test.d.ts.map +0 -1
  284. package/dist/action/diff/context.d.ts +0 -30
  285. package/dist/action/diff/context.d.ts.map +0 -1
  286. package/dist/action/diff/context.test.d.ts +0 -2
  287. package/dist/action/diff/context.test.d.ts.map +0 -1
  288. package/dist/action/diff/index.d.ts +0 -5
  289. package/dist/action/diff/index.d.ts.map +0 -1
  290. package/dist/action/diff/parser.d.ts +0 -52
  291. package/dist/action/diff/parser.d.ts.map +0 -1
  292. package/dist/action/diff/parser.test.d.ts +0 -2
  293. package/dist/action/diff/parser.test.d.ts.map +0 -1
  294. package/dist/action/event/context.d.ts +0 -9
  295. package/dist/action/event/context.d.ts.map +0 -1
  296. package/dist/action/event/index.d.ts +0 -3
  297. package/dist/action/event/index.d.ts.map +0 -1
  298. package/dist/action/event/schedule-context.d.ts +0 -30
  299. package/dist/action/event/schedule-context.d.ts.map +0 -1
  300. package/dist/action/examples/examples.integration.test.d.ts +0 -2
  301. package/dist/action/examples/examples.integration.test.d.ts.map +0 -1
  302. package/dist/action/examples/index.d.ts +0 -50
  303. package/dist/action/examples/index.d.ts.map +0 -1
  304. package/dist/action/examples/index.test.d.ts +0 -2
  305. package/dist/action/examples/index.test.d.ts.map +0 -1
  306. package/dist/action/examples/setup.d.ts +0 -2
  307. package/dist/action/examples/setup.d.ts.map +0 -1
  308. package/dist/action/index.d.ts +0 -11
  309. package/dist/action/index.d.ts.map +0 -1
  310. package/dist/action/index.js +0 -38231
  311. package/dist/action/index.js.map +0 -1
  312. package/dist/action/licenses.txt +0 -992
  313. package/dist/action/main.d.ts +0 -2
  314. package/dist/action/main.d.ts.map +0 -1
  315. package/dist/action/main.js +0 -707
  316. package/dist/action/main.js.map +0 -1
  317. package/dist/action/output/dedup.d.ts +0 -153
  318. package/dist/action/output/dedup.d.ts.map +0 -1
  319. package/dist/action/output/dedup.test.d.ts +0 -2
  320. package/dist/action/output/dedup.test.d.ts.map +0 -1
  321. package/dist/action/output/github-checks.d.ts +0 -106
  322. package/dist/action/output/github-checks.d.ts.map +0 -1
  323. package/dist/action/output/github-checks.test.d.ts +0 -2
  324. package/dist/action/output/github-checks.test.d.ts.map +0 -1
  325. package/dist/action/output/github-issues.d.ts +0 -35
  326. package/dist/action/output/github-issues.d.ts.map +0 -1
  327. package/dist/action/output/index.d.ts +0 -6
  328. package/dist/action/output/index.d.ts.map +0 -1
  329. package/dist/action/output/issue-renderer.d.ts +0 -20
  330. package/dist/action/output/issue-renderer.d.ts.map +0 -1
  331. package/dist/action/output/renderer.d.ts +0 -4
  332. package/dist/action/output/renderer.d.ts.map +0 -1
  333. package/dist/action/output/renderer.test.d.ts +0 -2
  334. package/dist/action/output/renderer.test.d.ts.map +0 -1
  335. package/dist/action/output/stale.d.ts +0 -31
  336. package/dist/action/output/stale.d.ts.map +0 -1
  337. package/dist/action/output/stale.test.d.ts +0 -2
  338. package/dist/action/output/stale.test.d.ts.map +0 -1
  339. package/dist/action/output/types.d.ts +0 -31
  340. package/dist/action/output/types.d.ts.map +0 -1
  341. package/dist/action/package.json +0 -3
  342. package/dist/action/sdk/index.d.ts +0 -2
  343. package/dist/action/sdk/index.d.ts.map +0 -1
  344. package/dist/action/sdk/runner.d.ts +0 -202
  345. package/dist/action/sdk/runner.d.ts.map +0 -1
  346. package/dist/action/sdk/runner.test.d.ts +0 -2
  347. package/dist/action/sdk/runner.test.d.ts.map +0 -1
  348. package/dist/action/skills/index.d.ts +0 -5
  349. package/dist/action/skills/index.d.ts.map +0 -1
  350. package/dist/action/skills/loader.d.ts +0 -111
  351. package/dist/action/skills/loader.d.ts.map +0 -1
  352. package/dist/action/skills/loader.test.d.ts +0 -2
  353. package/dist/action/skills/loader.test.d.ts.map +0 -1
  354. package/dist/action/skills/remote.d.ts +0 -117
  355. package/dist/action/skills/remote.d.ts.map +0 -1
  356. package/dist/action/skills/remote.test.d.ts +0 -2
  357. package/dist/action/skills/remote.test.d.ts.map +0 -1
  358. package/dist/action/sourcemap-register.cjs +0 -1
  359. package/dist/action/triggers/matcher.d.ts +0 -30
  360. package/dist/action/triggers/matcher.d.ts.map +0 -1
  361. package/dist/action/triggers/matcher.test.d.ts +0 -2
  362. package/dist/action/triggers/matcher.test.d.ts.map +0 -1
  363. package/dist/action/types/index.d.ts +0 -269
  364. package/dist/action/types/index.d.ts.map +0 -1
  365. package/dist/action/utils/async.d.ts +0 -5
  366. package/dist/action/utils/async.d.ts.map +0 -1
  367. package/dist/action/utils/index.d.ts +0 -16
  368. package/dist/action/utils/index.d.ts.map +0 -1
  369. package/dist/action/utils/index.test.d.ts +0 -2
  370. package/dist/action/utils/index.test.d.ts.map +0 -1
  371. package/dist/action/utils/version.d.ts +0 -3
  372. package/dist/action/utils/version.d.ts.map +0 -1
  373. package/dist/cli/args.test.d.ts +0 -2
  374. package/dist/cli/args.test.d.ts.map +0 -1
  375. package/dist/cli/args.test.js +0 -392
  376. package/dist/cli/args.test.js.map +0 -1
  377. package/dist/cli/commands/init.test.d.ts +0 -2
  378. package/dist/cli/commands/init.test.d.ts.map +0 -1
  379. package/dist/cli/commands/init.test.js +0 -117
  380. package/dist/cli/commands/init.test.js.map +0 -1
  381. package/dist/cli/files.test.d.ts +0 -2
  382. package/dist/cli/files.test.d.ts.map +0 -1
  383. package/dist/cli/files.test.js +0 -117
  384. package/dist/cli/files.test.js.map +0 -1
  385. package/dist/cli/fix.test.d.ts +0 -2
  386. package/dist/cli/fix.test.d.ts.map +0 -1
  387. package/dist/cli/fix.test.js +0 -251
  388. package/dist/cli/fix.test.js.map +0 -1
  389. package/dist/cli/git.test.d.ts +0 -2
  390. package/dist/cli/git.test.d.ts.map +0 -1
  391. package/dist/cli/git.test.js +0 -96
  392. package/dist/cli/git.test.js.map +0 -1
  393. package/dist/cli/output/formatters.test.d.ts +0 -2
  394. package/dist/cli/output/formatters.test.d.ts.map +0 -1
  395. package/dist/cli/output/formatters.test.js +0 -152
  396. package/dist/cli/output/formatters.test.js.map +0 -1
  397. package/dist/cli/output/jsonl.test.d.ts +0 -2
  398. package/dist/cli/output/jsonl.test.d.ts.map +0 -1
  399. package/dist/cli/output/jsonl.test.js +0 -284
  400. package/dist/cli/output/jsonl.test.js.map +0 -1
  401. package/dist/cli/output/tty.test.d.ts +0 -2
  402. package/dist/cli/output/tty.test.d.ts.map +0 -1
  403. package/dist/cli/output/tty.test.js +0 -105
  404. package/dist/cli/output/tty.test.js.map +0 -1
  405. package/dist/cli/output/verbosity.test.d.ts +0 -2
  406. package/dist/cli/output/verbosity.test.d.ts.map +0 -1
  407. package/dist/cli/output/verbosity.test.js +0 -35
  408. package/dist/cli/output/verbosity.test.js.map +0 -1
  409. package/dist/cli/terminal.test.d.ts +0 -2
  410. package/dist/cli/terminal.test.d.ts.map +0 -1
  411. package/dist/cli/terminal.test.js +0 -123
  412. package/dist/cli/terminal.test.js.map +0 -1
  413. package/dist/config/loader.test.d.ts +0 -2
  414. package/dist/config/loader.test.d.ts.map +0 -1
  415. package/dist/config/loader.test.js +0 -263
  416. package/dist/config/loader.test.js.map +0 -1
  417. package/dist/config/writer.test.d.ts +0 -2
  418. package/dist/config/writer.test.d.ts.map +0 -1
  419. package/dist/config/writer.test.js +0 -98
  420. package/dist/config/writer.test.js.map +0 -1
  421. package/dist/diff/classify.test.d.ts +0 -2
  422. package/dist/diff/classify.test.d.ts.map +0 -1
  423. package/dist/diff/classify.test.js +0 -140
  424. package/dist/diff/classify.test.js.map +0 -1
  425. package/dist/diff/coalesce.test.d.ts +0 -2
  426. package/dist/diff/coalesce.test.d.ts.map +0 -1
  427. package/dist/diff/coalesce.test.js +0 -159
  428. package/dist/diff/coalesce.test.js.map +0 -1
  429. package/dist/diff/context.test.d.ts +0 -2
  430. package/dist/diff/context.test.d.ts.map +0 -1
  431. package/dist/diff/context.test.js +0 -190
  432. package/dist/diff/context.test.js.map +0 -1
  433. package/dist/diff/parser.test.d.ts +0 -2
  434. package/dist/diff/parser.test.d.ts.map +0 -1
  435. package/dist/diff/parser.test.js +0 -178
  436. package/dist/diff/parser.test.js.map +0 -1
  437. package/dist/examples/examples.integration.test.d.ts +0 -2
  438. package/dist/examples/examples.integration.test.d.ts.map +0 -1
  439. package/dist/examples/examples.integration.test.js +0 -55
  440. package/dist/examples/examples.integration.test.js.map +0 -1
  441. package/dist/examples/index.test.d.ts +0 -2
  442. package/dist/examples/index.test.d.ts.map +0 -1
  443. package/dist/examples/index.test.js +0 -88
  444. package/dist/examples/index.test.js.map +0 -1
  445. package/dist/output/dedup.test.d.ts +0 -2
  446. package/dist/output/dedup.test.d.ts.map +0 -1
  447. package/dist/output/dedup.test.js +0 -357
  448. package/dist/output/dedup.test.js.map +0 -1
  449. package/dist/output/github-checks.test.d.ts +0 -2
  450. package/dist/output/github-checks.test.d.ts.map +0 -1
  451. package/dist/output/github-checks.test.js +0 -255
  452. package/dist/output/github-checks.test.js.map +0 -1
  453. package/dist/output/renderer.test.d.ts +0 -2
  454. package/dist/output/renderer.test.d.ts.map +0 -1
  455. package/dist/output/renderer.test.js +0 -645
  456. package/dist/output/renderer.test.js.map +0 -1
  457. package/dist/output/stale.test.d.ts +0 -2
  458. package/dist/output/stale.test.d.ts.map +0 -1
  459. package/dist/output/stale.test.js +0 -330
  460. package/dist/output/stale.test.js.map +0 -1
  461. package/dist/sdk/runner.test.d.ts +0 -2
  462. package/dist/sdk/runner.test.d.ts.map +0 -1
  463. package/dist/sdk/runner.test.js +0 -677
  464. package/dist/sdk/runner.test.js.map +0 -1
  465. package/dist/skills/loader.test.d.ts +0 -2
  466. package/dist/skills/loader.test.d.ts.map +0 -1
  467. package/dist/skills/loader.test.js +0 -241
  468. package/dist/skills/loader.test.js.map +0 -1
  469. package/dist/skills/remote.test.d.ts +0 -2
  470. package/dist/skills/remote.test.d.ts.map +0 -1
  471. package/dist/skills/remote.test.js +0 -582
  472. package/dist/skills/remote.test.js.map +0 -1
  473. package/dist/triggers/matcher.test.d.ts +0 -2
  474. package/dist/triggers/matcher.test.d.ts.map +0 -1
  475. package/dist/triggers/matcher.test.js +0 -234
  476. package/dist/triggers/matcher.test.js.map +0 -1
  477. package/dist/utils/index.test.d.ts +0 -2
  478. package/dist/utils/index.test.d.ts.map +0 -1
  479. package/dist/utils/index.test.js +0 -68
  480. package/dist/utils/index.test.js.map +0 -1
  481. package/docs/astro.config.mjs +0 -43
  482. package/docs/package.json +0 -19
  483. package/docs/pnpm-lock.yaml +0 -4000
  484. package/docs/public/favicon.svg +0 -5
  485. package/docs/src/components/Code.astro +0 -141
  486. package/docs/src/components/PackageManagerTabs.astro +0 -183
  487. package/docs/src/components/Terminal.astro +0 -212
  488. package/docs/src/layouts/Base.astro +0 -380
  489. package/docs/src/pages/cli.astro +0 -167
  490. package/docs/src/pages/config.astro +0 -395
  491. package/docs/src/pages/guide.astro +0 -450
  492. package/docs/src/pages/index.astro +0 -490
  493. package/docs/src/styles/global.css +0 -551
  494. package/docs/src/utils/version.ts +0 -6
  495. package/docs/tsconfig.json +0 -3
  496. package/docs/vercel.json +0 -5
  497. package/eslint.config.js +0 -33
  498. package/src/action/index.ts +0 -1
  499. package/src/action/main.ts +0 -868
  500. package/src/cli/args.test.ts +0 -477
  501. package/src/cli/args.ts +0 -414
  502. package/src/cli/commands/add.ts +0 -447
  503. package/src/cli/commands/init.test.ts +0 -137
  504. package/src/cli/commands/init.ts +0 -134
  505. package/src/cli/commands/setup-app/browser.ts +0 -38
  506. package/src/cli/commands/setup-app/credentials.ts +0 -45
  507. package/src/cli/commands/setup-app/manifest.ts +0 -48
  508. package/src/cli/commands/setup-app/server.ts +0 -172
  509. package/src/cli/commands/setup-app.ts +0 -156
  510. package/src/cli/commands/sync.ts +0 -114
  511. package/src/cli/context.ts +0 -131
  512. package/src/cli/files.test.ts +0 -155
  513. package/src/cli/files.ts +0 -89
  514. package/src/cli/fix.test.ts +0 -310
  515. package/src/cli/fix.ts +0 -387
  516. package/src/cli/git.test.ts +0 -119
  517. package/src/cli/git.ts +0 -318
  518. package/src/cli/index.ts +0 -14
  519. package/src/cli/main.ts +0 -672
  520. package/src/cli/output/box.ts +0 -235
  521. package/src/cli/output/formatters.test.ts +0 -187
  522. package/src/cli/output/formatters.ts +0 -269
  523. package/src/cli/output/icons.ts +0 -19
  524. package/src/cli/output/index.ts +0 -44
  525. package/src/cli/output/ink-runner.tsx +0 -366
  526. package/src/cli/output/jsonl.test.ts +0 -347
  527. package/src/cli/output/jsonl.ts +0 -126
  528. package/src/cli/output/reporter.ts +0 -434
  529. package/src/cli/output/tasks.ts +0 -374
  530. package/src/cli/output/tty.test.ts +0 -117
  531. package/src/cli/output/tty.ts +0 -60
  532. package/src/cli/output/verbosity.test.ts +0 -40
  533. package/src/cli/output/verbosity.ts +0 -31
  534. package/src/cli/terminal.test.ts +0 -148
  535. package/src/cli/terminal.ts +0 -301
  536. package/src/config/index.ts +0 -3
  537. package/src/config/loader.test.ts +0 -313
  538. package/src/config/loader.ts +0 -103
  539. package/src/config/schema.ts +0 -168
  540. package/src/config/writer.test.ts +0 -119
  541. package/src/config/writer.ts +0 -84
  542. package/src/diff/classify.test.ts +0 -162
  543. package/src/diff/classify.ts +0 -92
  544. package/src/diff/coalesce.test.ts +0 -208
  545. package/src/diff/coalesce.ts +0 -133
  546. package/src/diff/context.test.ts +0 -226
  547. package/src/diff/context.ts +0 -201
  548. package/src/diff/index.ts +0 -4
  549. package/src/diff/parser.test.ts +0 -212
  550. package/src/diff/parser.ts +0 -149
  551. package/src/event/context.ts +0 -132
  552. package/src/event/index.ts +0 -2
  553. package/src/event/schedule-context.ts +0 -101
  554. package/src/examples/examples.integration.test.ts +0 -66
  555. package/src/examples/index.test.ts +0 -101
  556. package/src/examples/index.ts +0 -122
  557. package/src/examples/setup.ts +0 -25
  558. package/src/index.ts +0 -115
  559. package/src/output/dedup.test.ts +0 -419
  560. package/src/output/dedup.ts +0 -607
  561. package/src/output/github-checks.test.ts +0 -300
  562. package/src/output/github-checks.ts +0 -476
  563. package/src/output/github-issues.ts +0 -329
  564. package/src/output/index.ts +0 -5
  565. package/src/output/issue-renderer.ts +0 -197
  566. package/src/output/renderer.test.ts +0 -727
  567. package/src/output/renderer.ts +0 -217
  568. package/src/output/stale.test.ts +0 -375
  569. package/src/output/stale.ts +0 -155
  570. package/src/output/types.ts +0 -34
  571. package/src/sdk/index.ts +0 -1
  572. package/src/sdk/runner.test.ts +0 -806
  573. package/src/sdk/runner.ts +0 -1232
  574. package/src/skills/index.ts +0 -36
  575. package/src/skills/loader.test.ts +0 -300
  576. package/src/skills/loader.ts +0 -423
  577. package/src/skills/remote.test.ts +0 -704
  578. package/src/skills/remote.ts +0 -604
  579. package/src/triggers/matcher.test.ts +0 -277
  580. package/src/triggers/matcher.ts +0 -152
  581. package/src/types/index.ts +0 -194
  582. package/src/utils/async.ts +0 -18
  583. package/src/utils/index.test.ts +0 -84
  584. package/src/utils/index.ts +0 -51
  585. package/src/utils/version.ts +0 -17
  586. package/tsconfig.json +0 -25
  587. package/vitest.config.ts +0 -8
  588. package/vitest.integration.config.ts +0 -11
  589. package/warden.toml +0 -19
@@ -1,447 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join, relative } from 'node:path';
3
- import chalk from 'chalk';
4
- import select from '@inquirer/select';
5
- import { getRepoRoot } from '../git.js';
6
- import { loadWardenConfig, appendTrigger } from '../../config/index.js';
7
- import type { Trigger } from '../../config/schema.js';
8
- import { discoverAllSkills, type DiscoveredSkill } from '../../skills/loader.js';
9
- import {
10
- fetchRemote,
11
- discoverRemoteSkills,
12
- parseRemoteRef,
13
- type DiscoveredRemoteSkill,
14
- } from '../../skills/remote.js';
15
- import type { Reporter } from '../output/reporter.js';
16
- import type { CLIOptions } from '../args.js';
17
- import { ICON_CHECK } from '../output/icons.js';
18
-
19
- /** Custom theme for select prompts - white for selected, gray for unselected */
20
- const selectTheme = {
21
- prefix: {
22
- idle: '',
23
- done: '',
24
- },
25
- icon: {
26
- cursor: chalk.white('›'),
27
- },
28
- style: {
29
- message: () => '', // We print heading separately
30
- highlight: (text: string) => chalk.white(text),
31
- disabled: (text: string) => chalk.dim(text),
32
- description: (text: string) => chalk.white(text),
33
- keysHelpTip: (keys: [key: string, action: string][]) => {
34
- const keyStr = keys.map(([key, action]) => `${key} ${action}`).join(', ');
35
- return `\n${chalk.dim(keyStr)}`;
36
- },
37
- },
38
- };
39
-
40
- /**
41
- * Render the list of available local skills.
42
- */
43
- function renderSkillList(
44
- skills: Map<string, DiscoveredSkill>,
45
- configuredSkills: Set<string>,
46
- reporter: Reporter
47
- ): void {
48
- reporter.bold('Available Skills');
49
- reporter.blank();
50
-
51
- // Sort skills alphabetically by name
52
- const sortedSkills = Array.from(skills.entries()).sort((a, b) => a[0].localeCompare(b[0]));
53
-
54
- for (const [name, discovered] of sortedSkills) {
55
- const isConfigured = configuredSkills.has(name);
56
- const dirTag = chalk.dim(`[${discovered.directory}]`);
57
- const configuredTag = isConfigured ? chalk.dim(' (already configured)') : '';
58
-
59
- if (reporter.mode.isTTY) {
60
- const icon = isConfigured ? chalk.dim(ICON_CHECK) : ' ';
61
- reporter.text(` ${icon} ${chalk.bold(name)} ${dirTag}${configuredTag}`);
62
- reporter.text(` ${chalk.dim(discovered.skill.description)}`);
63
- } else {
64
- const status = isConfigured ? '[configured]' : '';
65
- reporter.text(`${name} ${status} [${discovered.directory}]`);
66
- reporter.text(` ${discovered.skill.description}`);
67
- }
68
- }
69
- }
70
-
71
- /**
72
- * Render the list of available remote skills.
73
- */
74
- function renderRemoteSkillList(
75
- skills: DiscoveredRemoteSkill[],
76
- configuredSkills: Set<string>,
77
- remote: string,
78
- reporter: Reporter
79
- ): void {
80
- reporter.bold(`Available Skills from ${remote}`);
81
- reporter.blank();
82
-
83
- // Sort skills alphabetically by name
84
- const sortedSkills = [...skills].sort((a, b) => a.name.localeCompare(b.name));
85
-
86
- for (const skill of sortedSkills) {
87
- const isConfigured = configuredSkills.has(skill.name);
88
- const configuredTag = isConfigured ? chalk.dim(' (already configured)') : '';
89
-
90
- if (reporter.mode.isTTY) {
91
- const icon = isConfigured ? chalk.dim(ICON_CHECK) : ' ';
92
- reporter.text(` ${icon} ${chalk.bold(skill.name)}${configuredTag}`);
93
- reporter.text(` ${chalk.dim(skill.description)}`);
94
- } else {
95
- const status = isConfigured ? '[configured]' : '';
96
- reporter.text(`${skill.name} ${status}`);
97
- reporter.text(` ${skill.description}`);
98
- }
99
- }
100
- }
101
-
102
- /**
103
- * Prompt user to select a local skill interactively.
104
- */
105
- async function promptSkillSelection(
106
- skills: Map<string, DiscoveredSkill>,
107
- configuredSkills: Set<string>,
108
- reporter: Reporter,
109
- ): Promise<string | null> {
110
- // Filter out already configured skills for selection
111
- const availableSkills = Array.from(skills.entries())
112
- .filter(([name]) => !configuredSkills.has(name))
113
- .sort((a, b) => a[0].localeCompare(b[0]));
114
-
115
- if (availableSkills.length === 0) {
116
- reporter.warning('All available skills are already configured.');
117
- return null;
118
- }
119
-
120
- const choices = availableSkills.map(([name, discovered]) => {
121
- return {
122
- name: `${name} ${chalk.dim(`[${discovered.directory}]`)}`,
123
- value: name,
124
- description: discovered.skill.description,
125
- };
126
- });
127
-
128
- reporter.bold('ADD SKILL');
129
- reporter.blank();
130
-
131
- try {
132
- const answer = await select({
133
- message: '',
134
- choices,
135
- theme: selectTheme,
136
- });
137
- // Clear the inquirer "done" line
138
- process.stderr.write('\x1b[1A\x1b[2K');
139
- return answer;
140
- } catch {
141
- // User cancelled (Ctrl+C or escape)
142
- return null;
143
- }
144
- }
145
-
146
- /**
147
- * Prompt user to select a remote skill interactively.
148
- */
149
- async function promptRemoteSkillSelection(
150
- skills: DiscoveredRemoteSkill[],
151
- configuredSkills: Set<string>,
152
- reporter: Reporter,
153
- ): Promise<string | null> {
154
- // Filter out already configured skills for selection
155
- const availableSkills = skills
156
- .filter((s) => !configuredSkills.has(s.name))
157
- .sort((a, b) => a.name.localeCompare(b.name));
158
-
159
- if (availableSkills.length === 0) {
160
- reporter.warning('All available skills are already configured.');
161
- return null;
162
- }
163
-
164
- const choices = availableSkills.map((skill) => {
165
- return {
166
- name: skill.name,
167
- value: skill.name,
168
- description: skill.description,
169
- };
170
- });
171
-
172
- reporter.bold('ADD REMOTE SKILL');
173
- reporter.blank();
174
-
175
- try {
176
- const answer = await select({
177
- message: '',
178
- choices,
179
- theme: selectTheme,
180
- });
181
- // Clear the inquirer "done" line
182
- process.stderr.write('\x1b[1A\x1b[2K');
183
- return answer;
184
- } catch {
185
- // User cancelled (Ctrl+C or escape)
186
- return null;
187
- }
188
- }
189
-
190
- /**
191
- * Create a default trigger for a local skill.
192
- */
193
- function createDefaultTrigger(skillName: string): Trigger {
194
- return {
195
- name: skillName,
196
- event: 'pull_request',
197
- actions: ['opened', 'synchronize', 'reopened'],
198
- skill: skillName,
199
- };
200
- }
201
-
202
- /**
203
- * Create a trigger for a remote skill.
204
- */
205
- function createRemoteTrigger(skillName: string, remote: string): Trigger {
206
- return {
207
- name: skillName,
208
- event: 'pull_request',
209
- actions: ['opened', 'synchronize', 'reopened'],
210
- skill: skillName,
211
- remote,
212
- };
213
- }
214
-
215
- /**
216
- * Run the add command for remote skills.
217
- */
218
- async function runAddRemote(
219
- options: CLIOptions,
220
- reporter: Reporter,
221
- configPath: string,
222
- configuredSkills: Set<string>
223
- ): Promise<number> {
224
- const remote = options.remote ?? '';
225
- if (!remote) {
226
- reporter.error('Remote repository is required');
227
- return 1;
228
- }
229
- const cwd = process.cwd();
230
-
231
- // Validate remote ref format
232
- try {
233
- parseRemoteRef(remote);
234
- } catch (err) {
235
- const message = err instanceof Error ? err.message : String(err);
236
- reporter.error(message);
237
- return 1;
238
- }
239
-
240
- // Fetch remote repository
241
- reporter.step(`Fetching skills from ${remote}...`);
242
- try {
243
- await fetchRemote(remote, {
244
- onProgress: (msg) => reporter.debug(msg),
245
- });
246
- } catch (err) {
247
- const message = err instanceof Error ? err.message : String(err);
248
- reporter.error(`Failed to fetch remote: ${message}`);
249
- return 1;
250
- }
251
-
252
- // Discover skills in the remote
253
- const remoteSkills = await discoverRemoteSkills(remote);
254
-
255
- if (remoteSkills.length === 0) {
256
- reporter.error(`No skills found in remote: ${remote}`);
257
- return 1;
258
- }
259
-
260
- reporter.success(`Found ${remoteSkills.length} skill${remoteSkills.length === 1 ? '' : 's'}`);
261
-
262
- // Handle --list: display remote skills and exit
263
- if (options.list) {
264
- reporter.blank();
265
- renderRemoteSkillList(remoteSkills, configuredSkills, remote, reporter);
266
- return 0;
267
- }
268
-
269
- // Get skill to add (from --skill or interactive prompt)
270
- let skillName: string | null;
271
-
272
- if (options.skill) {
273
- skillName = options.skill;
274
- } else if (reporter.mode.isTTY) {
275
- reporter.blank();
276
- skillName = await promptRemoteSkillSelection(remoteSkills, configuredSkills, reporter);
277
- if (!skillName) {
278
- return 0; // User quit or no skills available
279
- }
280
- } else {
281
- reporter.error('Skill name required when not running interactively.');
282
- reporter.tip(`Use: warden add --remote ${remote} --skill <name>`);
283
- return 1;
284
- }
285
-
286
- // Validate skill exists in remote
287
- const skill = remoteSkills.find((s) => s.name === skillName);
288
- if (!skill) {
289
- reporter.error(`Skill '${skillName}' not found in remote: ${remote}`);
290
- reporter.blank();
291
- reporter.tip('Available skills:');
292
- for (const s of remoteSkills) {
293
- reporter.text(` - ${s.name}`);
294
- }
295
- return 1;
296
- }
297
-
298
- // Check for duplicate trigger
299
- if (configuredSkills.has(skillName)) {
300
- reporter.warning(`Trigger '${skillName}' already exists in warden.toml`);
301
- reporter.skipped(relative(cwd, configPath), 'trigger already configured');
302
- return 0;
303
- }
304
-
305
- // Append trigger to warden.toml
306
- const trigger = createRemoteTrigger(skillName, remote);
307
- try {
308
- appendTrigger(configPath, trigger);
309
- reporter.success(`Added trigger '${skillName}' to ${relative(cwd, configPath)}`);
310
- } catch (err) {
311
- const message = err instanceof Error ? err.message : String(err);
312
- reporter.error(`Failed to update warden.toml: ${message}`);
313
- return 1;
314
- }
315
-
316
- // Show success message
317
- reporter.blank();
318
- reporter.text(`The trigger will run on pull requests using skill from ${chalk.cyan(remote)}.`);
319
- reporter.text(`Edit ${chalk.cyan('warden.toml')} to customize filters and output options.`);
320
-
321
- return 0;
322
- }
323
-
324
- /**
325
- * Run the add command.
326
- */
327
- export async function runAdd(options: CLIOptions, reporter: Reporter): Promise<number> {
328
- const cwd = process.cwd();
329
-
330
- // 1. Check git repo
331
- let repoRoot: string;
332
- try {
333
- repoRoot = getRepoRoot(cwd);
334
- } catch {
335
- reporter.error('Not a git repository. Run this command from a git repository.');
336
- return 1;
337
- }
338
-
339
- // 2. Check warden.toml exists (deferred for --list without --remote)
340
- const configPath = join(repoRoot, 'warden.toml');
341
- const hasConfig = existsSync(configPath);
342
-
343
- // 3. Load existing config if available
344
- let configuredSkills = new Set<string>();
345
- if (hasConfig) {
346
- try {
347
- const config = loadWardenConfig(repoRoot);
348
- configuredSkills = new Set(config.triggers.map((t) => t.name));
349
- } catch (err) {
350
- const message = err instanceof Error ? err.message : String(err);
351
- reporter.error(`Failed to load warden.toml: ${message}`);
352
- return 1;
353
- }
354
- }
355
-
356
- // 4. Handle remote skills with --remote flag
357
- if (options.remote) {
358
- // For remote skills, require warden.toml (unless --list)
359
- if (!hasConfig && !options.list) {
360
- reporter.error('warden.toml not found.');
361
- reporter.tip('Run `warden init` first to create the configuration file.');
362
- return 1;
363
- }
364
-
365
- return runAddRemote(options, reporter, configPath, configuredSkills);
366
- }
367
-
368
- // 5. Discover local skills
369
- const skills = await discoverAllSkills(repoRoot, {
370
- onWarning: (message) => reporter.warning(message),
371
- });
372
-
373
- if (skills.size === 0) {
374
- reporter.error('No skills found.');
375
- reporter.tip('Add skills to .warden/skills/, .agents/skills/, or .claude/skills/');
376
- reporter.tip('Or use --remote to add remote skills: warden add --remote owner/repo --skill name');
377
- return 1;
378
- }
379
-
380
- // 6. Handle --list: display skills and exit (works without warden.toml)
381
- if (options.list) {
382
- renderSkillList(skills, configuredSkills, reporter);
383
- return 0;
384
- }
385
-
386
- // 7. For adding skills, require warden.toml
387
- if (!hasConfig) {
388
- reporter.error('warden.toml not found.');
389
- reporter.tip('Run `warden init` first to create the configuration file.');
390
- return 1;
391
- }
392
-
393
- // 8. Get skill to add (from arg or interactive prompt)
394
- let skillName: string | null;
395
-
396
- if (options.skill) {
397
- // Non-interactive: skill specified as argument
398
- skillName = options.skill;
399
- } else if (reporter.mode.isTTY) {
400
- // Interactive mode
401
- skillName = await promptSkillSelection(skills, configuredSkills, reporter);
402
- if (!skillName) {
403
- return 0; // User quit or no skills available
404
- }
405
- } else {
406
- // Non-TTY and no skill specified
407
- reporter.error('Skill name required when not running interactively.');
408
- reporter.tip('Use: warden add <skill-name> or warden add --list');
409
- return 1;
410
- }
411
-
412
- // 9. Validate skill exists
413
- if (!skills.has(skillName)) {
414
- reporter.error(`Skill not found: ${skillName}`);
415
- reporter.blank();
416
- reporter.tip('Available skills:');
417
- for (const name of skills.keys()) {
418
- reporter.text(` - ${name}`);
419
- }
420
- return 1;
421
- }
422
-
423
- // 10. Check for duplicate trigger
424
- if (configuredSkills.has(skillName)) {
425
- reporter.warning(`Trigger '${skillName}' already exists in warden.toml`);
426
- reporter.skipped(relative(cwd, configPath), 'trigger already configured');
427
- return 0;
428
- }
429
-
430
- // 11. Append trigger to warden.toml
431
- const trigger = createDefaultTrigger(skillName);
432
- try {
433
- appendTrigger(configPath, trigger);
434
- reporter.success(`Added trigger '${skillName}' to ${relative(cwd, configPath)}`);
435
- } catch (err) {
436
- const message = err instanceof Error ? err.message : String(err);
437
- reporter.error(`Failed to update warden.toml: ${message}`);
438
- return 1;
439
- }
440
-
441
- // 12. Show success message with next steps
442
- reporter.blank();
443
- reporter.text(`The trigger will run on pull requests.`);
444
- reporter.text(`Edit ${chalk.cyan('warden.toml')} to customize filters and output options.`);
445
-
446
- return 0;
447
- }
@@ -1,137 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { mkdirSync, rmSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { tmpdir } from 'node:os';
5
- import { execSync } from 'node:child_process';
6
- import { runInit } from './init.js';
7
- import { Reporter } from '../output/reporter.js';
8
- import { detectOutputMode } from '../output/tty.js';
9
- import { Verbosity } from '../output/verbosity.js';
10
- import type { CLIOptions } from '../args.js';
11
- import { getMajorVersion } from '../../utils/index.js';
12
-
13
- function createMockReporter(): Reporter {
14
- return new Reporter(detectOutputMode(false), Verbosity.Normal);
15
- }
16
-
17
- function createOptions(overrides: Partial<CLIOptions> = {}): CLIOptions {
18
- return {
19
- json: false,
20
- help: false,
21
- quiet: false,
22
- verbose: 0,
23
- fix: false,
24
- force: false,
25
- list: false,
26
- git: false,
27
- offline: false,
28
- ...overrides,
29
- };
30
- }
31
-
32
- describe('init command', () => {
33
- let tempDir: string;
34
- let originalCwd: string;
35
-
36
- beforeEach(() => {
37
- tempDir = join(tmpdir(), `warden-init-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
38
- mkdirSync(tempDir, { recursive: true });
39
- originalCwd = process.cwd();
40
- process.chdir(tempDir);
41
- // Initialize git repo for tests
42
- execSync('git init', { cwd: tempDir, stdio: 'ignore' });
43
- });
44
-
45
- afterEach(() => {
46
- process.chdir(originalCwd);
47
- rmSync(tempDir, { recursive: true, force: true });
48
- });
49
-
50
- describe('file creation', () => {
51
- it('creates warden.toml and workflow in fresh repo', async () => {
52
- const reporter = createMockReporter();
53
- const exitCode = await runInit(createOptions(), reporter);
54
-
55
- expect(exitCode).toBe(0);
56
- expect(existsSync(join(tempDir, 'warden.toml'))).toBe(true);
57
- expect(existsSync(join(tempDir, '.github', 'workflows', 'warden.yml'))).toBe(true);
58
- });
59
-
60
- it('creates warden.toml with correct content', async () => {
61
- const reporter = createMockReporter();
62
- await runInit(createOptions(), reporter);
63
-
64
- const content = readFileSync(join(tempDir, 'warden.toml'), 'utf-8');
65
- expect(content).toContain('version = 1');
66
- });
67
-
68
- it('creates workflow with correct content', async () => {
69
- const reporter = createMockReporter();
70
- await runInit(createOptions(), reporter);
71
-
72
- const content = readFileSync(join(tempDir, '.github', 'workflows', 'warden.yml'), 'utf-8');
73
- expect(content).toContain('name: Warden');
74
- expect(content).toContain('pull_request');
75
- expect(content).toContain('permissions:');
76
- expect(content).toContain('pull-requests: write');
77
- expect(content).toContain('checks: write');
78
- expect(content).toContain('WARDEN_ANTHROPIC_API_KEY');
79
- expect(content).toContain(`getsentry/warden@v${getMajorVersion()}`);
80
- });
81
- });
82
-
83
- describe('existing files', () => {
84
- it('skips existing files without --force', async () => {
85
- // Create existing files
86
- writeFileSync(join(tempDir, 'warden.toml'), 'existing content');
87
- mkdirSync(join(tempDir, '.github', 'workflows'), { recursive: true });
88
- writeFileSync(join(tempDir, '.github', 'workflows', 'warden.yml'), 'existing workflow');
89
-
90
- const reporter = createMockReporter();
91
- await runInit(createOptions(), reporter);
92
-
93
- // Files should not be overwritten
94
- expect(readFileSync(join(tempDir, 'warden.toml'), 'utf-8')).toBe('existing content');
95
- expect(readFileSync(join(tempDir, '.github', 'workflows', 'warden.yml'), 'utf-8')).toBe('existing workflow');
96
- });
97
-
98
- it('overwrites existing files with --force', async () => {
99
- // Create existing files
100
- writeFileSync(join(tempDir, 'warden.toml'), 'existing content');
101
- mkdirSync(join(tempDir, '.github', 'workflows'), { recursive: true });
102
- writeFileSync(join(tempDir, '.github', 'workflows', 'warden.yml'), 'existing workflow');
103
-
104
- const reporter = createMockReporter();
105
- await runInit(createOptions({ force: true }), reporter);
106
-
107
- // Files should be overwritten with new content
108
- const tomlContent = readFileSync(join(tempDir, 'warden.toml'), 'utf-8');
109
- expect(tomlContent).toContain('version = 1');
110
- expect(tomlContent).not.toBe('existing content');
111
-
112
- const workflowContent = readFileSync(join(tempDir, '.github', 'workflows', 'warden.yml'), 'utf-8');
113
- expect(workflowContent).toContain('name: Warden');
114
- expect(workflowContent).not.toBe('existing workflow');
115
- });
116
- });
117
-
118
- describe('error handling', () => {
119
- it('fails when not in a git repository', async () => {
120
- // Create a non-git directory
121
- const nonGitDir = join(tmpdir(), `warden-non-git-${Date.now()}`);
122
- mkdirSync(nonGitDir, { recursive: true });
123
- process.chdir(nonGitDir);
124
-
125
- try {
126
- const reporter = createMockReporter();
127
- const exitCode = await runInit(createOptions(), reporter);
128
-
129
- expect(exitCode).toBe(1);
130
- expect(existsSync(join(nonGitDir, 'warden.toml'))).toBe(false);
131
- } finally {
132
- process.chdir(originalCwd);
133
- rmSync(nonGitDir, { recursive: true, force: true });
134
- }
135
- });
136
- });
137
- });