Skip to content

fix(e2e): read ports from project config instead of hardcoding#3777

Merged
PierreBrisorgueil merged 3 commits intomasterfrom
fix/e2e-ports-from-config
Mar 25, 2026
Merged

fix(e2e): read ports from project config instead of hardcoding#3777
PierreBrisorgueil merged 3 commits intomasterfrom
fix/e2e-ports-from-config

Conversation

@PierreBrisorgueil
Copy link
Copy Markdown
Collaborator

@PierreBrisorgueil PierreBrisorgueil commented Mar 25, 2026

Summary

  • Create shared E2E config loader (src/lib/helpers/e2e/config.js) that dynamically imports the generated project config with safe fallback defaults
  • Replace all hardcoded localhost:3000 and localhost:8080 in playwright.config.js, E2E helpers (api.js, auth.js), and test files (auth.signup, billing)
  • Single source of truth for BASE_URL, API_URL, API_ORIGIN, and port across all E2E infrastructure

Test plan

  • Lint passes on all changed files
  • Unit tests pass (730/730) with coverage thresholds met
  • Production build succeeds
  • E2E tests pass with API backend running (API was offline during dev; skipped gracefully)

Closes #3775

Summary by CodeRabbit

  • Chores
    • Centralized end-to-end testing configuration to replace hardcoded URLs and ports with configurable runtime values.
    • Test suites and test runner now derive application base URL, API origin, and server port from shared configuration.
    • Playwright/web-server startup and all E2E API calls adapt to the configured environment for more flexible local and CI runs.

Create shared E2E config loader that dynamically imports the generated
project config for ports and API settings, with safe fallback defaults.
All E2E helpers and test files now use this single source of truth
instead of hardcoded localhost:3000 / localhost:8080.

Closes #3775
Copilot AI review requested due to automatic review settings March 25, 2026 13:45
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 25, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 101ef3b4-17f8-4bf7-8718-7432e036fd96

📥 Commits

Reviewing files that changed from the base of the PR and between 2506a4f and ca85710.

📒 Files selected for processing (6)
  • playwright.config.js
  • src/lib/helpers/e2e/api.js
  • src/lib/helpers/e2e/auth.js
  • src/lib/helpers/e2e/config.js
  • src/modules/auth/tests/auth.signup.e2e.tests.js
  • src/modules/billing/tests/billing.e2e.tests.js

Walkthrough

Added a centralized E2E config loader and switched Playwright, helper modules, and tests to derive dev server port and API URLs from that loader instead of hardcoded localhost values.

Changes

Cohort / File(s) Summary
New E2E configuration
src/lib/helpers/e2e/config.js
Adds module that runs npm run generateConfig (errors ignored), imports src/config/index.js, derives numeric port and API fields, and exports BASE_URL, API_URL, API_ORIGIN, and port with safe defaults.
Playwright config
playwright.config.js
Replaces hardcoded baseURL and webServer.port/command with imports from the new E2E config (BASE_URL, port) and uses npx vite --port ${port} to start Vite.
E2E helpers
src/lib/helpers/e2e/api.js, src/lib/helpers/e2e/auth.js
Replaced hardcoded API endpoints with API_URL/API_ORIGIN imports from the centralized config; request targets now use the runtime-derived URLs.
E2E tests
src/modules/auth/tests/auth.signup.e2e.tests.js, src/modules/billing/tests/billing.e2e.tests.js
Tests updated to use API_URL/API_ORIGIN from the centralized config instead of hardcoded localhost addresses.

Sequence Diagram(s)

sequenceDiagram
  participant Runner as Playwright (runner)
  participant Gen as generateConfig
  participant E2EConfig as E2E config module
  participant DevServer as Vite dev server
  participant Tests as E2E tests/helpers
  participant API as Backend API

  Runner->>Gen: run `npm run generateConfig`
  Runner->>E2EConfig: import computed config (port, BASE_URL, API_URL, API_ORIGIN)
  Runner->>DevServer: start `npx vite --port ${port}`
  DevServer-->>Runner: dev server ready at BASE_URL
  Runner->>Tests: run tests with baseURL = BASE_URL
  Tests->>API: HTTP requests to API_URL / API_ORIGIN
  API-->>Tests: responses
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: replacing hardcoded ports with config-driven values for E2E tests.
Description check ✅ Passed The description covers key sections: summary of changes, test plan results, and linked issue. However, the 'Scope' section (modules impacted, cross-module impact, risk level) and 'Guardrails check' section are largely missing.
Linked Issues check ✅ Passed All core objectives from issue #3775 are met: shared E2E config loader added [#3775], hardcoded localhost:3000/8080 replaced in playwright.config.js/helpers/tests [#3775], and config-driven BASE_URL/API_URL/API_ORIGIN used throughout [#3775].
Out of Scope Changes check ✅ Passed All changes remain within scope: E2E configuration and helper files are modified to centralize port/URL configuration. No unrelated refactoring, feature additions, or cross-module changes detected.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/e2e-ports-from-config

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 25, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.22%. Comparing base (2506a4f) to head (ca85710).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #3777   +/-   ##
=======================================
  Coverage   99.22%   99.22%           
=======================================
  Files          27       27           
  Lines         898      898           
  Branches      235      235           
=======================================
  Hits          891      891           
  Misses          7        7           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR centralizes E2E URL/port configuration by introducing a shared loader that reads from the generated project config, and updates Playwright config + E2E helpers/tests to stop hardcoding localhost:3000/localhost:8080.

Changes:

  • Add src/lib/helpers/e2e/config.js to derive BASE_URL, API_URL, API_ORIGIN, and port from generated config with fallbacks.
  • Update playwright.config.js to use the shared BASE_URL/port instead of hardcoded values.
  • Replace hardcoded API URLs in E2E helpers and E2E tests to use the shared config exports.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/lib/helpers/e2e/config.js New shared E2E config module that imports generated config and exports computed URLs/ports.
playwright.config.js Switch Playwright baseURL and webServer port/command to use shared E2E config values.
src/lib/helpers/e2e/auth.js Use shared API_URL for signup/signin API calls.
src/lib/helpers/e2e/api.js Use shared API_URL for authenticated API context and org creation helpers.
src/modules/auth/tests/auth.signup.e2e.tests.js Replace hardcoded signup endpoint with config-driven API URL.
src/modules/billing/tests/billing.e2e.tests.js Replace hardcoded API origin with config-driven origin export.

Comment thread playwright.config.js
Comment thread src/lib/helpers/e2e/config.js Outdated
Comment thread src/modules/billing/tests/billing.e2e.tests.js Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@playwright.config.js`:
- Line 2: Imports of BASE_URL and port in playwright.config.js (from
src/lib/helpers/e2e/config.js) rely on a generated config that is created by the
webServer.command generateConfig step which runs too late, so ensure
generateConfig runs before Playwright resolves imports: modify the E2E workflow
to run the generateConfig script prior to starting Playwright (e.g., change the
test:e2e npm script to run the generateConfig command first), or refactor
webServer.command/generateConfig so that src/config/index.js exists before
playwright.config.js imports BASE_URL and port; reference symbols: BASE_URL,
port, generateConfig, webServer.command, src/lib/helpers/e2e/config.js, and
test:e2e.

In `@src/lib/helpers/e2e/config.js`:
- Line 16: Replace the use of the logical OR fallback for the port constant with
nullish coalescing so intentional falsy values (like 0) aren't overridden:
update the declaration using the symbol port and the source _config.port to use
?? instead of ||; if there are other defaulting lines in the same module (e.g.,
apiBase or similar), apply the same change there for consistency.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8dbcfa24-7f0e-4789-a1d5-f41d29c78b2a

📥 Commits

Reviewing files that changed from the base of the PR and between 2506a4f and b64e4f0.

📒 Files selected for processing (6)
  • playwright.config.js
  • src/lib/helpers/e2e/api.js
  • src/lib/helpers/e2e/auth.js
  • src/lib/helpers/e2e/config.js
  • src/modules/auth/tests/auth.signup.e2e.tests.js
  • src/modules/billing/tests/billing.e2e.tests.js

Comment thread playwright.config.js
Comment thread src/lib/helpers/e2e/config.js Outdated
- Run generateConfig synchronously in config.js before importing, so
  ports resolve before playwright.config.js evaluates
- Use ?? instead of || for config fallbacks to preserve falsy values
- Coerce port values to numbers for Playwright type safety
- Rename misleading API_ORIGIN→API_URL alias to use API_ORIGIN directly
@PierreBrisorgueil
Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 25, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/lib/helpers/e2e/config.js`:
- Around line 27-32: The current fallback uses `||` which turns an intentional 0
into the default; update the parsing logic for rawPort/rawApiPort to preserve 0
by first deriving a numeric value then only replacing it when it's NaN: for
rawPort use something like const parsedPort = typeof rawPort === 'number' ?
rawPort : Number.parseInt(rawPort, 10); const port = Number.isNaN(parsedPort) ?
8080 : parsedPort; and do the same for rawApiPort -> apiPort (use
Number.isNaN(parsedApiPort) ? 3000 : parsedApiPort); keep apiProtocol/apiHost
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 95cec566-0431-4225-9d92-871b2753400c

📥 Commits

Reviewing files that changed from the base of the PR and between b64e4f0 and ff68411.

📒 Files selected for processing (3)
  • playwright.config.js
  • src/lib/helpers/e2e/config.js
  • src/modules/billing/tests/billing.e2e.tests.js

Comment thread src/lib/helpers/e2e/config.js Outdated
@PierreBrisorgueil
Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 25, 2026

✅ Actions performed

Full review triggered.

@PierreBrisorgueil PierreBrisorgueil merged commit ec56d20 into master Mar 25, 2026
5 checks passed
@PierreBrisorgueil PierreBrisorgueil deleted the fix/e2e-ports-from-config branch March 25, 2026 15:38
PierreBrisorgueil pushed a commit that referenced this pull request Apr 1, 2026
# [1.5.0](v1.4.0...v1.5.0) (2026-04-01)

### Bug Fixes

* **analytics:** PostHog api_host bug + identify/group on login ([#3772](#3772)) ([534fdf3](534fdf3)), closes [#3753](#3753) [#3766](#3766) [#3769](#3769) [#3771](#3771)
* **auth,admin:** move mailer warning to admin page, fix verify-email routing, align invite button ([0d195c4](0d195c4))
* **auth:** add missing $route.query mock in verifyEmail tests ([b2732f6](b2732f6))
* **auth:** address CodeRabbit review feedback ([1d14b06](1d14b06))
* **auth:** address review feedback from pass 1 ([bd27d2f](bd27d2f))
* **auth:** address review feedback from pass 1 ([a87fdb1](a87fdb1))
* **auth:** address review feedback from pass 2 — prevent form flash on load ([a6afeca](a6afeca))
* **auth:** fix runtime deprecation warnings and add auth view unit tests ([1901dad](1901dad)), closes [#3592](#3592)
* **auth:** persist snackbar dismissal on implicit close ([5e464c3](5e464c3))
* **auth:** resolve lint errors and update test mocks for fetchServerConfig ([a642001](a642001))
* **billing:** add store unit tests and fix view import paths ([e370272](e370272))
* **billing:** address CodeRabbit review — guards, tests, JSDoc, price fallback ([f0f6657](f0f6657))
* **billing:** address CodeRabbit review feedback ([b195d2d](b195d2d))
* **billing:** address CodeRabbit review feedback ([8435d1c](8435d1c))
* **billing:** address CodeRabbit review feedback ([4187771](4187771))
* **billing:** address review — tier comparison, graceful failure, tests, naming ([7b00b91](7b00b91))
* **billing:** address review feedback — pricing card, fetch guard, router tests ([34cbda9](34cbda9))
* **billing:** address UI review findings ([b281a8a](b281a8a))
* **billing:** address UI review findings ([ead3eb0](ead3eb0))
* **billing:** address UI review findings ([b2d3897](b2d3897))
* **billing:** address UI review findings ([a756cd9](a756cd9))
* **billing:** align CASL guard subject with backend policy ([7e8287b](7e8287b))
* **billing:** align CASL guard subject with backend policy ([8e9b768](8e9b768))
* **billing:** correct plan field name, add enterprise badge, store cleanup ([#3733](#3733)) ([9b6e30d](9b6e30d)), closes [#3729](#3729) [#3730](#3730) [#3731](#3731) [#3732](#3732) [#3729](#3729) [#3730](#3730) [#3731](#3731) [#3732](#3732)
* **billing:** correct test URL assertions to match store checkout URLs ([cd64628](cd64628))
* **billing:** correct view import paths to match lowercase filenames ([e2646dd](e2646dd))
* **billing:** default free plan display + E2E security tests ([#3751](#3751)) ([025534a](025534a))
* **billing:** fix branch coverage and E2E auth guard test ([2864cf7](2864cf7))
* **billing:** fix branch coverage and harden E2E auth test ([7b91edb](7b91edb))
* **billing:** fix error-handling tests and restore CASL guard on /billing route ([bcb15a6](bcb15a6))
* **billing:** fix plan merge — match by planId/name and build price objects ([1c1c765](1c1c765))
* **billing:** gate fetchSubscription behind org check and add missing [@returns](https://github.com/returns) JSDoc ([9dd15a7](9dd15a7))
* **billing:** harden URL validation, test assertions, and error handling ([44d9cc2](44d9cc2))
* **billing:** include canceled query param in checkout cancel URL ([9e28636](9e28636))
* **billing:** propagate errors, add CASL route metadata, rename views ([39343ba](39343ba))
* **billing:** remove duplicate import in E2E test ([02576f5](02576f5))
* **billing:** rename views, fix test assertions, address review feedback ([cb72130](cb72130))
* **billing:** separate checkout error from fetch error in pricing view ([78db8b1](78db8b1))
* **billing:** update store cancel URL to include canceled query param ([ca5f1a3](ca5f1a3))
* **billing:** validate portal URL and catch fetchSubscription rejection ([7534b6c](7534b6c))
* **ci:** ensure coverage thresholds pass with all modules ([8e0c970](8e0c970)), closes [#3710](#3710)
* **ci:** remove ARC-specific conditionals from CI.yml ([#3806](#3806)) ([48747f3](48747f3)), closes [#3805](#3805)
* **config:** add missing api section to config.test.js ([#3679](#3679)) ([fff9ffc](fff9ffc)), closes [#3676](#3676)
* **config:** address review — use lodash-es, drop glob dep, add env warning ([1ec84fa](1ec84fa))
* **config:** address review feedback from pass 1 ([3336f09](3336f09))
* **config:** align app_title default between Dockerfile and hooks/build ([b08dbf3](b08dbf3))
* **config:** backward-compat fallback for sucessColor and improve warning ([1965557](1965557))
* **config:** fail fast when config is missing in production builds ([#3671](#3671)) ([c660ba4](c660ba4)), closes [#3669](#3669)
* **config:** generateConfig ignores module env-specific configs ([#3827](#3827)) ([1ffd80e](1ffd80e)), closes [#3826](#3826)
* **config:** remove [@desc](https://github.com/desc) tag from deepMerge JSDoc ([7c4b613](7c4b613))
* **config:** remove duplicate vuetify.theme block from app config merge ([5a583a7](5a583a7))
* **config:** remove unused imports and fix typo in generateConfig ([7b0c006](7b0c006))
* **config:** replace _.merge with deepMerge to fix array handling ([4e91025](4e91025)), closes [#3628](#3628)
* **config:** skip undefined values and guard against prototype pollution in deepMerge ([ffc574e](ffc574e))
* **config:** use pathToFileURL for cross-platform dynamic imports ([acad44e](acad44e))
* **core:** address review feedback from pass 1 ([0f6e3af](0f6e3af))
* **core:** make datatable generic via fetchAction prop ([e3a4926](e3a4926)), closes [#3596](#3596)
* **coverage:** exclude bootstrapper files with 0% coverage from collection ([4dfde5a](4dfde5a))
* **datatable:** increase per page select width to 100px ([#3779](#3779)) ([ff65d6f](ff65d6f)), closes [#3778](#3778)
* **docker:** add DEVKIT_NODE_api_port to docker-compose.test.yml ([#3815](#3815)) ([0f06402](0f06402)), closes [#3809](#3809)
* **docker:** make docker-compose.test.yml work for downstream projects ([#3790](#3790)) ([838aec1](838aec1)), closes [#3789](#3789)
* **docs:** add src/ prefix and use <env> placeholder in merge order table ([5af5d5b](5af5d5b))
* **docs:** mark global env override config files as optional ([7459d0f](7459d0f))
* **e2e:** read ports from project config instead of hardcoding ([#3777](#3777)) ([ec56d20](ec56d20)), closes [#3775](#3775)
* **header:** address review feedback from pass 1 ([b05d210](b05d210))
* **home,config:** address review feedback from pass 1 ([709ccbe](709ccbe))
* **home:** add JSDoc for tabs colorMode validator and tabStyle method ([a7fb5e3](a7fb5e3))
* **home:** add JSDoc to created() hook in home.team.view ([7548c15](7548c15))
* **home:** address CodeRabbit review feedback ([9990286](9990286))
* **home:** hero vertical centering, overlap prop, and Vuetify 4 typography migration ([4c26b25](4c26b25)), closes [#3587](#3587)
* **home:** pass colorMode to tabs component so forced text color applies to tab items ([50256d8](50256d8))
* **lodash:** use lodash-es imports for proper tree-shaking ([50570cf](50570cf))
* **nav:** fix organizations ghost item icon in sidenav ([bca4237](bca4237)), closes [#3706](#3706)
* **pull-request skill:** add consecutive_zero guard and re-check pending review checks ([18c70f8](18c70f8))
* **pull-request skill:** address review feedback — clarity and consistency ([2dd1ce2](2dd1ce2))
* **pull-request skill:** reply and resolve all threads including non-actionable ([ff776c8](ff776c8))
* **security:** harden auth views against XSS and weak validation ([#3735](#3735)) ([c3b844d](c3b844d))
* **seo-inject:** add JSON-LD structured data injection ([#3670](#3670)) ([5b36e5c](5b36e5c)), closes [#3664](#3664)
* **seo:** improve heading hierarchy and alt text for accessibility ([#3661](#3661)) ([918f9bd](918f9bd))
* **seo:** puppeteer prerender Docker support + minor plugin fixes ([#3673](#3673)) ([8ac241b](8ac241b))
* **seo:** skip runtime JSON-LD when seo-inject handles schema ([#3677](#3677)) ([#3680](#3680)) ([b0d90ac](b0d90ac))
* **skill:** add merge conflict check in pull-request convergence loop ([ef136ed](ef136ed)), closes [#3707](#3707)
* **skill:** address review feedback from pass 1 ([4020b82](4020b82))
* **skill:** handle CHANGES_REQUESTED, UNKNOWN mergeable, and standardize $PR usage ([13cb3cf](13cb3cf))
* **skill:** pull-request skill should ignore stack-level CodeRabbit comments for downstream projects ([97d2cb2](97d2cb2)), closes [#3604](#3604)
* **skills:** clarify feature Phase 0 completeness check ([#3773](#3773)) ([8ac6b1b](8ac6b1b))
* **skills:** match coderabbitai[bot] login in monitoring jq filter ([aae850f](aae850f))
* **update-stack:** add concrete gh issue create command and resolution guidance ([6092368](6092368))
* **update-stack:** add downstream-only new files rule to conflict table ([4a15e39](4a15e39))
* **update-stack:** address review feedback from pass 1 ([f7ed820](f7ed820))
* **update-stack:** address review feedback from pass 2 ([2bef8a3](2bef8a3))
* **update-stack:** clarify failure origin criteria in step 3bis ([a71515e](a71515e))

### Features

* add /frontend design skill + migrate Vuetify 3 patterns to V4 ([#3644](#3644)) ([2f2a8ff](2f2a8ff))
* **analytics:** add useFeatureFlag and usePostHog composables ([#3774](#3774)) ([2506a4f](2506a4f)), closes [#3771](#3771)
* **auth:** add email verification gate UI for org setup ([999aa60](999aa60))
* **auth:** add password visibility toggle ([#3752](#3752)) ([ea3b0a0](ea3b0a0)), closes [#336](#336)
* **auth:** display server-side auth status on signin/signup pages ([0f4276d](0f4276d))
* **billing:** add billing page with plan badge and subscription management ([e9a1fc5](e9a1fc5)), closes [#3715](#3715)
* **billing:** add BillingUsageBar component and enhance UpgradePrompt ([#3744](#3744)) ([0e9ca7f](0e9ca7f))
* **billing:** add checkout flow with auth/org guards and Stripe redirect ([ce17d67](ce17d67)), closes [#3714](#3714)
* **billing:** add checkout flow with auth/org guards and Stripe redirect ([f762d91](f762d91)), closes [#3714](#3714)
* **billing:** add feature gates — composable, upgrade prompt, router guard ([207c022](207c022)), closes [#3716](#3716)
* **billing:** add homepage pricing section ([a8ced6d](a8ced6d)), closes [#3717](#3717)
* **billing:** add pricing page with plan cards and billing toggle ([abb1d4a](abb1d4a)), closes [#3713](#3713)
* **billing:** add pricing page with plan cards and billing toggle ([0881a9f](0881a9f)), closes [#3713](#3713)
* **billing:** add useQuota composable for plan-based feature gating ([#3743](#3743)) ([85e2984](85e2984))
* **billing:** move pricing to dedicated page, update topnav ([eaab6f3](eaab6f3))
* **billing:** scaffold billing module with store, router, and views ([7b08b12](7b08b12)), closes [#3712](#3712)
* **ci:** skip setup-node and playwright install on self-hosted runner ([#3803](#3803)) ([104d4f8](104d4f8)), closes [#3802](#3802)
* **ci:** support configurable runner via RUNNER variable ([#3794](#3794)) ([1151d02](1151d02)), closes [#3792](#3792)
* **ci:** use APP_ENV variable for generateConfig in CI ([#3801](#3801)) ([e384c7c](e384c7c)), closes [#3795](#3795)
* **config:** migrate WAOS_VUE_* env prefix to DEVKIT_VUE_* ([7ad1a7f](7ad1a7f)), closes [#3614](#3614)
* **header:** add float scroll behavior and document all config options ([d1d4891](d1d4891))
* **home:** add dedicated 404 Not Found page ([#3655](#3655)) ([ac73739](ac73739))
* **home:** add FAQ accordion component with JSON-LD schema ([#3821](#3821)) ([444e62c](444e62c)), closes [#3819](#3819)
* **nav:** liquid glass sidenav with Apple-style inset mode ([#3737](#3737)) ([8203f2c](8203f2c))
* **pageHeader:** add tabs slot as alternative to icon + title ([#3781](#3781)) ([763d814](763d814)), closes [#3780](#3780)
* phase 2 organizations ([#3702](#3702)) ([71c6a5c](71c6a5c)), closes [#3674](#3674) [#3675](#3675) [#3684](#3684) [#3686](#3686) [#3681](#3681) [#3682](#3682) [#3683](#3683) [#3684](#3684) [#3685](#3685) [#3686](#3686) [#3675](#3675) [#3674](#3674)
* rename /frontend to /ui, add workflow rules ([#3704](#3704)) ([3d8259e](3d8259e))
* **sentry:** add Sentry error tracking and ErrorBoundary component ([#3788](#3788)) ([b5463d7](b5463d7)), closes [#3787](#3787)
* **seo-inject:** add noscript fallback, preconnect hints, and theme-color ([#3663](#3663)) ([261a3a8](261a3a8))
* **seo:** add pre-rendering of home page at build time ([#3660](#3660)) ([39d9414](39d9414))
* **seo:** add seo-static Vite plugin for robots.txt, sitemap.xml, manifest.json ([#3658](#3658)) ([0a50388](0a50388))
* **update-stack:** report upstream issues when verify fails on stack code ([71dbecc](71dbecc))
* **verify:** add coverage enforcement to verify skill ([#3776](#3776)) ([63301f9](63301f9))

### Performance Improvements

* **ci:** optimize GitHub Actions ([#3793](#3793)) ([e31287e](e31287e)), closes [#3791](#3791)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(e2e): read ports from project config instead of hardcoding

2 participants