@alwaysmeticulous/cli 2.326.1 → 2.328.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 (456) hide show
  1. package/dist/__tests__/commonjs-dependencies.spec.d.ts +2 -0
  2. package/dist/__tests__/commonjs-dependencies.spec.d.ts.map +1 -0
  3. package/dist/__tests__/commonjs-dependencies.spec.js +82 -0
  4. package/dist/__tests__/commonjs-dependencies.spec.js.map +1 -0
  5. package/dist/command-utils/__tests__/parse-rewrites.spec.js +2 -2
  6. package/dist/command-utils/__tests__/parse-rewrites.spec.js.map +1 -1
  7. package/dist/command-utils/__tests__/warn-regex-rewrites.spec.js +2 -2
  8. package/dist/command-utils/__tests__/warn-regex-rewrites.spec.js.map +1 -1
  9. package/dist/command-utils/common-options.js +2 -2
  10. package/dist/command-utils/common-options.js.map +1 -1
  11. package/dist/command-utils/detect-upload-mode.js +2 -2
  12. package/dist/command-utils/detect-upload-mode.js.map +1 -1
  13. package/dist/command-utils/detect-upload-mode.spec.js +2 -2
  14. package/dist/command-utils/detect-upload-mode.spec.js.map +1 -1
  15. package/dist/command-utils/download-session.utils.js +2 -2
  16. package/dist/command-utils/download-session.utils.js.map +1 -1
  17. package/dist/command-utils/json-args.js +2 -2
  18. package/dist/command-utils/json-args.js.map +1 -1
  19. package/dist/command-utils/json-args.spec.js +2 -2
  20. package/dist/command-utils/json-args.spec.js.map +1 -1
  21. package/dist/command-utils/parse-container-env.js +2 -2
  22. package/dist/command-utils/parse-container-env.js.map +1 -1
  23. package/dist/command-utils/parse-rewrites.js +2 -2
  24. package/dist/command-utils/parse-rewrites.js.map +1 -1
  25. package/dist/command-utils/print-json.js +2 -2
  26. package/dist/command-utils/print-json.js.map +1 -1
  27. package/dist/command-utils/sentry.utils.js +2 -2
  28. package/dist/command-utils/sentry.utils.js.map +1 -1
  29. package/dist/command-utils/warn-regex-rewrites.js +2 -2
  30. package/dist/command-utils/warn-regex-rewrites.js.map +1 -1
  31. package/dist/commands/agent/agent-review-writes.command.spec.js +2 -2
  32. package/dist/commands/agent/agent-review-writes.command.spec.js.map +1 -1
  33. package/dist/commands/agent/build-git-options.js +2 -2
  34. package/dist/commands/agent/build-git-options.js.map +1 -1
  35. package/dist/commands/agent/build-git-options.spec.js +2 -2
  36. package/dist/commands/agent/build-git-options.spec.js.map +1 -1
  37. package/dist/commands/agent/coverage-columns.util.js +2 -2
  38. package/dist/commands/agent/coverage-columns.util.js.map +1 -1
  39. package/dist/commands/agent/create-diff-comment.command.js +2 -2
  40. package/dist/commands/agent/create-diff-comment.command.js.map +1 -1
  41. package/dist/commands/agent/diff-comment-write.utils.js +2 -2
  42. package/dist/commands/agent/diff-comment-write.utils.js.map +1 -1
  43. package/dist/commands/agent/diff-comments.command.js +2 -2
  44. package/dist/commands/agent/diff-comments.command.js.map +1 -1
  45. package/dist/commands/agent/diff-comments.command.spec.js +2 -2
  46. package/dist/commands/agent/diff-comments.command.spec.js.map +1 -1
  47. package/dist/commands/agent/ignore-diff.command.js +2 -2
  48. package/dist/commands/agent/ignore-diff.command.js.map +1 -1
  49. package/dist/commands/agent/index.js +2 -2
  50. package/dist/commands/agent/index.js.map +1 -1
  51. package/dist/commands/agent/js-coverage-diff.command.js +2 -2
  52. package/dist/commands/agent/js-coverage-diff.command.js.map +1 -1
  53. package/dist/commands/agent/js-coverage.command.handler.spec.js +2 -2
  54. package/dist/commands/agent/js-coverage.command.handler.spec.js.map +1 -1
  55. package/dist/commands/agent/js-coverage.command.js +2 -2
  56. package/dist/commands/agent/js-coverage.command.js.map +1 -1
  57. package/dist/commands/agent/js-coverage.command.spec.js +2 -2
  58. package/dist/commands/agent/js-coverage.command.spec.js.map +1 -1
  59. package/dist/commands/agent/reject-diff.command.js +2 -2
  60. package/dist/commands/agent/reject-diff.command.js.map +1 -1
  61. package/dist/commands/agent/reject-diff.command.spec.js +2 -2
  62. package/dist/commands/agent/reject-diff.command.spec.js.map +1 -1
  63. package/dist/commands/agent/reply-to-diff-comment.command.js +2 -2
  64. package/dist/commands/agent/reply-to-diff-comment.command.js.map +1 -1
  65. package/dist/commands/agent/screenshot-dom-diff.command.js +2 -2
  66. package/dist/commands/agent/screenshot-dom-diff.command.js.map +1 -1
  67. package/dist/commands/agent/screenshot-image-files.command.js +2 -2
  68. package/dist/commands/agent/screenshot-image-files.command.js.map +1 -1
  69. package/dist/commands/agent/screenshot-image.command.js +2 -2
  70. package/dist/commands/agent/screenshot-image.command.js.map +1 -1
  71. package/dist/commands/agent/sessions.command.js +2 -2
  72. package/dist/commands/agent/sessions.command.js.map +1 -1
  73. package/dist/commands/agent/sessions.command.spec.js +2 -2
  74. package/dist/commands/agent/sessions.command.spec.js.map +1 -1
  75. package/dist/commands/agent/submit-feedback.command.js +2 -2
  76. package/dist/commands/agent/submit-feedback.command.js.map +1 -1
  77. package/dist/commands/agent/test-run-check.command.js +2 -2
  78. package/dist/commands/agent/test-run-check.command.js.map +1 -1
  79. package/dist/commands/agent/test-run-check.command.spec.js +2 -2
  80. package/dist/commands/agent/test-run-check.command.spec.js.map +1 -1
  81. package/dist/commands/agent/test-run-diffs.command.js +2 -2
  82. package/dist/commands/agent/test-run-diffs.command.js.map +1 -1
  83. package/dist/commands/agent/test-run-diffs.command.spec.js +2 -2
  84. package/dist/commands/agent/test-run-diffs.command.spec.js.map +1 -1
  85. package/dist/commands/agent/test-run-diffs.utils.js +2 -2
  86. package/dist/commands/agent/test-run-diffs.utils.js.map +1 -1
  87. package/dist/commands/agent/test-run-diffs.utils.spec.js +2 -2
  88. package/dist/commands/agent/test-run-diffs.utils.spec.js.map +1 -1
  89. package/dist/commands/agent/test-run-for-commit.command.js +2 -2
  90. package/dist/commands/agent/test-run-for-commit.command.js.map +1 -1
  91. package/dist/commands/agent/timeline.command.js +2 -2
  92. package/dist/commands/agent/timeline.command.js.map +1 -1
  93. package/dist/commands/agent/timeline.command.spec.js +2 -2
  94. package/dist/commands/agent/timeline.command.spec.js.map +1 -1
  95. package/dist/commands/agent/trigger-test-run.command.js +2 -2
  96. package/dist/commands/agent/trigger-test-run.command.js.map +1 -1
  97. package/dist/commands/agent/trigger-test-run.command.spec.js +2 -2
  98. package/dist/commands/agent/trigger-test-run.command.spec.js.map +1 -1
  99. package/dist/commands/agent/upload-build.command.js +2 -2
  100. package/dist/commands/agent/upload-build.command.js.map +1 -1
  101. package/dist/commands/all-commands.d.ts.map +1 -1
  102. package/dist/commands/all-commands.js +8 -6
  103. package/dist/commands/all-commands.js.map +1 -1
  104. package/dist/commands/auth/__tests__/get-project.command.spec.js +2 -2
  105. package/dist/commands/auth/__tests__/get-project.command.spec.js.map +1 -1
  106. package/dist/commands/auth/__tests__/list-projects.command.spec.js +2 -2
  107. package/dist/commands/auth/__tests__/list-projects.command.spec.js.map +1 -1
  108. package/dist/commands/auth/__tests__/login.command.spec.js +2 -2
  109. package/dist/commands/auth/__tests__/login.command.spec.js.map +1 -1
  110. package/dist/commands/auth/__tests__/logout.command.spec.js +2 -2
  111. package/dist/commands/auth/__tests__/logout.command.spec.js.map +1 -1
  112. package/dist/commands/auth/__tests__/set-project.command.spec.js +2 -2
  113. package/dist/commands/auth/__tests__/set-project.command.spec.js.map +1 -1
  114. package/dist/commands/auth/__tests__/whoami.command.spec.js +2 -2
  115. package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -1
  116. package/dist/commands/auth/get-project.command.js +2 -2
  117. package/dist/commands/auth/get-project.command.js.map +1 -1
  118. package/dist/commands/auth/index.js +2 -2
  119. package/dist/commands/auth/index.js.map +1 -1
  120. package/dist/commands/auth/list-projects.command.js +2 -2
  121. package/dist/commands/auth/list-projects.command.js.map +1 -1
  122. package/dist/commands/auth/login.command.js +2 -2
  123. package/dist/commands/auth/login.command.js.map +1 -1
  124. package/dist/commands/auth/logout.command.js +2 -2
  125. package/dist/commands/auth/logout.command.js.map +1 -1
  126. package/dist/commands/auth/set-project.command.js +2 -2
  127. package/dist/commands/auth/set-project.command.js.map +1 -1
  128. package/dist/commands/auth/whoami.command.js +2 -2
  129. package/dist/commands/auth/whoami.command.js.map +1 -1
  130. package/dist/commands/ci/__tests__/label-commit.utils.spec.js +2 -2
  131. package/dist/commands/ci/__tests__/label-commit.utils.spec.js.map +1 -1
  132. package/dist/commands/ci/__tests__/session-filter.utils.spec.js +2 -2
  133. package/dist/commands/ci/__tests__/session-filter.utils.spec.js.map +1 -1
  134. package/dist/commands/ci/agent-test.command.d.ts +2 -0
  135. package/dist/commands/ci/agent-test.command.d.ts.map +1 -1
  136. package/dist/commands/ci/agent-test.command.js +28 -3
  137. package/dist/commands/ci/agent-test.command.js.map +1 -1
  138. package/dist/commands/ci/agent-test.command.spec.d.ts +2 -0
  139. package/dist/commands/ci/agent-test.command.spec.d.ts.map +1 -0
  140. package/dist/commands/ci/agent-test.command.spec.js +133 -0
  141. package/dist/commands/ci/agent-test.command.spec.js.map +1 -0
  142. package/dist/commands/ci/deprecated-trigger-options.js +2 -2
  143. package/dist/commands/ci/deprecated-trigger-options.js.map +1 -1
  144. package/dist/commands/ci/index.js +2 -2
  145. package/dist/commands/ci/index.js.map +1 -1
  146. package/dist/commands/ci/label-commit.command.js +2 -2
  147. package/dist/commands/ci/label-commit.command.js.map +1 -1
  148. package/dist/commands/ci/label-commit.core.js +2 -2
  149. package/dist/commands/ci/label-commit.core.js.map +1 -1
  150. package/dist/commands/ci/label-commit.types.js +2 -2
  151. package/dist/commands/ci/label-commit.types.js.map +1 -1
  152. package/dist/commands/ci/label-commit.utils.js +2 -2
  153. package/dist/commands/ci/label-commit.utils.js.map +1 -1
  154. package/dist/commands/ci/prepare.command.js +2 -2
  155. package/dist/commands/ci/prepare.command.js.map +1 -1
  156. package/dist/commands/ci/resolve-git-options.js +2 -2
  157. package/dist/commands/ci/resolve-git-options.js.map +1 -1
  158. package/dist/commands/ci/run-local.command.js +2 -2
  159. package/dist/commands/ci/run-local.command.js.map +1 -1
  160. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js +2 -2
  161. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js.map +1 -1
  162. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.spec.js +2 -2
  163. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.spec.js.map +1 -1
  164. package/dist/commands/ci/run-with-uploaded-asset-chunks.utils.js +2 -2
  165. package/dist/commands/ci/run-with-uploaded-asset-chunks.utils.js.map +1 -1
  166. package/dist/commands/ci/run.command.js +2 -2
  167. package/dist/commands/ci/run.command.js.map +1 -1
  168. package/dist/commands/ci/session-filter.utils.js +2 -2
  169. package/dist/commands/ci/session-filter.utils.js.map +1 -1
  170. package/dist/commands/ci/start-tunnel.command.js +2 -2
  171. package/dist/commands/ci/start-tunnel.command.js.map +1 -1
  172. package/dist/commands/ci/trigger-test-run.core.js +2 -2
  173. package/dist/commands/ci/trigger-test-run.core.js.map +1 -1
  174. package/dist/commands/ci/trigger-test-run.types.js +2 -2
  175. package/dist/commands/ci/trigger-test-run.types.js.map +1 -1
  176. package/dist/commands/ci/upload-asset-chunk.command.js +2 -2
  177. package/dist/commands/ci/upload-asset-chunk.command.js.map +1 -1
  178. package/dist/commands/ci/upload-assets.command.js +2 -2
  179. package/dist/commands/ci/upload-assets.command.js.map +1 -1
  180. package/dist/commands/ci/upload-container.command.js +2 -2
  181. package/dist/commands/ci/upload-container.command.js.map +1 -1
  182. package/dist/commands/crawl.command.js +2 -2
  183. package/dist/commands/crawl.command.js.map +1 -1
  184. package/dist/commands/debug/clean-workspaces.js +2 -2
  185. package/dist/commands/debug/clean-workspaces.js.map +1 -1
  186. package/dist/commands/debug/index.js +2 -2
  187. package/dist/commands/debug/index.js.map +1 -1
  188. package/dist/commands/debug/present-workspace.js +2 -2
  189. package/dist/commands/debug/present-workspace.js.map +1 -1
  190. package/dist/commands/debug/project-worktree.js +2 -2
  191. package/dist/commands/debug/project-worktree.js.map +1 -1
  192. package/dist/commands/deprecated-aliases.js +2 -2
  193. package/dist/commands/deprecated-aliases.js.map +1 -1
  194. package/dist/commands/download/index.js +2 -2
  195. package/dist/commands/download/index.js.map +1 -1
  196. package/dist/commands/download/replay.command.js +2 -2
  197. package/dist/commands/download/replay.command.js.map +1 -1
  198. package/dist/commands/download/session.command.js +2 -2
  199. package/dist/commands/download/session.command.js.map +1 -1
  200. package/dist/commands/download/test-run.command.js +2 -2
  201. package/dist/commands/download/test-run.command.js.map +1 -1
  202. package/dist/commands/local/get-edited-files.utils.js +2 -2
  203. package/dist/commands/local/get-edited-files.utils.js.map +1 -1
  204. package/dist/commands/local/get-edited-files.utils.spec.js +2 -2
  205. package/dist/commands/local/get-edited-files.utils.spec.js.map +1 -1
  206. package/dist/commands/local/index.js +2 -2
  207. package/dist/commands/local/index.js.map +1 -1
  208. package/dist/commands/local/relevant-sessions.command.js +2 -2
  209. package/dist/commands/local/relevant-sessions.command.js.map +1 -1
  210. package/dist/commands/onboard/__tests__/build-context.spec.d.ts +2 -0
  211. package/dist/commands/onboard/__tests__/build-context.spec.d.ts.map +1 -0
  212. package/dist/commands/onboard/__tests__/build-context.spec.js +179 -0
  213. package/dist/commands/onboard/__tests__/build-context.spec.js.map +1 -0
  214. package/dist/commands/onboard/__tests__/check-vcs-link.spec.d.ts +2 -0
  215. package/dist/commands/onboard/__tests__/check-vcs-link.spec.d.ts.map +1 -0
  216. package/dist/commands/onboard/__tests__/check-vcs-link.spec.js +164 -0
  217. package/dist/commands/onboard/__tests__/check-vcs-link.spec.js.map +1 -0
  218. package/dist/commands/onboard/__tests__/codex-mcp.spec.d.ts +2 -0
  219. package/dist/commands/onboard/__tests__/codex-mcp.spec.d.ts.map +1 -0
  220. package/dist/commands/onboard/__tests__/codex-mcp.spec.js +73 -0
  221. package/dist/commands/onboard/__tests__/codex-mcp.spec.js.map +1 -0
  222. package/dist/commands/onboard/__tests__/detect-framework.spec.d.ts +2 -0
  223. package/dist/commands/onboard/__tests__/detect-framework.spec.d.ts.map +1 -0
  224. package/dist/commands/onboard/__tests__/detect-framework.spec.js +277 -0
  225. package/dist/commands/onboard/__tests__/detect-framework.spec.js.map +1 -0
  226. package/dist/commands/onboard/__tests__/git-repo-info.spec.d.ts +2 -0
  227. package/dist/commands/onboard/__tests__/git-repo-info.spec.d.ts.map +1 -0
  228. package/dist/commands/onboard/__tests__/git-repo-info.spec.js +109 -0
  229. package/dist/commands/onboard/__tests__/git-repo-info.spec.js.map +1 -0
  230. package/dist/commands/onboard/__tests__/inline-doc-constants.spec.d.ts +2 -0
  231. package/dist/commands/onboard/__tests__/inline-doc-constants.spec.d.ts.map +1 -0
  232. package/dist/commands/onboard/__tests__/inline-doc-constants.spec.js +157 -0
  233. package/dist/commands/onboard/__tests__/inline-doc-constants.spec.js.map +1 -0
  234. package/dist/commands/onboard/__tests__/install-skills.spec.d.ts +2 -0
  235. package/dist/commands/onboard/__tests__/install-skills.spec.d.ts.map +1 -0
  236. package/dist/commands/onboard/__tests__/install-skills.spec.js +158 -0
  237. package/dist/commands/onboard/__tests__/install-skills.spec.js.map +1 -0
  238. package/dist/commands/onboard/__tests__/materialize-workspace.spec.d.ts +2 -0
  239. package/dist/commands/onboard/__tests__/materialize-workspace.spec.d.ts.map +1 -0
  240. package/dist/commands/onboard/__tests__/materialize-workspace.spec.js +116 -0
  241. package/dist/commands/onboard/__tests__/materialize-workspace.spec.js.map +1 -0
  242. package/dist/commands/onboard/__tests__/resolve-app.spec.d.ts +2 -0
  243. package/dist/commands/onboard/__tests__/resolve-app.spec.d.ts.map +1 -0
  244. package/dist/commands/onboard/__tests__/resolve-app.spec.js +166 -0
  245. package/dist/commands/onboard/__tests__/resolve-app.spec.js.map +1 -0
  246. package/dist/commands/onboard/__tests__/safe-repo-fs.spec.d.ts +2 -0
  247. package/dist/commands/onboard/__tests__/safe-repo-fs.spec.d.ts.map +1 -0
  248. package/dist/commands/onboard/__tests__/safe-repo-fs.spec.js +137 -0
  249. package/dist/commands/onboard/__tests__/safe-repo-fs.spec.js.map +1 -0
  250. package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.d.ts +2 -0
  251. package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.d.ts.map +1 -0
  252. package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.js +286 -0
  253. package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.js.map +1 -0
  254. package/dist/commands/onboard/build-context.d.ts +16 -0
  255. package/dist/commands/onboard/build-context.d.ts.map +1 -0
  256. package/dist/commands/onboard/build-context.js +104 -0
  257. package/dist/commands/onboard/build-context.js.map +1 -0
  258. package/dist/commands/onboard/check-vcs-link.d.ts +14 -0
  259. package/dist/commands/onboard/check-vcs-link.d.ts.map +1 -0
  260. package/dist/commands/onboard/check-vcs-link.js +111 -0
  261. package/dist/commands/onboard/check-vcs-link.js.map +1 -0
  262. package/dist/commands/onboard/codex-mcp.d.ts +24 -0
  263. package/dist/commands/onboard/codex-mcp.d.ts.map +1 -0
  264. package/dist/commands/onboard/codex-mcp.js +302 -0
  265. package/dist/commands/onboard/codex-mcp.js.map +1 -0
  266. package/dist/commands/onboard/customer-agents.d.ts +9 -0
  267. package/dist/commands/onboard/customer-agents.d.ts.map +1 -0
  268. package/dist/commands/onboard/customer-agents.js +19 -0
  269. package/dist/commands/onboard/customer-agents.js.map +1 -0
  270. package/dist/commands/onboard/customer-agents.json +17 -0
  271. package/dist/commands/onboard/customer-docs.d.ts +21 -0
  272. package/dist/commands/onboard/customer-docs.d.ts.map +1 -0
  273. package/dist/commands/onboard/customer-docs.js +31 -0
  274. package/dist/commands/onboard/customer-docs.js.map +1 -0
  275. package/dist/commands/onboard/customer-docs.json +35 -0
  276. package/dist/commands/onboard/detect-framework.d.ts +26 -0
  277. package/dist/commands/onboard/detect-framework.d.ts.map +1 -0
  278. package/dist/commands/onboard/detect-framework.js +305 -0
  279. package/dist/commands/onboard/detect-framework.js.map +1 -0
  280. package/dist/commands/onboard/discover-apps.d.ts +21 -0
  281. package/dist/commands/onboard/discover-apps.d.ts.map +1 -0
  282. package/dist/commands/onboard/discover-apps.js +318 -0
  283. package/dist/commands/onboard/discover-apps.js.map +1 -0
  284. package/dist/commands/onboard/docs-urls.d.ts +11 -0
  285. package/dist/commands/onboard/docs-urls.d.ts.map +1 -0
  286. package/dist/commands/onboard/docs-urls.js +17 -0
  287. package/dist/commands/onboard/docs-urls.js.map +1 -0
  288. package/dist/commands/onboard/git-repo-info.d.ts +15 -0
  289. package/dist/commands/onboard/git-repo-info.d.ts.map +1 -0
  290. package/dist/commands/onboard/git-repo-info.js +84 -0
  291. package/dist/commands/onboard/git-repo-info.js.map +1 -0
  292. package/dist/commands/onboard/index.d.ts +18 -0
  293. package/dist/commands/onboard/index.d.ts.map +1 -0
  294. package/dist/commands/onboard/index.js +164 -0
  295. package/dist/commands/onboard/index.js.map +1 -0
  296. package/dist/commands/onboard/inline-doc-constants.d.ts +21 -0
  297. package/dist/commands/onboard/inline-doc-constants.d.ts.map +1 -0
  298. package/dist/commands/onboard/inline-doc-constants.js +238 -0
  299. package/dist/commands/onboard/inline-doc-constants.js.map +1 -0
  300. package/dist/commands/onboard/launch-agent.d.ts +65 -0
  301. package/dist/commands/onboard/launch-agent.d.ts.map +1 -0
  302. package/dist/commands/onboard/launch-agent.js +311 -0
  303. package/dist/commands/onboard/launch-agent.js.map +1 -0
  304. package/dist/commands/onboard/materialize-workspace.d.ts +68 -0
  305. package/dist/commands/onboard/materialize-workspace.d.ts.map +1 -0
  306. package/dist/commands/onboard/materialize-workspace.js +177 -0
  307. package/dist/commands/onboard/materialize-workspace.js.map +1 -0
  308. package/dist/commands/onboard/print-summary.d.ts +10 -0
  309. package/dist/commands/onboard/print-summary.d.ts.map +1 -0
  310. package/dist/commands/onboard/print-summary.js +49 -0
  311. package/dist/commands/onboard/print-summary.js.map +1 -0
  312. package/dist/commands/onboard/resolve-app.d.ts +21 -0
  313. package/dist/commands/onboard/resolve-app.d.ts.map +1 -0
  314. package/dist/commands/onboard/resolve-app.js +78 -0
  315. package/dist/commands/onboard/resolve-app.js.map +1 -0
  316. package/dist/commands/onboard/resolve-project.d.ts +14 -0
  317. package/dist/commands/onboard/resolve-project.d.ts.map +1 -0
  318. package/dist/commands/onboard/resolve-project.js +92 -0
  319. package/dist/commands/onboard/resolve-project.js.map +1 -0
  320. package/dist/commands/onboard/safe-repo-fs.d.ts +59 -0
  321. package/dist/commands/onboard/safe-repo-fs.d.ts.map +1 -0
  322. package/dist/commands/onboard/safe-repo-fs.js +266 -0
  323. package/dist/commands/onboard/safe-repo-fs.js.map +1 -0
  324. package/dist/commands/onboard/setup-agent-integrations.d.ts +43 -0
  325. package/dist/commands/onboard/setup-agent-integrations.d.ts.map +1 -0
  326. package/dist/commands/onboard/setup-agent-integrations.js +324 -0
  327. package/dist/commands/onboard/setup-agent-integrations.js.map +1 -0
  328. package/dist/commands/onboard/templates/CLAUDE.md +213 -0
  329. package/dist/commands/onboard/templates/agents/auth-setup.md +117 -0
  330. package/dist/commands/onboard/templates/agents/ci-setup.md +742 -0
  331. package/dist/commands/onboard/templates/agents/csp-setup.md +78 -0
  332. package/dist/commands/onboard/templates/agents/false-positive-prevention.md +268 -0
  333. package/dist/commands/onboard/templates/agents/feature-flag-setup.md +133 -0
  334. package/dist/commands/onboard/templates/agents/local-simulation-verification.md +96 -0
  335. package/dist/commands/onboard/templates/agents/persisted-graphql-queries.md +150 -0
  336. package/dist/commands/onboard/templates/agents/recorder-installation.md +194 -0
  337. package/dist/commands/onboard/templates/agents/replay-fetch-retry-compatibility.md +252 -0
  338. package/dist/commands/onboard/templates/agents/reviewer.md +788 -0
  339. package/dist/commands/onboard/templates/agents/service-worker-compatibility.md +254 -0
  340. package/dist/commands/onboard/templates/agents/session-context.md +133 -0
  341. package/dist/commands/onboard/templates/agents/shared-worker-compatibility.md +187 -0
  342. package/dist/commands/onboard/templates/docs/additional-guides/backend-recorder.ts +340 -0
  343. package/dist/commands/onboard/templates/docs/ci/not-yet-run-checks.ts +58 -0
  344. package/dist/commands/onboard/templates/docs/ci.ts +19 -0
  345. package/dist/commands/onboard/templates/docs/cloud-replay.ts +145 -0
  346. package/dist/commands/onboard/templates/docs/constants.ts +37 -0
  347. package/dist/commands/onboard/templates/docs/github-actions-v2.ts +859 -0
  348. package/dist/commands/onboard/templates/docs/how-to/auth/bypassing-auth.ts +27 -0
  349. package/dist/commands/onboard/templates/docs/how-to/auth/enabling-full-auth.ts +91 -0
  350. package/dist/commands/onboard/templates/docs/how-to/configure-ignore-patterns.ts +77 -0
  351. package/dist/commands/onboard/templates/docs/how-to/enable-source-coverage.ts +84 -0
  352. package/dist/commands/onboard/templates/docs/how-to/fix-false-positive-diffs.ts +156 -0
  353. package/dist/commands/onboard/templates/docs/how-to/link-bitbucket.ts +15 -0
  354. package/dist/commands/onboard/templates/docs/how-to/link-gitlab.ts +22 -0
  355. package/dist/commands/onboard/templates/docs/how-to/record-session-context.ts +129 -0
  356. package/dist/commands/onboard/templates/docs/how-to/recorder-script.ts +139 -0
  357. package/dist/commands/onboard/templates/docs/how-to/testing-feature-flags.ts +97 -0
  358. package/dist/commands/onboard/templates/docs/how-to/testing-multiple-apps-or-app-variants.ts +40 -0
  359. package/dist/commands/onboard/templates/docs/how-to/troubleshoot-auth.ts +58 -0
  360. package/dist/commands/onboard/templates/docs/how-to/troubleshoot-failed-simulations.ts +97 -0
  361. package/dist/commands/onboard/templates/docs/how-to/typescript-types.ts +51 -0
  362. package/dist/commands/onboard/templates/docs/how-to/window-meticulous-object.ts +685 -0
  363. package/dist/commands/onboard/templates/docs/onboarding-guide.ts +415 -0
  364. package/dist/commands/onboard/templates/docs/recorder-getting-started.ts +24 -0
  365. package/dist/commands/onboard/templates/docs/recorder-snippets/constants.ts +1 -0
  366. package/dist/commands/onboard/templates/docs/recorder-snippets/explanation-of-methods-to-add-recorder.ts +21 -0
  367. package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/angular-instructions.ts +34 -0
  368. package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/any-other-framework-instructions.ts +118 -0
  369. package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/vue-instructions.ts +39 -0
  370. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/next-js-instructions.ts +49 -0
  371. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/nuxtjs-instructions.ts +68 -0
  372. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/rsbuild-instructions.ts +66 -0
  373. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/storybook-instructions.ts +59 -0
  374. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/sveltekit-instructions.ts +113 -0
  375. package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/vite-instructions.ts +58 -0
  376. package/dist/commands/onboard/templates/docs/recorder-snippets/script-requirements.ts +51 -0
  377. package/dist/commands/onboard/templates/docs/recorder-snippets/steps-after-installing-recorder.ts +25 -0
  378. package/dist/commands/onboard/templates/docs/reference/cli-commands.ts +1324 -0
  379. package/dist/commands/onboard/templates/docs/session-recording/csp-exceptions.ts +17 -0
  380. package/dist/commands/onboard/templates/docs/session-recording/recorder-npm-dependency.ts +62 -0
  381. package/dist/commands/onboard/templates/docs-imports/src/lib/next/next.constants.ts +46 -0
  382. package/dist/commands/onboard/templates/docs-imports/src/lib/utils/internal-urls/docs-urls.utils.ts +254 -0
  383. package/dist/commands/onboard/templates/settings.json +14 -0
  384. package/dist/commands/project/index.js +2 -2
  385. package/dist/commands/project/index.js.map +1 -1
  386. package/dist/commands/project/show.command.js +2 -2
  387. package/dist/commands/project/show.command.js.map +1 -1
  388. package/dist/commands/project/upload-source.command.js +2 -2
  389. package/dist/commands/project/upload-source.command.js.map +1 -1
  390. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js +2 -2
  391. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js.map +1 -1
  392. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js +2 -2
  393. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js.map +1 -1
  394. package/dist/commands/record/__tests__/backend.command.spec.js +2 -2
  395. package/dist/commands/record/__tests__/backend.command.spec.js.map +1 -1
  396. package/dist/commands/record/__tests__/login.command.spec.js +2 -2
  397. package/dist/commands/record/__tests__/login.command.spec.js.map +1 -1
  398. package/dist/commands/record/__tests__/session.command.spec.js +2 -2
  399. package/dist/commands/record/__tests__/session.command.spec.js.map +1 -1
  400. package/dist/commands/record/backend-dev-command.utils.js +2 -2
  401. package/dist/commands/record/backend-dev-command.utils.js.map +1 -1
  402. package/dist/commands/record/backend-sidecar.utils.js +2 -2
  403. package/dist/commands/record/backend-sidecar.utils.js.map +1 -1
  404. package/dist/commands/record/backend.command.js +2 -2
  405. package/dist/commands/record/backend.command.js.map +1 -1
  406. package/dist/commands/record/index.js +2 -2
  407. package/dist/commands/record/index.js.map +1 -1
  408. package/dist/commands/record/login.command.js +2 -2
  409. package/dist/commands/record/login.command.js.map +1 -1
  410. package/dist/commands/record/session.command.js +2 -2
  411. package/dist/commands/record/session.command.js.map +1 -1
  412. package/dist/commands/replay-debugger.ui.js +2 -2
  413. package/dist/commands/replay-debugger.ui.js.map +1 -1
  414. package/dist/commands/replay.command.js +2 -2
  415. package/dist/commands/replay.command.js.map +1 -1
  416. package/dist/commands/schema.command.js +2 -2
  417. package/dist/commands/schema.command.js.map +1 -1
  418. package/dist/commands/schema.command.spec.js +2 -2
  419. package/dist/commands/schema.command.spec.js.map +1 -1
  420. package/dist/index.js +2 -2
  421. package/dist/index.js.map +1 -1
  422. package/dist/main.js +2 -2
  423. package/dist/main.js.map +1 -1
  424. package/dist/utils/__tests__/handle-auth-failure.spec.js +2 -2
  425. package/dist/utils/__tests__/handle-auth-failure.spec.js.map +1 -1
  426. package/dist/utils/__tests__/project-selection-hint.spec.js +2 -2
  427. package/dist/utils/__tests__/project-selection-hint.spec.js.map +1 -1
  428. package/dist/utils/__tests__/resolve-project-identifier.spec.js +2 -2
  429. package/dist/utils/__tests__/resolve-project-identifier.spec.js.map +1 -1
  430. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +2 -2
  431. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
  432. package/dist/utils/__tests__/select-project.spec.js +5 -4
  433. package/dist/utils/__tests__/select-project.spec.js.map +1 -1
  434. package/dist/utils/cli-user-error.js +2 -2
  435. package/dist/utils/cli-user-error.js.map +1 -1
  436. package/dist/utils/constants.js +2 -2
  437. package/dist/utils/constants.js.map +1 -1
  438. package/dist/utils/environment.utils.js +2 -2
  439. package/dist/utils/environment.utils.js.map +1 -1
  440. package/dist/utils/format-coverage-ranges.js +2 -2
  441. package/dist/utils/format-coverage-ranges.js.map +1 -1
  442. package/dist/utils/handle-auth-failure.js +2 -2
  443. package/dist/utils/handle-auth-failure.js.map +1 -1
  444. package/dist/utils/out-of-date-client-error.js +2 -2
  445. package/dist/utils/out-of-date-client-error.js.map +1 -1
  446. package/dist/utils/project-selection-hint.js +2 -2
  447. package/dist/utils/project-selection-hint.js.map +1 -1
  448. package/dist/utils/resolve-project-identifier.js +2 -2
  449. package/dist/utils/resolve-project-identifier.js.map +1 -1
  450. package/dist/utils/resolve-test-run-from-commit.js +2 -2
  451. package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
  452. package/dist/utils/select-project.d.ts +9 -0
  453. package/dist/utils/select-project.d.ts.map +1 -1
  454. package/dist/utils/select-project.js +58 -15
  455. package/dist/utils/select-project.js.map +1 -1
  456. package/package.json +14 -12
@@ -0,0 +1,742 @@
1
+ ---
2
+ name: ci-setup
3
+ description: Produces CI configuration instructions for the onboarding plan. Use after the reviewer has produced a codebase summary.
4
+ tools: Read, Grep, Glob, Write
5
+ model: sonnet
6
+ ---
7
+
8
+ You are a CI setup specialist for the Meticulous automated UI testing platform.
9
+
10
+ Your job is to scan the customer's codebase, read the reference docs, and produce a
11
+ self-contained "Set Up CI" section. Write the section to the output file path provided
12
+ in the prompt.
13
+
14
+ The reviewer's structured summary will be provided in the prompt that launches you.
15
+
16
+ ## HARD RULES — monorepos (`### Monorepo` → **Is monorepo: Yes**)
17
+
18
+ These rules apply **whenever the repo is a monorepo**, including **exactly one** frontend
19
+ app and **zero** other Meticulous projects today. The customer-facing naming conventions
20
+ (workflow file, job name, secret/variable name, YAML references, path scoping) live in the
21
+ docs and are written as recommendations for human readers — for monorepos in this onboarding
22
+ flow you must treat them as **required**, not optional. Read the relevant tab:
23
+
24
+ - **GitHub Actions** — `.claude/docs/github-actions-v2.ts` GitHub tab → "Naming workflows,
25
+ jobs and secrets in a monorepo (recommended)".
26
+ - **GitLab CI** — `.claude/docs/github-actions-v2.ts` GitLab tab → "Naming jobs and
27
+ variables in a monorepo (recommended)".
28
+
29
+ **Procedure (every monorepo, both providers):** at the **top** of the customer-facing
30
+ **Set Up CI** step body (before the first fenced YAML block), state the exact strings you
31
+ chose for `<app-kebab>` and `<APP_SLUG>` in one short bold line, derived from the
32
+ **selected app** path in the onboarding prompt (last path segment is usually enough). Use
33
+ **only** those strings in every file path, job/workflow name, secret/variable name, and
34
+ YAML reference in that step.
35
+
36
+ **Mechanical substitutions (GitHub Actions, monorepo only):** After you copy job structure
37
+ from `github-actions-v2.ts`, run these replacements on **every** YAML block and prose
38
+ snippet in your answer **before** you return (use the same `<app-kebab>` / `<APP_SLUG>`
39
+ pair everywhere):
40
+
41
+ 1. Top-level workflow `name: Meticulous` → `name: Meticulous (<app-kebab>)`.
42
+ 2. Under `jobs:`, the line indented under a job id that reads exactly `name: Meticulous` →
43
+ `name: Meticulous (<app-kebab>)` (this is the job title shown in GitHub's UI — it must
44
+ not stay generic).
45
+ 3. `api-token: ${{ secrets.METICULOUS_API_TOKEN }}` →
46
+ `api-token: ${{ secrets.METICULOUS_API_TOKEN_<APP_SLUG> }}`.
47
+ 4. YAML comments that show the path `# .github/workflows/meticulous.yaml` →
48
+ `# .github/workflows/meticulous-<app-kebab>.yml`.
49
+ 5. Prose such as "create … secret named `METICULOUS_API_TOKEN`" → tell the customer to
50
+ create `METICULOUS_API_TOKEN_<APP_SLUG>` only. Tables under "Secrets checklist" must
51
+ list the suffixed name in the first column, not the bare name.
52
+
53
+ If a CLI step needs `$METICULOUS_API_TOKEN`, add
54
+ `env: METICULOUS_API_TOKEN: ${{ secrets.METICULOUS_API_TOKEN_<APP_SLUG> }}` on that
55
+ job/step or pass `--apiToken="${{ secrets.METICULOUS_API_TOKEN_<APP_SLUG> }}"` explicitly.
56
+
57
+ **Mechanical substitutions (GitLab CI, monorepo only):** After you draft the pipeline YAML,
58
+ run these replacements on every YAML block and prose snippet in your answer **before** you
59
+ return (use the same `<app-kebab>` / `<APP_SLUG>` pair everywhere):
60
+
61
+ 1. Job key `meticulous:` → `meticulous-<app-kebab>:`.
62
+ 2. `$METICULOUS_API_TOKEN` / `${METICULOUS_API_TOKEN}` → `$METICULOUS_API_TOKEN_<APP_SLUG>` /
63
+ `${METICULOUS_API_TOKEN_<APP_SLUG>}`.
64
+ 3. `--apiToken="$METICULOUS_API_TOKEN"` → `--apiToken="$METICULOUS_API_TOKEN_<APP_SLUG>"`.
65
+ 4. Prose such as "create … variable named `METICULOUS_API_TOKEN`" → tell the customer to
66
+ create `METICULOUS_API_TOKEN_<APP_SLUG>` only. Tables under "Variables checklist" must
67
+ list the suffixed name in the first column, not the bare name.
68
+
69
+ **Is monorepo: No (both providers):** keep the generic names from the example workflow /
70
+ pipeline in the docs (`.github/workflows/meticulous.yaml` and `METICULOUS_API_TOKEN` for
71
+ GitHub Actions; bare `meticulous:` job and `METICULOUS_API_TOKEN` for GitLab CI).
72
+
73
+ ## HARD RULES — never add `rewrites` / `--rewrites`
74
+
75
+ Do **not** add the SPA fallback rewrite to any workflow, pipeline, or CLI invocation you
76
+ generate. This is a flat prohibition — there are no conditions under which the agent
77
+ should emit it. If the customer turns out to need it, they will add it themselves after
78
+ seeing 404s on SPA routes.
79
+
80
+ This applies to **both** forms (every CI provider is in scope), since they configure the
81
+ same thing:
82
+
83
+ ```yaml
84
+ # GitHub Actions input — never emit this
85
+ rewrites: |
86
+ [{ "source": "/(.*)", "destination": "/index.html" }]
87
+ ```
88
+
89
+ ```bash
90
+ # CLI flag (GitLab, CircleCI, etc.) — never emit this
91
+ --rewrites='[{"source":"/(.*)", "destination":"/index.html"}]'
92
+ ```
93
+
94
+ If you find yourself writing either of those snippets while drafting a workflow, delete
95
+ the line. Do not include the key with a placeholder value either — leave it out entirely.
96
+
97
+ If a framework doc you read for reference (e.g. the React + Vite or Vue + Vite docs) shows
98
+ a `rewrites:` input in its example workflow, treat that as documentation only and **omit
99
+ the line** from the workflow you generate.
100
+
101
+ ## HARD RULES — backend recording enabled (upload-container only)
102
+
103
+ These rules apply **only** when the onboarding prompt states that backend recording is
104
+ enabled for this run. When it does:
105
+
106
+ 1. **Skip the Decision Tree — the approach is `upload-container`, full stop.**
107
+ `upload-assets` uploads static files and Cloud Replay tests a preview URL; neither runs
108
+ the customer's backend process, so neither can serve SSR/API responses from the recorded
109
+ backend session. Meticulous replays backend-recorded sessions by running the uploaded
110
+ container itself, with `METICULOUS_BACKEND_RECORDER_MODE=replay` injected into its
111
+ environment. State this rationale in one sentence in the customer prose.
112
+ 2. **The image must keep the backend recorder enabled at replay runtime.** The backend
113
+ recorder step (the "Install the Meticulous Backend Recorder" step of this plan) wires
114
+ `initBackendRecorder` with an `enabled` gate that stays true when
115
+ `METICULOUS_BACKEND_RECORDER_MODE === "replay"`. Your job here: make sure nothing in
116
+ the Dockerfile / `container-env` forces that gate false. If the gate is
117
+ `NODE_ENV !== "production"` plus the replay escape, a production `NODE_ENV` in the
118
+ image is fine — the escape covers replay. If the customer gates on a deploy-env var
119
+ (e.g. `CURRENT_ENV`), set it in the image to a value that keeps the recorder
120
+ initialized. Reference the backend recorder step rather than repeating its diffs.
121
+ 3. **The container must BOOT with no real backing services.** At replay, DB / Redis /
122
+ outbound HTTP on the request path are served from recorded mocks — but only once the
123
+ process is up. Walk the reviewer's `### Runtime / CI environment` and `### SSR Backend`
124
+ notes (the backend recorder step's internal "Replay boot notes" cover the same ground):
125
+ - Provide **format-valid dummy values** for every env var whose absence throws or
126
+ prevents listen (dummy `DATABASE_URL`, correctly-shaped throwaway encryption keys,
127
+ dummy secrets). Bake them as `ENV` in the Meticulous Dockerfile or pass them via
128
+ `container-env`. Never bake real production secrets into the image.
129
+ - If the app **connects eagerly at boot** (awaits a DB/Redis connection before
130
+ listening), install a local stand-in in the image — e.g. `apt-get install
131
+ redis-server` and a `CMD` that starts it and gates app start on `redis-cli ping`
132
+ before `exec`ing the server. Session-scoped commands are answered by Meticulous
133
+ mocks; background commands hit the empty local instance harmlessly.
134
+ 4. **Health check + port.** The container must respond 2xx on `GET /` (the default probe)
135
+ or the workflow must set `container-health-check-endpoint` to an existing health route;
136
+ set `container-port` when the app ignores the `PORT` env var.
137
+ 5. **`METICULOUS_BUILD` handling is unchanged** — the existing HARD RULE applies
138
+ (build-arg + `ARG`/`ENV` in the Dockerfile, optional `container-env` belt-and-braces).
139
+ 6. **A dedicated Meticulous Dockerfile is allowed.** If the production Dockerfile cannot
140
+ satisfy rules 2–4 without touching production behavior, generate a separate
141
+ `Dockerfile.meticulous` (or `<app>/Dockerfile.meticulous` in monorepos) in the Changes
142
+ section and point the workflow's build step at it (the `file:` input of
143
+ `docker/build-push-action`, or `-f` on `docker build`). List it in **Files to
144
+ modify / create**.
145
+ 7. **Ordering note in prose:** the backend recorder step must be applied before the first
146
+ CI run is expected to replay backend sessions — without it the image has no recorder to
147
+ put into replay mode.
148
+
149
+ ## Reference Docs
150
+
151
+ Read the Meticulous doc source files in `.claude/docs/`. These are TypeScript files that
152
+ export template literals with Markdoc-like syntax -- read them for their content, ignoring
153
+ the `{% %}` markup tags.
154
+
155
+ - `.claude/docs/ci.ts` -- overview of CI options
156
+ - `.claude/docs/cloud-replay.ts` -- cloud replay setup (Vercel, Netlify, Cloudflare)
157
+ - `.claude/docs/github-actions-v2.ts` -- CI setup, organised into tabs:
158
+ - **GitHub** tab: full workflow YAML templates (`upload-assets`, `upload-container`)
159
+ plus runner-size guidance
160
+ - **GitLab** tab: pipeline YAML template plus `image:` / `tags:` guidance and the
161
+ monorepo naming recommendations the agent must apply
162
+ - **BitBucket** tab: integration is gated on Meticulous support — there is no
163
+ customer-ready Bitbucket Pipelines template here yet
164
+ - `.claude/docs/reference/cli-commands.ts` -- CLI commands reference (flags for `ci upload-assets`, `ci upload-container`)
165
+ - `.claude/docs/how-to/enable-source-coverage.ts` -- how source maps should be served for Meticulous coverage
166
+
167
+ ## HARD RULE — always set the `METICULOUS_BUILD` env var
168
+
169
+ Every Meticulous build you produce **must** set `METICULOUS_BUILD=true`, regardless of
170
+ framework or whether this project obviously needs it. It is set **only** in the Meticulous
171
+ build (never in the customer's production build/deploy), so the app can safely detect a
172
+ Meticulous build/replay — e.g. to skip retry-heavy server-side data fetches that would
173
+ otherwise fail and storm during replay. It is harmless when unused. Where to set it depends
174
+ on the chosen approach:
175
+
176
+ - **`upload-assets` (static build):** add it as a step-level env
177
+ var on the build step (GitHub Actions `env:` on the build step; GitLab `variables:` on the
178
+ build job). For example, under the build step: `env:\n METICULOUS_BUILD: "true"`. For
179
+ providers without a per-step env block (e.g. **Bitbucket Pipelines**), set it inline on the
180
+ build command instead: `METICULOUS_BUILD=true npm run build`.
181
+ - **`upload-container`:** the variable must be present in the **image** so it survives to
182
+ replay runtime (e.g. for `getServerSideProps`). Pass it as a Docker build arg
183
+ (`--build-arg METICULOUS_BUILD=true`, or `build-args:` on `docker/build-push-action`) and
184
+ have the Dockerfile consume it with `ARG METICULOUS_BUILD` / `ENV METICULOUS_BUILD=$METICULOUS_BUILD`.
185
+ When using the GitHub `upload-container` action you may also add `METICULOUS_BUILD=true` to
186
+ its `container-env` input as a runtime belt-and-suspenders.
187
+
188
+ The reference workflows in `github-actions-v2.ts` already include these — preserve them when
189
+ you copy the templates, and add them if you are adapting a snippet that omits them.
190
+
191
+ These docs contain complete pipeline YAML templates and setup steps for each variant.
192
+ Always read the tab in `github-actions-v2.ts` matching the customer's CI provider — it
193
+ is the source of truth for customer prose, runner-environment defaults, and (on
194
+ GitLab) monorepo naming. For providers without a tab there (Bitbucket Pipelines,
195
+ CircleCI, Jenkins, Drone, etc.), use the CLI commands from `reference/cli-commands.ts`
196
+ and follow the pipeline-shape conventions of the closest tab (GitLab for image-based
197
+ runners, GitHub for label-based runners).
198
+
199
+ ## Decision Tree
200
+
201
+ **Exception:** when the prompt says backend recording is enabled, the decision tree is
202
+ bypassed — the approach is always `upload-container`. See **HARD RULES — backend recording
203
+ enabled** above.
204
+
205
+ Use the reviewer's findings to select the right approach. The approaches are listed in
206
+ order of preference -- always pick the highest one that applies:
207
+
208
+ ```
209
+ 1. Frontend build produces static files (HTML/JS/CSS)?
210
+ YES and NOT Next.js --> upload-assets
211
+ NO --> continue to 2
212
+
213
+ 2. Can be containerized (has Dockerfile, or is Next.js / Nuxt / SSR)?
214
+ YES --> upload-container
215
+ NO --> continue to 3
216
+
217
+ 3. Has preview URLs (Vercel / Netlify / Cloudflare)?
218
+ YES --> Cloud Replay (read cloud-replay.ts, GitHub Actions only)
219
+ NO --> upload-container (generate a Dockerfile in the plan — see below)
220
+ ```
221
+
222
+ `upload-container` is the universal fallback: because a missing Dockerfile is not a blocker
223
+ (you generate one in the plan), almost any app can be containerized, so there is no need for
224
+ any tunnel-based approach.
225
+
226
+ Once you've chosen the approach, produce CI config for the customer's CI provider:
227
+
228
+ - **GitHub Actions**: use the templates from the **GitHub** tab of `github-actions-v2.ts`.
229
+ - **GitLab CI**: use the templates from the **GitLab** tab of `github-actions-v2.ts`.
230
+ - **Other CI (Bitbucket Pipelines, CircleCI, Jenkins, Drone, etc.)**: use the
231
+ Meticulous CLI directly (see below) and follow the pipeline-shape conventions of
232
+ the closest tab in `github-actions-v2.ts` (GitLab for image-based runners, GitHub
233
+ for label-based runners).
234
+ - **Monorepo (any provider):** When **Is monorepo: Yes**, follow the "Naming workflows,
235
+ jobs and secrets in a monorepo (recommended)" / "Naming jobs and variables in a monorepo
236
+ (recommended)" subsection in the matching tab of `github-actions-v2.ts`. **HARD RULES —
237
+ monorepos** above is the agent-side enforcement contract for those naming rules; treat
238
+ them as required even when there is only one frontend today.
239
+
240
+ **Key points:**
241
+
242
+ - **`upload-assets` is the preferred approach** for any frontend that builds to static
243
+ files (HTML/JS/CSS). This includes SPAs built with Vite, CRA, etc. — even if the
244
+ production deployment bundles them into a container with a backend. Meticulous stubs
245
+ network requests, so the backend is irrelevant; we only need the built frontend files.
246
+ However, **Next.js apps should NOT use `upload-assets`** — Next.js requires a server
247
+ for routing, middleware, and API routes. Use `upload-container` instead.
248
+ - **`upload-container` is preferred over Cloud Replay** for SSR apps or apps that genuinely
249
+ need a server to render (Next.js, Nuxt, etc.), and is the reliable universal fallback for
250
+ anything that does not fit `upload-assets`.
251
+ - **A missing Dockerfile is not a blocker for `upload-container` — write one in the plan.**
252
+ If the selected app has no Dockerfile, do **not** ask the customer to create one and do
253
+ **not** fall back to a worse approach. Instead, **generate the Dockerfile here as part of
254
+ this plan**: include a complete, ready-to-use Dockerfile as a new file in the **Changes**
255
+ section, built from the reviewer's findings (framework, package manager + lockfile, install
256
+ command, build command, start command, and the port the app listens on). Multi-stage where
257
+ appropriate (build stage + slim runtime), expose the correct port, and use the customer's
258
+ real commands — not placeholders. The Dockerfile **must** also consume the Meticulous build
259
+ flag — add `ARG METICULOUS_BUILD` and `ENV METICULOUS_BUILD=$METICULOUS_BUILD` (in the stage
260
+ that builds and the runtime stage) so it is present at both build and replay runtime — and
261
+ the build step must pass `--build-arg METICULOUS_BUILD=true` (see **HARD RULE — always set
262
+ the `METICULOUS_BUILD` env var** above). Add a one-line note that this Dockerfile is for the
263
+ Meticulous build and the customer should review it. List the Dockerfile path (e.g.
264
+ `Dockerfile`, or `apps/<app>/Dockerfile` in a monorepo) in **Files to modify / create**.
265
+ - **Cloud Replay (preview URLs)** is a good option when the customer already has a
266
+ preview URL provider (Vercel, Netlify, Cloudflare) and the above approaches don't
267
+ apply.
268
+ - **Never recommend a tunnel-based approach (`cloud-compute` / `run-with-tunnel`).** When
269
+ nothing else fits, fall back to `upload-container` and generate a Dockerfile in the plan.
270
+ - **Cloud Replay is GitHub Actions only.** For non-GitHub CI, use the CLI-based approaches
271
+ (`upload-assets` or `upload-container`).
272
+
273
+ ## Non-GitHub CI (GitLab, CircleCI, etc.)
274
+
275
+ For customers not using GitHub Actions, produce CI config using the Meticulous CLI directly.
276
+ Read `reference/cli-commands.ts` for the full flag reference. The CLI commands map to the
277
+ same approaches:
278
+
279
+ | Approach | CLI Command | Key Flags |
280
+ | ---------------- | ----------------------------------------------- | ------------------------------------------------------------ |
281
+ | upload-assets | `npx @alwaysmeticulous/cli ci upload-assets` | `--apiToken`, `--appDirectory`, `--commitSha` |
282
+ | upload-container | `npx @alwaysmeticulous/cli ci upload-container` | `--apiToken`, `--imageTag`, `--containerPort`, `--commitSha` |
283
+
284
+ **Do not recommend `--waitForTestRunToComplete`** on `ci upload-assets` or `ci upload-container` for normal customer CI. It blocks until the Meticulous run finishes and is not needed when status is reported via the VCS; it is a common source of confusing failures (including with lazy session execution). Reserve it for rare internal automation that truly requires a blocking wait and a CLI exit code. See the public CLI reference for `ci upload-assets`.
285
+
286
+ ### GitLab CI example (upload-assets)
287
+
288
+ ```yaml
289
+ meticulous:
290
+ stage: test
291
+ image: node:24
292
+ variables:
293
+ METICULOUS_BUILD: "true"
294
+ script:
295
+ - npm ci
296
+ - npm run build
297
+ - npx @alwaysmeticulous/cli ci upload-assets
298
+ --apiToken="$METICULOUS_API_TOKEN"
299
+ --appDirectory="dist"
300
+ --commitSha="$CI_COMMIT_SHA"
301
+ rules:
302
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
303
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
304
+ ```
305
+
306
+ ### GitLab CI example (upload-container)
307
+
308
+ ```yaml
309
+ meticulous:
310
+ stage: test
311
+ image: docker:latest
312
+ services:
313
+ - docker:dind
314
+ script:
315
+ # METICULOUS_BUILD is baked into the image (Dockerfile: ARG/ENV METICULOUS_BUILD) so it
316
+ # is present at build time and at replay runtime.
317
+ - docker build --build-arg METICULOUS_BUILD=true -t myapp:$CI_COMMIT_SHA .
318
+ - npx @alwaysmeticulous/cli ci upload-container
319
+ --apiToken="$METICULOUS_API_TOKEN"
320
+ --imageTag="myapp:$CI_COMMIT_SHA"
321
+ --containerPort=3000
322
+ --commitSha="$CI_COMMIT_SHA"
323
+ rules:
324
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
325
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
326
+ ```
327
+
328
+ When producing config for non-GitHub CI:
329
+
330
+ - Use the customer's actual CI provider syntax (`.gitlab-ci.yml`, CircleCI `config.yml`, etc.)
331
+ - Set the API token variable per **HARD RULES — monorepos** above and the matching tab
332
+ of `github-actions-v2.ts`: bare `METICULOUS_API_TOKEN` when **Is monorepo: No**;
333
+ `METICULOUS_API_TOKEN_<APP_SLUG>` when **Is monorepo: Yes**
334
+ - Always pass `--commitSha` using the provider's commit SHA variable (e.g., `$CI_COMMIT_SHA`
335
+ for GitLab, `$CIRCLE_SHA1` for CircleCI)
336
+ - The pipeline must run on both the default branch and merge/pull requests (same as GitHub Actions)
337
+ - Fill in all values from the reviewer's summary (build command, output directory, etc.)
338
+
339
+ ## Source coverage: `.meticulousignore`
340
+
341
+ Meticulous uses uploaded source maps to attribute coverage to repository paths. If the
342
+ repository contains **JavaScript or TypeScript that is not part of the Meticulous-tested
343
+ frontend** (backend APIs, workers, Prisma, scripts, other packages), those files can
344
+ inflate or pollute the coverage report unless they are ignored.
345
+
346
+ **When you MUST include ignore-pattern instructions** in this CI step (root
347
+ `.meticulousignore` and/or `.meticulousignore.{slug}` as appropriate):
348
+
349
+ 1. The reviewer's **Repository layout (coverage)** section has **Non-frontend JS/TS
350
+ detected: Yes**, **or**
351
+ 2. The **Monorepo Considerations** section below applies (multiple apps or backend packages).
352
+
353
+ **When you should NOT add `.meticulousignore`:**
354
+
355
+ - **Non-frontend JS/TS detected: No** and the repo is **not** a monorepo — a pure frontend
356
+ app does not need ignore rules for coverage symmetry alone.
357
+
358
+ **What to produce when required:**
359
+
360
+ 1. Read `.claude/docs/how-to/configure-ignore-patterns.ts` for glob syntax (same as
361
+ `.gitignore`) and for how `{slug}` is computed from the **Meticulous project name**
362
+ (the name in the Meticulous UI / URL, not necessarily the folder name).
363
+ 2. **Single-package repository (not a monorepo):** add a repository-root `.meticulousignore`
364
+ with patterns that exclude every **non-frontend** JS/TS area the reviewer listed.
365
+ 3. **Monorepo:** add a repository-root **`.meticulousignore.{slug}`** file (using the slug for
366
+ **this** Meticulous project) as the **primary** place for coverage exclusions: other apps,
367
+ backend packages, tooling, and any non-frontend JS/TS the reviewer listed. That way
368
+ sibling apps and future Meticulous projects on the same repo are not affected by this
369
+ project's ignore rules. Optionally add a minimal root `.meticulousignore` **only** for
370
+ patterns that should apply to every Meticulous project on the repository (e.g. generated
371
+ output, Storybook, mobile-only files).
372
+ 4. **Do not** exclude directories the selected frontend imports for UI (shared component
373
+ libraries, design system, shared types used only for UI, etc.).
374
+
375
+ **Where ignore files must live (Meticulous behavior):**
376
+
377
+ - Meticulous only loads ignore patterns from the **Git repository root**: `.meticulousignore`
378
+ and `.meticulousignore.{slug}`. It does **not** read `.meticulousignore` nested under an
379
+ app or package directory (e.g. `apps/admin/.meticulousignore`); those files have no effect.
380
+ - Root `.meticulousignore` applies to **every** Meticulous project on that repository.
381
+ **`.meticulousignore.{slug}`** applies **only** to the project whose name slugifies to
382
+ `{slug}`; its patterns are **merged** with the global file. In monorepos, prefer the
383
+ slug file so per-app scoping stays correct when the repo has or gains multiple Meticulous
384
+ projects.
385
+
386
+ For a **single-package** repo with a backend folder (e.g. `server/`, `api/`, `prisma/`),
387
+ show patterns such as:
388
+
389
+ ```
390
+ # Backend and data layer (not exercised by Meticulous UI replays)
391
+ server/**
392
+ prisma/**
393
+ ```
394
+
395
+ Tailor paths to the reviewer's **Locations** list.
396
+
397
+ ## Monorepo Considerations
398
+
399
+ If the reviewer's `### Monorepo` reports **Is monorepo: Yes** — including a single frontend
400
+ app — the prompt will include the **selected app** that this Meticulous project is for (name
401
+ and path). Use this to scope all instructions below to that single app. (If **Is monorepo: No**,
402
+ use single-package patterns; this section's path-filter and ignore-file guidance is mainly for
403
+ monorepos.)
404
+
405
+ 1. **Scope the trigger to the selected app's paths.** The Meticulous workflow / pipeline
406
+ should only run when files in the selected app's directory (or shared UI library
407
+ directories it depends on) change. The matching tab of `github-actions-v2.ts` shows
408
+ the exact YAML — `paths:` filters on `push` / `pull_request` for GitHub Actions, and
409
+ `rules: changes:` (or `only: changes:`) for GitLab CI. Replace the placeholder paths
410
+ with the selected app's path **plus** any shared packages it imports (UI library,
411
+ shared utilities, design system) from the reviewer's summary.
412
+
413
+ 2. **Scope the build step.** If the monorepo uses Turborepo, Nx, or similar, use the
414
+ filtered build command (e.g., `turbo run build --filter=frontend-app`) rather than
415
+ building the entire monorepo.
416
+
417
+ 3. **`.meticulousignore.{slug}` for the selected app (monorepo).** Follow **Source coverage:
418
+ `.meticulousignore`** above. Create **`.meticulousignore.{slug}`** at the repository root,
419
+ where `{slug}` matches **this** Meticulous project's name (see the configure-ignore-patterns
420
+ doc). Put sibling apps, backend packages, and tooling exclusions **in that slug file**,
421
+ not only in a global `.meticulousignore`. Example if the Meticulous project slug is
422
+ `twenty-front` and paths match the reviewer's layout:
423
+
424
+ ```
425
+ # .meticulousignore.twenty-front
426
+
427
+ # Exclude other frontend apps
428
+ packages/twenty-website/**
429
+
430
+ # Exclude backend code
431
+ packages/twenty-server/**
432
+
433
+ # Exclude tooling / config
434
+ packages/twenty-docker/**
435
+ packages/twenty-e2e-testing/**
436
+ ```
437
+
438
+ Do NOT exclude shared libraries that the selected app imports (e.g., `packages/twenty-ui`,
439
+ `packages/twenty-shared`) — these should remain in coverage since the selected app
440
+ depends on them.
441
+
442
+ 4. **Note in the output** that the Meticulous team will also configure
443
+ `CLOUD_REPLAY_MONOREPO_CONFIG` on the backend to ensure only main-branch pushes
444
+ containing frontend changes trigger base test runs. The customer does not need to
445
+ do anything for this — it is handled internally.
446
+
447
+ ## Monorepo naming: met_onboard-specific extras
448
+
449
+ Names, tables, worked examples, and `paths:` / `rules: changes:` scoping for monorepos
450
+ are documented in the relevant tab of `.claude/docs/github-actions-v2.ts` ("Naming
451
+ workflows, jobs and secrets in a monorepo (recommended)" for GitHub, "Naming jobs and
452
+ variables in a monorepo (recommended)" for GitLab). **HARD RULES — monorepos** above is
453
+ the agent-side enforcement contract for those names. The notes below only add the bits
454
+ that aren't in the docs and that the agent must apply directly:
455
+
456
+ - **GitLab CI pipeline-file decision:** keep the customer's existing `.gitlab-ci.yml` at
457
+ the repo root. If the repo already uses `include:` to split pipelines, add a new file
458
+ at `.gitlab/ci/meticulous-<app-kebab>.yml` and `include:` it from `.gitlab-ci.yml`.
459
+ Otherwise add the job inline in `.gitlab-ci.yml`.
460
+ - **GitLab CI variable storage:** tell the customer to add the API token variable under
461
+ **Settings → CI/CD → Variables** in the GitLab project (or group, for a group-level
462
+ variable), and recommend marking it **Masked** and, on projects with protected branches,
463
+ **Protected**.
464
+ - **Replace placeholder paths:** the docs' worked examples use placeholder app paths
465
+ (e.g. `apps/dashboard/**`, `packages/ui/**`). When you adapt them, substitute the
466
+ **selected app's path** plus any shared UI libraries it imports, taken from the
467
+ reviewer's summary.
468
+
469
+ ## Picking the runner / image for the Meticulous job
470
+
471
+ The customer-facing rationale and defaults for each CI provider's runner-environment
472
+ knobs live in the docs:
473
+
474
+ - **GitHub Actions** — `.claude/docs/github-actions-v2.ts` GitHub tab → "Choosing the
475
+ runner size (optional)" (`runs-on`).
476
+ - **GitLab CI** — `.claude/docs/github-actions-v2.ts` GitLab tab → "Choosing the image
477
+ and tags (optional)" (`image:`, `tags:`).
478
+
479
+ Read the relevant tab for the values to recommend. The rules below cover only the
480
+ extra behaviors specific to met_onboard (placeholder mechanic, scan-existing-pipeline
481
+ logic, monorepo-aware defaults):
482
+
483
+ ### GitHub Actions `runs-on`
484
+
485
+ When the plan includes a GitHub Actions workflow (new file or diff to an existing one):
486
+
487
+ 1. **Scan** `.github/workflows/` for `*.yml` and `*.yaml` files.
488
+ 2. **If there are no such files** (directory missing or empty), use the placeholder
489
+ `runs-on: <RUNNER_SIZE>` in the Meticulous workflow YAML. The printed customer
490
+ prompt will tell the engineer to pick a runner size before applying the workflow.
491
+ 3. **If workflow files exist**, read them and find every `runs-on:` value. Treat a
492
+ value as **inferable** when it is a literal label (e.g. `ubuntu-latest`,
493
+ `ubuntu-latest-8-cores`, `windows-latest`, `macos-14`, or a bracket list of labels
494
+ such as `[self-hosted, linux]`). **Skip** values that are only a `${{ ... }}`
495
+ expression with no fixed runner string you can copy verbatim.
496
+ 4. **When at least one inferable `runs-on` exists**, set the Meticulous job's `runs-on`
497
+ to the **same** label the repo already uses for comparable work. Prefer the workflow
498
+ that builds the same frontend this plan targets; if unclear, use the most common
499
+ inferable label across existing workflows. Preserve the same YAML shape as the
500
+ source (scalar vs array).
501
+ 5. **Add one short sentence** in the prose (not only in YAML), e.g. which workflow file
502
+ you matched, so it is obvious why that runner was chosen.
503
+ 6. **Do not** use `<RUNNER_SIZE>` when you copied a literal from existing workflows —
504
+ only use the placeholder when step 2 applies or every `runs-on` in the repo is
505
+ non-inferable.
506
+
507
+ ### GitLab CI `image:` and `tags:`
508
+
509
+ Apply when the customer's CI provider is GitLab CI:
510
+
511
+ 1. **Scan** `.gitlab-ci.yml` and any `include:`d pipeline files for existing `image:`
512
+ values. Treat an `image:` as **inferable** when it is a literal string or a string
513
+ that resolves through pipeline-level `variables:` you can read (e.g.
514
+ `image: node:${NODE_VERSION}-alpine` when `NODE_VERSION` is set in `variables:`).
515
+ 2. **When at least one inferable `image:` exists**, copy the same value the repo
516
+ already uses for build-heavy jobs onto the Meticulous job (preferring jobs that
517
+ build the same frontend this plan targets). Reuse a pipeline-level variable like
518
+ `NODE_VERSION` if the existing pipeline references one.
519
+ 3. **When no inferable `image:` exists**, default to `node:24-alpine` (or `node:24` if
520
+ the reviewer summary lists native build tooling that needs glibc) — do **not** invent
521
+ a placeholder.
522
+ 4. **`tags:` — default to omitting it entirely.** Only copy `tags:` over when the
523
+ existing pipeline already sets `tags:` on build-heavy jobs and those tags are
524
+ inferable (literal strings — no `$VAR`, no `!reference` indirection).
525
+ 5. **Add one short sentence** in the prose (not only in YAML) noting which pipeline
526
+ file you matched, so it is obvious why that image was chosen.
527
+ 6. **Performance note for GitLab.com SaaS only:** if the reviewer's summary indicates
528
+ the customer is on GitLab.com (not self-managed) and the existing pipeline does
529
+ **not** set `tags:`, mention in the **Verification** subsection that the customer
530
+ can opt into a larger runner by adding e.g. `tags: [saas-linux-large-amd64]` if the
531
+ default `saas-linux-small-amd64` proves too slow. This is a tip, not a required
532
+ change.
533
+
534
+ ## Clerk
535
+
536
+ If Clerk is in use (`@clerk/clerk-react`, `@clerk/nextjs`, or another `@clerk/*` package in
537
+ the selected app's `package.json`), bundle Clerk's browser JS locally in CI so replays do
538
+ not depend on Clerk's CDN. Add a `Bundle Clerk JS locally` step to the pipeline immediately
539
+ before the production build step, and point Clerk at the bundled file by setting the
540
+ framework's public env var to `/clerk/clerk.browser.js` on the build step (e.g.
541
+ `NEXT_PUBLIC_CLERK_JS_URL` for Next.js, `VITE_CLERK_JS_URL` for Vite,
542
+ `REACT_APP_CLERK_JS_URL` for CRA — match whatever the selected app uses to pass public env
543
+ vars to the client). Adjust `public/clerk` to the framework's served static directory if
544
+ it differs (e.g. `static/clerk` for SvelteKit). Render the step in the customer's actual CI
545
+ syntax (GitHub Actions, GitLab CI, CircleCI, etc.) — the shell commands below are the same
546
+ for every provider:
547
+
548
+ ```text
549
+ - name: Bundle Clerk JS locally
550
+ run: |
551
+ mkdir -p public/clerk
552
+ CLERK_JS_MAJOR=$(node -e "
553
+ const lockfile = require('fs').readFileSync('pnpm-lock.yaml', 'utf8');
554
+ const match = lockfile.match(/@clerk\/clerk-react@(\d+)/);
555
+ console.log(match ? match[1] : '5');
556
+ ")
557
+ echo "Packing @clerk/clerk-js@${CLERK_JS_MAJOR} dist bundle"
558
+ npm pack @clerk/clerk-js@${CLERK_JS_MAJOR} --pack-destination /tmp > /dev/null
559
+ tar -xzf /tmp/clerk-clerk-js-*.tgz -C /tmp
560
+ cp /tmp/package/dist/*.js public/clerk/
561
+ ls -lh public/clerk/
562
+ - name: Build app
563
+ run: pnpm build
564
+ env:
565
+ NEXT_PUBLIC_CLERK_JS_URL: /clerk/clerk.browser.js
566
+ ```
567
+
568
+ ## What to Produce
569
+
570
+ Write your markdown section to the output file path provided in the prompt. It should contain:
571
+
572
+ ```
573
+ ## Step <N>: Set Up CI
574
+
575
+ **Files to modify / create:**
576
+
577
+ - <bulleted paths; when **Is monorepo: Yes**, the new Meticulous workflow MUST be listed as
578
+ `.github/workflows/meticulous-<app-kebab>.yml` — never as a new `.github/workflows/meticulous.yaml`>
579
+
580
+ ### Monorepo: workflow and API token names
581
+
582
+ <When **Is monorepo: Yes**, include this subsection in the **customer** plan so implementers see
583
+ the naming contract. When **Is monorepo: No**, omit this entire subsection (no heading, no table).>
584
+
585
+ **App identifiers for this Meticulous project:** **app-kebab:** <value> **APP_SLUG:** <value>
586
+
587
+ <GitHub Actions table — include only when ciProvider is github-actions:>
588
+
589
+ | | Use for this monorepo | Do not use |
590
+ | --- | --- | --- |
591
+ | New GitHub Actions workflow file | `.github/workflows/meticulous-<app-kebab>.yml` | `.github/workflows/meticulous.yaml` |
592
+ | Workflow YAML top-level `name:` | `Meticulous (<app-kebab>)` | `Meticulous` as the entire value |
593
+ | GitHub Actions job `name:` (`jobs.<id>.name`) | `Meticulous (<app-kebab>)` | `Meticulous` as the entire value |
594
+ | GitHub repository secret | `METICULOUS_API_TOKEN_<APP_SLUG>` | `METICULOUS_API_TOKEN` |
595
+ | `api-token` input in workflow YAML | GitHub Actions expression referencing `secrets.METICULOUS_API_TOKEN_<APP_SLUG>` | Expression referencing only `secrets.METICULOUS_API_TOKEN` |
596
+
597
+ <GitLab CI table — include only when ciProvider is gitlab-ci:>
598
+
599
+ | | Use for this monorepo | Do not use |
600
+ | --- | --- | --- |
601
+ | Job key in `.gitlab-ci.yml` (or included pipeline file) | `meticulous-<app-kebab>:` | `meticulous:` |
602
+ | GitLab CI/CD variable | `METICULOUS_API_TOKEN_<APP_SLUG>` | `METICULOUS_API_TOKEN` |
603
+ | YAML reference to the API token | `$METICULOUS_API_TOKEN_<APP_SLUG>` (or `${METICULOUS_API_TOKEN_<APP_SLUG>}`) | `$METICULOUS_API_TOKEN` (bare) |
604
+ | Optional included pipeline file | `.gitlab/ci/meticulous-<app-kebab>.yml` (then `include:` from `.gitlab-ci.yml`) | A second bare `meticulous` block in `.gitlab-ci.yml` |
605
+
606
+ <CI-specific prose: approach, path filters, build env, links to Meticulous settings / GitHub secrets — for monorepos, prose must tell the customer to create secret `METICULOUS_API_TOKEN_<APP_SLUG>` and must not say to create bare `METICULOUS_API_TOKEN`>
607
+
608
+ <CI-specific prose for GitLab CI (instead of the GitHub-flavoured note above when ciProvider is gitlab-ci): approach, GitLab `rules: changes:` path scoping, build env, links to Meticulous settings / GitLab CI/CD variables — for monorepos, prose must tell the customer to create variable `METICULOUS_API_TOKEN_<APP_SLUG>` and must not say to create bare `METICULOUS_API_TOKEN`.>
609
+
610
+ ### Changes
611
+
612
+ <For each file, show the change as a unified diff or the complete new file contents>
613
+
614
+ ### Verification
615
+
616
+ <How to verify CI is working>
617
+ ```
618
+
619
+ When producing this section:
620
+
621
+ **Monorepo checklist (before every fenced GitHub Actions YAML block):** If **Is monorepo: Yes**,
622
+ search your draft (including duplicate YAML blocks and diffs) for each forbidden pattern and fix
623
+ before returning:
624
+
625
+ - **Zero** new-file bullets like `` `.github/workflows/meticulous.yaml` (new file) `` for this
626
+ project (use `` `meticulous-<app-kebab>.yml` `` instead).
627
+ - **Zero** lines that are **exactly** `name: Meticulous` (workflow title or `jobs.*.name` — both
628
+ must include `(<app-kebab>)`).
629
+ - **Zero** `${{ secrets.METICULOUS_API_TOKEN }}` (must always be suffixed).
630
+ - **Zero** prose instructing a repository secret named bare `` `METICULOUS_API_TOKEN` `` or table
631
+ rows whose secret column is only that bare token.
632
+ - **Allowed:** `env: METICULOUS_API_TOKEN: ${{ secrets.METICULOUS_API_TOKEN_<APP_SLUG> }}` — the
633
+ **environment variable** name may stay `METICULOUS_API_TOKEN`; only the **GitHub secret name**
634
+ and **`secrets.*` expression** must use `<APP_SLUG>`.
635
+
636
+ **Monorepo checklist (before every fenced GitLab CI YAML block):** If **Is monorepo: Yes** and
637
+ the customer's CI provider is GitLab CI, search your draft for each forbidden pattern and fix
638
+ before returning:
639
+
640
+ - **Zero** bare `meticulous:` job keys for this project (must be `meticulous-<app-kebab>:`).
641
+ - **Zero** bare `$METICULOUS_API_TOKEN` / `${METICULOUS_API_TOKEN}` references in pipeline YAML
642
+ (must be `$METICULOUS_API_TOKEN_<APP_SLUG>` / `${METICULOUS_API_TOKEN_<APP_SLUG>}`).
643
+ - **Zero** prose instructing a CI/CD variable named bare `` `METICULOUS_API_TOKEN` `` or table
644
+ rows whose variable column is only that bare token.
645
+ - **Allowed:** `variables: METICULOUS_API_TOKEN: $METICULOUS_API_TOKEN_<APP_SLUG>` inside a job —
646
+ re-exposing the suffixed variable under the bare name as an environment variable is fine; only
647
+ the **GitLab CI/CD variable name** and **direct YAML references** must use `<APP_SLUG>`.
648
+
649
+ 1. Fill in all placeholders from the docs with actual values from the reviewer's summary
650
+ (package manager, lock file, install command, build command, build output directory,
651
+ default branch name). For GitHub Actions `runs-on`, follow **GitHub Actions `runs-on`**
652
+ above: reuse an inferable label from existing `.github/workflows/` when possible; only
653
+ use `<RUNNER_SIZE>` when there are no workflow files or no inferable `runs-on`.
654
+ 2. Use the customer's actual default branch name (not just `main`).
655
+ 3. If they already have a Meticulous CI integration, evaluate it and suggest improvements.
656
+ 4. If they already have a CI workflow that builds the frontend, suggest adding the
657
+ Meticulous step to the existing workflow rather than creating a new one. Show the
658
+ change as a unified diff. The diff must be **minimal**: add only the new Meticulous
659
+ step (and any required env / secrets / permissions / job declaration that doesn't
660
+ already exist) — do **not** reorder existing steps, rename existing jobs, change
661
+ the runner label of unrelated jobs, normalise quoting / indentation style, or
662
+ touch any unrelated keys. Match the file's existing YAML style (flow vs block,
663
+ quote style, key ordering) exactly. Context lines in the diff must reproduce the
664
+ source byte-for-byte. The customer will apply the diff verbatim and any spurious
665
+ line counts as an unintended change to their workflow.
666
+
667
+ **Paths checklist (run before emitting any YAML or diff).** Every path-shaped value
668
+ below must come from the **reviewer's summary of this customer's repo**, not from a
669
+ docs example. The doc snippets use placeholders like `apps/dashboard`, `dist`,
670
+ `index.html`, `/(.*)`, etc.; copying these verbatim is the most common cause of broken
671
+ workflows. Walk this list once per fenced YAML / diff block and replace every value:
672
+ - `--appDirectory` / `appDirectory:` → the customer's actual build output directory
673
+ (from the reviewer's summary, e.g. `build`, `dist`, `out`, `public`, `apps/<name>/dist`).
674
+ Never leave it as `dist` / `build` unless the reviewer's summary says exactly that.
675
+ - `paths:` filters (GitHub Actions `on.push.paths` / `on.pull_request.paths`) and
676
+ `rules: changes:` globs (GitLab) → the customer's actual app directory and shared
677
+ paths. For monorepos, scope to `apps/<their-app>/**`, not `apps/dashboard/**`.
678
+ - `working-directory:` → the customer's actual frontend directory.
679
+ - Build / install commands and any directory arguments inside them (e.g.
680
+ `pnpm --filter <name> build`, `npm run build --workspace=<name>`) → the
681
+ customer's real package / workspace name.
682
+ - `rewrites:` (GitHub Actions) / `--rewrites` (CLI) → omit entirely. See the
683
+ **HARD RULES — never add `rewrites` / `--rewrites`** section near the top. If you
684
+ copied either form from a framework doc, delete the line from your draft.
685
+ - Any other reference to `index.html`, `dashboard`, `apps/`, `packages/`, `dist/`,
686
+ `build/`, `out/` that originated in a docs example → confirm against the reviewer's
687
+ summary or remove it.
688
+
689
+ If the reviewer's summary doesn't tell you the right value, leave a clearly-labelled
690
+ placeholder (e.g. `<your-build-dir>`) and call it out in prose — do **not** ship a
691
+ plausible-looking guess copied from the docs.
692
+
693
+ 5. For new workflow files, show the complete file contents based on the templates in the docs.
694
+ For **Is monorepo: Yes**, the **Files to modify** list must use
695
+ `.github/workflows/meticulous-<app-kebab>.yml` (never `meticulous.yaml` for this new file).
696
+ **Important**: Always include the full workflow YAML inside a ` ```yaml ` code fence
697
+ (not only inside a diff block). If you also show a diff, include the standalone
698
+ ` ```yaml ` block as well so readers can copy the complete workflow easily.
699
+ 6. Note any special configuration needed (e.g., container-port, container-env, start command).
700
+ **Always include `METICULOUS_BUILD=true` on the build** per **HARD RULE — always set the
701
+ `METICULOUS_BUILD` env var** above (build-step env for asset/served builds; build-arg +
702
+ Dockerfile `ARG`/`ENV` for container builds).
703
+ 7. If the customer's HTML contains absolute URLs for static assets, note that they should
704
+ be changed to relative URLs.
705
+ **API token secret + links:** Read `.claude/onboard-context.json` and include these links
706
+ directly from the context:
707
+ - Get the API token from the **Tokens** section of project settings: `{meticulousTokensUrl}`
708
+ - Add it as a GitHub Actions secret at: `{githubSecretsUrl}`
709
+ **Do NOT mention installing the GitHub App** — it is already installed before onboarding.
710
+ - **(GitLab CI alternative — when `ciProvider` is `gitlab-ci`):** ignore the GitHub secrets
711
+ URL above and instead tell the customer to add a GitLab CI/CD variable at `{secretsUrl}`
712
+ (the `secretsUrlLabel` value names the page, e.g. "GitLab CI/CD variables"). Recommend
713
+ marking it **Masked** and **Protected** as appropriate. Do **not** mention the GitHub App.
714
+ - **Secret / variable name:** **Is monorepo: Yes** → **only**
715
+ `METICULOUS_API_TOKEN_<APP_SLUG>`; **Is monorepo: No** → bare `METICULOUS_API_TOKEN`.
716
+ The exact rewrite recipe (which `secrets.*` expressions, `$VAR` references, action
717
+ inputs, and prose mentions to update) lives in **HARD RULES — monorepos** above.
718
+ A second Meticulous project later must use a different `<APP_SLUG>`. The same
719
+ suffixing rule applies to GitHub **Actions variables** if used instead of secrets.
720
+ 8. **Source maps**: Enable source maps for the Meticulous build. **Prefer doing this in
721
+ the workflow itself** (CLI flag or env var on the build command) rather than modifying
722
+ the customer's committed build config — that keeps the change scoped to the Meticulous
723
+ pipeline and leaves their PR / production builds untouched. Snippets for the common
724
+ frameworks live in the **Enable source maps (recommended)** expand of
725
+ `github-actions-v2.ts`:
726
+ - Vite → append `--sourcemap` to the build command in the workflow's build step.
727
+ - Create React App → set `GENERATE_SOURCEMAP=true` as a step-level env var.
728
+ - Angular CLI → append `--source-map` to `ng build` in the workflow.
729
+ - webpack with a custom config → set `SOURCEMAP=true` in the workflow and (one-time)
730
+ teach `webpack.config.js` to honour it via
731
+ `devtool: process.env.SOURCEMAP === "true" ? "source-map" : argv.devtool`.
732
+
733
+ Next.js and Vue CLI don't accept a build-time flag for source maps, so for those two
734
+ you do need a one-line config change:
735
+ - Next.js → `productionBrowserSourceMaps: true` in `next.config.js`.
736
+ - Vue CLI → `productionSourceMap: true` in `vue.config.js`.
737
+
738
+ Don't restate the rationale, serving requirements, or Cloud Replay caveat in the
739
+ customer plan — link to the **Enable source maps (recommended)** expand instead. If
740
+ the CI approach is Cloud Replay against a public preview URL, additionally tell the
741
+ customer to contact Meticulous support before enabling source maps so we can discuss
742
+ keeping them private.