@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,134 +0,0 @@
1
- import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
- import { join, relative } from 'node:path';
3
- import chalk from 'chalk';
4
- import { getRepoRoot, getGitHubRepoUrl } from '../git.js';
5
- import type { Reporter } from '../output/reporter.js';
6
- import type { CLIOptions } from '../args.js';
7
- import { getMajorVersion } from '../../utils/index.js';
8
-
9
- /**
10
- * Template for warden.toml configuration file.
11
- */
12
- function generateWardenToml(): string {
13
- return `version = 1
14
- `;
15
- }
16
-
17
- /**
18
- * Template for GitHub Actions workflow file.
19
- */
20
- function generateWorkflowYaml(): string {
21
- const majorVersion = getMajorVersion();
22
- return `name: Warden
23
-
24
- on:
25
- pull_request:
26
- types: [opened, synchronize, reopened]
27
-
28
- permissions:
29
- contents: read
30
- pull-requests: write
31
- checks: write
32
-
33
- jobs:
34
- review:
35
- runs-on: ubuntu-latest
36
- steps:
37
- - uses: actions/checkout@v4
38
- - uses: getsentry/warden@v${majorVersion}
39
- with:
40
- anthropic-api-key: \${{ secrets.WARDEN_ANTHROPIC_API_KEY }}
41
- `;
42
- }
43
-
44
- /**
45
- * Check for existing warden configuration files.
46
- */
47
- function checkExistingFiles(repoRoot: string): {
48
- hasWardenToml: boolean;
49
- hasWorkflow: boolean;
50
- } {
51
- const wardenTomlPath = join(repoRoot, 'warden.toml');
52
- const workflowPath = join(repoRoot, '.github', 'workflows', 'warden.yml');
53
-
54
- return {
55
- hasWardenToml: existsSync(wardenTomlPath),
56
- hasWorkflow: existsSync(workflowPath),
57
- };
58
- }
59
-
60
- export interface InitOptions {
61
- force: boolean;
62
- }
63
-
64
- /**
65
- * Run the init command to scaffold warden configuration.
66
- */
67
- export async function runInit(options: CLIOptions, reporter: Reporter): Promise<number> {
68
- const cwd = process.cwd();
69
-
70
- // Find repo root
71
- let repoRoot: string;
72
- try {
73
- repoRoot = getRepoRoot(cwd);
74
- } catch {
75
- reporter.error('Not a git repository. Run this command from a git repository.');
76
- return 1;
77
- }
78
-
79
- // Check for existing files
80
- const existing = checkExistingFiles(repoRoot);
81
-
82
- let filesCreated = 0;
83
-
84
- // Create warden.toml
85
- const wardenTomlPath = join(repoRoot, 'warden.toml');
86
- if (existing.hasWardenToml && !options.force) {
87
- reporter.skipped(relative(cwd, wardenTomlPath), 'already exists');
88
- } else {
89
- const content = generateWardenToml();
90
- writeFileSync(wardenTomlPath, content, 'utf-8');
91
- reporter.created(relative(cwd, wardenTomlPath));
92
- filesCreated++;
93
- }
94
-
95
- // Create .github/workflows directory if needed
96
- const workflowDir = join(repoRoot, '.github', 'workflows');
97
- if (!existsSync(workflowDir)) {
98
- mkdirSync(workflowDir, { recursive: true });
99
- }
100
-
101
- // Create workflow file
102
- const workflowPath = join(workflowDir, 'warden.yml');
103
- if (existing.hasWorkflow && !options.force) {
104
- reporter.skipped(relative(cwd, workflowPath), 'already exists');
105
- } else {
106
- const content = generateWorkflowYaml();
107
- writeFileSync(workflowPath, content, 'utf-8');
108
- reporter.created(relative(cwd, workflowPath));
109
- filesCreated++;
110
- }
111
-
112
- if (filesCreated === 0) {
113
- reporter.blank();
114
- reporter.tip('All configuration files already exist. Use --force to overwrite.');
115
- return 0;
116
- }
117
-
118
- // Print next steps
119
- reporter.blank();
120
- reporter.bold('Next steps:');
121
- reporter.text(` 1. Add a skill: ${chalk.cyan('warden add <skill-name>')}`);
122
- reporter.text(` 2. Set ${chalk.cyan('WARDEN_ANTHROPIC_API_KEY')} in .env.local`);
123
- reporter.text(` 3. Add ${chalk.cyan('WARDEN_ANTHROPIC_API_KEY')} to repository secrets`);
124
-
125
- // Show GitHub secrets URL if available
126
- const githubUrl = getGitHubRepoUrl(repoRoot);
127
- if (githubUrl) {
128
- reporter.text(` ${chalk.dim(githubUrl + '/settings/secrets/actions')}`);
129
- }
130
-
131
- reporter.text(' 4. Commit and open a PR to test');
132
-
133
- return 0;
134
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * Cross-platform browser opener.
3
- */
4
-
5
- import { exec } from 'node:child_process';
6
- import { platform } from 'node:os';
7
-
8
- /**
9
- * Open a URL in the default browser.
10
- * Returns a promise that resolves when the browser open command has been executed.
11
- */
12
- export function openBrowser(url: string): Promise<void> {
13
- return new Promise((resolve, reject) => {
14
- const os = platform();
15
- let command: string;
16
-
17
- switch (os) {
18
- case 'darwin':
19
- command = `open "${url}"`;
20
- break;
21
- case 'win32':
22
- command = `start "" "${url}"`;
23
- break;
24
- default:
25
- // Linux and others
26
- command = `xdg-open "${url}"`;
27
- break;
28
- }
29
-
30
- exec(command, (error) => {
31
- if (error) {
32
- reject(error);
33
- } else {
34
- resolve();
35
- }
36
- });
37
- });
38
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * Exchange temporary code for GitHub App credentials via GitHub API.
3
- */
4
-
5
- export interface AppCredentials {
6
- id: number;
7
- name: string;
8
- pem: string;
9
- htmlUrl: string;
10
- }
11
-
12
- /**
13
- * Exchange a temporary code for GitHub App credentials.
14
- * This uses the GitHub API to convert the code into full app credentials.
15
- */
16
- export async function exchangeCodeForCredentials(code: string): Promise<AppCredentials> {
17
- const url = `https://api.github.com/app-manifests/${code}/conversions`;
18
-
19
- const response = await fetch(url, {
20
- method: 'POST',
21
- headers: {
22
- Accept: 'application/vnd.github+json',
23
- 'X-GitHub-Api-Version': '2022-11-28',
24
- },
25
- });
26
-
27
- if (!response.ok) {
28
- const errorText = await response.text();
29
- throw new Error(`Failed to exchange code for credentials: ${response.status} ${response.statusText}\n${errorText}`);
30
- }
31
-
32
- const data = (await response.json()) as {
33
- id: number;
34
- name: string;
35
- pem: string;
36
- html_url: string;
37
- };
38
-
39
- return {
40
- id: data.id,
41
- name: data.name,
42
- pem: data.pem,
43
- htmlUrl: data.html_url,
44
- };
45
- }
@@ -1,48 +0,0 @@
1
- /**
2
- * GitHub App manifest builder for the setup-app flow.
3
- */
4
-
5
- export interface ManifestOptions {
6
- name?: string;
7
- port: number;
8
- }
9
-
10
- export interface GitHubAppManifest {
11
- name: string;
12
- url: string;
13
- hook_attributes: {
14
- url: string;
15
- active: boolean;
16
- };
17
- redirect_url: string;
18
- public: boolean;
19
- default_permissions: Record<string, string>;
20
- default_events: string[];
21
- }
22
-
23
- /**
24
- * Build a GitHub App manifest for Warden.
25
- */
26
- export function buildManifest(options: ManifestOptions): GitHubAppManifest {
27
- const name = options.name ?? 'Warden';
28
-
29
- return {
30
- name,
31
- url: 'https://github.com/getsentry/warden',
32
- hook_attributes: {
33
- // URL is required by GitHub even when webhooks are disabled
34
- url: 'https://example.com/webhook',
35
- active: false,
36
- },
37
- redirect_url: `http://localhost:${options.port}/callback`,
38
- public: false,
39
- default_permissions: {
40
- contents: 'read',
41
- pull_requests: 'write',
42
- issues: 'write',
43
- checks: 'write',
44
- metadata: 'read',
45
- },
46
- default_events: ['pull_request'],
47
- };
48
- }
@@ -1,172 +0,0 @@
1
- /**
2
- * Local HTTP server for GitHub App manifest flow.
3
- * Serves a form that POSTs the manifest to GitHub, then receives the callback.
4
- */
5
-
6
- import { createServer, type Server, type IncomingMessage, type ServerResponse } from 'node:http';
7
- import { URL } from 'node:url';
8
- import type { GitHubAppManifest } from './manifest.js';
9
-
10
- export interface CallbackResult {
11
- code: string;
12
- }
13
-
14
- export interface ServerOptions {
15
- port: number;
16
- expectedState: string;
17
- timeoutMs: number;
18
- manifest: GitHubAppManifest;
19
- org?: string;
20
- }
21
-
22
- /**
23
- * Build the HTML page that auto-submits the manifest form to GitHub.
24
- */
25
- function buildStartPage(manifest: GitHubAppManifest, state: string, org?: string): string {
26
- const githubUrl = org
27
- ? `https://github.com/organizations/${org}/settings/apps/new?state=${state}`
28
- : `https://github.com/settings/apps/new?state=${state}`;
29
-
30
- const manifestJson = JSON.stringify(manifest);
31
-
32
- return `<!DOCTYPE html>
33
- <html>
34
- <head>
35
- <title>Creating GitHub App...</title>
36
- <style>
37
- body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; text-align: center; padding: 50px; }
38
- .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 20px auto; }
39
- @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
40
- </style>
41
- </head>
42
- <body>
43
- <h1>Redirecting to GitHub...</h1>
44
- <div class="spinner"></div>
45
- <p>If you are not redirected automatically, click the button below.</p>
46
- <form id="manifest-form" action="${githubUrl}" method="post">
47
- <input type="hidden" name="manifest" value='${manifestJson.replace(/'/g, '&#39;')}'>
48
- <button type="submit" style="padding: 10px 20px; font-size: 16px; cursor: pointer;">Continue to GitHub</button>
49
- </form>
50
- <script>
51
- // Auto-submit the form after a brief delay
52
- setTimeout(function() {
53
- document.getElementById('manifest-form').submit();
54
- }, 500);
55
- </script>
56
- </body>
57
- </html>`;
58
- }
59
-
60
- /**
61
- * Create and start a local HTTP server for the manifest flow.
62
- * - GET / or /start: Serves the form that POSTs to GitHub
63
- * - GET /callback: Receives the callback from GitHub with the code
64
- */
65
- export function startCallbackServer(options: ServerOptions): {
66
- server: Server;
67
- waitForCallback: Promise<CallbackResult>;
68
- close: () => void;
69
- startUrl: string;
70
- } {
71
- let resolveCallback: (result: CallbackResult) => void;
72
- let rejectCallback: (error: Error) => void;
73
-
74
- const waitForCallback = new Promise<CallbackResult>((resolve, reject) => {
75
- resolveCallback = resolve;
76
- rejectCallback = reject;
77
- });
78
-
79
- const server = createServer((req: IncomingMessage, res: ServerResponse) => {
80
- const url = new URL(req.url || '/', `http://localhost:${options.port}`);
81
-
82
- // Serve the start page that auto-submits to GitHub
83
- if (req.method === 'GET' && (url.pathname === '/' || url.pathname === '/start')) {
84
- res.writeHead(200, { 'Content-Type': 'text/html' });
85
- res.end(buildStartPage(options.manifest, options.expectedState, options.org));
86
- return;
87
- }
88
-
89
- // Handle callback from GitHub
90
- if (req.method === 'GET' && url.pathname === '/callback') {
91
- const code = url.searchParams.get('code');
92
- const state = url.searchParams.get('state');
93
-
94
- // Validate state parameter (CSRF protection)
95
- if (state !== options.expectedState) {
96
- res.writeHead(400, { 'Content-Type': 'text/html' });
97
- res.end(`
98
- <!DOCTYPE html>
99
- <html>
100
- <head><title>Error</title></head>
101
- <body>
102
- <h1>Error: Invalid state parameter</h1>
103
- <p>This may be a CSRF attack. Please try again.</p>
104
- </body>
105
- </html>
106
- `);
107
- rejectCallback(new Error('Invalid state parameter - possible CSRF attack'));
108
- return;
109
- }
110
-
111
- if (!code) {
112
- res.writeHead(400, { 'Content-Type': 'text/html' });
113
- res.end(`
114
- <!DOCTYPE html>
115
- <html>
116
- <head><title>Error</title></head>
117
- <body>
118
- <h1>Error: Missing code parameter</h1>
119
- <p>GitHub did not provide the expected authorization code.</p>
120
- </body>
121
- </html>
122
- `);
123
- rejectCallback(new Error('Missing code parameter in callback'));
124
- return;
125
- }
126
-
127
- // Success - send response and resolve promise
128
- res.writeHead(200, { 'Content-Type': 'text/html' });
129
- res.end(`
130
- <!DOCTYPE html>
131
- <html>
132
- <head>
133
- <title>Success</title>
134
- <style>
135
- body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; text-align: center; padding: 50px; }
136
- h1 { color: #28a745; }
137
- </style>
138
- </head>
139
- <body>
140
- <h1>GitHub App Created!</h1>
141
- <p>You can close this window and return to the terminal.</p>
142
- </body>
143
- </html>
144
- `);
145
-
146
- resolveCallback({ code });
147
- return;
148
- }
149
-
150
- // 404 for anything else
151
- res.writeHead(404);
152
- res.end('Not found');
153
- });
154
-
155
- // Bind only to localhost for security
156
- server.listen(options.port, '127.0.0.1');
157
-
158
- // Set up timeout
159
- const timeoutId = setTimeout(() => {
160
- rejectCallback(new Error(`Timeout: No callback received within ${options.timeoutMs / 1000} seconds`));
161
- server.close();
162
- }, options.timeoutMs);
163
-
164
- const close = () => {
165
- clearTimeout(timeoutId);
166
- server.close();
167
- };
168
-
169
- const startUrl = `http://localhost:${options.port}/start`;
170
-
171
- return { server, waitForCallback, close, startUrl };
172
- }
@@ -1,156 +0,0 @@
1
- /**
2
- * Setup GitHub App command.
3
- * Creates a GitHub App via the manifest flow for Warden to post as a custom bot.
4
- */
5
-
6
- import { randomBytes } from 'node:crypto';
7
- import chalk from 'chalk';
8
- import type { SetupAppOptions } from '../args.js';
9
- import type { Reporter } from '../output/reporter.js';
10
- import { getGitHubRepoUrl } from '../git.js';
11
- import { buildManifest } from './setup-app/manifest.js';
12
- import { startCallbackServer } from './setup-app/server.js';
13
- import { openBrowser } from './setup-app/browser.js';
14
- import { exchangeCodeForCredentials } from './setup-app/credentials.js';
15
-
16
- /**
17
- * Run the setup-app command.
18
- */
19
- export async function runSetupApp(options: SetupAppOptions, reporter: Reporter): Promise<number> {
20
- const { port, timeout, org, name, open } = options;
21
-
22
- reporter.bold('SETUP GITHUB APP');
23
- reporter.blank();
24
-
25
- // Generate state token for CSRF protection
26
- const state = randomBytes(16).toString('hex');
27
-
28
- // Build manifest
29
- const manifest = buildManifest({ name, port });
30
-
31
- // Show what permissions will be requested
32
- reporter.text('This will create a GitHub App with the following permissions:');
33
- reporter.text(` ${chalk.dim('•')} contents: read ${chalk.dim('- Read repository files')}`);
34
- reporter.text(` ${chalk.dim('•')} pull_requests: write ${chalk.dim('- Post review comments')}`);
35
- reporter.text(` ${chalk.dim('•')} issues: write ${chalk.dim('- Create/update issues')}`);
36
- reporter.text(` ${chalk.dim('•')} checks: write ${chalk.dim('- Create check runs')}`);
37
- reporter.text(` ${chalk.dim('•')} metadata: read ${chalk.dim('- Read repository metadata')}`);
38
- reporter.blank();
39
-
40
- // Start local server (serves the form and handles callback)
41
- reporter.step(`Starting local server on http://localhost:${port}...`);
42
-
43
- const serverHandle = startCallbackServer({
44
- port,
45
- expectedState: state,
46
- timeoutMs: timeout * 1000,
47
- manifest,
48
- org,
49
- });
50
-
51
- // Handle server errors (e.g., port already in use)
52
- serverHandle.server.on('error', (error: NodeJS.ErrnoException) => {
53
- if (error.code === 'EADDRINUSE') {
54
- reporter.error(`Port ${port} is already in use. Try a different port with --port <number>`);
55
- } else {
56
- reporter.error(`Server error: ${error.message}`);
57
- }
58
- process.exit(1);
59
- });
60
-
61
- try {
62
- // Open browser to our local server (which will POST to GitHub)
63
- if (open) {
64
- reporter.step('Opening browser...');
65
- try {
66
- await openBrowser(serverHandle.startUrl);
67
- } catch {
68
- reporter.warning('Could not open browser automatically.');
69
- reporter.blank();
70
- reporter.text('Open this URL in your browser:');
71
- reporter.text(chalk.cyan(serverHandle.startUrl));
72
- }
73
- } else {
74
- reporter.blank();
75
- reporter.text('Open this URL in your browser:');
76
- reporter.text(chalk.cyan(serverHandle.startUrl));
77
- }
78
-
79
- reporter.blank();
80
- reporter.text(`On the GitHub page, click ${chalk.cyan('"Create GitHub App"')} to continue.`);
81
- reporter.blank();
82
- reporter.text(chalk.dim('Waiting for GitHub callback... (Ctrl+C to cancel)'));
83
-
84
- // Wait for callback
85
- const { code } = await serverHandle.waitForCallback;
86
-
87
- // Exchange code for credentials
88
- reporter.blank();
89
- reporter.step('Exchanging code for credentials...');
90
- const credentials = await exchangeCodeForCredentials(code);
91
-
92
- // Success!
93
- reporter.blank();
94
- reporter.success('GitHub App created!');
95
- reporter.blank();
96
- reporter.text(` App ID: ${chalk.cyan(credentials.id)}`);
97
- reporter.text(` App Name: ${chalk.cyan(credentials.name)}`);
98
- reporter.text(` App URL: ${chalk.cyan(credentials.htmlUrl)}`);
99
- reporter.blank();
100
-
101
- // Next steps - in correct order!
102
- const githubRepoUrl = getGitHubRepoUrl(process.cwd());
103
- reporter.bold('Next steps:');
104
- reporter.blank();
105
-
106
- // Step 1: Install the app (must happen first!)
107
- reporter.text(` ${chalk.cyan('1.')} Install the app on your repository:`);
108
- reporter.text(` ${chalk.cyan(credentials.htmlUrl + '/installations/new')}`);
109
- reporter.blank();
110
-
111
- // Step 2: Add secrets
112
- reporter.text(` ${chalk.cyan('2.')} Add these secrets to your repository:`);
113
- if (githubRepoUrl) {
114
- reporter.text(` ${chalk.cyan(githubRepoUrl + '/settings/secrets/actions')}`);
115
- }
116
- reporter.blank();
117
- reporter.text(` ${chalk.white('WARDEN_APP_ID')} ${credentials.id}`);
118
- reporter.text(` ${chalk.white('WARDEN_PRIVATE_KEY')} ${chalk.dim('(copy the key below)')}`);
119
- reporter.blank();
120
-
121
- // Private key with clear instructions
122
- reporter.text(` ${chalk.cyan('Private Key')} ${chalk.dim('(copy entire block including BEGIN/END lines):')}`);
123
- reporter.blank();
124
- // Indent the private key for readability
125
- const pemLines = credentials.pem.trim().split('\n');
126
- for (const line of pemLines) {
127
- reporter.text(` ${chalk.dim(line)}`);
128
- }
129
- reporter.blank();
130
-
131
- return 0;
132
- } catch (error) {
133
- const message = error instanceof Error ? error.message : String(error);
134
- reporter.error(message);
135
- reporter.blank();
136
-
137
- // Provide recovery guidance if the app might have been created
138
- const githubRepoUrl = getGitHubRepoUrl(process.cwd());
139
- reporter.text(chalk.dim('If the GitHub App was created before this error:'));
140
- reporter.text(chalk.dim(' 1. Go to https://github.com/settings/apps' + (org ? ` (or your org's settings)` : '')));
141
- reporter.text(chalk.dim(' 2. Find your app and click "Edit"'));
142
- reporter.text(chalk.dim(' 3. Note the App ID from the "About" section'));
143
- reporter.text(chalk.dim(' 4. Scroll to "Private keys" and click "Generate a private key"'));
144
- reporter.text(chalk.dim(' 5. Install the app: click "Install App" in the sidebar'));
145
- reporter.text(chalk.dim(' 6. Add secrets to your repository:'));
146
- if (githubRepoUrl) {
147
- reporter.text(chalk.dim(` ${githubRepoUrl}/settings/secrets/actions`));
148
- }
149
- reporter.text(chalk.dim(' - WARDEN_APP_ID: your App ID'));
150
- reporter.text(chalk.dim(' - WARDEN_PRIVATE_KEY: contents of the downloaded .pem file'));
151
-
152
- return 1;
153
- } finally {
154
- serverHandle.close();
155
- }
156
- }