polen 0.10.0-next.3 → 0.10.0-next.4

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 (268) hide show
  1. package/README.md +49 -376
  2. package/build/api/api.d.ts +1 -0
  3. package/build/api/api.d.ts.map +1 -1
  4. package/build/api/api.js +1 -0
  5. package/build/api/api.js.map +1 -1
  6. package/build/api/static/index.d.ts +2 -0
  7. package/build/api/static/index.d.ts.map +1 -0
  8. package/build/api/static/index.js +2 -0
  9. package/build/api/static/index.js.map +1 -0
  10. package/build/api/static/manifest.d.ts +18 -0
  11. package/build/api/static/manifest.d.ts.map +1 -0
  12. package/build/api/static/manifest.js +13 -0
  13. package/build/api/static/manifest.js.map +1 -0
  14. package/build/api/static/rebase.d.ts +14 -0
  15. package/build/api/static/rebase.d.ts.map +1 -0
  16. package/build/api/static/rebase.js +110 -0
  17. package/build/api/static/rebase.js.map +1 -0
  18. package/build/api/static/static.d.ts +3 -0
  19. package/build/api/static/static.d.ts.map +1 -0
  20. package/build/api/static/static.js +3 -0
  21. package/build/api/static/static.js.map +1 -0
  22. package/build/api/vite/plugins/build.d.ts.map +1 -1
  23. package/build/api/vite/plugins/build.js +22 -1
  24. package/build/api/vite/plugins/build.js.map +1 -1
  25. package/build/cli/commands/static/$default.d.ts +3 -0
  26. package/build/cli/commands/static/$default.d.ts.map +1 -0
  27. package/build/cli/commands/static/$default.js +38 -0
  28. package/build/cli/commands/static/$default.js.map +1 -0
  29. package/build/cli/commands/static/rebase.d.ts +2 -0
  30. package/build/cli/commands/static/rebase.d.ts.map +1 -0
  31. package/build/cli/commands/static/rebase.js +26 -0
  32. package/build/cli/commands/static/rebase.js.map +1 -0
  33. package/build/cli/commands/static.d.ts +3 -0
  34. package/build/cli/commands/static.d.ts.map +1 -0
  35. package/build/cli/commands/static.js +5 -0
  36. package/build/cli/commands/static.js.map +1 -0
  37. package/build/lib/demos/builder.d.ts +83 -0
  38. package/build/lib/demos/builder.d.ts.map +1 -0
  39. package/build/lib/demos/builder.js +237 -0
  40. package/build/lib/demos/builder.js.map +1 -0
  41. package/build/lib/demos/config-schema.d.ts +243 -0
  42. package/build/lib/demos/config-schema.d.ts.map +1 -0
  43. package/build/lib/demos/config-schema.js +52 -0
  44. package/build/lib/demos/config-schema.js.map +1 -0
  45. package/build/lib/demos/config.d.ts +40 -0
  46. package/build/lib/demos/config.d.ts.map +1 -0
  47. package/build/lib/demos/config.js +180 -0
  48. package/build/lib/demos/config.js.map +1 -0
  49. package/build/lib/demos/index.d.ts +9 -0
  50. package/build/lib/demos/index.d.ts.map +1 -0
  51. package/build/lib/demos/index.js +8 -0
  52. package/build/lib/demos/index.js.map +1 -0
  53. package/build/lib/demos/ui/components.d.ts +33 -0
  54. package/build/lib/demos/ui/components.d.ts.map +1 -0
  55. package/build/lib/demos/ui/components.js +699 -0
  56. package/build/lib/demos/ui/components.js.map +1 -0
  57. package/build/lib/demos/ui/data-collector.d.ts +88 -0
  58. package/build/lib/demos/ui/data-collector.d.ts.map +1 -0
  59. package/build/lib/demos/ui/data-collector.js +174 -0
  60. package/build/lib/demos/ui/data-collector.js.map +1 -0
  61. package/build/lib/demos/ui/landing-page-cli.d.ts +3 -0
  62. package/build/lib/demos/ui/landing-page-cli.d.ts.map +1 -0
  63. package/build/lib/demos/ui/landing-page-cli.js +21 -0
  64. package/build/lib/demos/ui/landing-page-cli.js.map +1 -0
  65. package/build/lib/demos/ui/landing-page.d.ts +32 -0
  66. package/build/lib/demos/ui/landing-page.d.ts.map +1 -0
  67. package/build/lib/demos/ui/landing-page.js +83 -0
  68. package/build/lib/demos/ui/landing-page.js.map +1 -0
  69. package/build/lib/demos/ui/page-renderer.d.ts +26 -0
  70. package/build/lib/demos/ui/page-renderer.d.ts.map +1 -0
  71. package/build/lib/demos/ui/page-renderer.js +104 -0
  72. package/build/lib/demos/ui/page-renderer.js.map +1 -0
  73. package/build/lib/demos/utils.d.ts +14 -0
  74. package/build/lib/demos/utils.d.ts.map +1 -0
  75. package/build/lib/demos/utils.js +37 -0
  76. package/build/lib/demos/utils.js.map +1 -0
  77. package/build/lib/deployment/$$.d.ts +3 -0
  78. package/build/lib/deployment/$$.d.ts.map +1 -0
  79. package/build/lib/deployment/$$.js +3 -0
  80. package/build/lib/deployment/$$.js.map +1 -0
  81. package/build/lib/deployment/$.d.ts +2 -0
  82. package/build/lib/deployment/$.d.ts.map +1 -0
  83. package/build/lib/deployment/$.js +2 -0
  84. package/build/lib/deployment/$.js.map +1 -0
  85. package/build/lib/deployment/metadata.d.ts +32 -0
  86. package/build/lib/deployment/metadata.d.ts.map +1 -0
  87. package/build/lib/deployment/metadata.js +37 -0
  88. package/build/lib/deployment/metadata.js.map +1 -0
  89. package/build/lib/deployment/path-manager.d.ts +41 -0
  90. package/build/lib/deployment/path-manager.d.ts.map +1 -0
  91. package/build/lib/deployment/path-manager.js +157 -0
  92. package/build/lib/deployment/path-manager.js.map +1 -0
  93. package/build/lib/github-actions/git-controller.d.ts +50 -0
  94. package/build/lib/github-actions/git-controller.d.ts.map +1 -0
  95. package/build/lib/github-actions/git-controller.js +90 -0
  96. package/build/lib/github-actions/git-controller.js.map +1 -0
  97. package/build/lib/github-actions/github-actions.d.ts +7 -0
  98. package/build/lib/github-actions/github-actions.d.ts.map +1 -0
  99. package/build/lib/github-actions/github-actions.js +7 -0
  100. package/build/lib/github-actions/github-actions.js.map +1 -0
  101. package/build/lib/github-actions/index.d.ts +2 -0
  102. package/build/lib/github-actions/index.d.ts.map +1 -0
  103. package/build/lib/github-actions/index.js +2 -0
  104. package/build/lib/github-actions/index.js.map +1 -0
  105. package/build/lib/github-actions/lib/get-pr-deployments.d.ts +12 -0
  106. package/build/lib/github-actions/lib/get-pr-deployments.d.ts.map +1 -0
  107. package/build/lib/github-actions/lib/get-pr-deployments.js +51 -0
  108. package/build/lib/github-actions/lib/get-pr-deployments.js.map +1 -0
  109. package/build/lib/github-actions/pr-controller.d.ts +39 -0
  110. package/build/lib/github-actions/pr-controller.d.ts.map +1 -0
  111. package/build/lib/github-actions/pr-controller.js +122 -0
  112. package/build/lib/github-actions/pr-controller.js.map +1 -0
  113. package/build/lib/github-actions/run-step-cli.d.ts +9 -0
  114. package/build/lib/github-actions/run-step-cli.d.ts.map +1 -0
  115. package/build/lib/github-actions/run-step-cli.js +71 -0
  116. package/build/lib/github-actions/run-step-cli.js.map +1 -0
  117. package/build/lib/github-actions/runner.d.ts +17 -0
  118. package/build/lib/github-actions/runner.d.ts.map +1 -0
  119. package/build/lib/github-actions/runner.js +195 -0
  120. package/build/lib/github-actions/runner.js.map +1 -0
  121. package/build/lib/github-actions/schemas/context.d.ts +933 -0
  122. package/build/lib/github-actions/schemas/context.d.ts.map +1 -0
  123. package/build/lib/github-actions/schemas/context.js +407 -0
  124. package/build/lib/github-actions/schemas/context.js.map +1 -0
  125. package/build/lib/github-actions/schemas/index.d.ts +5 -0
  126. package/build/lib/github-actions/schemas/index.d.ts.map +1 -0
  127. package/build/lib/github-actions/schemas/index.js +5 -0
  128. package/build/lib/github-actions/schemas/index.js.map +1 -0
  129. package/build/lib/github-actions/search-module.d.ts +38 -0
  130. package/build/lib/github-actions/search-module.d.ts.map +1 -0
  131. package/build/lib/github-actions/search-module.js +40 -0
  132. package/build/lib/github-actions/search-module.js.map +1 -0
  133. package/build/lib/github-actions/step.d.ts +163 -0
  134. package/build/lib/github-actions/step.d.ts.map +1 -0
  135. package/build/lib/github-actions/step.js +121 -0
  136. package/build/lib/github-actions/step.js.map +1 -0
  137. package/build/lib/helpers.d.ts.map +1 -1
  138. package/build/lib/helpers.js +5 -3
  139. package/build/lib/helpers.js.map +1 -1
  140. package/build/lib/kit-temp.d.ts +54 -0
  141. package/build/lib/kit-temp.d.ts.map +1 -1
  142. package/build/lib/kit-temp.js +80 -14
  143. package/build/lib/kit-temp.js.map +1 -1
  144. package/build/lib/kit-temp.test-d.d.ts +2 -0
  145. package/build/lib/kit-temp.test-d.d.ts.map +1 -0
  146. package/build/lib/kit-temp.test-d.js +75 -0
  147. package/build/lib/kit-temp.test-d.js.map +1 -0
  148. package/build/lib/mask/$$.d.ts +3 -0
  149. package/build/lib/mask/$$.d.ts.map +1 -0
  150. package/build/lib/mask/$$.js +3 -0
  151. package/build/lib/mask/$$.js.map +1 -0
  152. package/build/lib/mask/$.d.ts +2 -0
  153. package/build/lib/mask/$.d.ts.map +1 -0
  154. package/build/lib/mask/$.js +2 -0
  155. package/build/lib/mask/$.js.map +1 -0
  156. package/build/lib/mask/apply.d.ts +86 -0
  157. package/build/lib/mask/apply.d.ts.map +1 -0
  158. package/build/lib/mask/apply.js +86 -0
  159. package/build/lib/mask/apply.js.map +1 -0
  160. package/build/lib/mask/mask.d.ts +124 -0
  161. package/build/lib/mask/mask.d.ts.map +1 -0
  162. package/build/lib/mask/mask.js +137 -0
  163. package/build/lib/mask/mask.js.map +1 -0
  164. package/build/lib/mask/mask.test-d.d.ts +2 -0
  165. package/build/lib/mask/mask.test-d.d.ts.map +1 -0
  166. package/build/lib/mask/mask.test-d.js +102 -0
  167. package/build/lib/mask/mask.test-d.js.map +1 -0
  168. package/build/lib/task/$$.d.ts +3 -0
  169. package/build/lib/task/$$.d.ts.map +1 -0
  170. package/build/lib/task/$$.js +3 -0
  171. package/build/lib/task/$$.js.map +1 -0
  172. package/build/lib/task/$.d.ts +2 -0
  173. package/build/lib/task/$.d.ts.map +1 -0
  174. package/build/lib/task/$.js +2 -0
  175. package/build/lib/task/$.js.map +1 -0
  176. package/build/lib/task/report.d.ts +28 -0
  177. package/build/lib/task/report.d.ts.map +1 -0
  178. package/build/lib/task/report.js +33 -0
  179. package/build/lib/task/report.js.map +1 -0
  180. package/build/lib/task/task.d.ts +44 -0
  181. package/build/lib/task/task.d.ts.map +1 -0
  182. package/build/lib/task/task.js +63 -0
  183. package/build/lib/task/task.js.map +1 -0
  184. package/build/lib/version-history/index.d.ts +3 -0
  185. package/build/lib/version-history/index.d.ts.map +1 -0
  186. package/build/lib/version-history/index.js +2 -0
  187. package/build/lib/version-history/index.js.map +1 -0
  188. package/build/lib/version-history/types.d.ts +64 -0
  189. package/build/lib/version-history/types.d.ts.map +1 -0
  190. package/build/lib/version-history/types.js +5 -0
  191. package/build/lib/version-history/types.js.map +1 -0
  192. package/build/lib/version-history/version-history.d.ts +85 -0
  193. package/build/lib/version-history/version-history.d.ts.map +1 -0
  194. package/build/lib/version-history/version-history.js +248 -0
  195. package/build/lib/version-history/version-history.js.map +1 -0
  196. package/build/sandbox.d.ts +2 -0
  197. package/build/sandbox.d.ts.map +1 -0
  198. package/build/sandbox.js +3 -0
  199. package/build/sandbox.js.map +1 -0
  200. package/build/template/components/Link.jsx +1 -1
  201. package/package.json +16 -9
  202. package/src/api/api.ts +1 -0
  203. package/src/api/singletons/markdown/markdown.test.ts +1 -1
  204. package/src/api/static/index.ts +1 -0
  205. package/src/api/static/manifest.test.ts +106 -0
  206. package/src/api/static/manifest.ts +16 -0
  207. package/src/api/static/rebase.test.ts +229 -0
  208. package/src/api/static/rebase.ts +140 -0
  209. package/src/api/static/static.ts +2 -0
  210. package/src/api/utils/asset-url/asset-url.test.ts +4 -4
  211. package/src/api/vite/plugins/build.ts +25 -1
  212. package/src/api/vite/plugins/core.ts +1 -1
  213. package/src/cli/commands/static/$default.ts +43 -0
  214. package/src/cli/commands/static/rebase.ts +37 -0
  215. package/src/cli/commands/static.ts +6 -0
  216. package/src/lib/demos/builder.ts +298 -0
  217. package/src/lib/demos/config-schema.ts +56 -0
  218. package/src/lib/demos/config.test.ts +193 -0
  219. package/src/lib/demos/config.ts +205 -0
  220. package/src/lib/demos/index.ts +9 -0
  221. package/src/lib/demos/ui/components.ts +739 -0
  222. package/src/lib/demos/ui/data-collector.ts +246 -0
  223. package/src/lib/demos/ui/landing-page-cli.ts +23 -0
  224. package/src/lib/demos/ui/landing-page.ts +126 -0
  225. package/src/lib/demos/ui/page-renderer.ts +124 -0
  226. package/src/lib/demos/utils.ts +43 -0
  227. package/src/lib/deployment/$$.ts +2 -0
  228. package/src/lib/deployment/$.test.ts +53 -0
  229. package/src/lib/deployment/$.ts +1 -0
  230. package/src/lib/deployment/metadata.ts +40 -0
  231. package/src/lib/deployment/path-manager.ts +186 -0
  232. package/src/lib/github-actions/git-controller.ts +151 -0
  233. package/src/lib/github-actions/github-actions.ts +6 -0
  234. package/src/lib/github-actions/index.ts +1 -0
  235. package/src/lib/github-actions/lib/get-pr-deployments.ts +76 -0
  236. package/src/lib/github-actions/pr-controller.test.ts +172 -0
  237. package/src/lib/github-actions/pr-controller.ts +183 -0
  238. package/src/lib/github-actions/run-step-cli.ts +84 -0
  239. package/src/lib/github-actions/runner.test.ts +192 -0
  240. package/src/lib/github-actions/runner.ts +226 -0
  241. package/src/lib/github-actions/schemas/context.ts +424 -0
  242. package/src/lib/github-actions/schemas/index.ts +5 -0
  243. package/src/lib/github-actions/search-module.test.ts +110 -0
  244. package/src/lib/github-actions/search-module.ts +76 -0
  245. package/src/lib/github-actions/step.test.ts +149 -0
  246. package/src/lib/github-actions/step.ts +232 -0
  247. package/src/lib/helpers.ts +4 -3
  248. package/src/lib/kit-temp.test-d.ts +115 -0
  249. package/src/lib/kit-temp.test.ts +127 -0
  250. package/src/lib/kit-temp.ts +126 -14
  251. package/src/lib/mask/$$.ts +2 -0
  252. package/src/lib/mask/$.test.ts +248 -0
  253. package/src/lib/mask/$.ts +1 -0
  254. package/src/lib/mask/apply.ts +134 -0
  255. package/src/lib/mask/mask.test-d.ts +144 -0
  256. package/src/lib/mask/mask.ts +244 -0
  257. package/src/lib/shiki/shiki.test.ts +1 -1
  258. package/src/lib/task/$$.ts +2 -0
  259. package/src/lib/task/$.test.ts +209 -0
  260. package/src/lib/task/$.ts +1 -0
  261. package/src/lib/task/report.ts +72 -0
  262. package/src/lib/task/task.ts +112 -0
  263. package/src/lib/version-history/index.test.ts +188 -0
  264. package/src/lib/version-history/index.ts +4 -0
  265. package/src/lib/version-history/types.ts +68 -0
  266. package/src/lib/version-history/version-history.ts +293 -0
  267. package/src/sandbox.ts +1 -0
  268. package/src/template/components/Link.tsx +1 -1
@@ -0,0 +1,424 @@
1
+ /**
2
+ * GitHub Actions context schemas with proper typing for event payloads
3
+ * Based on GitHub's official webhook documentation
4
+ *
5
+ * @see {@link https://docs.github.com/en/webhooks/webhook-events-and-payloads}
6
+ */
7
+
8
+ import { z } from 'zod/v4'
9
+
10
+ /**
11
+ * GitHub user information
12
+ */
13
+ const User = z.object({
14
+ /** User's login username */
15
+ login: z.string(),
16
+ /** Unique user ID */
17
+ id: z.number(),
18
+ /** Node ID for GraphQL */
19
+ node_id: z.string(),
20
+ /** URL to user's avatar image */
21
+ avatar_url: z.string(),
22
+ /** URL to user's GitHub profile */
23
+ html_url: z.string().optional(),
24
+ /** User type (e.g., 'User', 'Bot') */
25
+ type: z.string(),
26
+ /** Whether user is a site administrator */
27
+ site_admin: z.boolean(),
28
+ })
29
+
30
+ /**
31
+ * Repository information
32
+ */
33
+ const Repository = z.object({
34
+ /** Unique repository ID */
35
+ id: z.number(),
36
+ /** Node ID for GraphQL */
37
+ node_id: z.string(),
38
+ /** Repository name (without owner) */
39
+ name: z.string(),
40
+ /** Full repository name (owner/name) */
41
+ full_name: z.string(),
42
+ /** Whether repository is private */
43
+ private: z.boolean(),
44
+ /** Repository owner */
45
+ owner: User,
46
+ /** Repository's GitHub page URL */
47
+ html_url: z.string(),
48
+ /** Repository description */
49
+ description: z.string().nullable(),
50
+ /** Whether repository is a fork */
51
+ fork: z.boolean(),
52
+ /** ISO 8601 timestamp of repository creation */
53
+ created_at: z.string(),
54
+ /** ISO 8601 timestamp of last update */
55
+ updated_at: z.string(),
56
+ /** ISO 8601 timestamp of last push */
57
+ pushed_at: z.string(),
58
+ /** Git clone URL */
59
+ git_url: z.string(),
60
+ /** SSH clone URL */
61
+ ssh_url: z.string(),
62
+ /** HTTPS clone URL */
63
+ clone_url: z.string(),
64
+ /** Default branch name */
65
+ default_branch: z.string(),
66
+ })
67
+
68
+ /**
69
+ * Git reference (branch/tag) information
70
+ */
71
+ const GitRef = z.object({
72
+ /** Label including owner prefix (e.g., 'owner:branch-name') */
73
+ label: z.string(),
74
+ /** Reference name (e.g., 'main', 'feature-branch') */
75
+ ref: z.string(),
76
+ /** Commit SHA for this reference */
77
+ sha: z.string(),
78
+ /** User who owns the reference */
79
+ user: User,
80
+ /** Repository containing this reference */
81
+ repo: Repository,
82
+ })
83
+
84
+ /**
85
+ * Pull request information
86
+ */
87
+ const PullRequest = z.object({
88
+ /** API URL for this pull request */
89
+ url: z.string(),
90
+ /** Unique pull request ID */
91
+ id: z.number(),
92
+ /** Node ID for GraphQL */
93
+ node_id: z.string(),
94
+ /** HTML URL to view pull request on GitHub */
95
+ html_url: z.string(),
96
+ /** Pull request number (unique per repository) */
97
+ number: z.number(),
98
+ /** Current state: 'open' or 'closed' */
99
+ state: z.enum(['open', 'closed']),
100
+ /** Whether pull request is locked */
101
+ locked: z.boolean(),
102
+ /** Pull request title */
103
+ title: z.string(),
104
+ /** User who created the pull request */
105
+ user: User,
106
+ /** Pull request description body */
107
+ body: z.string().nullable(),
108
+ /** ISO 8601 timestamp when created */
109
+ created_at: z.string(),
110
+ /** ISO 8601 timestamp when last updated */
111
+ updated_at: z.string(),
112
+ /** ISO 8601 timestamp when closed (if closed) */
113
+ closed_at: z.string().nullable(),
114
+ /** ISO 8601 timestamp when merged (if merged) */
115
+ merged_at: z.string().nullable(),
116
+ /** SHA of the merge commit (if merged) */
117
+ merge_commit_sha: z.string().nullable(),
118
+ /** User assigned to review */
119
+ assignee: User.nullable(),
120
+ /** All users assigned to review */
121
+ assignees: z.array(User),
122
+ /** Users requested to review */
123
+ requested_reviewers: z.array(User),
124
+ /** Teams requested to review */
125
+ requested_teams: z.array(z.any()),
126
+ /** Labels applied to pull request */
127
+ labels: z.array(z.object({
128
+ id: z.number(),
129
+ node_id: z.string(),
130
+ url: z.string(),
131
+ name: z.string(),
132
+ color: z.string(),
133
+ default: z.boolean(),
134
+ description: z.string().nullable(),
135
+ })),
136
+ /** Associated milestone */
137
+ milestone: z.any().nullable(),
138
+ /** Whether this is a draft pull request */
139
+ draft: z.boolean(),
140
+ /** Source branch/fork information */
141
+ head: GitRef,
142
+ /** Target branch information */
143
+ base: GitRef,
144
+ /** Whether PR has been merged */
145
+ merged: z.boolean().optional(),
146
+ /** Whether PR is mergeable */
147
+ mergeable: z.boolean().nullable().optional(),
148
+ /** Whether PR is in a rebasing state */
149
+ rebaseable: z.boolean().nullable().optional(),
150
+ /** Merge state status */
151
+ mergeable_state: z.string().optional(),
152
+ /** User who merged the PR */
153
+ merged_by: User.nullable().optional(),
154
+ /** Number of comments */
155
+ comments: z.number().optional(),
156
+ /** Number of review comments */
157
+ review_comments: z.number().optional(),
158
+ /** Whether maintainer can modify */
159
+ maintainer_can_modify: z.boolean().optional(),
160
+ /** Number of commits */
161
+ commits: z.number().optional(),
162
+ /** Number of additions */
163
+ additions: z.number().optional(),
164
+ /** Number of deletions */
165
+ deletions: z.number().optional(),
166
+ /** Number of changed files */
167
+ changed_files: z.number().optional(),
168
+ })
169
+
170
+ /**
171
+ * Pull request webhook event payload
172
+ * Triggered when a pull request is opened, closed, or changed
173
+ *
174
+ * @see {@link https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request}
175
+ */
176
+ export const PullRequestEvent = z.object({
177
+ /**
178
+ * Action that triggered the event
179
+ * Common actions: opened, closed, reopened, synchronize, edited
180
+ */
181
+ action: z.enum([
182
+ 'opened',
183
+ 'edited',
184
+ 'closed',
185
+ 'assigned',
186
+ 'unassigned',
187
+ 'review_requested',
188
+ 'review_request_removed',
189
+ 'ready_for_review',
190
+ 'converted_to_draft',
191
+ 'labeled',
192
+ 'unlabeled',
193
+ 'synchronize',
194
+ 'auto_merge_enabled',
195
+ 'auto_merge_disabled',
196
+ 'locked',
197
+ 'unlocked',
198
+ 'reopened',
199
+ ]),
200
+ /** Pull request number (same as pull_request.number) */
201
+ number: z.number(),
202
+ /** Full pull request object */
203
+ pull_request: PullRequest,
204
+ /** Repository where event occurred */
205
+ repository: Repository,
206
+ /** User who triggered the event */
207
+ sender: User,
208
+ /** GitHub App installation (if applicable) */
209
+ installation: z.any().optional(),
210
+ /** Organization (if applicable) */
211
+ organization: z.any().optional(),
212
+ })
213
+
214
+ /**
215
+ * Push webhook event payload
216
+ * Triggered when commits are pushed to a repository
217
+ *
218
+ * @see {@link https://docs.github.com/en/webhooks/webhook-events-and-payloads#push}
219
+ */
220
+ export const PushEvent = z.object({
221
+ /** Git ref that was pushed (e.g., 'refs/heads/main') */
222
+ ref: z.string(),
223
+ /** Commit SHA before the push */
224
+ before: z.string(),
225
+ /** Commit SHA after the push */
226
+ after: z.string(),
227
+ /** Whether this created a new branch/tag */
228
+ created: z.boolean(),
229
+ /** Whether this deleted a branch/tag */
230
+ deleted: z.boolean(),
231
+ /** Whether this was a force push */
232
+ forced: z.boolean(),
233
+ /** Base ref for comparison */
234
+ base_ref: z.string().nullable(),
235
+ /** URL to compare changes */
236
+ compare: z.string(),
237
+ /** Array of commits in this push */
238
+ commits: z.array(z.object({
239
+ /** Commit SHA */
240
+ id: z.string(),
241
+ /** Tree SHA */
242
+ tree_id: z.string(),
243
+ /** Whether commit is distinct */
244
+ distinct: z.boolean(),
245
+ /** Commit message */
246
+ message: z.string(),
247
+ /** ISO 8601 timestamp */
248
+ timestamp: z.string(),
249
+ /** URL to view commit */
250
+ url: z.string(),
251
+ /** Commit author */
252
+ author: z.object({
253
+ name: z.string(),
254
+ email: z.string(),
255
+ username: z.string().optional(),
256
+ }),
257
+ /** Commit committer */
258
+ committer: z.object({
259
+ name: z.string(),
260
+ email: z.string(),
261
+ username: z.string().optional(),
262
+ }),
263
+ /** Files added in commit */
264
+ added: z.array(z.string()),
265
+ /** Files removed in commit */
266
+ removed: z.array(z.string()),
267
+ /** Files modified in commit */
268
+ modified: z.array(z.string()),
269
+ })),
270
+ /** HEAD commit after push */
271
+ head_commit: z.any().nullable(),
272
+ /** Repository where push occurred */
273
+ repository: Repository,
274
+ /** User who pushed */
275
+ pusher: z.object({
276
+ name: z.string(),
277
+ email: z.string(),
278
+ }),
279
+ /** User who triggered the event */
280
+ sender: User,
281
+ })
282
+
283
+ /**
284
+ * Workflow dispatch event payload
285
+ * Triggered when a workflow is manually triggered
286
+ *
287
+ * @see {@link https://docs.github.com/en/webhooks/webhook-events-and-payloads#workflow_dispatch}
288
+ */
289
+ export const WorkflowDispatchEvent = z.object({
290
+ /** Input values provided to the workflow */
291
+ inputs: z.record(z.string(), z.any()).optional(),
292
+ /** Git ref where workflow was triggered */
293
+ ref: z.string(),
294
+ /** Repository where workflow was triggered */
295
+ repository: Repository,
296
+ /** User who triggered the workflow */
297
+ sender: User,
298
+ /** Workflow file name */
299
+ workflow: z.string(),
300
+ })
301
+
302
+ /**
303
+ * Release event payload
304
+ * Triggered when a release is published, unpublished, created, edited, deleted, or prereleased
305
+ *
306
+ * @see {@link https://docs.github.com/en/webhooks/webhook-events-and-payloads#release}
307
+ */
308
+ export const ReleaseEvent = z.object({
309
+ /** Action that triggered the event */
310
+ action: z.enum(['published', 'unpublished', 'created', 'edited', 'deleted', 'prereleased', 'released']),
311
+ /** Release information */
312
+ release: z.object({
313
+ /** Unique release ID */
314
+ id: z.number(),
315
+ /** Node ID for GraphQL */
316
+ node_id: z.string(),
317
+ /** Tag name for the release */
318
+ tag_name: z.string(),
319
+ /** Target commitish (branch/SHA) */
320
+ target_commitish: z.string(),
321
+ /** Release name */
322
+ name: z.string().nullable(),
323
+ /** Whether this is a draft release */
324
+ draft: z.boolean(),
325
+ /** Whether this is a prerelease */
326
+ prerelease: z.boolean(),
327
+ /** ISO 8601 timestamp when created */
328
+ created_at: z.string(),
329
+ /** ISO 8601 timestamp when published */
330
+ published_at: z.string().nullable(),
331
+ /** User who created the release */
332
+ author: User,
333
+ /** Release assets */
334
+ assets: z.array(z.any()),
335
+ /** Release description */
336
+ body: z.string().nullable(),
337
+ }),
338
+ /** Repository where release was created */
339
+ repository: Repository,
340
+ /** User who triggered the event */
341
+ sender: User,
342
+ })
343
+
344
+ /**
345
+ * Generic GitHub Actions context that accepts any event type
346
+ * Use this when your step needs to work with multiple event types
347
+ */
348
+ export const Context = z.object({
349
+ /** Event name (e.g., 'push', 'pull_request', etc.) */
350
+ // eventName: z.any(),
351
+ /** Event payload (structure depends on eventName) */
352
+ // payload: z.any(),
353
+ /** Repository information */
354
+ repo: z.object({
355
+ owner: z.string(),
356
+ repo: z.string(),
357
+ }),
358
+ /** Workflow information */
359
+ workflow: z.string(),
360
+ /** Job name */
361
+ job: z.string(),
362
+ /** Run ID */
363
+ runId: z.number(),
364
+ /** Run number */
365
+ runNumber: z.number(),
366
+ /** SHA that triggered the workflow */
367
+ sha: z.string(),
368
+ /** Ref that triggered the workflow */
369
+ ref: z.string(),
370
+ /** Actor who triggered the workflow */
371
+ actor: z.string(),
372
+ })
373
+
374
+ export type ContextSchema = typeof Context
375
+
376
+ export type Context = z.output<typeof Context>
377
+
378
+ /**
379
+ * GitHub Actions context with pull_request event
380
+ * Use this to ensure your step only runs on pull request events
381
+ */
382
+ export const PullRequestContext = z.object({
383
+ ...Context.shape,
384
+ /** Will always be 'pull_request' */
385
+ eventName: z.literal('pull_request'),
386
+ /** Pull request event payload */
387
+ payload: PullRequestEvent,
388
+ })
389
+
390
+ /**
391
+ * GitHub Actions context with push event
392
+ * Use this to ensure your step only runs on push events
393
+ */
394
+ export const PushContext = z.object({
395
+ ...Context.shape,
396
+ /** Will always be 'push' */
397
+ eventName: z.literal('push'),
398
+ /** Push event payload */
399
+ payload: PushEvent,
400
+ })
401
+
402
+ /**
403
+ * GitHub Actions context with workflow_dispatch event
404
+ * Use this to ensure your step only runs on manual workflow triggers
405
+ */
406
+ export const WorkflowDispatchContext = z.object({
407
+ ...Context.shape,
408
+ /** Will always be 'workflow_dispatch' */
409
+ eventName: z.literal('workflow_dispatch'),
410
+ /** Workflow dispatch event payload */
411
+ payload: WorkflowDispatchEvent,
412
+ })
413
+
414
+ /**
415
+ * GitHub Actions context with release event
416
+ * Use this to ensure your step only runs on release events
417
+ */
418
+ export const ReleaseContext = z.object({
419
+ ...Context.shape,
420
+ /** Will always be 'release' */
421
+ eventName: z.literal('release'),
422
+ /** Release event payload */
423
+ payload: ReleaseEvent,
424
+ })
@@ -0,0 +1,5 @@
1
+ /**
2
+ * GitHub Actions schemas
3
+ */
4
+
5
+ export * from './context.ts'
@@ -0,0 +1,110 @@
1
+ import { existsSync } from 'node:fs'
2
+ import { join } from 'node:path'
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
4
+ import { searchModule } from './search-module.ts'
5
+
6
+ // Mock fs module
7
+ vi.mock('node:fs', () => ({
8
+ existsSync: vi.fn(),
9
+ }))
10
+
11
+ describe('discoverStep', () => {
12
+ const mockExistsSync = existsSync as ReturnType<typeof vi.fn>
13
+ const baseDir = '/test/project'
14
+
15
+ beforeEach(() => {
16
+ vi.clearAllMocks()
17
+ })
18
+
19
+ it('finds workflow-specific step first', () => {
20
+ const workflowPath = join(baseDir, '.github/steps', 'preview', 'pr-comment.ts')
21
+ const generalPath = join(baseDir, '.github/steps', 'pr-comment.ts')
22
+
23
+ mockExistsSync.mockImplementation((path) => path === workflowPath)
24
+
25
+ const result = searchModule({
26
+ stepName: 'pr-comment',
27
+ workflowName: 'preview',
28
+ baseDir,
29
+ })
30
+
31
+ expect(result).toEqual({
32
+ found: true,
33
+ path: workflowPath,
34
+ searchedPaths: [workflowPath],
35
+ })
36
+
37
+ // Should not check general path if workflow-specific found
38
+ expect(mockExistsSync).toHaveBeenCalledTimes(1)
39
+ })
40
+
41
+ it('falls back to general step if workflow-specific not found', () => {
42
+ const workflowPath = join(baseDir, '.github/steps', 'preview', 'pr-comment.ts')
43
+ const generalPath = join(baseDir, '.github/steps', 'pr-comment.ts')
44
+
45
+ mockExistsSync.mockImplementation((path) => path === generalPath)
46
+
47
+ const result = searchModule({
48
+ stepName: 'pr-comment',
49
+ workflowName: 'preview',
50
+ baseDir,
51
+ })
52
+
53
+ expect(result).toEqual({
54
+ found: true,
55
+ path: generalPath,
56
+ searchedPaths: [workflowPath, generalPath],
57
+ })
58
+
59
+ expect(mockExistsSync).toHaveBeenCalledWith(workflowPath)
60
+ expect(mockExistsSync).toHaveBeenCalledWith(generalPath)
61
+ })
62
+
63
+ it('searches only general path when no workflow name', () => {
64
+ const generalPath = join(baseDir, '.github/steps', 'build-demos.ts')
65
+
66
+ mockExistsSync.mockImplementation((path) => path === generalPath)
67
+
68
+ const result = searchModule({
69
+ stepName: 'build-demos',
70
+ baseDir,
71
+ })
72
+
73
+ expect(result).toEqual({
74
+ found: true,
75
+ path: generalPath,
76
+ searchedPaths: [generalPath],
77
+ })
78
+ })
79
+
80
+ it('returns not found when step does not exist', () => {
81
+ mockExistsSync.mockReturnValue(false)
82
+
83
+ const result = searchModule({
84
+ stepName: 'non-existent',
85
+ workflowName: 'preview',
86
+ baseDir,
87
+ })
88
+
89
+ expect(result).toEqual({
90
+ found: false,
91
+ searchedPaths: [
92
+ join(baseDir, '.github/steps', 'preview', 'non-existent.ts'),
93
+ join(baseDir, '.github/steps', 'non-existent.ts'),
94
+ ],
95
+ })
96
+ })
97
+
98
+ it('uses process.cwd() as default base directory', () => {
99
+ const cwd = process.cwd()
100
+ const generalPath = join(cwd, '.github/steps', 'test.ts')
101
+
102
+ mockExistsSync.mockImplementation((path) => path === generalPath)
103
+
104
+ const result = searchModule({
105
+ stepName: 'test',
106
+ })
107
+
108
+ expect(result.path).toBe(generalPath)
109
+ })
110
+ })
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Step discovery utilities for GitHub Actions
3
+ */
4
+
5
+ import { existsSync } from 'node:fs'
6
+ import { join } from 'node:path'
7
+
8
+ export interface Options {
9
+ /**
10
+ * The name of the step to find
11
+ */
12
+ stepName: string
13
+ /**
14
+ * The name of the workflow (optional)
15
+ */
16
+ workflowName?: string
17
+ /**
18
+ * Base directory to search from (defaults to process.cwd())
19
+ */
20
+ baseDir?: string
21
+ }
22
+
23
+ export interface ModuleSearchResult {
24
+ /**
25
+ * Whether the step was found
26
+ */
27
+ found: boolean
28
+ /**
29
+ * The absolute path to the step module
30
+ */
31
+ path?: string
32
+ /**
33
+ * Paths that were searched
34
+ */
35
+ searchedPaths: string[]
36
+ }
37
+
38
+ /**
39
+ * Discover a workflow step module using the convention:
40
+ * 1. First try: .github/steps/<workflow-name>/<step-name>.ts
41
+ * 2. Second try: .github/steps/<step-name>.ts
42
+ */
43
+ export function searchModule(options: Options): ModuleSearchResult {
44
+ const { stepName, workflowName, baseDir = process.cwd() } = options
45
+ const searchedPaths: string[] = []
46
+
47
+ if (workflowName) {
48
+ const workflowSpecificPath = join(baseDir, '.github/steps', workflowName, `${stepName}.ts`)
49
+ searchedPaths.push(workflowSpecificPath)
50
+
51
+ if (existsSync(workflowSpecificPath)) {
52
+ return {
53
+ found: true,
54
+ path: workflowSpecificPath,
55
+ searchedPaths,
56
+ }
57
+ }
58
+ }
59
+
60
+ // Try general path
61
+ const generalPath = join(baseDir, '.github/steps', `${stepName}.ts`)
62
+ searchedPaths.push(generalPath)
63
+
64
+ if (existsSync(generalPath)) {
65
+ return {
66
+ found: true,
67
+ path: generalPath,
68
+ searchedPaths,
69
+ }
70
+ }
71
+
72
+ return {
73
+ found: false,
74
+ searchedPaths,
75
+ }
76
+ }