@etus/bhono-app 0.1.1
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/cli.d.ts +13 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +26 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/generator.d.ts +14 -0
- package/dist/generator.js +142 -0
- package/dist/generator.js.map +1 -0
- package/dist/generator.test.d.ts +1 -0
- package/dist/generator.test.js +127 -0
- package/dist/generator.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +25 -0
- package/dist/prompts.js +83 -0
- package/dist/prompts.js.map +1 -0
- package/dist/prompts.test.d.ts +1 -0
- package/dist/prompts.test.js +24 -0
- package/dist/prompts.test.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +37 -0
- package/dist/providers/cloudflare.js +61 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/cloudflare.test.d.ts +1 -0
- package/dist/providers/cloudflare.test.js +29 -0
- package/dist/providers/cloudflare.test.js.map +1 -0
- package/dist/providers/github.d.ts +16 -0
- package/dist/providers/github.js +57 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/github.test.d.ts +1 -0
- package/dist/providers/github.test.js +16 -0
- package/dist/providers/github.test.js.map +1 -0
- package/dist/templates.d.ts +8 -0
- package/dist/templates.js +88 -0
- package/dist/templates.js.map +1 -0
- package/dist/templates.test.d.ts +1 -0
- package/dist/templates.test.js +26 -0
- package/dist/templates.test.js.map +1 -0
- package/package.json +36 -0
- package/templates/base/.claude/agents/architect-review.md +160 -0
- package/templates/base/.claude/agents/backend-architect.md +308 -0
- package/templates/base/.claude/agents/code-reviewer.md +170 -0
- package/templates/base/.claude/agents/performance-engineer.md +166 -0
- package/templates/base/.claude/agents/test-automator.md +219 -0
- package/templates/base/.claude/commands/check-skill-rules.md +53 -0
- package/templates/base/.claude/commands/claude-md.md +250 -0
- package/templates/base/.claude/commands/code-prompt.md +212 -0
- package/templates/base/.claude/commands/explain-code.md +194 -0
- package/templates/base/.claude/commands/init-projec.md +89 -0
- package/templates/base/.claude/commands/linear/README.md +297 -0
- package/templates/base/.claude/commands/linear/create-issue.md +190 -0
- package/templates/base/.claude/commands/linear/implement-issue.md +248 -0
- package/templates/base/.claude/commands/linear/process-triage.md +399 -0
- package/templates/base/.claude/commands/linear/setup.md +180 -0
- package/templates/base/.claude/commands/prime.md +9 -0
- package/templates/base/.claude/commands/review-gap.md +10 -0
- package/templates/base/.claude/commands/setup-aa.md +311 -0
- package/templates/base/.claude/commands/ship.md +262 -0
- package/templates/base/.claude/commands/tools.md +3 -0
- package/templates/base/.claude/docs/claude-progress.txt +107 -0
- package/templates/base/.claude/hooks/package-lock.json +556 -0
- package/templates/base/.claude/hooks/package.json +16 -0
- package/templates/base/.claude/hooks/skill-activation-prompt.sh +7 -0
- package/templates/base/.claude/hooks/skill-activation-prompt.ts +142 -0
- package/templates/base/.claude/hooks/tsconfig.json +19 -0
- package/templates/base/.claude/scripts/check-updates.sh +85 -0
- package/templates/base/.claude/scripts/install_pkgs.sh +66 -0
- package/templates/base/.claude/scripts/setup-project.sh +177 -0
- package/templates/base/.claude/scripts/validate-skill-rules.sh +94 -0
- package/templates/base/.claude/settings.json +113 -0
- package/templates/base/.claude/settings.local.json +11 -0
- package/templates/base/.claude/skills/architecture-analyzer/SKILL.md +531 -0
- package/templates/base/.claude/skills/architecture-analyzer/assets/report-template.md +215 -0
- package/templates/base/.claude/skills/architecture-analyzer/references/c4-templates.md +234 -0
- package/templates/base/.claude/skills/architecture-analyzer/references/confidence-levels.md +203 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/analyze_structure.py +266 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/analyze_tech_debt.py +776 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/extract_apis.py +338 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/generate_c4.py +283 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/generate_erd.py +935 -0
- package/templates/base/.claude/skills/architecture-analyzer/scripts/map_dependencies.py +555 -0
- package/templates/base/.claude/skills/dev-browser/SKILL.md +318 -0
- package/templates/base/.claude/skills/dev-browser/bun.lock +443 -0
- package/templates/base/.claude/skills/dev-browser/package-lock.json +2927 -0
- package/templates/base/.claude/skills/dev-browser/package.json +27 -0
- package/templates/base/.claude/skills/dev-browser/scripts/start-server.ts +117 -0
- package/templates/base/.claude/skills/dev-browser/server.sh +24 -0
- package/templates/base/.claude/skills/dev-browser/src/client.ts +403 -0
- package/templates/base/.claude/skills/dev-browser/src/index.ts +281 -0
- package/templates/base/.claude/skills/dev-browser/src/snapshot/__tests__/snapshot.test.ts +223 -0
- package/templates/base/.claude/skills/dev-browser/src/snapshot/browser-script.ts +877 -0
- package/templates/base/.claude/skills/dev-browser/src/snapshot/index.ts +14 -0
- package/templates/base/.claude/skills/dev-browser/src/snapshot/inject.ts +13 -0
- package/templates/base/.claude/skills/dev-browser/src/types.ts +27 -0
- package/templates/base/.claude/skills/dev-browser/tsconfig.json +36 -0
- package/templates/base/.claude/skills/dev-browser/vitest.config.ts +12 -0
- package/templates/base/.claude/skills/linear/SKILL.md +440 -0
- package/templates/base/.claude/skills/linear/examples.md +262 -0
- package/templates/base/.claude/skills/linear/lib/client.ts +51 -0
- package/templates/base/.claude/skills/linear/lib/config.ts +106 -0
- package/templates/base/.claude/skills/linear/lib/output.ts +34 -0
- package/templates/base/.claude/skills/linear/package-lock.json +698 -0
- package/templates/base/.claude/skills/linear/package.json +27 -0
- package/templates/base/.claude/skills/linear/reference.md +263 -0
- package/templates/base/.claude/skills/linear/scripts/comments/create.ts +47 -0
- package/templates/base/.claude/skills/linear/scripts/comments/list.ts +47 -0
- package/templates/base/.claude/skills/linear/scripts/issues/archive.ts +30 -0
- package/templates/base/.claude/skills/linear/scripts/issues/create.ts +279 -0
- package/templates/base/.claude/skills/linear/scripts/issues/get.ts +68 -0
- package/templates/base/.claude/skills/linear/scripts/issues/list.ts +67 -0
- package/templates/base/.claude/skills/linear/scripts/issues/update.ts +281 -0
- package/templates/base/.claude/skills/linear/scripts/labels/add-to-issue.ts +63 -0
- package/templates/base/.claude/skills/linear/scripts/labels/create.ts +45 -0
- package/templates/base/.claude/skills/linear/scripts/labels/list.ts +30 -0
- package/templates/base/.claude/skills/linear/scripts/list-teams.ts +52 -0
- package/templates/base/.claude/skills/linear/scripts/setup/setup-credentials.ts +96 -0
- package/templates/base/.claude/skills/linear/scripts/status/list.ts +31 -0
- package/templates/base/.claude/skills/linear/scripts/status/set-by-name.ts +78 -0
- package/templates/base/.claude/skills/linear/scripts/status/update.ts +44 -0
- package/templates/base/.claude/skills/linear/scripts/users/list.ts +59 -0
- package/templates/base/.claude/skills/linear/scripts/users/me.ts +20 -0
- package/templates/base/.claude/skills/linear/templates/README.md +203 -0
- package/templates/base/.claude/skills/linear/templates/api-reference.md +258 -0
- package/templates/base/.claude/skills/linear/templates/bug-report.md +99 -0
- package/templates/base/.claude/skills/linear/templates/feature-request.md +118 -0
- package/templates/base/.claude/skills/linear/templates/security-issue.md +162 -0
- package/templates/base/.claude/skills/linear/templates/sprint-task.md +175 -0
- package/templates/base/.claude/skills/linear/templates/tech-debt.md +137 -0
- package/templates/base/.claude/skills/linear/tsconfig.json +17 -0
- package/templates/base/.claude/skills/linear/workflows/issue-lifecycle.md +317 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/SKILL.md +113 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/assets/global-setup.template.js +97 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/assets/playwright.config.template.js +171 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/assets/test-template.spec.js +163 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/examples/README.md +26 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/examples/ads.email-deeplink.spec.ts +12 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/examples/mobile.realism.spec.ts +16 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/examples/smoke.home.spec.ts +6 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/architecture.md +578 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/best-practices.md +260 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/ci-reporting.md +86 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/debugging.md +629 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/mobile-realism.md +50 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/optimization.md +488 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/patterns.md +513 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/resources.md +44 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/references/visual-a11y.md +66 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/scripts/auth-setup.js +202 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/scripts/performance-analyzer.js +240 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/scripts/trace-url.js +132 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/ci/github-actions.playwright.yml +78 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/fixtures.ts +44 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/global-setup.template.js +97 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/global.setup.ts +35 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/helpers/ad-gpt-observer.ts +80 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/helpers/chromium-mobile-profile.ts +93 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/playwright.config.template.js +171 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/playwright.config.ts +126 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/test-template.spec.js +163 -0
- package/templates/base/.claude/skills/playwright-e2e-testing/templates/tests/email-deeplink.ads.spec.ts +44 -0
- package/templates/base/.claude/skills/skill-rules.json +184 -0
- package/templates/base/.claude/skills/wrangler/SKILL.md +209 -0
- package/templates/base/.claude/skills/wrangler/resources/api.md +494 -0
- package/templates/base/.claude/skills/wrangler/resources/bundling.md +83 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/cert.md +64 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/check.md +66 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/containers.md +157 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/d1.md +843 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/delete.md +27 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/deploy.md +139 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/deployments.md +56 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/dev.md +157 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/dispatch-namespace.md +69 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/docs.md +61 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/how-to-run.md +62 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/hyperdrive.md +425 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/init.md +31 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/kv-bulk.md +265 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/kv-key.md +353 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/kv-namespace.md +265 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/login.md +23 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/logout.md +19 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/mtls-certificate.md +69 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/pages.md +175 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/pipelines.md +76 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/queues.md +132 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/r2-bucket.md +342 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/r2-object.md +267 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/r2-sql.md +65 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/rollback.md +40 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/secret.md +308 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/secrets-store-secret.md +100 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/secrets-store-store.md +60 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/setup.md +67 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/tail.md +37 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/telemetry.md +64 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/triggers.md +39 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/types.md +73 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/vectorize.md +941 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/versions.md +95 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/whoami.md +49 -0
- package/templates/base/.claude/skills/wrangler/resources/commands/workflows.md +117 -0
- package/templates/base/.claude/skills/wrangler/resources/commands.md +138 -0
- package/templates/base/.claude/skills/wrangler/resources/configuration.md +2176 -0
- package/templates/base/.claude/skills/wrangler/resources/custom-builds.md +55 -0
- package/templates/base/.claude/skills/wrangler/resources/deprecations.md +279 -0
- package/templates/base/.claude/skills/wrangler/resources/enviroments.md +416 -0
- package/templates/base/.claude/skills/wrangler/resources/extract_sections.py +119 -0
- package/templates/base/.claude/skills/wrangler/resources/process_content.py +94 -0
- package/templates/base/.claude/skills/wrangler/resources/system-enviroments-variables.md +120 -0
- package/templates/base/.dev.vars.example +15 -0
- package/templates/base/.env.example +29 -0
- package/templates/base/.github/workflows/test.yml +127 -0
- package/templates/base/.nycrc.json +16 -0
- package/templates/base/CLAUDE.md +218 -0
- package/templates/base/README.md +670 -0
- package/templates/base/auth-setup-error.png +0 -0
- package/templates/base/config/drizzle.config.ts +10 -0
- package/templates/base/config/eslint.config.js +364 -0
- package/templates/base/config/wrangler.json +76 -0
- package/templates/base/docs/app_spec.txt +879 -0
- package/templates/base/docs/app_spec_template.md +681 -0
- package/templates/base/docs/architecture/README.md +8 -0
- package/templates/base/docs/architecture/data-requirements.md +109 -0
- package/templates/base/docs/architecture/erd.md +91 -0
- package/templates/base/docs/features/feature_list.json +3128 -0
- package/templates/base/docs/hono-boilerplate-plan.md +1774 -0
- package/templates/base/docs/test-coverage-gap-analysis.md +242 -0
- package/templates/base/docs/testing.md +188 -0
- package/templates/base/index.html +16 -0
- package/templates/base/package.json +115 -0
- package/templates/base/playwright.config.ts +158 -0
- package/templates/base/pnpm-lock.yaml +8175 -0
- package/templates/base/scripts/capture-prod-session.ts +250 -0
- package/templates/base/scripts/generate-openapi.ts +23 -0
- package/templates/base/scripts/init.sh +121 -0
- package/templates/base/src/client/__tests__/button.test.tsx +30 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-dashboard-stats-cards-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-quick-action-cards-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-recent-activity-section-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-user-first-name-in-welcome-message-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-display-user-information-in-sidebar-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-render-dashboard-when-authenticated-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-authenticated-should-show-navigation-sidebar-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/dashboard.test.tsx/Dashboard-Page-when-unauthenticated-should-redirect-to-login-when-not-authenticated-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-display-Google-OAuth-login-button-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-have-a-link-back-to-home-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-render-login-content-without-waiting-for-authentication-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-render-login-page-at--login-route-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-show-Terms-of-Service-and-Privacy-Policy-links-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/login.test.tsx/Login-Page-should-trigger-OAuth-flow-when-clicking-login-button-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-display-404-text-on-not-found-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-have-navigation-options-on-404-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-404-handling-should-render-404-page-for-unknown-routes-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-account-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-integrations-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-settings-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-authenticated-navigation-should-navigate-from-dashboard-to-team-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-home-page-navigation-should-display-navigation-links-on-home-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-home-page-navigation-should-have-correct-link-destinations-on-home-page-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-allow-access-to-home-page-without-authentication-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-allow-access-to-login-page-without-authentication-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-dashboard-to-login-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-settings-to-login-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/__screenshots__/navigation.test.tsx/Navigation-unauthenticated-navigation-should-redirect-unauthenticated-users-from-team-to-login-1.png +0 -0
- package/templates/base/src/client/__tests__/routes/authenticated-layout.test.tsx +252 -0
- package/templates/base/src/client/__tests__/routes/dashboard.test.tsx +136 -0
- package/templates/base/src/client/__tests__/routes/error-components.test.tsx +186 -0
- package/templates/base/src/client/__tests__/routes/login.test.tsx +112 -0
- package/templates/base/src/client/__tests__/routes/navigation.test.tsx +272 -0
- package/templates/base/src/client/__tests__/routes/root-layout.test.tsx +65 -0
- package/templates/base/src/client/__tests__/setup-browser.ts +15 -0
- package/templates/base/src/client/__tests__/setup.ts +32 -0
- package/templates/base/src/client/__tests__/test-utils.tsx +135 -0
- package/templates/base/src/client/api/.gitkeep +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-can-be-collapsed-by-default-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-expands-when-collapsed-and-expand-button-is-clicked-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-handles-logout-button-click-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-handles-navigation-clicks-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-hides-navigation-labels-when-collapsed-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-highlights-active-route-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-renders-sidebar-navigation-items-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-shows-keyboard-shortcut-hint-when-expanded-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-shows-user-info-when-authenticated-1.png +0 -0
- package/templates/base/src/client/components/__tests__/__screenshots__/sidebar.test.tsx/Sidebar-shows-user-initials-in-avatar-fallback-1.png +0 -0
- package/templates/base/src/client/components/__tests__/error-boundary.test.tsx +97 -0
- package/templates/base/src/client/components/__tests__/sidebar.test.tsx +281 -0
- package/templates/base/src/client/components/error-boundary.tsx +68 -0
- package/templates/base/src/client/components/icons.tsx +106 -0
- package/templates/base/src/client/components/layout/.gitkeep +0 -0
- package/templates/base/src/client/components/sidebar.tsx +267 -0
- package/templates/base/src/client/components/ui/.gitkeep +0 -0
- package/templates/base/src/client/components/ui/__tests__/avatar.test.tsx +308 -0
- package/templates/base/src/client/components/ui/__tests__/card.test.tsx +214 -0
- package/templates/base/src/client/components/ui/__tests__/dialog.test.tsx +297 -0
- package/templates/base/src/client/components/ui/__tests__/error-fallback.test.tsx +145 -0
- package/templates/base/src/client/components/ui/__tests__/input.test.tsx +98 -0
- package/templates/base/src/client/components/ui/__tests__/loading-skeleton.test.tsx +139 -0
- package/templates/base/src/client/components/ui/__tests__/skeleton.test.tsx +44 -0
- package/templates/base/src/client/components/ui/__tests__/sonner.test.tsx +28 -0
- package/templates/base/src/client/components/ui/__tests__/tabs.test.tsx +233 -0
- package/templates/base/src/client/components/ui/avatar.tsx +101 -0
- package/templates/base/src/client/components/ui/badge.tsx +46 -0
- package/templates/base/src/client/components/ui/button.tsx +72 -0
- package/templates/base/src/client/components/ui/card.tsx +86 -0
- package/templates/base/src/client/components/ui/dialog.tsx +140 -0
- package/templates/base/src/client/components/ui/error-fallback.tsx +179 -0
- package/templates/base/src/client/components/ui/form.tsx +172 -0
- package/templates/base/src/client/components/ui/input.tsx +24 -0
- package/templates/base/src/client/components/ui/label.tsx +22 -0
- package/templates/base/src/client/components/ui/loading-skeleton.tsx +154 -0
- package/templates/base/src/client/components/ui/separator.tsx +33 -0
- package/templates/base/src/client/components/ui/skeleton.tsx +16 -0
- package/templates/base/src/client/components/ui/sonner.tsx +29 -0
- package/templates/base/src/client/components/ui/tabs.tsx +121 -0
- package/templates/base/src/client/hooks/.gitkeep +0 -0
- package/templates/base/src/client/hooks/__tests__/use-auth.test.tsx +306 -0
- package/templates/base/src/client/hooks/__tests__/use-theme.test.tsx +172 -0
- package/templates/base/src/client/hooks/use-auth.ts +53 -0
- package/templates/base/src/client/hooks/use-theme.tsx +78 -0
- package/templates/base/src/client/index.css +881 -0
- package/templates/base/src/client/lib/query-client.ts +11 -0
- package/templates/base/src/client/lib/utils.ts +7 -0
- package/templates/base/src/client/main.tsx +26 -0
- package/templates/base/src/client/routeTree.gen.ts +258 -0
- package/templates/base/src/client/router.ts +15 -0
- package/templates/base/src/client/routes/$.tsx +77 -0
- package/templates/base/src/client/routes/.gitkeep +0 -0
- package/templates/base/src/client/routes/__root.tsx +34 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-accept-invitation-button-1.png +0 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-decline-button-linking-to-homepage-1.png +0 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-display-invitation-details--email--workspace--role--1.png +0 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-have-a-logo-link-to-homepage-1.png +0 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-render-invitation-page-with-inviter-name-and-workspace-1.png +0 -0
- package/templates/base/src/client/routes/__tests__/__screenshots__/invite.test.tsx/Invite-Token-Page-pending-invitation-state-should-show-terms-of-service-and-privacy-policy-links-1.png +0 -0
- package/templates/base/src/client/routes/__tests__/invite.test.tsx +138 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-render-Active-Sessions-section-with-session-cards-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-render-page-with-correct-title--Account--1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-show-API-Access-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-show-Connected-Accounts-section-with-Google-connected-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-show-Danger-Zone-section-with-delete-button-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/account.test.tsx/Account-Page-should-show-Security-section-with-Two-Factor-Authentication-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-API-documentation-section-should-display-API-documentation-link-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-Create-Webhook-Dialog-should-have-Add-Webhook-trigger-button-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-category-filters-should-display-all-category-buttons-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-display-all-integration-cards-with-names-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-display-category-badges-on-cards-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Configure-button-for-connected-integrations-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Connect-button-for-not-connected-integrations-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-integration-cards-should-show-Connected-badge-for-connected-integrations-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-Available-Integrations-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-Webhooks-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-connected-count-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-page-description-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-display-search-input-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-page-rendering-should-render-with-correct-title--Integrations--1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-filter-integrations-based-on-search-query-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-search-by-description-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-search-functionality-should-show-no-results-message-when-search-has-no-matches-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-existing-webhook-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-events-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-last-delivery-info-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-display-webhook-success-status-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/integrations.test.tsx/Integrations-Page-webhooks-section-should-have-Add-Webhook-button-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Account-tab-should-display-connected-accounts-section-with-Google-provider-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Account-tab-should-display-sessions-and-danger-zone-sections-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-all-notification-toggle-options-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-email-notifications-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-display-toggle-switches-for-notification-options-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Notifications-tab-should-have-toggles-checked-by-default-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display--Save-Changes--button-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-personal-information-form-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-profile-picture-section-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-email-in-disabled-email-input-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-initials-in-avatar-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-Profile-tab-should-display-user-name-in-the-name-input-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-display-all-three-tabs-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-display-page-description-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-page-rendering-should-render-with-correct-title--Settings--1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-show-Profile-tab-as-default-active-tab-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-switch-to-Account-tab-when-clicked-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/settings.test.tsx/Settings-Page-tab-navigation-should-switch-to-Notifications-tab-when-clicked-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-display-Active-Members-section-with-member-count-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-display-Pending-Invitations-section-with-invitation-details-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-have-invite-member-button-that-can-be-clicked-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-render-page-with-correct-title-and-description-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-render-search-input-that-filters-team-members-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/__screenshots__/team.test.tsx/Team-Page-should-show-current-user-with---you---indicator-and-role-badge-1.png +0 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/account.test.tsx +324 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/integrations.test.tsx +520 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/settings.test.tsx +414 -0
- package/templates/base/src/client/routes/_authenticated/__tests__/team.test.tsx +374 -0
- package/templates/base/src/client/routes/_authenticated/account.tsx +416 -0
- package/templates/base/src/client/routes/_authenticated/dashboard.tsx +151 -0
- package/templates/base/src/client/routes/_authenticated/integrations.tsx +553 -0
- package/templates/base/src/client/routes/_authenticated/settings.tsx +310 -0
- package/templates/base/src/client/routes/_authenticated/team.tsx +395 -0
- package/templates/base/src/client/routes/_authenticated.tsx +69 -0
- package/templates/base/src/client/routes/index.tsx +155 -0
- package/templates/base/src/client/routes/invite.$token.tsx +191 -0
- package/templates/base/src/client/routes/login.tsx +92 -0
- package/templates/base/src/server/__tests__/fixtures.ts +461 -0
- package/templates/base/src/server/__tests__/mocks/__tests__/db.test.ts +239 -0
- package/templates/base/src/server/__tests__/mocks/__tests__/kv.test.ts +293 -0
- package/templates/base/src/server/__tests__/mocks/__tests__/r2.test.ts +363 -0
- package/templates/base/src/server/__tests__/mocks/db.ts +186 -0
- package/templates/base/src/server/__tests__/mocks/index.ts +33 -0
- package/templates/base/src/server/__tests__/mocks/kv.ts +286 -0
- package/templates/base/src/server/__tests__/mocks/r2.ts +397 -0
- package/templates/base/src/server/__tests__/setup.ts +281 -0
- package/templates/base/src/server/auth/__tests__/guards.test.ts +162 -0
- package/templates/base/src/server/auth/guards.ts +92 -0
- package/templates/base/src/server/auth/permissions.test.ts +45 -0
- package/templates/base/src/server/auth/permissions.ts +139 -0
- package/templates/base/src/server/auth/roles.test.ts +169 -0
- package/templates/base/src/server/auth/roles.ts +141 -0
- package/templates/base/src/server/db/client.ts +12 -0
- package/templates/base/src/server/db/schema/accounts.ts +20 -0
- package/templates/base/src/server/db/schema/audit-logs.ts +26 -0
- package/templates/base/src/server/db/schema/index.ts +7 -0
- package/templates/base/src/server/db/schema/invitations.ts +30 -0
- package/templates/base/src/server/db/schema/refresh-tokens.ts +22 -0
- package/templates/base/src/server/db/schema/user-accounts.ts +25 -0
- package/templates/base/src/server/db/schema/users.ts +33 -0
- package/templates/base/src/server/db/seed.ts +267 -0
- package/templates/base/src/server/env.test.ts +84 -0
- package/templates/base/src/server/env.ts +78 -0
- package/templates/base/src/server/index.ts +82 -0
- package/templates/base/src/server/lib/audit.ts +73 -0
- package/templates/base/src/server/lib/audited-db.test.ts +107 -0
- package/templates/base/src/server/lib/audited-db.ts +154 -0
- package/templates/base/src/server/lib/email.test.ts +116 -0
- package/templates/base/src/server/lib/email.ts +82 -0
- package/templates/base/src/server/lib/errors.test.ts +49 -0
- package/templates/base/src/server/lib/errors.ts +64 -0
- package/templates/base/src/server/lib/oauth.test.ts +238 -0
- package/templates/base/src/server/lib/oauth.ts +113 -0
- package/templates/base/src/server/lib/pagination.test.ts +52 -0
- package/templates/base/src/server/lib/pagination.ts +32 -0
- package/templates/base/src/server/lib/password.test.ts +151 -0
- package/templates/base/src/server/lib/password.ts +151 -0
- package/templates/base/src/server/lib/providers.test.ts +105 -0
- package/templates/base/src/server/lib/providers.ts +62 -0
- package/templates/base/src/server/lib/r2-storage.test.ts +202 -0
- package/templates/base/src/server/lib/r2-storage.ts +107 -0
- package/templates/base/src/server/lib/schema-helpers.ts +16 -0
- package/templates/base/src/server/lib/session.test.ts +758 -0
- package/templates/base/src/server/lib/session.ts +267 -0
- package/templates/base/src/server/lib/tokens.test.ts +208 -0
- package/templates/base/src/server/lib/tokens.ts +65 -0
- package/templates/base/src/server/lib/transaction.test.ts +45 -0
- package/templates/base/src/server/lib/transaction.ts +24 -0
- package/templates/base/src/server/middleware/account.test.ts +201 -0
- package/templates/base/src/server/middleware/account.ts +66 -0
- package/templates/base/src/server/middleware/auth.test.ts +345 -0
- package/templates/base/src/server/middleware/auth.ts +146 -0
- package/templates/base/src/server/middleware/cors.test.ts +88 -0
- package/templates/base/src/server/middleware/cors.ts +26 -0
- package/templates/base/src/server/middleware/error-handler.test.ts +69 -0
- package/templates/base/src/server/middleware/error-handler.ts +43 -0
- package/templates/base/src/server/middleware/index.ts +8 -0
- package/templates/base/src/server/middleware/rate-limit.test.ts +472 -0
- package/templates/base/src/server/middleware/rate-limit.ts +294 -0
- package/templates/base/src/server/middleware/request-context.test.ts +175 -0
- package/templates/base/src/server/middleware/request-context.ts +28 -0
- package/templates/base/src/server/middleware/request-logger.test.ts +92 -0
- package/templates/base/src/server/middleware/request-logger.ts +50 -0
- package/templates/base/src/server/routes/accounts/__tests__/handlers.test.ts +460 -0
- package/templates/base/src/server/routes/accounts/handlers.ts +179 -0
- package/templates/base/src/server/routes/accounts/index.ts +55 -0
- package/templates/base/src/server/routes/accounts/routes.ts +205 -0
- package/templates/base/src/server/routes/accounts/schemas.ts +31 -0
- package/templates/base/src/server/routes/api.ts +37 -0
- package/templates/base/src/server/routes/audits/__tests__/handlers.test.ts +349 -0
- package/templates/base/src/server/routes/audits/handlers.ts +37 -0
- package/templates/base/src/server/routes/audits/index.ts +14 -0
- package/templates/base/src/server/routes/audits/routes.ts +29 -0
- package/templates/base/src/server/routes/audits/schemas.ts +43 -0
- package/templates/base/src/server/routes/auth/__tests__/handlers.test.ts +381 -0
- package/templates/base/src/server/routes/auth/handlers.ts +222 -0
- package/templates/base/src/server/routes/auth/index.ts +37 -0
- package/templates/base/src/server/routes/auth/routes.ts +136 -0
- package/templates/base/src/server/routes/auth/schemas.ts +48 -0
- package/templates/base/src/server/routes/auth/test-login.ts +156 -0
- package/templates/base/src/server/routes/health/__tests__/handlers.test.ts +237 -0
- package/templates/base/src/server/routes/health/handlers.ts +83 -0
- package/templates/base/src/server/routes/health/index.ts +13 -0
- package/templates/base/src/server/routes/health/routes.ts +90 -0
- package/templates/base/src/server/routes/index.ts +53 -0
- package/templates/base/src/server/routes/invitations/__tests__/handlers.test.ts +473 -0
- package/templates/base/src/server/routes/invitations/handlers.ts +71 -0
- package/templates/base/src/server/routes/invitations/index.ts +25 -0
- package/templates/base/src/server/routes/invitations/routes.ts +69 -0
- package/templates/base/src/server/routes/invitations/schemas.ts +39 -0
- package/templates/base/src/server/routes/openapi.ts +14 -0
- package/templates/base/src/server/routes/schemas.ts +53 -0
- package/templates/base/src/server/routes/storage/__tests__/handlers.test.ts +408 -0
- package/templates/base/src/server/routes/storage/handlers.ts +100 -0
- package/templates/base/src/server/routes/storage/index.ts +42 -0
- package/templates/base/src/server/routes/storage/routes.ts +91 -0
- package/templates/base/src/server/routes/storage/schemas.ts +56 -0
- package/templates/base/src/server/routes/users/__tests__/handlers.test.ts +526 -0
- package/templates/base/src/server/routes/users/handlers.ts +228 -0
- package/templates/base/src/server/routes/users/index.ts +67 -0
- package/templates/base/src/server/routes/users/routes.ts +265 -0
- package/templates/base/src/server/routes/users/schemas.ts +67 -0
- package/templates/base/src/server/services/__tests__/accounts.test.ts +764 -0
- package/templates/base/src/server/services/__tests__/audits.test.ts +235 -0
- package/templates/base/src/server/services/__tests__/auth.test.ts +765 -0
- package/templates/base/src/server/services/__tests__/invitations.test.ts +704 -0
- package/templates/base/src/server/services/__tests__/users.test.ts +755 -0
- package/templates/base/src/server/services/accounts.ts +269 -0
- package/templates/base/src/server/services/audits.ts +82 -0
- package/templates/base/src/server/services/auth.ts +225 -0
- package/templates/base/src/server/services/index.ts +6 -0
- package/templates/base/src/server/services/invitations.ts +306 -0
- package/templates/base/src/server/services/users.ts +350 -0
- package/templates/base/src/server/types/auth.ts +36 -0
- package/templates/base/src/server/types/index.ts +117 -0
- package/templates/base/src/shared/schemas/.gitkeep +0 -0
- package/templates/base/src/shared/schemas/__tests__/schemas.test.ts +547 -0
- package/templates/base/src/shared/schemas/account.ts +15 -0
- package/templates/base/src/shared/schemas/index.ts +6 -0
- package/templates/base/src/shared/schemas/invitation.ts +9 -0
- package/templates/base/src/shared/schemas/profile.ts +10 -0
- package/templates/base/src/shared/schemas/user.ts +16 -0
- package/templates/base/src/shared/schemas/webhook.ts +12 -0
- package/templates/base/src/shared/types/.gitkeep +0 -0
- package/templates/base/src/shared/types/account.ts +12 -0
- package/templates/base/src/shared/types/api.ts +1399 -0
- package/templates/base/src/shared/types/auth.ts +24 -0
- package/templates/base/src/shared/types/index.ts +5 -0
- package/templates/base/src/shared/types/user.ts +31 -0
- package/templates/base/src/test/vitest-zod-matcher.ts +37 -0
- package/templates/base/src/test/vitest.d.ts +19 -0
- package/templates/base/tests/e2e/README.md +141 -0
- package/templates/base/tests/e2e/a11y/accessibility.spec.ts +925 -0
- package/templates/base/tests/e2e/a11y/keyboard-navigation.spec.ts +610 -0
- package/templates/base/tests/e2e/api/accounts.spec.ts +148 -0
- package/templates/base/tests/e2e/api/audit-logs.spec.ts +130 -0
- package/templates/base/tests/e2e/api/authenticated-api.spec.ts +311 -0
- package/templates/base/tests/e2e/api/storage.spec.ts +109 -0
- package/templates/base/tests/e2e/auth-flows.unauth.spec.ts +117 -0
- package/templates/base/tests/e2e/auth-logout.unauth.spec.ts +103 -0
- package/templates/base/tests/e2e/auth.setup.ts +115 -0
- package/templates/base/tests/e2e/auth.spec.ts +146 -0
- package/templates/base/tests/e2e/compatibility/cross-browser.spec.ts +152 -0
- package/templates/base/tests/e2e/compatibility/cross-browser.spec.ts-snapshots/login-chromium-chromium-darwin.png +0 -0
- package/templates/base/tests/e2e/crud/account.spec.ts +356 -0
- package/templates/base/tests/e2e/crud/integrations.spec.ts +419 -0
- package/templates/base/tests/e2e/crud/team.spec.ts +287 -0
- package/templates/base/tests/e2e/crud/users.spec.ts +239 -0
- package/templates/base/tests/e2e/errors/error-boundary.spec.ts +428 -0
- package/templates/base/tests/e2e/errors/error-handling.spec.ts +47 -0
- package/templates/base/tests/e2e/errors/error-handling.unauth.spec.ts +205 -0
- package/templates/base/tests/e2e/fixtures.ts +266 -0
- package/templates/base/tests/e2e/forms/validation.spec.ts +569 -0
- package/templates/base/tests/e2e/invitations/invite-flow.unauth.spec.ts +204 -0
- package/templates/base/tests/e2e/journeys/account-lifecycle.spec.ts +314 -0
- package/templates/base/tests/e2e/journeys/audit-investigation.spec.ts +299 -0
- package/templates/base/tests/e2e/journeys/auth-onboarding.spec.ts +232 -0
- package/templates/base/tests/e2e/journeys/critical-flows.spec.ts +281 -0
- package/templates/base/tests/e2e/journeys/error-recovery.spec.ts +354 -0
- package/templates/base/tests/e2e/journeys/file-management.spec.ts +307 -0
- package/templates/base/tests/e2e/journeys/integrations.spec.ts +372 -0
- package/templates/base/tests/e2e/journeys/multi-account.spec.ts +317 -0
- package/templates/base/tests/e2e/journeys/rbac-enforcement.spec.ts +389 -0
- package/templates/base/tests/e2e/journeys/settings-profile.spec.ts +400 -0
- package/templates/base/tests/e2e/journeys/team-collaboration.spec.ts +410 -0
- package/templates/base/tests/e2e/mobile/responsive.spec.ts +178 -0
- package/templates/base/tests/e2e/navigation/routing.spec.ts +371 -0
- package/templates/base/tests/e2e/navigation/sidebar.spec.ts +425 -0
- package/templates/base/tests/e2e/pages/ui-features.spec.ts +393 -0
- package/templates/base/tests/e2e/performance/baselines.spec.ts +162 -0
- package/templates/base/tests/e2e/performance/benchmarks.spec.ts +371 -0
- package/templates/base/tests/e2e/smoke.unauth.spec.ts +196 -0
- package/templates/base/tests/e2e/visual/components.spec.ts +650 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/confirmation-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dark-mode-background-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dark-mode-card-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dark-mode-sidebar-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dashboard-card-single-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dialog-content-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/dialog-with-backdrop-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/empty-search-results-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/input-default-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/input-focus-ring-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/primary-button-focus-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/primary-button-hover-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/primary-button-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/sidebar-active-nav-item-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/sidebar-collapsed-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/components.spec.ts-snapshots/sidebar-navigation-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts +192 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/account-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/create-webhook-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/dashboard-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/delete-account-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/integrations-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/invite-member-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/login-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/settings-account-tab-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/settings-profile-tab-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/sidebar-navigation-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/core-components.spec.ts-snapshots/team-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts +230 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/404-page-chromium-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/404-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/account-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/login-page-chromium-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/login-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/settings-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/team-invite-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/team-page-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/screenshots.spec.ts-snapshots/webhook-create-dialog-visual-darwin.png +0 -0
- package/templates/base/tests/e2e/visual/theme-colors.spec.ts +293 -0
- package/templates/base/tests/e2e/visual/ui-components.spec.ts +502 -0
- package/templates/base/tests/integration/accounts/crud.test.ts +1402 -0
- package/templates/base/tests/integration/audits/list.test.ts +1133 -0
- package/templates/base/tests/integration/auth/auth-service.test.ts +415 -0
- package/templates/base/tests/integration/auth/invitation-token.test.ts +529 -0
- package/templates/base/tests/integration/auth/logout.test.ts +524 -0
- package/templates/base/tests/integration/auth/oauth.test.ts +768 -0
- package/templates/base/tests/integration/auth/refresh-token.test.ts +364 -0
- package/templates/base/tests/integration/auth/session-expiry.test.ts +569 -0
- package/templates/base/tests/integration/auth/session.test.ts +520 -0
- package/templates/base/tests/integration/auth/super-admin.test.ts +451 -0
- package/templates/base/tests/integration/authorization/analytics-role.test.ts +1026 -0
- package/templates/base/tests/integration/authorization/billing-role.test.ts +776 -0
- package/templates/base/tests/integration/authorization/guards-roles.test.ts +539 -0
- package/templates/base/tests/integration/authorization/multi-tenancy.test.ts +1112 -0
- package/templates/base/tests/integration/authorization/role-hierarchy.test.ts +931 -0
- package/templates/base/tests/integration/authorization/roles.test.ts +1347 -0
- package/templates/base/tests/integration/config/production-behavior.test.ts +536 -0
- package/templates/base/tests/integration/db/constraints.test.ts +695 -0
- package/templates/base/tests/integration/fixtures/accounts.ts +136 -0
- package/templates/base/tests/integration/fixtures/index.ts +232 -0
- package/templates/base/tests/integration/fixtures/invitations.ts +195 -0
- package/templates/base/tests/integration/fixtures/users.ts +144 -0
- package/templates/base/tests/integration/health/health.test.ts +351 -0
- package/templates/base/tests/integration/invitations/crud.test.ts +1457 -0
- package/templates/base/tests/integration/invitations/email.test.ts +506 -0
- package/templates/base/tests/integration/lib/email.test.ts +174 -0
- package/templates/base/tests/integration/lib/oauth.test.ts +368 -0
- package/templates/base/tests/integration/lib/password.test.ts +192 -0
- package/templates/base/tests/integration/lib/schema-helpers.test.ts +129 -0
- package/templates/base/tests/integration/lib/tokens.test.ts +304 -0
- package/templates/base/tests/integration/middleware/auth.test.ts +499 -0
- package/templates/base/tests/integration/middleware/cors.test.ts +334 -0
- package/templates/base/tests/integration/middleware/request-context.test.ts +156 -0
- package/templates/base/tests/integration/middleware/request-logger.test.ts +313 -0
- package/templates/base/tests/integration/performance/response-times.test.ts +509 -0
- package/templates/base/tests/integration/security/cookie-security.test.ts +567 -0
- package/templates/base/tests/integration/security/csrf-protection.test.ts +542 -0
- package/templates/base/tests/integration/security/jwt-validation.test.ts +209 -0
- package/templates/base/tests/integration/security/log-sanitization.test.ts +658 -0
- package/templates/base/tests/integration/security/rate-limiting.test.ts +1251 -0
- package/templates/base/tests/integration/security/sql-injection.test.ts +663 -0
- package/templates/base/tests/integration/security/token-hashing.test.ts +371 -0
- package/templates/base/tests/integration/security/xss-prevention.test.ts +541 -0
- package/templates/base/tests/integration/setup.ts +834 -0
- package/templates/base/tests/integration/smoke.test.ts +288 -0
- package/templates/base/tests/integration/storage/upload.test.ts +1162 -0
- package/templates/base/tests/integration/storage/validation.test.ts +746 -0
- package/templates/base/tests/integration/users/crud.test.ts +1297 -0
- package/templates/base/tests/integration/users/list.test.ts +698 -0
- package/templates/base/tests/integration/vitest.config.ts +80 -0
- package/templates/base/tsconfig.app.json +18 -0
- package/templates/base/tsconfig.json +39 -0
- package/templates/base/tsconfig.node.json +16 -0
- package/templates/base/tsconfig.server.json +26 -0
- package/templates/base/tsconfig.tsbuildinfo +1 -0
- package/templates/base/vite.config.ts +46 -0
- package/templates/base/vitest.config.browser.ts +47 -0
- package/templates/base/vitest.config.frontend.ts +47 -0
- package/templates/base/vitest.config.ts +82 -0
- package/templates/base/vitest.workspace.ts +22 -0
- package/templates/modules/audit-logs/.gitkeep +0 -0
- package/templates/modules/billing/.gitkeep +0 -0
- package/templates/modules/invitations/.gitkeep +0 -0
- package/templates/modules/storage/.gitkeep +0 -0
- package/templates/modules/webhooks/.gitkeep +0 -0
- package/templates/providers/auth-email/.gitkeep +0 -0
- package/templates/providers/auth-github/.gitkeep +0 -0
- package/templates/providers/auth-google/.gitkeep +0 -0
- package/templates/providers/email-resend/.gitkeep +0 -0
- package/templates/providers/email-sendgrid/.gitkeep +0 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# Issue Lifecycle Workflow
|
|
2
|
+
|
|
3
|
+
Complete workflow guide for managing Linear issues from triage to completion.
|
|
4
|
+
|
|
5
|
+
## Status Lifecycle
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌─────────┐ ┌─────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
|
|
9
|
+
│ Triage │───▶│ Backlog │───▶│ Todo │───▶│In Progress│───▶│ In Review │───▶│ Done │
|
|
10
|
+
└─────────┘ └─────────┘ └───────────┘ └───────────┘ └───────────┘ └──────────┘
|
|
11
|
+
│ │ │ │ │ │
|
|
12
|
+
│ ▼ │ │ │ │
|
|
13
|
+
│ ┌─────────┐ │ │ │ │
|
|
14
|
+
│ │ Icebox │ │ │ │ │
|
|
15
|
+
│ └─────────┘ │ │ │ │
|
|
16
|
+
▼ ▼ ▼ ▼ ▼ │
|
|
17
|
+
┌────────────────────────────────────────────────────────────────────────────────┐ │
|
|
18
|
+
│ Canceled / Duplicate │◀───┘
|
|
19
|
+
└────────────────────────────────────────────────────────────────────────────────┘
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Workflow Stages
|
|
23
|
+
|
|
24
|
+
### 1. Triage (type: `triage`)
|
|
25
|
+
|
|
26
|
+
**When**: Issue is newly created and awaiting review.
|
|
27
|
+
|
|
28
|
+
**Actions**:
|
|
29
|
+
- Review issue description and requirements
|
|
30
|
+
- Assess priority and effort
|
|
31
|
+
- Assign to appropriate team/project
|
|
32
|
+
- Move to Backlog or Todo
|
|
33
|
+
|
|
34
|
+
### 2. Backlog (type: `backlog`)
|
|
35
|
+
|
|
36
|
+
**When**: Issue is prioritized but not scheduled.
|
|
37
|
+
|
|
38
|
+
**Actions**:
|
|
39
|
+
- Refine requirements if needed
|
|
40
|
+
- Estimate effort
|
|
41
|
+
- Schedule for upcoming sprint/cycle
|
|
42
|
+
|
|
43
|
+
### 2b. Icebox (type: `backlog`)
|
|
44
|
+
|
|
45
|
+
**When**: Issue is valid but deferred indefinitely.
|
|
46
|
+
|
|
47
|
+
**Actions**:
|
|
48
|
+
- Add comment explaining why it's being iceboxed
|
|
49
|
+
- Review periodically during planning sessions
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
ICEBOX=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "Icebox") | .id')
|
|
53
|
+
npx tsx scripts/comments/create.ts ABC-123 "Moving to Icebox: Lower priority, will revisit in Q2" --json
|
|
54
|
+
npx tsx scripts/status/update.ts ABC-123 "$ICEBOX" --json
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. Todo (type: `unstarted`)
|
|
58
|
+
|
|
59
|
+
**When**: Issue is ready to be picked up.
|
|
60
|
+
|
|
61
|
+
**Actions**:
|
|
62
|
+
- Self-assign or get assigned
|
|
63
|
+
- Review acceptance criteria
|
|
64
|
+
- Prepare to start work
|
|
65
|
+
|
|
66
|
+
### 4. In Progress (type: `started`)
|
|
67
|
+
|
|
68
|
+
**When**: Actively working on the issue.
|
|
69
|
+
|
|
70
|
+
**Actions required upon starting**:
|
|
71
|
+
```bash
|
|
72
|
+
cd .claude/skills/linear
|
|
73
|
+
|
|
74
|
+
# Get current user
|
|
75
|
+
ME=$(npx tsx scripts/users/me.ts --json | jq -r '.id')
|
|
76
|
+
|
|
77
|
+
# Get "In Progress" state (use name for precision)
|
|
78
|
+
STATES=$(npx tsx scripts/status/list.ts --json)
|
|
79
|
+
IN_PROGRESS=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "In Progress") | .id')
|
|
80
|
+
|
|
81
|
+
# Update issue
|
|
82
|
+
npx tsx scripts/issues/update.ts --issue ABC-123 --assignee "$ME" --json
|
|
83
|
+
npx tsx scripts/status/update.ts ABC-123 "$IN_PROGRESS" --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 5. In Review (type: `started`)
|
|
87
|
+
|
|
88
|
+
**When**: Work is complete and awaiting review.
|
|
89
|
+
|
|
90
|
+
**Actions**:
|
|
91
|
+
- Code review requested
|
|
92
|
+
- PR submitted
|
|
93
|
+
- Awaiting approval
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
IN_REVIEW=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "In Review") | .id')
|
|
97
|
+
npx tsx scripts/status/update.ts ABC-123 "$IN_REVIEW" --json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 6. Done (type: `completed`)
|
|
101
|
+
|
|
102
|
+
**When**: Work is complete and verified.
|
|
103
|
+
|
|
104
|
+
**Actions required before marking done**:
|
|
105
|
+
1. Verify all acceptance criteria met
|
|
106
|
+
2. Check related issues
|
|
107
|
+
3. Add completion documentation
|
|
108
|
+
4. Update status
|
|
109
|
+
|
|
110
|
+
## Completion Checklist
|
|
111
|
+
|
|
112
|
+
Before marking ANY issue as Done, verify:
|
|
113
|
+
|
|
114
|
+
- [ ] **Code complete**: All implementation finished
|
|
115
|
+
- [ ] **Tests passing**: Unit/integration tests green
|
|
116
|
+
- [ ] **Documentation**: Code comments where needed
|
|
117
|
+
- [ ] **Related issues checked**: Parent, siblings, children reviewed
|
|
118
|
+
- [ ] **Completion comment added**: Summary of changes
|
|
119
|
+
|
|
120
|
+
## Completion Comment Template
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
## Completion Summary
|
|
124
|
+
|
|
125
|
+
**Status**: ✅ COMPLETED
|
|
126
|
+
|
|
127
|
+
### Changes Made
|
|
128
|
+
- `path/to/file.ts`: Brief description of changes
|
|
129
|
+
- `path/to/another.ts`: Brief description of changes
|
|
130
|
+
|
|
131
|
+
### Features Implemented
|
|
132
|
+
- Feature 1: What it does
|
|
133
|
+
- Feature 2: What it does
|
|
134
|
+
|
|
135
|
+
### Testing
|
|
136
|
+
- [ ] Unit tests added/updated
|
|
137
|
+
- [ ] Manual testing completed
|
|
138
|
+
- [ ] Edge cases verified
|
|
139
|
+
|
|
140
|
+
### Next Steps (if any)
|
|
141
|
+
- Follow-up task description
|
|
142
|
+
- Configuration required
|
|
143
|
+
- Related work to schedule
|
|
144
|
+
|
|
145
|
+
### Related Issues
|
|
146
|
+
- Parent: ABC-100 (if applicable)
|
|
147
|
+
- Subtasks: ABC-101, ABC-102 (if applicable)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Related Issue Management
|
|
151
|
+
|
|
152
|
+
### Working on Subtasks
|
|
153
|
+
|
|
154
|
+
When completing a subtask:
|
|
155
|
+
|
|
156
|
+
1. **Update the subtask** with completion comment
|
|
157
|
+
2. **Check sibling subtasks**: Are others complete?
|
|
158
|
+
3. **Update parent issue**:
|
|
159
|
+
- If all subtasks done → Mark parent Done
|
|
160
|
+
- If partial → Update parent with progress comment
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# Get parent issue details
|
|
164
|
+
npx tsx scripts/issues/get.ts ABC-100 --json
|
|
165
|
+
|
|
166
|
+
# Add progress comment to parent
|
|
167
|
+
npx tsx scripts/comments/create.ts ABC-100 "Subtask ABC-101 completed. 2/3 subtasks done." --json
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Completing Parent Issues
|
|
171
|
+
|
|
172
|
+
When all subtasks are complete:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Add summary comment
|
|
176
|
+
npx tsx scripts/comments/create.ts ABC-100 "$(cat <<'EOF'
|
|
177
|
+
## All Subtasks Completed
|
|
178
|
+
|
|
179
|
+
**Status**: ✅ COMPLETED
|
|
180
|
+
|
|
181
|
+
### Completed Subtasks
|
|
182
|
+
- ABC-101: Feature A implementation
|
|
183
|
+
- ABC-102: Feature B implementation
|
|
184
|
+
- ABC-103: Testing and documentation
|
|
185
|
+
|
|
186
|
+
### Summary
|
|
187
|
+
All acceptance criteria met. Feature ready for release.
|
|
188
|
+
EOF
|
|
189
|
+
)" --json
|
|
190
|
+
|
|
191
|
+
# Update status
|
|
192
|
+
DONE=$(npx tsx scripts/status/list.ts --json | jq -r '.statuses[] | select(.type == "completed") | .id' | head -1)
|
|
193
|
+
npx tsx scripts/status/update.ts ABC-100 $DONE --json
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Documentation Quality Examples
|
|
197
|
+
|
|
198
|
+
### Good Documentation
|
|
199
|
+
|
|
200
|
+
```markdown
|
|
201
|
+
## Completion Summary
|
|
202
|
+
|
|
203
|
+
**Status**: ✅ COMPLETED
|
|
204
|
+
|
|
205
|
+
### Changes Made
|
|
206
|
+
- `src/auth/oauth.ts`: Implemented OAuth 2.1 PKCE flow with state validation
|
|
207
|
+
- `src/auth/tokens.ts`: Added secure token storage with encryption
|
|
208
|
+
- `tests/auth/oauth.test.ts`: 12 unit tests covering happy path and edge cases
|
|
209
|
+
|
|
210
|
+
### Features Implemented
|
|
211
|
+
- OAuth authorization with PKCE challenge
|
|
212
|
+
- Automatic token refresh before expiry
|
|
213
|
+
- Secure token storage in encrypted format
|
|
214
|
+
- Error handling with user-friendly messages
|
|
215
|
+
|
|
216
|
+
### Testing
|
|
217
|
+
- [x] Unit tests (12 passing)
|
|
218
|
+
- [x] Integration test with mock OAuth server
|
|
219
|
+
- [x] Manual testing with Google OAuth
|
|
220
|
+
|
|
221
|
+
### Configuration Required
|
|
222
|
+
Set environment variables:
|
|
223
|
+
- `OAUTH_CLIENT_ID`
|
|
224
|
+
- `OAUTH_REDIRECT_URI`
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Poor Documentation
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
Done.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
Fixed the bug.
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
Implemented feature.
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Why this matters**: Poor documentation creates confusion about what was delivered and makes it hard to debug issues later.
|
|
242
|
+
|
|
243
|
+
## Edge Cases
|
|
244
|
+
|
|
245
|
+
### Blocked Issues
|
|
246
|
+
|
|
247
|
+
If an issue is blocked:
|
|
248
|
+
|
|
249
|
+
1. Add comment explaining the blocker
|
|
250
|
+
2. Create linked blocking issue if needed
|
|
251
|
+
3. Keep status as In Progress or move to Backlog
|
|
252
|
+
4. Do NOT mark as Done
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
npx tsx scripts/comments/create.ts ABC-123 "Blocked by: Need API credentials from external team. Created follow-up ABC-124." --json
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Reopened Issues
|
|
259
|
+
|
|
260
|
+
If a completed issue needs more work:
|
|
261
|
+
|
|
262
|
+
1. Move back to In Progress
|
|
263
|
+
2. Add comment explaining why reopened
|
|
264
|
+
3. Follow normal completion flow when done again
|
|
265
|
+
|
|
266
|
+
### Canceled Issues
|
|
267
|
+
|
|
268
|
+
When canceling:
|
|
269
|
+
|
|
270
|
+
1. Add comment explaining why
|
|
271
|
+
2. Move to Canceled status
|
|
272
|
+
3. Update any parent issues
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
CANCELED=$(npx tsx scripts/status/list.ts --json | jq -r '.statuses[] | select(.type == "canceled") | .id' | head -1)
|
|
276
|
+
npx tsx scripts/comments/create.ts ABC-123 "Canceled: Requirements changed, no longer needed." --json
|
|
277
|
+
npx tsx scripts/status/update.ts ABC-123 $CANCELED --json
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Quick Reference Commands
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
cd .claude/skills/linear
|
|
284
|
+
|
|
285
|
+
# Get statuses (run once, reuse $STATES)
|
|
286
|
+
STATES=$(npx tsx scripts/status/list.ts --json)
|
|
287
|
+
|
|
288
|
+
# Start work on issue
|
|
289
|
+
ME=$(npx tsx scripts/users/me.ts --json | jq -r '.id')
|
|
290
|
+
IN_PROGRESS=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "In Progress") | .id')
|
|
291
|
+
npx tsx scripts/issues/update.ts --issue ABC-123 --assignee "$ME" --json
|
|
292
|
+
npx tsx scripts/status/update.ts ABC-123 "$IN_PROGRESS" --json
|
|
293
|
+
|
|
294
|
+
# Move to review
|
|
295
|
+
IN_REVIEW=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "In Review") | .id')
|
|
296
|
+
npx tsx scripts/status/update.ts ABC-123 "$IN_REVIEW" --json
|
|
297
|
+
|
|
298
|
+
# Complete issue
|
|
299
|
+
DONE=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "Done") | .id')
|
|
300
|
+
npx tsx scripts/comments/create.ts ABC-123 "Completion summary here..." --json
|
|
301
|
+
npx tsx scripts/status/update.ts ABC-123 "$DONE" --json
|
|
302
|
+
|
|
303
|
+
# Move to icebox
|
|
304
|
+
ICEBOX=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "Icebox") | .id')
|
|
305
|
+
npx tsx scripts/comments/create.ts ABC-123 "Moving to Icebox: reason..." --json
|
|
306
|
+
npx tsx scripts/status/update.ts ABC-123 "$ICEBOX" --json
|
|
307
|
+
|
|
308
|
+
# Cancel issue
|
|
309
|
+
CANCELED=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "Canceled") | .id')
|
|
310
|
+
npx tsx scripts/comments/create.ts ABC-123 "Reason for cancellation..." --json
|
|
311
|
+
npx tsx scripts/status/update.ts ABC-123 "$CANCELED" --json
|
|
312
|
+
|
|
313
|
+
# Mark as duplicate
|
|
314
|
+
DUPLICATE=$(echo "$STATES" | jq -r '.statuses[] | select(.name == "Duplicate") | .id')
|
|
315
|
+
npx tsx scripts/comments/create.ts ABC-123 "Duplicate of ABC-100" --json
|
|
316
|
+
npx tsx scripts/status/update.ts ABC-123 "$DUPLICATE" --json
|
|
317
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwright-e2e-testing
|
|
3
|
+
description: Design, implement, debug, and optimize Playwright Test E2E/UI test suites (mobile emulation, traces/video, visual + a11y snapshots, API setup/auth, and CI sharding/reporting). Use when adding new Playwright tests, stabilizing flaky tests, improving execution speed, validating ad rendering/placement, or setting up Playwright in a repo.
|
|
4
|
+
allowed-tools: Read, Write, Edit, MultiEdit, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Playwright E2E Testing
|
|
8
|
+
|
|
9
|
+
You are an expert Playwright Test engineer. When this Skill is active, produce **production-grade, low-flake** E2E/UI tests and the supporting scaffolding (config, fixtures, helpers, CI) with **fast feedback** and **strong debugging artifacts**.
|
|
10
|
+
|
|
11
|
+
## When to use this Skill
|
|
12
|
+
|
|
13
|
+
Use this Skill when the user asks for:
|
|
14
|
+
|
|
15
|
+
1. New Playwright E2E/UI tests or test architecture.
|
|
16
|
+
2. Stabilizing flaky tests (timing, race conditions, non-determinism).
|
|
17
|
+
3. Performance-focused testing (mobile realism, cache control, throttling, tracing).
|
|
18
|
+
4. Visual verification (screenshots) and accessibility snapshots.
|
|
19
|
+
5. CI pipelines (parallelism, sharding, report merging, artifacts).
|
|
20
|
+
6. Testing ad behavior (e.g., GPT slots render/viewable timing, layout stability).
|
|
21
|
+
|
|
22
|
+
## Non-negotiable rules (anti-flake defaults)
|
|
23
|
+
|
|
24
|
+
1. **No arbitrary sleeps** (`waitForTimeout`) unless the user explicitly demands it (and then isolate it behind a helper + document why).
|
|
25
|
+
2. Prefer **web-first assertions** (`expect(locator).toBeVisible()` etc.) over manual DOM reads.
|
|
26
|
+
3. Prefer **user-facing locators** (`getByRole`, `getByLabel`, `getByText`) over brittle CSS.
|
|
27
|
+
4. Make tests **idempotent** and **isolated**:
|
|
28
|
+
- New context per test unless intentionally reusing state.
|
|
29
|
+
- Avoid shared mutable state across tests; clean up created data.
|
|
30
|
+
5. Make failures debuggable:
|
|
31
|
+
- Traces on retry, screenshots on failure, and videos on failure (or first retry).
|
|
32
|
+
6. Use **progressive disclosure**:
|
|
33
|
+
- Keep SKILL.md guidance short.
|
|
34
|
+
- Pull details from `references/` only when needed.
|
|
35
|
+
|
|
36
|
+
## Standard workflow (use this sequence)
|
|
37
|
+
|
|
38
|
+
### 1) Intake and test design
|
|
39
|
+
1. Identify the **user journey** (start state → actions → expected result).
|
|
40
|
+
2. Choose the **test type**:
|
|
41
|
+
- E2E (full journey)
|
|
42
|
+
- UI regression (visual snapshots)
|
|
43
|
+
- a11y regression (ARIA snapshots)
|
|
44
|
+
- API + light UI (fast setup)
|
|
45
|
+
- Component testing (when UI can be tested without full app)
|
|
46
|
+
3. Define the **acceptance checks**:
|
|
47
|
+
- UI state (text/role/visibility)
|
|
48
|
+
- Network behavior (requests fired, caching)
|
|
49
|
+
- Ads (slot rendered, viewable, no CLS spikes)
|
|
50
|
+
|
|
51
|
+
### 2) Build scaffolding (only if missing)
|
|
52
|
+
Use the templates in `templates/` to add quickly:
|
|
53
|
+
- `templates/playwright.config.ts` (projects + artifacts + CI defaults)
|
|
54
|
+
- `templates/global.setup.ts` (optional storageState)
|
|
55
|
+
- `templates/fixtures.ts` (custom fixtures)
|
|
56
|
+
- `templates/helpers/` (throttling, cache bypass, ad observers)
|
|
57
|
+
- `templates/ci/` (GitHub Actions sharding + merged report)
|
|
58
|
+
|
|
59
|
+
### 3) Implement tests
|
|
60
|
+
1. Use **tags** (`@smoke`, `@critical`, `@ads`, `@mobile`, `@visual`) to create runnable subsets.
|
|
61
|
+
2. Prefer **Page Objects** only where they reduce duplication (keep them small).
|
|
62
|
+
3. Prefer **APIRequestContext** for setup (create users/data) and reuse `storageState` where appropriate.
|
|
63
|
+
|
|
64
|
+
### 4) Run + debug
|
|
65
|
+
Use Playwright’s strongest DX features:
|
|
66
|
+
- UI Mode: `npx playwright test --ui`
|
|
67
|
+
- Debug: `npx playwright test --debug`
|
|
68
|
+
- Trace viewer: `npx playwright show-trace <trace.zip>`
|
|
69
|
+
|
|
70
|
+
### 5) CI hardening
|
|
71
|
+
1. Enable retries in CI only.
|
|
72
|
+
2. Use **blob reporter** with sharding and merge reports into a single HTML report.
|
|
73
|
+
3. Always upload HTML report + traces/videos as CI artifacts.
|
|
74
|
+
|
|
75
|
+
## Included scripts
|
|
76
|
+
|
|
77
|
+
1. `scripts/auth-setup.js`
|
|
78
|
+
Creates `storageState` (auth) for reuse.
|
|
79
|
+
|
|
80
|
+
2. `scripts/performance-analyzer.js`
|
|
81
|
+
Analyzes Playwright JSON results to identify slow tests.
|
|
82
|
+
|
|
83
|
+
3. `scripts/trace-url.js`
|
|
84
|
+
Captures a Playwright trace (trace.zip) for a URL with optional mobile presets (cache disabled + optional throttle).
|
|
85
|
+
|
|
86
|
+
## References (open only when needed)
|
|
87
|
+
|
|
88
|
+
- `references/best-practices.md` — test philosophy, selectors, waiting
|
|
89
|
+
- `references/patterns.md` — fixtures/POM/tagging, data strategies
|
|
90
|
+
- `references/debugging.md` — traces, UI mode, inspector, CI triage
|
|
91
|
+
- `references/optimization.md` — speed, parallelism, CI
|
|
92
|
+
- `references/architecture.md` — scalable folder structure, responsibilities
|
|
93
|
+
- `references/ci-reporting.md` — sharding + blob reports + merge-reports
|
|
94
|
+
- `references/visual-a11y.md` — screenshots + ARIA snapshots + masking
|
|
95
|
+
- `references/mobile-realism.md` — device emulation, cache/service workers, throttling
|
|
96
|
+
- `references/resources.md` — curated official docs + recent high-signal blog posts
|
|
97
|
+
|
|
98
|
+
## Example prompts (what the user can ask)
|
|
99
|
+
|
|
100
|
+
1. “Add a @critical E2E test for the email deep link → page load → first ad slot renders.”
|
|
101
|
+
2. “This test flakes in CI only; use traces to find the root cause and fix it.”
|
|
102
|
+
3. “Set up Playwright with sharding and a merged HTML report in GitHub Actions.”
|
|
103
|
+
4. “Create a visual regression suite for the main templates, masking ad slots.”
|
|
104
|
+
5. “Simulate mid-tier mobile (throttled CPU/network) and report time to first ad viewable.”
|
|
105
|
+
|
|
106
|
+
## Output requirements (how you respond)
|
|
107
|
+
|
|
108
|
+
When implementing or updating tests, always provide:
|
|
109
|
+
|
|
110
|
+
1. The **plan** (brief, 5–10 bullets).
|
|
111
|
+
2. The **code changes** (files created/modified).
|
|
112
|
+
3. The **commands to run** (local + CI).
|
|
113
|
+
4. A **debug playbook** if the change introduces new moving parts.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { chromium } from '@playwright/test';
|
|
2
|
+
import { LoginPage } from './tests-config/pages/LoginPage';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Global Setup Script
|
|
6
|
+
*
|
|
7
|
+
* This script runs once before all tests.
|
|
8
|
+
* Use it for:
|
|
9
|
+
* - Creating authentication state
|
|
10
|
+
* - Seeding test data
|
|
11
|
+
* - Starting services
|
|
12
|
+
* - Database migrations
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
async function globalSetup(config) {
|
|
16
|
+
console.log('Running global setup...');
|
|
17
|
+
|
|
18
|
+
// Setup authentication state
|
|
19
|
+
await setupAuthentication(config);
|
|
20
|
+
|
|
21
|
+
// Optional: Setup test data
|
|
22
|
+
// await setupTestData();
|
|
23
|
+
|
|
24
|
+
console.log('Global setup complete\n');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Setup authentication and save state
|
|
29
|
+
*/
|
|
30
|
+
async function setupAuthentication(config) {
|
|
31
|
+
console.log('🔐 Setting up authentication...');
|
|
32
|
+
|
|
33
|
+
const browser = await chromium.launch();
|
|
34
|
+
const context = await browser.newContext();
|
|
35
|
+
const page = await context.newPage();
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
// Use your login page object
|
|
39
|
+
const loginPage = new LoginPage(page);
|
|
40
|
+
await loginPage.goto();
|
|
41
|
+
|
|
42
|
+
// Login with test credentials
|
|
43
|
+
const email = process.env.TEST_EMAIL || 'test@example.com';
|
|
44
|
+
const password = process.env.TEST_PASSWORD || 'password123';
|
|
45
|
+
|
|
46
|
+
await loginPage.login(email, password);
|
|
47
|
+
|
|
48
|
+
// Verify login was successful
|
|
49
|
+
await page.waitForURL('**/dashboard', { timeout: 10000 });
|
|
50
|
+
|
|
51
|
+
// Save authentication state
|
|
52
|
+
await context.storageState({ path: 'auth.json' });
|
|
53
|
+
|
|
54
|
+
console.log('Authentication state saved to auth.json');
|
|
55
|
+
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('Authentication setup failed:', error.message);
|
|
58
|
+
throw error;
|
|
59
|
+
} finally {
|
|
60
|
+
await browser.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Optional: Setup test data
|
|
66
|
+
*/
|
|
67
|
+
async function setupTestData() {
|
|
68
|
+
console.log('📦 Setting up test data...');
|
|
69
|
+
|
|
70
|
+
// Example: Seed database with test data
|
|
71
|
+
try {
|
|
72
|
+
// Call your API or database to create test data
|
|
73
|
+
const response = await fetch('http://localhost:3000/api/seed', {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
users: 10,
|
|
80
|
+
products: 50,
|
|
81
|
+
orders: 100
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new Error(`Failed to seed data: ${response.statusText}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log('Test data seeded successfully');
|
|
90
|
+
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error('Test data setup failed:', error.message);
|
|
93
|
+
// Don't throw - continue with tests even if seeding fails
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export default globalSetup;
|
package/templates/base/.claude/skills/playwright-e2e-testing/assets/playwright.config.template.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optimized Playwright Configuration Template
|
|
5
|
+
*
|
|
6
|
+
* This configuration follows best practices for:
|
|
7
|
+
* - Fast execution
|
|
8
|
+
* - Reliable tests
|
|
9
|
+
* - Comprehensive reporting
|
|
10
|
+
* - CI/CD compatibility
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export default defineConfig({
|
|
14
|
+
// Test directory
|
|
15
|
+
testDir: './tests',
|
|
16
|
+
|
|
17
|
+
// Run tests in parallel for speed
|
|
18
|
+
fullyParallel: true,
|
|
19
|
+
|
|
20
|
+
// Fail the build on CI if you accidentally left test.only in source code
|
|
21
|
+
forbidOnly: !!process.env.CI,
|
|
22
|
+
|
|
23
|
+
// Retry failed tests in CI
|
|
24
|
+
retries: process.env.CI ? 2 : 0,
|
|
25
|
+
|
|
26
|
+
// Optimal worker configuration
|
|
27
|
+
// Use 50% of cores locally, 4 workers in CI
|
|
28
|
+
workers: process.env.CI ? 4 : '50%',
|
|
29
|
+
|
|
30
|
+
// Reporter configuration
|
|
31
|
+
// HTML report locally, JUnit + HTML in CI
|
|
32
|
+
reporter: process.env.CI
|
|
33
|
+
? [
|
|
34
|
+
['html', { open: 'never' }],
|
|
35
|
+
['junit', { outputFile: 'test-results/junit.xml' }],
|
|
36
|
+
['json', { outputFile: 'test-results/results.json' }]
|
|
37
|
+
]
|
|
38
|
+
: [
|
|
39
|
+
['html', { open: 'on-failure' }],
|
|
40
|
+
['list']
|
|
41
|
+
],
|
|
42
|
+
|
|
43
|
+
// Shared settings for all projects
|
|
44
|
+
use: {
|
|
45
|
+
// Base URL for all navigation
|
|
46
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
47
|
+
|
|
48
|
+
// Collect trace only on first retry to save space
|
|
49
|
+
trace: 'on-first-retry',
|
|
50
|
+
|
|
51
|
+
// Screenshots only on failure
|
|
52
|
+
screenshot: 'only-on-failure',
|
|
53
|
+
|
|
54
|
+
// Video only on failure
|
|
55
|
+
video: 'retain-on-failure',
|
|
56
|
+
|
|
57
|
+
// Run in headless mode in CI
|
|
58
|
+
headless: process.env.CI ? true : false,
|
|
59
|
+
|
|
60
|
+
// Default viewport
|
|
61
|
+
viewport: { width: 1280, height: 720 },
|
|
62
|
+
|
|
63
|
+
// Ignore HTTPS errors
|
|
64
|
+
ignoreHTTPSErrors: true,
|
|
65
|
+
|
|
66
|
+
// Timeouts
|
|
67
|
+
navigationTimeout: 30000,
|
|
68
|
+
actionTimeout: 10000,
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// Global timeout for each test
|
|
72
|
+
timeout: 30000,
|
|
73
|
+
|
|
74
|
+
// Timeout for each assertion
|
|
75
|
+
expect: {
|
|
76
|
+
timeout: 5000,
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// Configure projects for different browsers and scenarios
|
|
80
|
+
projects: [
|
|
81
|
+
// Setup project - runs first, creates auth state
|
|
82
|
+
{
|
|
83
|
+
name: 'setup',
|
|
84
|
+
testMatch: /.*\.setup\.js/,
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
// Chromium - main browser for most tests
|
|
88
|
+
{
|
|
89
|
+
name: 'chromium',
|
|
90
|
+
use: {
|
|
91
|
+
...devices['Desktop Chrome'],
|
|
92
|
+
// Use saved authentication state
|
|
93
|
+
storageState: 'auth.json',
|
|
94
|
+
},
|
|
95
|
+
dependencies: ['setup'],
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
// Firefox - run critical tests only
|
|
99
|
+
{
|
|
100
|
+
name: 'firefox',
|
|
101
|
+
use: {
|
|
102
|
+
...devices['Desktop Firefox'],
|
|
103
|
+
storageState: 'auth.json',
|
|
104
|
+
},
|
|
105
|
+
testMatch: /.*\.critical\.spec\.js/,
|
|
106
|
+
dependencies: ['setup'],
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
// WebKit - run critical tests only
|
|
110
|
+
{
|
|
111
|
+
name: 'webkit',
|
|
112
|
+
use: {
|
|
113
|
+
...devices['Desktop Safari'],
|
|
114
|
+
storageState: 'auth.json',
|
|
115
|
+
},
|
|
116
|
+
testMatch: /.*\.critical\.spec\.js/,
|
|
117
|
+
dependencies: ['setup'],
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
// Mobile Chrome
|
|
121
|
+
{
|
|
122
|
+
name: 'mobile-chrome',
|
|
123
|
+
use: {
|
|
124
|
+
...devices['Pixel 5'],
|
|
125
|
+
storageState: 'auth.json',
|
|
126
|
+
},
|
|
127
|
+
testMatch: /.*\.mobile\.spec\.js/,
|
|
128
|
+
dependencies: ['setup'],
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
// Mobile Safari
|
|
132
|
+
{
|
|
133
|
+
name: 'mobile-safari',
|
|
134
|
+
use: {
|
|
135
|
+
...devices['iPhone 13'],
|
|
136
|
+
storageState: 'auth.json',
|
|
137
|
+
},
|
|
138
|
+
testMatch: /.*\.mobile\.spec\.js/,
|
|
139
|
+
dependencies: ['setup'],
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// API testing project
|
|
143
|
+
{
|
|
144
|
+
name: 'api',
|
|
145
|
+
testMatch: /api\/.*\.spec\.js/,
|
|
146
|
+
use: {
|
|
147
|
+
baseURL: process.env.API_URL || 'http://localhost:3001/api',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
|
|
152
|
+
// Web Server configuration (optional)
|
|
153
|
+
// Uncomment if you want Playwright to start your dev server
|
|
154
|
+
/*
|
|
155
|
+
webServer: {
|
|
156
|
+
command: 'npm run dev',
|
|
157
|
+
url: 'http://localhost:3000',
|
|
158
|
+
reuseExistingServer: !process.env.CI,
|
|
159
|
+
timeout: 120000,
|
|
160
|
+
stdout: 'ignore',
|
|
161
|
+
stderr: 'pipe',
|
|
162
|
+
},
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
// Global Setup and Teardown (optional)
|
|
166
|
+
// Uncomment to use global setup/teardown scripts
|
|
167
|
+
/*
|
|
168
|
+
globalSetup: require.resolve('./tests-config/global-setup'),
|
|
169
|
+
globalTeardown: require.resolve('./tests-config/global-teardown'),
|
|
170
|
+
*/
|
|
171
|
+
});
|