@sentry/warden 0.1.0 → 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 (588) 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/icons.d.ts +4 -0
  18. package/dist/cli/output/icons.d.ts.map +1 -1
  19. package/dist/cli/output/icons.js +4 -0
  20. package/dist/cli/output/icons.js.map +1 -1
  21. package/dist/cli/output/ink-runner.d.ts +20 -0
  22. package/dist/cli/output/ink-runner.d.ts.map +1 -1
  23. package/dist/cli/output/ink-runner.js +53 -19
  24. package/dist/cli/output/ink-runner.js.map +1 -1
  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.map +1 -1
  36. package/dist/output/dedup.js +8 -3
  37. package/dist/output/dedup.js.map +1 -1
  38. package/dist/output/renderer.d.ts.map +1 -1
  39. package/dist/output/renderer.js +49 -5
  40. package/dist/output/renderer.js.map +1 -1
  41. package/dist/output/stale.d.ts.map +1 -1
  42. package/dist/output/stale.js +7 -0
  43. package/dist/output/stale.js.map +1 -1
  44. package/dist/output/types.d.ts +15 -1
  45. package/dist/output/types.d.ts.map +1 -1
  46. package/dist/sdk/analyze.d.ts +18 -0
  47. package/dist/sdk/analyze.d.ts.map +1 -0
  48. package/dist/sdk/analyze.js +425 -0
  49. package/dist/sdk/analyze.js.map +1 -0
  50. package/dist/sdk/errors.d.ts +23 -0
  51. package/dist/sdk/errors.d.ts.map +1 -0
  52. package/dist/sdk/errors.js +72 -0
  53. package/dist/sdk/errors.js.map +1 -0
  54. package/dist/sdk/extract.d.ts +44 -0
  55. package/dist/sdk/extract.d.ts.map +1 -0
  56. package/dist/sdk/extract.js +224 -0
  57. package/dist/sdk/extract.js.map +1 -0
  58. package/dist/sdk/prepare.d.ts +13 -0
  59. package/dist/sdk/prepare.d.ts.map +1 -0
  60. package/dist/sdk/prepare.js +73 -0
  61. package/dist/sdk/prepare.js.map +1 -0
  62. package/dist/sdk/prompt.d.ts +30 -0
  63. package/dist/sdk/prompt.d.ts.map +1 -0
  64. package/dist/sdk/prompt.js +109 -0
  65. package/dist/sdk/prompt.js.map +1 -0
  66. package/dist/sdk/retry.d.ts +12 -0
  67. package/dist/sdk/retry.d.ts.map +1 -0
  68. package/dist/sdk/retry.js +31 -0
  69. package/dist/sdk/retry.js.map +1 -0
  70. package/dist/sdk/runner.d.ts +22 -199
  71. package/dist/sdk/runner.d.ts.map +1 -1
  72. package/dist/sdk/runner.js +26 -884
  73. package/dist/sdk/runner.js.map +1 -1
  74. package/dist/sdk/types.d.ts +127 -0
  75. package/dist/sdk/types.d.ts.map +1 -0
  76. package/dist/sdk/types.js +5 -0
  77. package/dist/sdk/types.js.map +1 -0
  78. package/dist/sdk/usage.d.ts +20 -0
  79. package/dist/sdk/usage.d.ts.map +1 -0
  80. package/dist/sdk/usage.js +44 -0
  81. package/dist/sdk/usage.js.map +1 -0
  82. package/dist/skills/remote.d.ts.map +1 -1
  83. package/dist/skills/remote.js +3 -7
  84. package/dist/skills/remote.js.map +1 -1
  85. package/dist/types/index.d.ts +1 -0
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/index.js +2 -0
  88. package/dist/types/index.js.map +1 -1
  89. package/dist/utils/exec.d.ts +61 -0
  90. package/dist/utils/exec.d.ts.map +1 -0
  91. package/dist/utils/exec.js +111 -0
  92. package/dist/utils/exec.js.map +1 -0
  93. package/dist/utils/index.d.ts +2 -0
  94. package/dist/utils/index.d.ts.map +1 -1
  95. package/dist/utils/index.js +1 -0
  96. package/dist/utils/index.js.map +1 -1
  97. package/package.json +15 -16
  98. package/.agents/skills/find-bugs/SKILL.md +0 -75
  99. package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -2934
  100. package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -136
  101. package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  102. package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  103. package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  104. package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  105. package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  106. package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  107. package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  108. package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  109. package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  110. package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  111. package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  112. package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  113. package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  114. package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  115. package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  116. package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  117. package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  118. package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  119. package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  120. package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  121. package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  122. package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  123. package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  124. package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  125. package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  126. package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  127. package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  128. package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  129. package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  130. package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  131. package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  132. package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  133. package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  134. package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  135. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  136. package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  137. package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  138. package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  139. package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  140. package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  141. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  142. package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  143. package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  144. package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  145. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  146. package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  147. package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  148. package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  149. package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  150. package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  151. package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  152. package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  153. package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  154. package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  155. package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  156. package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  157. package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  158. package/.claude/settings.json +0 -57
  159. package/.claude/skills/agent-prompt/SKILL.md +0 -54
  160. package/.claude/skills/agent-prompt/references/agentic-patterns.md +0 -94
  161. package/.claude/skills/agent-prompt/references/anti-patterns.md +0 -140
  162. package/.claude/skills/agent-prompt/references/context-design.md +0 -124
  163. package/.claude/skills/agent-prompt/references/core-principles.md +0 -75
  164. package/.claude/skills/agent-prompt/references/model-guidance.md +0 -118
  165. package/.claude/skills/agent-prompt/references/output-formats.md +0 -98
  166. package/.claude/skills/agent-prompt/references/skill-structure.md +0 -115
  167. package/.claude/skills/agent-prompt/references/system-prompts.md +0 -115
  168. package/.claude/skills/notseer/SKILL.md +0 -131
  169. package/.claude/skills/skill-writer/SKILL.md +0 -140
  170. package/.claude/skills/testing-guidelines/SKILL.md +0 -132
  171. package/.claude/skills/warden-skill/SKILL.md +0 -250
  172. package/.claude/skills/warden-skill/references/config-schema.md +0 -133
  173. package/.dex/config.toml +0 -2
  174. package/.github/workflows/ci.yml +0 -33
  175. package/.github/workflows/release.yml +0 -59
  176. package/.github/workflows/warden.yml +0 -40
  177. package/AGENTS.md +0 -89
  178. package/CONTRIBUTING.md +0 -60
  179. package/SPEC.md +0 -263
  180. package/action.yml +0 -87
  181. package/assets/favicon.png +0 -0
  182. package/assets/warden-icon-bw.svg +0 -5
  183. package/assets/warden-icon-purple.png +0 -0
  184. package/assets/warden-icon-purple.svg +0 -5
  185. package/dist/action/159.index.js +0 -523
  186. package/dist/action/159.index.js.map +0 -1
  187. package/dist/action/action/index.d.ts +0 -2
  188. package/dist/action/action/index.d.ts.map +0 -1
  189. package/dist/action/action/main.d.ts +0 -2
  190. package/dist/action/action/main.d.ts.map +0 -1
  191. package/dist/action/cli/args.d.ts +0 -74
  192. package/dist/action/cli/args.d.ts.map +0 -1
  193. package/dist/action/cli/args.test.d.ts +0 -2
  194. package/dist/action/cli/args.test.d.ts.map +0 -1
  195. package/dist/action/cli/commands/add.d.ts +0 -7
  196. package/dist/action/cli/commands/add.d.ts.map +0 -1
  197. package/dist/action/cli/commands/init.d.ts +0 -10
  198. package/dist/action/cli/commands/init.d.ts.map +0 -1
  199. package/dist/action/cli/commands/init.test.d.ts +0 -2
  200. package/dist/action/cli/commands/init.test.d.ts.map +0 -1
  201. package/dist/action/cli/commands/setup-app/browser.d.ts +0 -9
  202. package/dist/action/cli/commands/setup-app/browser.d.ts.map +0 -1
  203. package/dist/action/cli/commands/setup-app/credentials.d.ts +0 -15
  204. package/dist/action/cli/commands/setup-app/credentials.d.ts.map +0 -1
  205. package/dist/action/cli/commands/setup-app/manifest.d.ts +0 -24
  206. package/dist/action/cli/commands/setup-app/manifest.d.ts.map +0 -1
  207. package/dist/action/cli/commands/setup-app/server.d.ts +0 -28
  208. package/dist/action/cli/commands/setup-app/server.d.ts.map +0 -1
  209. package/dist/action/cli/commands/setup-app.d.ts +0 -11
  210. package/dist/action/cli/commands/setup-app.d.ts.map +0 -1
  211. package/dist/action/cli/commands/sync.d.ts +0 -9
  212. package/dist/action/cli/commands/sync.d.ts.map +0 -1
  213. package/dist/action/cli/context.d.ts +0 -27
  214. package/dist/action/cli/context.d.ts.map +0 -1
  215. package/dist/action/cli/files.d.ts +0 -22
  216. package/dist/action/cli/files.d.ts.map +0 -1
  217. package/dist/action/cli/files.test.d.ts +0 -2
  218. package/dist/action/cli/files.test.d.ts.map +0 -1
  219. package/dist/action/cli/fix.d.ts +0 -41
  220. package/dist/action/cli/fix.d.ts.map +0 -1
  221. package/dist/action/cli/fix.test.d.ts +0 -2
  222. package/dist/action/cli/fix.test.d.ts.map +0 -1
  223. package/dist/action/cli/git.d.ts +0 -73
  224. package/dist/action/cli/git.d.ts.map +0 -1
  225. package/dist/action/cli/git.test.d.ts +0 -2
  226. package/dist/action/cli/git.test.d.ts.map +0 -1
  227. package/dist/action/cli/index.d.ts +0 -3
  228. package/dist/action/cli/index.d.ts.map +0 -1
  229. package/dist/action/cli/main.d.ts +0 -7
  230. package/dist/action/cli/main.d.ts.map +0 -1
  231. package/dist/action/cli/output/box.d.ts +0 -75
  232. package/dist/action/cli/output/box.d.ts.map +0 -1
  233. package/dist/action/cli/output/formatters.d.ts +0 -90
  234. package/dist/action/cli/output/formatters.d.ts.map +0 -1
  235. package/dist/action/cli/output/formatters.test.d.ts +0 -2
  236. package/dist/action/cli/output/formatters.test.d.ts.map +0 -1
  237. package/dist/action/cli/output/icons.d.ts +0 -11
  238. package/dist/action/cli/output/icons.d.ts.map +0 -1
  239. package/dist/action/cli/output/index.d.ts +0 -10
  240. package/dist/action/cli/output/index.d.ts.map +0 -1
  241. package/dist/action/cli/output/ink-runner.d.ts +0 -9
  242. package/dist/action/cli/output/ink-runner.d.ts.map +0 -1
  243. package/dist/action/cli/output/jsonl.d.ts +0 -43
  244. package/dist/action/cli/output/jsonl.d.ts.map +0 -1
  245. package/dist/action/cli/output/jsonl.test.d.ts +0 -2
  246. package/dist/action/cli/output/jsonl.test.d.ts.map +0 -1
  247. package/dist/action/cli/output/reporter.d.ts +0 -108
  248. package/dist/action/cli/output/reporter.d.ts.map +0 -1
  249. package/dist/action/cli/output/tasks.d.ts +0 -89
  250. package/dist/action/cli/output/tasks.d.ts.map +0 -1
  251. package/dist/action/cli/output/tty.d.ts +0 -21
  252. package/dist/action/cli/output/tty.d.ts.map +0 -1
  253. package/dist/action/cli/output/tty.test.d.ts +0 -2
  254. package/dist/action/cli/output/tty.test.d.ts.map +0 -1
  255. package/dist/action/cli/output/verbosity.d.ts +0 -20
  256. package/dist/action/cli/output/verbosity.d.ts.map +0 -1
  257. package/dist/action/cli/output/verbosity.test.d.ts +0 -2
  258. package/dist/action/cli/output/verbosity.test.d.ts.map +0 -1
  259. package/dist/action/cli/terminal.d.ts +0 -19
  260. package/dist/action/cli/terminal.d.ts.map +0 -1
  261. package/dist/action/cli/terminal.test.d.ts +0 -2
  262. package/dist/action/cli/terminal.test.d.ts.map +0 -1
  263. package/dist/action/config/index.d.ts +0 -4
  264. package/dist/action/config/index.d.ts.map +0 -1
  265. package/dist/action/config/loader.d.ts +0 -27
  266. package/dist/action/config/loader.d.ts.map +0 -1
  267. package/dist/action/config/loader.test.d.ts +0 -2
  268. package/dist/action/config/loader.test.d.ts.map +0 -1
  269. package/dist/action/config/schema.d.ts +0 -318
  270. package/dist/action/config/schema.d.ts.map +0 -1
  271. package/dist/action/config/writer.d.ts +0 -11
  272. package/dist/action/config/writer.d.ts.map +0 -1
  273. package/dist/action/config/writer.test.d.ts +0 -2
  274. package/dist/action/config/writer.test.d.ts.map +0 -1
  275. package/dist/action/diff/classify.d.ts +0 -29
  276. package/dist/action/diff/classify.d.ts.map +0 -1
  277. package/dist/action/diff/classify.test.d.ts +0 -2
  278. package/dist/action/diff/classify.test.d.ts.map +0 -1
  279. package/dist/action/diff/coalesce.d.ts +0 -42
  280. package/dist/action/diff/coalesce.d.ts.map +0 -1
  281. package/dist/action/diff/coalesce.test.d.ts +0 -2
  282. package/dist/action/diff/coalesce.test.d.ts.map +0 -1
  283. package/dist/action/diff/context.d.ts +0 -30
  284. package/dist/action/diff/context.d.ts.map +0 -1
  285. package/dist/action/diff/context.test.d.ts +0 -2
  286. package/dist/action/diff/context.test.d.ts.map +0 -1
  287. package/dist/action/diff/index.d.ts +0 -5
  288. package/dist/action/diff/index.d.ts.map +0 -1
  289. package/dist/action/diff/parser.d.ts +0 -52
  290. package/dist/action/diff/parser.d.ts.map +0 -1
  291. package/dist/action/diff/parser.test.d.ts +0 -2
  292. package/dist/action/diff/parser.test.d.ts.map +0 -1
  293. package/dist/action/event/context.d.ts +0 -9
  294. package/dist/action/event/context.d.ts.map +0 -1
  295. package/dist/action/event/index.d.ts +0 -3
  296. package/dist/action/event/index.d.ts.map +0 -1
  297. package/dist/action/event/schedule-context.d.ts +0 -30
  298. package/dist/action/event/schedule-context.d.ts.map +0 -1
  299. package/dist/action/examples/examples.integration.test.d.ts +0 -2
  300. package/dist/action/examples/examples.integration.test.d.ts.map +0 -1
  301. package/dist/action/examples/index.d.ts +0 -50
  302. package/dist/action/examples/index.d.ts.map +0 -1
  303. package/dist/action/examples/index.test.d.ts +0 -2
  304. package/dist/action/examples/index.test.d.ts.map +0 -1
  305. package/dist/action/examples/setup.d.ts +0 -2
  306. package/dist/action/examples/setup.d.ts.map +0 -1
  307. package/dist/action/index.d.ts +0 -11
  308. package/dist/action/index.d.ts.map +0 -1
  309. package/dist/action/index.js +0 -38231
  310. package/dist/action/index.js.map +0 -1
  311. package/dist/action/licenses.txt +0 -992
  312. package/dist/action/main.d.ts +0 -2
  313. package/dist/action/main.d.ts.map +0 -1
  314. package/dist/action/main.js +0 -707
  315. package/dist/action/main.js.map +0 -1
  316. package/dist/action/output/dedup.d.ts +0 -153
  317. package/dist/action/output/dedup.d.ts.map +0 -1
  318. package/dist/action/output/dedup.test.d.ts +0 -2
  319. package/dist/action/output/dedup.test.d.ts.map +0 -1
  320. package/dist/action/output/github-checks.d.ts +0 -106
  321. package/dist/action/output/github-checks.d.ts.map +0 -1
  322. package/dist/action/output/github-checks.test.d.ts +0 -2
  323. package/dist/action/output/github-checks.test.d.ts.map +0 -1
  324. package/dist/action/output/github-issues.d.ts +0 -35
  325. package/dist/action/output/github-issues.d.ts.map +0 -1
  326. package/dist/action/output/index.d.ts +0 -6
  327. package/dist/action/output/index.d.ts.map +0 -1
  328. package/dist/action/output/issue-renderer.d.ts +0 -20
  329. package/dist/action/output/issue-renderer.d.ts.map +0 -1
  330. package/dist/action/output/renderer.d.ts +0 -4
  331. package/dist/action/output/renderer.d.ts.map +0 -1
  332. package/dist/action/output/renderer.test.d.ts +0 -2
  333. package/dist/action/output/renderer.test.d.ts.map +0 -1
  334. package/dist/action/output/stale.d.ts +0 -31
  335. package/dist/action/output/stale.d.ts.map +0 -1
  336. package/dist/action/output/stale.test.d.ts +0 -2
  337. package/dist/action/output/stale.test.d.ts.map +0 -1
  338. package/dist/action/output/types.d.ts +0 -31
  339. package/dist/action/output/types.d.ts.map +0 -1
  340. package/dist/action/package.json +0 -3
  341. package/dist/action/sdk/index.d.ts +0 -2
  342. package/dist/action/sdk/index.d.ts.map +0 -1
  343. package/dist/action/sdk/runner.d.ts +0 -202
  344. package/dist/action/sdk/runner.d.ts.map +0 -1
  345. package/dist/action/sdk/runner.test.d.ts +0 -2
  346. package/dist/action/sdk/runner.test.d.ts.map +0 -1
  347. package/dist/action/skills/index.d.ts +0 -5
  348. package/dist/action/skills/index.d.ts.map +0 -1
  349. package/dist/action/skills/loader.d.ts +0 -111
  350. package/dist/action/skills/loader.d.ts.map +0 -1
  351. package/dist/action/skills/loader.test.d.ts +0 -2
  352. package/dist/action/skills/loader.test.d.ts.map +0 -1
  353. package/dist/action/skills/remote.d.ts +0 -117
  354. package/dist/action/skills/remote.d.ts.map +0 -1
  355. package/dist/action/skills/remote.test.d.ts +0 -2
  356. package/dist/action/skills/remote.test.d.ts.map +0 -1
  357. package/dist/action/sourcemap-register.cjs +0 -1
  358. package/dist/action/triggers/matcher.d.ts +0 -30
  359. package/dist/action/triggers/matcher.d.ts.map +0 -1
  360. package/dist/action/triggers/matcher.test.d.ts +0 -2
  361. package/dist/action/triggers/matcher.test.d.ts.map +0 -1
  362. package/dist/action/types/index.d.ts +0 -269
  363. package/dist/action/types/index.d.ts.map +0 -1
  364. package/dist/action/utils/async.d.ts +0 -5
  365. package/dist/action/utils/async.d.ts.map +0 -1
  366. package/dist/action/utils/index.d.ts +0 -16
  367. package/dist/action/utils/index.d.ts.map +0 -1
  368. package/dist/action/utils/index.test.d.ts +0 -2
  369. package/dist/action/utils/index.test.d.ts.map +0 -1
  370. package/dist/action/utils/version.d.ts +0 -3
  371. package/dist/action/utils/version.d.ts.map +0 -1
  372. package/dist/cli/args.test.d.ts +0 -2
  373. package/dist/cli/args.test.d.ts.map +0 -1
  374. package/dist/cli/args.test.js +0 -392
  375. package/dist/cli/args.test.js.map +0 -1
  376. package/dist/cli/commands/init.test.d.ts +0 -2
  377. package/dist/cli/commands/init.test.d.ts.map +0 -1
  378. package/dist/cli/commands/init.test.js +0 -117
  379. package/dist/cli/commands/init.test.js.map +0 -1
  380. package/dist/cli/files.test.d.ts +0 -2
  381. package/dist/cli/files.test.d.ts.map +0 -1
  382. package/dist/cli/files.test.js +0 -117
  383. package/dist/cli/files.test.js.map +0 -1
  384. package/dist/cli/fix.test.d.ts +0 -2
  385. package/dist/cli/fix.test.d.ts.map +0 -1
  386. package/dist/cli/fix.test.js +0 -251
  387. package/dist/cli/fix.test.js.map +0 -1
  388. package/dist/cli/git.test.d.ts +0 -2
  389. package/dist/cli/git.test.d.ts.map +0 -1
  390. package/dist/cli/git.test.js +0 -96
  391. package/dist/cli/git.test.js.map +0 -1
  392. package/dist/cli/output/formatters.test.d.ts +0 -2
  393. package/dist/cli/output/formatters.test.d.ts.map +0 -1
  394. package/dist/cli/output/formatters.test.js +0 -152
  395. package/dist/cli/output/formatters.test.js.map +0 -1
  396. package/dist/cli/output/jsonl.test.d.ts +0 -2
  397. package/dist/cli/output/jsonl.test.d.ts.map +0 -1
  398. package/dist/cli/output/jsonl.test.js +0 -284
  399. package/dist/cli/output/jsonl.test.js.map +0 -1
  400. package/dist/cli/output/tty.test.d.ts +0 -2
  401. package/dist/cli/output/tty.test.d.ts.map +0 -1
  402. package/dist/cli/output/tty.test.js +0 -105
  403. package/dist/cli/output/tty.test.js.map +0 -1
  404. package/dist/cli/output/verbosity.test.d.ts +0 -2
  405. package/dist/cli/output/verbosity.test.d.ts.map +0 -1
  406. package/dist/cli/output/verbosity.test.js +0 -35
  407. package/dist/cli/output/verbosity.test.js.map +0 -1
  408. package/dist/cli/terminal.test.d.ts +0 -2
  409. package/dist/cli/terminal.test.d.ts.map +0 -1
  410. package/dist/cli/terminal.test.js +0 -123
  411. package/dist/cli/terminal.test.js.map +0 -1
  412. package/dist/config/loader.test.d.ts +0 -2
  413. package/dist/config/loader.test.d.ts.map +0 -1
  414. package/dist/config/loader.test.js +0 -263
  415. package/dist/config/loader.test.js.map +0 -1
  416. package/dist/config/writer.test.d.ts +0 -2
  417. package/dist/config/writer.test.d.ts.map +0 -1
  418. package/dist/config/writer.test.js +0 -98
  419. package/dist/config/writer.test.js.map +0 -1
  420. package/dist/diff/classify.test.d.ts +0 -2
  421. package/dist/diff/classify.test.d.ts.map +0 -1
  422. package/dist/diff/classify.test.js +0 -140
  423. package/dist/diff/classify.test.js.map +0 -1
  424. package/dist/diff/coalesce.test.d.ts +0 -2
  425. package/dist/diff/coalesce.test.d.ts.map +0 -1
  426. package/dist/diff/coalesce.test.js +0 -159
  427. package/dist/diff/coalesce.test.js.map +0 -1
  428. package/dist/diff/context.test.d.ts +0 -2
  429. package/dist/diff/context.test.d.ts.map +0 -1
  430. package/dist/diff/context.test.js +0 -190
  431. package/dist/diff/context.test.js.map +0 -1
  432. package/dist/diff/parser.test.d.ts +0 -2
  433. package/dist/diff/parser.test.d.ts.map +0 -1
  434. package/dist/diff/parser.test.js +0 -178
  435. package/dist/diff/parser.test.js.map +0 -1
  436. package/dist/examples/examples.integration.test.d.ts +0 -2
  437. package/dist/examples/examples.integration.test.d.ts.map +0 -1
  438. package/dist/examples/examples.integration.test.js +0 -55
  439. package/dist/examples/examples.integration.test.js.map +0 -1
  440. package/dist/examples/index.test.d.ts +0 -2
  441. package/dist/examples/index.test.d.ts.map +0 -1
  442. package/dist/examples/index.test.js +0 -88
  443. package/dist/examples/index.test.js.map +0 -1
  444. package/dist/output/dedup.test.d.ts +0 -2
  445. package/dist/output/dedup.test.d.ts.map +0 -1
  446. package/dist/output/dedup.test.js +0 -357
  447. package/dist/output/dedup.test.js.map +0 -1
  448. package/dist/output/github-checks.test.d.ts +0 -2
  449. package/dist/output/github-checks.test.d.ts.map +0 -1
  450. package/dist/output/github-checks.test.js +0 -255
  451. package/dist/output/github-checks.test.js.map +0 -1
  452. package/dist/output/renderer.test.d.ts +0 -2
  453. package/dist/output/renderer.test.d.ts.map +0 -1
  454. package/dist/output/renderer.test.js +0 -645
  455. package/dist/output/renderer.test.js.map +0 -1
  456. package/dist/output/stale.test.d.ts +0 -2
  457. package/dist/output/stale.test.d.ts.map +0 -1
  458. package/dist/output/stale.test.js +0 -330
  459. package/dist/output/stale.test.js.map +0 -1
  460. package/dist/sdk/runner.test.d.ts +0 -2
  461. package/dist/sdk/runner.test.d.ts.map +0 -1
  462. package/dist/sdk/runner.test.js +0 -677
  463. package/dist/sdk/runner.test.js.map +0 -1
  464. package/dist/skills/loader.test.d.ts +0 -2
  465. package/dist/skills/loader.test.d.ts.map +0 -1
  466. package/dist/skills/loader.test.js +0 -241
  467. package/dist/skills/loader.test.js.map +0 -1
  468. package/dist/skills/remote.test.d.ts +0 -2
  469. package/dist/skills/remote.test.d.ts.map +0 -1
  470. package/dist/skills/remote.test.js +0 -582
  471. package/dist/skills/remote.test.js.map +0 -1
  472. package/dist/triggers/matcher.test.d.ts +0 -2
  473. package/dist/triggers/matcher.test.d.ts.map +0 -1
  474. package/dist/triggers/matcher.test.js +0 -234
  475. package/dist/triggers/matcher.test.js.map +0 -1
  476. package/dist/utils/index.test.d.ts +0 -2
  477. package/dist/utils/index.test.d.ts.map +0 -1
  478. package/dist/utils/index.test.js +0 -68
  479. package/dist/utils/index.test.js.map +0 -1
  480. package/docs/astro.config.mjs +0 -43
  481. package/docs/package.json +0 -19
  482. package/docs/pnpm-lock.yaml +0 -4000
  483. package/docs/public/favicon.svg +0 -5
  484. package/docs/src/components/Code.astro +0 -141
  485. package/docs/src/components/PackageManagerTabs.astro +0 -183
  486. package/docs/src/components/Terminal.astro +0 -212
  487. package/docs/src/layouts/Base.astro +0 -380
  488. package/docs/src/pages/cli.astro +0 -167
  489. package/docs/src/pages/config.astro +0 -395
  490. package/docs/src/pages/guide.astro +0 -450
  491. package/docs/src/pages/index.astro +0 -490
  492. package/docs/src/styles/global.css +0 -551
  493. package/docs/src/utils/version.ts +0 -6
  494. package/docs/tsconfig.json +0 -3
  495. package/docs/vercel.json +0 -5
  496. package/eslint.config.js +0 -33
  497. package/src/action/index.ts +0 -1
  498. package/src/action/main.ts +0 -868
  499. package/src/cli/args.test.ts +0 -477
  500. package/src/cli/args.ts +0 -414
  501. package/src/cli/commands/add.ts +0 -447
  502. package/src/cli/commands/init.test.ts +0 -137
  503. package/src/cli/commands/init.ts +0 -134
  504. package/src/cli/commands/setup-app/browser.ts +0 -38
  505. package/src/cli/commands/setup-app/credentials.ts +0 -45
  506. package/src/cli/commands/setup-app/manifest.ts +0 -48
  507. package/src/cli/commands/setup-app/server.ts +0 -172
  508. package/src/cli/commands/setup-app.ts +0 -156
  509. package/src/cli/commands/sync.ts +0 -114
  510. package/src/cli/context.ts +0 -131
  511. package/src/cli/files.test.ts +0 -155
  512. package/src/cli/files.ts +0 -89
  513. package/src/cli/fix.test.ts +0 -310
  514. package/src/cli/fix.ts +0 -387
  515. package/src/cli/git.test.ts +0 -119
  516. package/src/cli/git.ts +0 -318
  517. package/src/cli/index.ts +0 -14
  518. package/src/cli/main.ts +0 -672
  519. package/src/cli/output/box.ts +0 -235
  520. package/src/cli/output/formatters.test.ts +0 -187
  521. package/src/cli/output/formatters.ts +0 -269
  522. package/src/cli/output/icons.ts +0 -13
  523. package/src/cli/output/index.ts +0 -44
  524. package/src/cli/output/ink-runner.tsx +0 -337
  525. package/src/cli/output/jsonl.test.ts +0 -347
  526. package/src/cli/output/jsonl.ts +0 -126
  527. package/src/cli/output/reporter.ts +0 -434
  528. package/src/cli/output/tasks.ts +0 -374
  529. package/src/cli/output/tty.test.ts +0 -117
  530. package/src/cli/output/tty.ts +0 -60
  531. package/src/cli/output/verbosity.test.ts +0 -40
  532. package/src/cli/output/verbosity.ts +0 -31
  533. package/src/cli/terminal.test.ts +0 -148
  534. package/src/cli/terminal.ts +0 -301
  535. package/src/config/index.ts +0 -3
  536. package/src/config/loader.test.ts +0 -313
  537. package/src/config/loader.ts +0 -103
  538. package/src/config/schema.ts +0 -168
  539. package/src/config/writer.test.ts +0 -119
  540. package/src/config/writer.ts +0 -84
  541. package/src/diff/classify.test.ts +0 -162
  542. package/src/diff/classify.ts +0 -92
  543. package/src/diff/coalesce.test.ts +0 -208
  544. package/src/diff/coalesce.ts +0 -133
  545. package/src/diff/context.test.ts +0 -226
  546. package/src/diff/context.ts +0 -201
  547. package/src/diff/index.ts +0 -4
  548. package/src/diff/parser.test.ts +0 -212
  549. package/src/diff/parser.ts +0 -149
  550. package/src/event/context.ts +0 -132
  551. package/src/event/index.ts +0 -2
  552. package/src/event/schedule-context.ts +0 -101
  553. package/src/examples/examples.integration.test.ts +0 -66
  554. package/src/examples/index.test.ts +0 -101
  555. package/src/examples/index.ts +0 -122
  556. package/src/examples/setup.ts +0 -25
  557. package/src/index.ts +0 -115
  558. package/src/output/dedup.test.ts +0 -419
  559. package/src/output/dedup.ts +0 -607
  560. package/src/output/github-checks.test.ts +0 -300
  561. package/src/output/github-checks.ts +0 -476
  562. package/src/output/github-issues.ts +0 -329
  563. package/src/output/index.ts +0 -5
  564. package/src/output/issue-renderer.ts +0 -197
  565. package/src/output/renderer.test.ts +0 -727
  566. package/src/output/renderer.ts +0 -217
  567. package/src/output/stale.test.ts +0 -375
  568. package/src/output/stale.ts +0 -155
  569. package/src/output/types.ts +0 -34
  570. package/src/sdk/index.ts +0 -1
  571. package/src/sdk/runner.test.ts +0 -806
  572. package/src/sdk/runner.ts +0 -1232
  573. package/src/skills/index.ts +0 -36
  574. package/src/skills/loader.test.ts +0 -300
  575. package/src/skills/loader.ts +0 -423
  576. package/src/skills/remote.test.ts +0 -704
  577. package/src/skills/remote.ts +0 -604
  578. package/src/triggers/matcher.test.ts +0 -277
  579. package/src/triggers/matcher.ts +0 -152
  580. package/src/types/index.ts +0 -194
  581. package/src/utils/async.ts +0 -18
  582. package/src/utils/index.test.ts +0 -84
  583. package/src/utils/index.ts +0 -51
  584. package/src/utils/version.ts +0 -17
  585. package/tsconfig.json +0 -25
  586. package/vitest.config.ts +0 -8
  587. package/vitest.integration.config.ts +0 -11
  588. 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
- });