Merge pull request #3 from bponders12-cell/chore/ci-hardening-phase-1

chore(ci): add website, relay, and backend PR validation
This commit is contained in:
Billie Ponder 2026-09-18 22:47:45 -04:00 committed by GitHub
commit d3caf37bb2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 185 additions and 80 deletions

50
.github/pull_request_template.md vendored Normal file
View File

@ -0,0 +1,50 @@
## Purpose
<!-- What problem, bug, or feature does this PR address? -->
## Related Issue
<!-- Closes # or Fixes # -->
Closes #
## Changes
<!-- High-level bullet points of what code changed -->
## Architecture Impact
<!-- What subsystem or data flow is affected? -->
## Risk Boundaries
<!-- Check all subsystems touched by this PR -->
- [ ] Telemetry acquisition (FROZEN 20 Hz pipeline)
- [ ] Sensor fusion / lean angle
- [ ] GNSS / speed processing
- [ ] Ride persistence / state machine
- [ ] Database / Drift Schema 7
- [ ] Authentication / security rules
- [ ] Website (Next.js / Founder Portal / Ops Console)
- [ ] Backend / FastAPI API
- [ ] Routing / Waze relay
- [ ] None
## Database Impact
<!-- Schema version, migration logic, or None. Never change Schema 7 without explicit migration tests. -->
None
## Validation Actually Executed
<!-- IMPORTANT: List only exact commands actually executed in this session. NEVER state "all tests pass" unless specifically executed. -->
```bash
# Example:
# flutter analyze
# flutter test
# flutter build apk --debug
# npm --prefix website run build
# npm --prefix server/waze_relay test
```
## Manual Testing
<!-- What manual, physical device, or browser testing was performed, if any? -->
## Review Focus
<!-- Specific files, security boundaries, or edge cases reviewers should inspect closely. -->
## Documentation
- [ ] Documentation updated
- [ ] Documentation not required for this change

45
.github/workflows/backend-ci.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: MotorSignal Backend CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: backend-ci-${{ github.ref }}
cancel-in-progress: true
jobs:
backend-api-tests:
name: Backend API tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend/motorsignal_api
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
cache-dependency-path: backend/motorsignal_api/requirements.lock
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.lock pytest httpx
- name: Run Firebase Auth signature and claims tests
run: python tests/test_firebase_auth.py
- name: Run isolated API and Operations unit tests
run: |
pytest tests/test_ops_support.py tests/test_ops_incidents.py tests/test_legacy_admin_retirement.py -v

39
.github/workflows/waze-relay-ci.yml vendored Normal file
View File

@ -0,0 +1,39 @@
name: MotorSignal Waze Relay CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: waze-relay-ci-${{ github.ref }}
cancel-in-progress: true
jobs:
waze-relay-tests:
name: Waze relay tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: server/waze_relay
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: server/waze_relay/package-lock.json
- name: Install dependencies
run: npm ci
- name: Run relay tests
run: npm test

51
.github/workflows/website-ci.yml vendored Normal file
View File

@ -0,0 +1,51 @@
name: MotorSignal Website CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: website-ci-${{ github.ref }}
cancel-in-progress: true
jobs:
website-build-and-tests:
name: Website build and regression tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: website
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: website/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build Next.js application
run: npm run build
- name: Run Founder Portal tests
run: node tests/founder-portal.test.cjs
- name: Run Operations Console tests
run: node tests/ops-experience.test.cjs
- name: Run Responsive Layout tests
run: node tests/responsive-layout.test.cjs
- name: Run Navigation and Auth tests
run: node tests/navigation-auth.cjs

View File

@ -7,7 +7,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:app_links/app_links.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:mcp_toolkit/mcp_toolkit.dart';
import 'firebase_options.dart';
import 'core/theme/theme.dart';
import 'core/theme/theme_mode_provider.dart';
@ -24,10 +23,6 @@ Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
}
MCPToolkitBinding.instance
..initialize()
..initializeFlutterToolkit();
try {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,

View File

@ -14,7 +14,6 @@ import flutter_tts
import geolocator_apple
import google_sign_in_ios
import in_app_purchase_storekit
import intentcall_platform
import package_info_plus
import share_plus
import shared_preferences_foundation
@ -31,7 +30,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin"))
InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin"))
IntentCallPlatformPlugin.register(with: registry.registrar(forPlugin: "IntentCallPlatformPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))

View File

@ -297,14 +297,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
dart_mcp:
dependency: transitive
description:
name: dart_mcp
sha256: "852b51da915d679be8d051e2e3b6c68ed19fe685f1c676bb35272a2d73ceac7a"
url: "https://pub.dev"
source: hosted
version: "0.5.2"
dart_style:
dependency: transitive
description:
@ -491,14 +483,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.2"
flutter_mcp_toolkit_core:
dependency: transitive
description:
name: flutter_mcp_toolkit_core
sha256: fc61b977983b0615b84c27404db86c18bb703af519867b51fb72136f95682148
url: "https://pub.dev"
source: hosted
version: "5.1.0"
flutter_native_splash:
dependency: "direct dev"
description:
@ -589,14 +573,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
from_json_to_json:
dependency: transitive
description:
name: from_json_to_json
sha256: a29219df65cd20b1b17be8141ee51b3103d1cd95b192b7512139f3ae44775f49
url: "https://pub.dev"
source: hosted
version: "0.5.0"
geoclue:
dependency: transitive
description:
@ -877,30 +853,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.4.11+2"
intentcall_core:
dependency: transitive
description:
name: intentcall_core
sha256: "10363edd11dab107d83d5126decec03d07ab6bf9fa4685a62f9f9d9c0af13cea"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
intentcall_platform:
dependency: transitive
description:
name: intentcall_platform
sha256: a14d533b5ab2413c67ce2f943b56ab2a335a1a46b88a00ae62d72fafc6cacf50
url: "https://pub.dev"
source: hosted
version: "0.6.0"
intentcall_schema:
dependency: transitive
description:
name: intentcall_schema
sha256: "7fd95e20f8d32f5ffe6c9cd4058d3fbf513c52dff69a63d9c4c8f4bf2810f842"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
intl:
dependency: "direct main"
description:
@ -917,14 +869,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
is_dart_empty_or_not:
dependency: transitive
description:
name: is_dart_empty_or_not
sha256: "1454632c2b961175d4c2807310713cbcbd054a51e63c545dc86c3eb9b2b061b0"
url: "https://pub.dev"
source: hosted
version: "0.4.0"
jni:
dependency: transitive
description:
@ -957,14 +901,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.12.0"
json_rpc_2:
dependency: transitive
description:
name: json_rpc_2
sha256: "82dfd37d3b2e5030ae4729e1d7f5538cbc45eb1c73d618b9272931facac3bec1"
url: "https://pub.dev"
source: hosted
version: "4.1.0"
latlong2:
dependency: "direct main"
description:
@ -1061,14 +997,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
mcp_toolkit:
dependency: "direct main"
description:
name: mcp_toolkit
sha256: "75713760da19ef3b0b370e572d7714d51346f2411221ecce86fc5555918c0f2b"
url: "https://pub.dev"
source: hosted
version: "5.1.0"
meta:
dependency: transitive
description:

View File

@ -66,7 +66,6 @@ dependencies:
flutter_secure_storage: ^10.2.1
in_app_purchase: 3.3.0
marionette_flutter: ^0.6.0
mcp_toolkit: ^5.1.0
dev_dependencies:
flutter_test: