@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.
- package/dist/__tests__/commonjs-dependencies.spec.d.ts +2 -0
- package/dist/__tests__/commonjs-dependencies.spec.d.ts.map +1 -0
- package/dist/__tests__/commonjs-dependencies.spec.js +82 -0
- package/dist/__tests__/commonjs-dependencies.spec.js.map +1 -0
- package/dist/command-utils/__tests__/parse-rewrites.spec.js +2 -2
- package/dist/command-utils/__tests__/parse-rewrites.spec.js.map +1 -1
- package/dist/command-utils/__tests__/warn-regex-rewrites.spec.js +2 -2
- package/dist/command-utils/__tests__/warn-regex-rewrites.spec.js.map +1 -1
- package/dist/command-utils/common-options.js +2 -2
- package/dist/command-utils/common-options.js.map +1 -1
- package/dist/command-utils/detect-upload-mode.js +2 -2
- package/dist/command-utils/detect-upload-mode.js.map +1 -1
- package/dist/command-utils/detect-upload-mode.spec.js +2 -2
- package/dist/command-utils/detect-upload-mode.spec.js.map +1 -1
- package/dist/command-utils/download-session.utils.js +2 -2
- package/dist/command-utils/download-session.utils.js.map +1 -1
- package/dist/command-utils/json-args.js +2 -2
- package/dist/command-utils/json-args.js.map +1 -1
- package/dist/command-utils/json-args.spec.js +2 -2
- package/dist/command-utils/json-args.spec.js.map +1 -1
- package/dist/command-utils/parse-container-env.js +2 -2
- package/dist/command-utils/parse-container-env.js.map +1 -1
- package/dist/command-utils/parse-rewrites.js +2 -2
- package/dist/command-utils/parse-rewrites.js.map +1 -1
- package/dist/command-utils/print-json.js +2 -2
- package/dist/command-utils/print-json.js.map +1 -1
- package/dist/command-utils/sentry.utils.js +2 -2
- package/dist/command-utils/sentry.utils.js.map +1 -1
- package/dist/command-utils/warn-regex-rewrites.js +2 -2
- package/dist/command-utils/warn-regex-rewrites.js.map +1 -1
- package/dist/commands/agent/agent-review-writes.command.spec.js +2 -2
- package/dist/commands/agent/agent-review-writes.command.spec.js.map +1 -1
- package/dist/commands/agent/build-git-options.js +2 -2
- package/dist/commands/agent/build-git-options.js.map +1 -1
- package/dist/commands/agent/build-git-options.spec.js +2 -2
- package/dist/commands/agent/build-git-options.spec.js.map +1 -1
- package/dist/commands/agent/coverage-columns.util.js +2 -2
- package/dist/commands/agent/coverage-columns.util.js.map +1 -1
- package/dist/commands/agent/create-diff-comment.command.js +2 -2
- package/dist/commands/agent/create-diff-comment.command.js.map +1 -1
- package/dist/commands/agent/diff-comment-write.utils.js +2 -2
- package/dist/commands/agent/diff-comment-write.utils.js.map +1 -1
- package/dist/commands/agent/diff-comments.command.js +2 -2
- package/dist/commands/agent/diff-comments.command.js.map +1 -1
- package/dist/commands/agent/diff-comments.command.spec.js +2 -2
- package/dist/commands/agent/diff-comments.command.spec.js.map +1 -1
- package/dist/commands/agent/ignore-diff.command.js +2 -2
- package/dist/commands/agent/ignore-diff.command.js.map +1 -1
- package/dist/commands/agent/index.js +2 -2
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/agent/js-coverage-diff.command.js +2 -2
- package/dist/commands/agent/js-coverage-diff.command.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.handler.spec.js +2 -2
- package/dist/commands/agent/js-coverage.command.handler.spec.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.js +2 -2
- package/dist/commands/agent/js-coverage.command.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.spec.js +2 -2
- package/dist/commands/agent/js-coverage.command.spec.js.map +1 -1
- package/dist/commands/agent/reject-diff.command.js +2 -2
- package/dist/commands/agent/reject-diff.command.js.map +1 -1
- package/dist/commands/agent/reject-diff.command.spec.js +2 -2
- package/dist/commands/agent/reject-diff.command.spec.js.map +1 -1
- package/dist/commands/agent/reply-to-diff-comment.command.js +2 -2
- package/dist/commands/agent/reply-to-diff-comment.command.js.map +1 -1
- package/dist/commands/agent/screenshot-dom-diff.command.js +2 -2
- package/dist/commands/agent/screenshot-dom-diff.command.js.map +1 -1
- package/dist/commands/agent/screenshot-image-files.command.js +2 -2
- package/dist/commands/agent/screenshot-image-files.command.js.map +1 -1
- package/dist/commands/agent/screenshot-image.command.js +2 -2
- package/dist/commands/agent/screenshot-image.command.js.map +1 -1
- package/dist/commands/agent/sessions.command.js +2 -2
- package/dist/commands/agent/sessions.command.js.map +1 -1
- package/dist/commands/agent/sessions.command.spec.js +2 -2
- package/dist/commands/agent/sessions.command.spec.js.map +1 -1
- package/dist/commands/agent/submit-feedback.command.js +2 -2
- package/dist/commands/agent/submit-feedback.command.js.map +1 -1
- package/dist/commands/agent/test-run-check.command.js +2 -2
- package/dist/commands/agent/test-run-check.command.js.map +1 -1
- package/dist/commands/agent/test-run-check.command.spec.js +2 -2
- package/dist/commands/agent/test-run-check.command.spec.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.js +2 -2
- package/dist/commands/agent/test-run-diffs.command.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.spec.js +2 -2
- package/dist/commands/agent/test-run-diffs.command.spec.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.utils.js +2 -2
- package/dist/commands/agent/test-run-diffs.utils.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.utils.spec.js +2 -2
- package/dist/commands/agent/test-run-diffs.utils.spec.js.map +1 -1
- package/dist/commands/agent/test-run-for-commit.command.js +2 -2
- package/dist/commands/agent/test-run-for-commit.command.js.map +1 -1
- package/dist/commands/agent/timeline.command.js +2 -2
- package/dist/commands/agent/timeline.command.js.map +1 -1
- package/dist/commands/agent/timeline.command.spec.js +2 -2
- package/dist/commands/agent/timeline.command.spec.js.map +1 -1
- package/dist/commands/agent/trigger-test-run.command.js +2 -2
- package/dist/commands/agent/trigger-test-run.command.js.map +1 -1
- package/dist/commands/agent/trigger-test-run.command.spec.js +2 -2
- package/dist/commands/agent/trigger-test-run.command.spec.js.map +1 -1
- package/dist/commands/agent/upload-build.command.js +2 -2
- package/dist/commands/agent/upload-build.command.js.map +1 -1
- package/dist/commands/all-commands.d.ts.map +1 -1
- package/dist/commands/all-commands.js +8 -6
- package/dist/commands/all-commands.js.map +1 -1
- package/dist/commands/auth/__tests__/get-project.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/get-project.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/list-projects.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/list-projects.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/login.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/login.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/logout.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/logout.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/set-project.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/set-project.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/whoami.command.spec.js +2 -2
- package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -1
- package/dist/commands/auth/get-project.command.js +2 -2
- package/dist/commands/auth/get-project.command.js.map +1 -1
- package/dist/commands/auth/index.js +2 -2
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/list-projects.command.js +2 -2
- package/dist/commands/auth/list-projects.command.js.map +1 -1
- package/dist/commands/auth/login.command.js +2 -2
- package/dist/commands/auth/login.command.js.map +1 -1
- package/dist/commands/auth/logout.command.js +2 -2
- package/dist/commands/auth/logout.command.js.map +1 -1
- package/dist/commands/auth/set-project.command.js +2 -2
- package/dist/commands/auth/set-project.command.js.map +1 -1
- package/dist/commands/auth/whoami.command.js +2 -2
- package/dist/commands/auth/whoami.command.js.map +1 -1
- package/dist/commands/ci/__tests__/label-commit.utils.spec.js +2 -2
- package/dist/commands/ci/__tests__/label-commit.utils.spec.js.map +1 -1
- package/dist/commands/ci/__tests__/session-filter.utils.spec.js +2 -2
- package/dist/commands/ci/__tests__/session-filter.utils.spec.js.map +1 -1
- package/dist/commands/ci/agent-test.command.d.ts +2 -0
- package/dist/commands/ci/agent-test.command.d.ts.map +1 -1
- package/dist/commands/ci/agent-test.command.js +28 -3
- package/dist/commands/ci/agent-test.command.js.map +1 -1
- package/dist/commands/ci/agent-test.command.spec.d.ts +2 -0
- package/dist/commands/ci/agent-test.command.spec.d.ts.map +1 -0
- package/dist/commands/ci/agent-test.command.spec.js +133 -0
- package/dist/commands/ci/agent-test.command.spec.js.map +1 -0
- package/dist/commands/ci/deprecated-trigger-options.js +2 -2
- package/dist/commands/ci/deprecated-trigger-options.js.map +1 -1
- package/dist/commands/ci/index.js +2 -2
- package/dist/commands/ci/index.js.map +1 -1
- package/dist/commands/ci/label-commit.command.js +2 -2
- package/dist/commands/ci/label-commit.command.js.map +1 -1
- package/dist/commands/ci/label-commit.core.js +2 -2
- package/dist/commands/ci/label-commit.core.js.map +1 -1
- package/dist/commands/ci/label-commit.types.js +2 -2
- package/dist/commands/ci/label-commit.types.js.map +1 -1
- package/dist/commands/ci/label-commit.utils.js +2 -2
- package/dist/commands/ci/label-commit.utils.js.map +1 -1
- package/dist/commands/ci/prepare.command.js +2 -2
- package/dist/commands/ci/prepare.command.js.map +1 -1
- package/dist/commands/ci/resolve-git-options.js +2 -2
- package/dist/commands/ci/resolve-git-options.js.map +1 -1
- package/dist/commands/ci/run-local.command.js +2 -2
- package/dist/commands/ci/run-local.command.js.map +1 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js +2 -2
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js.map +1 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.spec.js +2 -2
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.spec.js.map +1 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.utils.js +2 -2
- package/dist/commands/ci/run-with-uploaded-asset-chunks.utils.js.map +1 -1
- package/dist/commands/ci/run.command.js +2 -2
- package/dist/commands/ci/run.command.js.map +1 -1
- package/dist/commands/ci/session-filter.utils.js +2 -2
- package/dist/commands/ci/session-filter.utils.js.map +1 -1
- package/dist/commands/ci/start-tunnel.command.js +2 -2
- package/dist/commands/ci/start-tunnel.command.js.map +1 -1
- package/dist/commands/ci/trigger-test-run.core.js +2 -2
- package/dist/commands/ci/trigger-test-run.core.js.map +1 -1
- package/dist/commands/ci/trigger-test-run.types.js +2 -2
- package/dist/commands/ci/trigger-test-run.types.js.map +1 -1
- package/dist/commands/ci/upload-asset-chunk.command.js +2 -2
- package/dist/commands/ci/upload-asset-chunk.command.js.map +1 -1
- package/dist/commands/ci/upload-assets.command.js +2 -2
- package/dist/commands/ci/upload-assets.command.js.map +1 -1
- package/dist/commands/ci/upload-container.command.js +2 -2
- package/dist/commands/ci/upload-container.command.js.map +1 -1
- package/dist/commands/crawl.command.js +2 -2
- package/dist/commands/crawl.command.js.map +1 -1
- package/dist/commands/debug/clean-workspaces.js +2 -2
- package/dist/commands/debug/clean-workspaces.js.map +1 -1
- package/dist/commands/debug/index.js +2 -2
- package/dist/commands/debug/index.js.map +1 -1
- package/dist/commands/debug/present-workspace.js +2 -2
- package/dist/commands/debug/present-workspace.js.map +1 -1
- package/dist/commands/debug/project-worktree.js +2 -2
- package/dist/commands/debug/project-worktree.js.map +1 -1
- package/dist/commands/deprecated-aliases.js +2 -2
- package/dist/commands/deprecated-aliases.js.map +1 -1
- package/dist/commands/download/index.js +2 -2
- package/dist/commands/download/index.js.map +1 -1
- package/dist/commands/download/replay.command.js +2 -2
- package/dist/commands/download/replay.command.js.map +1 -1
- package/dist/commands/download/session.command.js +2 -2
- package/dist/commands/download/session.command.js.map +1 -1
- package/dist/commands/download/test-run.command.js +2 -2
- package/dist/commands/download/test-run.command.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.js +2 -2
- package/dist/commands/local/get-edited-files.utils.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.spec.js +2 -2
- package/dist/commands/local/get-edited-files.utils.spec.js.map +1 -1
- package/dist/commands/local/index.js +2 -2
- package/dist/commands/local/index.js.map +1 -1
- package/dist/commands/local/relevant-sessions.command.js +2 -2
- package/dist/commands/local/relevant-sessions.command.js.map +1 -1
- package/dist/commands/onboard/__tests__/build-context.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/build-context.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/build-context.spec.js +179 -0
- package/dist/commands/onboard/__tests__/build-context.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/check-vcs-link.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/check-vcs-link.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/check-vcs-link.spec.js +164 -0
- package/dist/commands/onboard/__tests__/check-vcs-link.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/codex-mcp.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/codex-mcp.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/codex-mcp.spec.js +73 -0
- package/dist/commands/onboard/__tests__/codex-mcp.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/detect-framework.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/detect-framework.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/detect-framework.spec.js +277 -0
- package/dist/commands/onboard/__tests__/detect-framework.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/git-repo-info.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/git-repo-info.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/git-repo-info.spec.js +109 -0
- package/dist/commands/onboard/__tests__/git-repo-info.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/inline-doc-constants.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/inline-doc-constants.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/inline-doc-constants.spec.js +157 -0
- package/dist/commands/onboard/__tests__/inline-doc-constants.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/install-skills.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/install-skills.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/install-skills.spec.js +158 -0
- package/dist/commands/onboard/__tests__/install-skills.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/materialize-workspace.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/materialize-workspace.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/materialize-workspace.spec.js +116 -0
- package/dist/commands/onboard/__tests__/materialize-workspace.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/resolve-app.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/resolve-app.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/resolve-app.spec.js +166 -0
- package/dist/commands/onboard/__tests__/resolve-app.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/safe-repo-fs.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/safe-repo-fs.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/safe-repo-fs.spec.js +137 -0
- package/dist/commands/onboard/__tests__/safe-repo-fs.spec.js.map +1 -0
- package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.d.ts +2 -0
- package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.d.ts.map +1 -0
- package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.js +286 -0
- package/dist/commands/onboard/__tests__/setup-agent-integrations.spec.js.map +1 -0
- package/dist/commands/onboard/build-context.d.ts +16 -0
- package/dist/commands/onboard/build-context.d.ts.map +1 -0
- package/dist/commands/onboard/build-context.js +104 -0
- package/dist/commands/onboard/build-context.js.map +1 -0
- package/dist/commands/onboard/check-vcs-link.d.ts +14 -0
- package/dist/commands/onboard/check-vcs-link.d.ts.map +1 -0
- package/dist/commands/onboard/check-vcs-link.js +111 -0
- package/dist/commands/onboard/check-vcs-link.js.map +1 -0
- package/dist/commands/onboard/codex-mcp.d.ts +24 -0
- package/dist/commands/onboard/codex-mcp.d.ts.map +1 -0
- package/dist/commands/onboard/codex-mcp.js +302 -0
- package/dist/commands/onboard/codex-mcp.js.map +1 -0
- package/dist/commands/onboard/customer-agents.d.ts +9 -0
- package/dist/commands/onboard/customer-agents.d.ts.map +1 -0
- package/dist/commands/onboard/customer-agents.js +19 -0
- package/dist/commands/onboard/customer-agents.js.map +1 -0
- package/dist/commands/onboard/customer-agents.json +17 -0
- package/dist/commands/onboard/customer-docs.d.ts +21 -0
- package/dist/commands/onboard/customer-docs.d.ts.map +1 -0
- package/dist/commands/onboard/customer-docs.js +31 -0
- package/dist/commands/onboard/customer-docs.js.map +1 -0
- package/dist/commands/onboard/customer-docs.json +35 -0
- package/dist/commands/onboard/detect-framework.d.ts +26 -0
- package/dist/commands/onboard/detect-framework.d.ts.map +1 -0
- package/dist/commands/onboard/detect-framework.js +305 -0
- package/dist/commands/onboard/detect-framework.js.map +1 -0
- package/dist/commands/onboard/discover-apps.d.ts +21 -0
- package/dist/commands/onboard/discover-apps.d.ts.map +1 -0
- package/dist/commands/onboard/discover-apps.js +318 -0
- package/dist/commands/onboard/discover-apps.js.map +1 -0
- package/dist/commands/onboard/docs-urls.d.ts +11 -0
- package/dist/commands/onboard/docs-urls.d.ts.map +1 -0
- package/dist/commands/onboard/docs-urls.js +17 -0
- package/dist/commands/onboard/docs-urls.js.map +1 -0
- package/dist/commands/onboard/git-repo-info.d.ts +15 -0
- package/dist/commands/onboard/git-repo-info.d.ts.map +1 -0
- package/dist/commands/onboard/git-repo-info.js +84 -0
- package/dist/commands/onboard/git-repo-info.js.map +1 -0
- package/dist/commands/onboard/index.d.ts +18 -0
- package/dist/commands/onboard/index.d.ts.map +1 -0
- package/dist/commands/onboard/index.js +164 -0
- package/dist/commands/onboard/index.js.map +1 -0
- package/dist/commands/onboard/inline-doc-constants.d.ts +21 -0
- package/dist/commands/onboard/inline-doc-constants.d.ts.map +1 -0
- package/dist/commands/onboard/inline-doc-constants.js +238 -0
- package/dist/commands/onboard/inline-doc-constants.js.map +1 -0
- package/dist/commands/onboard/launch-agent.d.ts +65 -0
- package/dist/commands/onboard/launch-agent.d.ts.map +1 -0
- package/dist/commands/onboard/launch-agent.js +311 -0
- package/dist/commands/onboard/launch-agent.js.map +1 -0
- package/dist/commands/onboard/materialize-workspace.d.ts +68 -0
- package/dist/commands/onboard/materialize-workspace.d.ts.map +1 -0
- package/dist/commands/onboard/materialize-workspace.js +177 -0
- package/dist/commands/onboard/materialize-workspace.js.map +1 -0
- package/dist/commands/onboard/print-summary.d.ts +10 -0
- package/dist/commands/onboard/print-summary.d.ts.map +1 -0
- package/dist/commands/onboard/print-summary.js +49 -0
- package/dist/commands/onboard/print-summary.js.map +1 -0
- package/dist/commands/onboard/resolve-app.d.ts +21 -0
- package/dist/commands/onboard/resolve-app.d.ts.map +1 -0
- package/dist/commands/onboard/resolve-app.js +78 -0
- package/dist/commands/onboard/resolve-app.js.map +1 -0
- package/dist/commands/onboard/resolve-project.d.ts +14 -0
- package/dist/commands/onboard/resolve-project.d.ts.map +1 -0
- package/dist/commands/onboard/resolve-project.js +92 -0
- package/dist/commands/onboard/resolve-project.js.map +1 -0
- package/dist/commands/onboard/safe-repo-fs.d.ts +59 -0
- package/dist/commands/onboard/safe-repo-fs.d.ts.map +1 -0
- package/dist/commands/onboard/safe-repo-fs.js +266 -0
- package/dist/commands/onboard/safe-repo-fs.js.map +1 -0
- package/dist/commands/onboard/setup-agent-integrations.d.ts +43 -0
- package/dist/commands/onboard/setup-agent-integrations.d.ts.map +1 -0
- package/dist/commands/onboard/setup-agent-integrations.js +324 -0
- package/dist/commands/onboard/setup-agent-integrations.js.map +1 -0
- package/dist/commands/onboard/templates/CLAUDE.md +213 -0
- package/dist/commands/onboard/templates/agents/auth-setup.md +117 -0
- package/dist/commands/onboard/templates/agents/ci-setup.md +742 -0
- package/dist/commands/onboard/templates/agents/csp-setup.md +78 -0
- package/dist/commands/onboard/templates/agents/false-positive-prevention.md +268 -0
- package/dist/commands/onboard/templates/agents/feature-flag-setup.md +133 -0
- package/dist/commands/onboard/templates/agents/local-simulation-verification.md +96 -0
- package/dist/commands/onboard/templates/agents/persisted-graphql-queries.md +150 -0
- package/dist/commands/onboard/templates/agents/recorder-installation.md +194 -0
- package/dist/commands/onboard/templates/agents/replay-fetch-retry-compatibility.md +252 -0
- package/dist/commands/onboard/templates/agents/reviewer.md +788 -0
- package/dist/commands/onboard/templates/agents/service-worker-compatibility.md +254 -0
- package/dist/commands/onboard/templates/agents/session-context.md +133 -0
- package/dist/commands/onboard/templates/agents/shared-worker-compatibility.md +187 -0
- package/dist/commands/onboard/templates/docs/additional-guides/backend-recorder.ts +340 -0
- package/dist/commands/onboard/templates/docs/ci/not-yet-run-checks.ts +58 -0
- package/dist/commands/onboard/templates/docs/ci.ts +19 -0
- package/dist/commands/onboard/templates/docs/cloud-replay.ts +145 -0
- package/dist/commands/onboard/templates/docs/constants.ts +37 -0
- package/dist/commands/onboard/templates/docs/github-actions-v2.ts +859 -0
- package/dist/commands/onboard/templates/docs/how-to/auth/bypassing-auth.ts +27 -0
- package/dist/commands/onboard/templates/docs/how-to/auth/enabling-full-auth.ts +91 -0
- package/dist/commands/onboard/templates/docs/how-to/configure-ignore-patterns.ts +77 -0
- package/dist/commands/onboard/templates/docs/how-to/enable-source-coverage.ts +84 -0
- package/dist/commands/onboard/templates/docs/how-to/fix-false-positive-diffs.ts +156 -0
- package/dist/commands/onboard/templates/docs/how-to/link-bitbucket.ts +15 -0
- package/dist/commands/onboard/templates/docs/how-to/link-gitlab.ts +22 -0
- package/dist/commands/onboard/templates/docs/how-to/record-session-context.ts +129 -0
- package/dist/commands/onboard/templates/docs/how-to/recorder-script.ts +139 -0
- package/dist/commands/onboard/templates/docs/how-to/testing-feature-flags.ts +97 -0
- package/dist/commands/onboard/templates/docs/how-to/testing-multiple-apps-or-app-variants.ts +40 -0
- package/dist/commands/onboard/templates/docs/how-to/troubleshoot-auth.ts +58 -0
- package/dist/commands/onboard/templates/docs/how-to/troubleshoot-failed-simulations.ts +97 -0
- package/dist/commands/onboard/templates/docs/how-to/typescript-types.ts +51 -0
- package/dist/commands/onboard/templates/docs/how-to/window-meticulous-object.ts +685 -0
- package/dist/commands/onboard/templates/docs/onboarding-guide.ts +415 -0
- package/dist/commands/onboard/templates/docs/recorder-getting-started.ts +24 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/constants.ts +1 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/explanation-of-methods-to-add-recorder.ts +21 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/angular-instructions.ts +34 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/any-other-framework-instructions.ts +118 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/npm-package-based-instructions/vue-instructions.ts +39 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/next-js-instructions.ts +49 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/nuxtjs-instructions.ts +68 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/rsbuild-instructions.ts +66 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/storybook-instructions.ts +59 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/sveltekit-instructions.ts +113 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-based-instructions/vite-instructions.ts +58 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/script-requirements.ts +51 -0
- package/dist/commands/onboard/templates/docs/recorder-snippets/steps-after-installing-recorder.ts +25 -0
- package/dist/commands/onboard/templates/docs/reference/cli-commands.ts +1324 -0
- package/dist/commands/onboard/templates/docs/session-recording/csp-exceptions.ts +17 -0
- package/dist/commands/onboard/templates/docs/session-recording/recorder-npm-dependency.ts +62 -0
- package/dist/commands/onboard/templates/docs-imports/src/lib/next/next.constants.ts +46 -0
- package/dist/commands/onboard/templates/docs-imports/src/lib/utils/internal-urls/docs-urls.utils.ts +254 -0
- package/dist/commands/onboard/templates/settings.json +14 -0
- package/dist/commands/project/index.js +2 -2
- package/dist/commands/project/index.js.map +1 -1
- package/dist/commands/project/show.command.js +2 -2
- package/dist/commands/project/show.command.js.map +1 -1
- package/dist/commands/project/upload-source.command.js +2 -2
- package/dist/commands/project/upload-source.command.js.map +1 -1
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js +2 -2
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js.map +1 -1
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js +2 -2
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js.map +1 -1
- package/dist/commands/record/__tests__/backend.command.spec.js +2 -2
- package/dist/commands/record/__tests__/backend.command.spec.js.map +1 -1
- package/dist/commands/record/__tests__/login.command.spec.js +2 -2
- package/dist/commands/record/__tests__/login.command.spec.js.map +1 -1
- package/dist/commands/record/__tests__/session.command.spec.js +2 -2
- package/dist/commands/record/__tests__/session.command.spec.js.map +1 -1
- package/dist/commands/record/backend-dev-command.utils.js +2 -2
- package/dist/commands/record/backend-dev-command.utils.js.map +1 -1
- package/dist/commands/record/backend-sidecar.utils.js +2 -2
- package/dist/commands/record/backend-sidecar.utils.js.map +1 -1
- package/dist/commands/record/backend.command.js +2 -2
- package/dist/commands/record/backend.command.js.map +1 -1
- package/dist/commands/record/index.js +2 -2
- package/dist/commands/record/index.js.map +1 -1
- package/dist/commands/record/login.command.js +2 -2
- package/dist/commands/record/login.command.js.map +1 -1
- package/dist/commands/record/session.command.js +2 -2
- package/dist/commands/record/session.command.js.map +1 -1
- package/dist/commands/replay-debugger.ui.js +2 -2
- package/dist/commands/replay-debugger.ui.js.map +1 -1
- package/dist/commands/replay.command.js +2 -2
- package/dist/commands/replay.command.js.map +1 -1
- package/dist/commands/schema.command.js +2 -2
- package/dist/commands/schema.command.js.map +1 -1
- package/dist/commands/schema.command.spec.js +2 -2
- package/dist/commands/schema.command.spec.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/utils/__tests__/handle-auth-failure.spec.js +2 -2
- package/dist/utils/__tests__/handle-auth-failure.spec.js.map +1 -1
- package/dist/utils/__tests__/project-selection-hint.spec.js +2 -2
- package/dist/utils/__tests__/project-selection-hint.spec.js.map +1 -1
- package/dist/utils/__tests__/resolve-project-identifier.spec.js +2 -2
- package/dist/utils/__tests__/resolve-project-identifier.spec.js.map +1 -1
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +2 -2
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
- package/dist/utils/__tests__/select-project.spec.js +5 -4
- package/dist/utils/__tests__/select-project.spec.js.map +1 -1
- package/dist/utils/cli-user-error.js +2 -2
- package/dist/utils/cli-user-error.js.map +1 -1
- package/dist/utils/constants.js +2 -2
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/environment.utils.js +2 -2
- package/dist/utils/environment.utils.js.map +1 -1
- package/dist/utils/format-coverage-ranges.js +2 -2
- package/dist/utils/format-coverage-ranges.js.map +1 -1
- package/dist/utils/handle-auth-failure.js +2 -2
- package/dist/utils/handle-auth-failure.js.map +1 -1
- package/dist/utils/out-of-date-client-error.js +2 -2
- package/dist/utils/out-of-date-client-error.js.map +1 -1
- package/dist/utils/project-selection-hint.js +2 -2
- package/dist/utils/project-selection-hint.js.map +1 -1
- package/dist/utils/resolve-project-identifier.js +2 -2
- package/dist/utils/resolve-project-identifier.js.map +1 -1
- package/dist/utils/resolve-test-run-from-commit.js +2 -2
- package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
- package/dist/utils/select-project.d.ts +9 -0
- package/dist/utils/select-project.d.ts.map +1 -1
- package/dist/utils/select-project.js +58 -15
- package/dist/utils/select-project.js.map +1 -1
- 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.
|