Skip to content

feat: Terragrunt infra pipeline + NexaMesh rebrand + marketing enhancements#798

Open
JustAGhosT wants to merge 215 commits intomainfrom
dev
Open

feat: Terragrunt infra pipeline + NexaMesh rebrand + marketing enhancements#798
JustAGhosT wants to merge 215 commits intomainfrom
dev

Conversation

@JustAGhosT
Copy link
Copy Markdown
Collaborator

Summary

  • Terragrunt CI/CD: Full plan-on-PR / apply-on-push-to-dev pipeline via GitHub Actions with Azure OIDC (no long-lived credentials)
  • Infra migration: Azure Bicep → Terraform modules under infra/terraform/_modules/ (Cosmos DB, Key Vault, Storage, App Insights, Static Web Apps, Functions, Container Apps, Notification Hub)
  • Dev environment deployed: Cosmos DB serverless, 2× Static Web Apps (eastus2), Key Vault, Storage, App Insights — all free-tier / pay-per-use
  • NexaMesh rebrand: Complete Phoenix Rooivalk → NexaMesh across marketing, docs, packages, and configs
  • Marketing enhancements: SimulatorShowcase, TechStackSection, AnnouncementBar sections; NexaMeshOrb hero visual; layout and content refinements

Dev infrastructure (live)

Resource URL
Docs SWA https://agreeable-meadow-08caf4a0f.6.azurestaticapps.net
Marketing SWA https://icy-sea-0e257aa0f.4.azurestaticapps.net
Cosmos DB https://nex-dev-docs-cosmos.documents.azure.com:443/
Key Vault https://nex-dev-shared-kv.vault.azure.net/

Test plan

  • terragrunt init passes in CI
  • terragrunt apply succeeds for dev environment
  • OIDC login works (no long-lived secrets)
  • Azure resources visible in portal under nex-dev-shared-rg
  • Verify SWA deployment tokens are wired into CI for docs/marketing deploys
  • Request Y1 Consumption quota increase to re-enable Azure Functions (create_functions = true)

🤖 Generated with Claude Code

renovate bot and others added 30 commits March 9, 2026 08:01
- Bumped versions of `@eslint/compat` to 2.0.3 and `@types/node` to 25.3.5 across multiple package.json files for better compatibility and stability.
- Updated `@easyops-cn/docusaurus-search-local` to 0.55.1 in relevant packages to ensure alignment with the latest features and fixes.
Bumps [hashicorp/setup-terraform](https://github.com/hashicorp/setup-terraform) from 3.1.2 to 4.0.0.
- [Release notes](https://github.com/hashicorp/setup-terraform/releases)
- [Changelog](https://github.com/hashicorp/setup-terraform/blob/main/CHANGELOG.md)
- [Commits](hashicorp/setup-terraform@b9cd54a...5e8dbf3)

---
updated-dependencies:
- dependency-name: hashicorp/setup-terraform
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.21.0 to 1.22.0.
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.21.0...v1.22.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [tauri](https://github.com/tauri-apps/tauri) from 2.10.2 to 2.10.3.
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](tauri-apps/tauri@tauri-v2.10.2...tauri-v2.10.3)

---
updated-dependencies:
- dependency-name: tauri
  dependency-version: 2.10.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [azure_core](https://github.com/azure/azure-sdk-for-rust) from 0.32.0 to 0.33.0.
- [Release notes](https://github.com/azure/azure-sdk-for-rust/releases)
- [Commits](https://github.com/azure/azure-sdk-for-rust/compare/azure_core@0.32.0...azure_core@0.33.0)

---
updated-dependencies:
- dependency-name: azure_core
  dependency-version: 0.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@azure/msal-browser](https://github.com/AzureAD/microsoft-authentication-library-for-js) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/AzureAD/microsoft-authentication-library-for-js/releases)
- [Commits](AzureAD/microsoft-authentication-library-for-js@msal-common-v5.2.0...msal-browser-v5.4.0)

---
updated-dependencies:
- dependency-name: "@azure/msal-browser"
  dependency-version: 5.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.2.7 to 16.3.2.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](lint-staged/lint-staged@v16.2.7...v16.3.2)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 16.3.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [jose](https://github.com/panva/jose) from 6.1.3 to 6.2.1.
- [Release notes](https://github.com/panva/jose/releases)
- [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md)
- [Commits](panva/jose@v6.1.3...v6.2.1)

---
updated-dependencies:
- dependency-name: jose
  dependency-version: 6.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
- Updated pnpm from version 9.6.0 to 10.31.0 in CLAUDE.md, package.json, and relevant documentation files to ensure consistency and compatibility.
- Adjusted references in launch and build guides to reflect the new package manager version.
fix(ci): pnpm 10 from packageManager, add @next/eslint-plugin-next for marketing lint
fix(ci): pnpm 10 from packageManager, add @next/eslint-plugin-next for marketing lint
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@6044e13...53b8394)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.6 to 8.5.8.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](postcss/postcss@8.5.6...8.5.8)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
deps(deps): bump tauri from 2.10.2 to 2.10.3
…taged-16.3.2

deps(deps-dev): bump lint-staged from 16.2.7 to 16.3.2
Bumps [libc](https://github.com/rust-lang/libc) from 0.2.182 to 0.2.183.
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.183/CHANGELOG.md)
- [Commits](rust-lang/libc@0.2.182...0.2.183)

---
updated-dependencies:
- dependency-name: libc
  dependency-version: 0.2.183
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
deps(deps): bump libc from 0.2.182 to 0.2.183
deps(deps): bump uuid from 1.21.0 to 1.22.0
…s-8.5.8

deps(deps-dev): bump postcss from 8.5.6 to 8.5.8
Bumps [turbo](https://github.com/vercel/turborepo) from 2.8.10 to 2.8.14.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.8.10...v2.8.14)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.8.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [globals](https://github.com/sindresorhus/globals) from 17.3.0 to 17.4.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](sindresorhus/globals@v17.3.0...v17.4.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-version: 17.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
… actions

- Updated the GitHub Actions workflow for marketing site deployment to prevent builds triggered by Dependabot and Renovate bots, improving deployment efficiency and reducing unnecessary builds.
…igest

chore(deps): update swatinem/rust-cache digest to 779680d
JustAGhosT and others added 29 commits March 26, 2026 03:26
- StickyHeader: render "NexaMesh" (was "Phoenix Rooivalk"), update Signal Amber color fallback
- StickyHeader tests: update all getByText/queryByText assertions to NexaMesh
- CalendarExport + TimelineSection: export filename phoenix-rooivalk-timeline → nexamesh-timeline
- e2e test: page title regex updated to /NexaMesh|Kestrel|Sentinel/i
- docs catalog: SkySnare → KestrelMesh, AeroNet → SentinelRing in types, names, object keys
- docs tariffs: product names aligned to Kestrel Mesh / Sentinel Ring
- packages: file header comments updated to NexaMesh
- marketing + typescript rule: CLAUDE.md docs updated (theme name, package scope)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PhaseFilterContext: phase labels → Kestrel Mesh Launch, Sentinel Ring & DoD
- export-products.test.ts: valid lines array updated to KestrelMesh/SentinelRing
- Slide decks (4 files): SkySnare → Kestrel Mesh, AeroNet → Sentinel Ring
- values.ts + calendar.tsx: brand name comments and event descriptions
- Agent configs: package scope @nexamesh/types, product line names
- known-emails.ts: old Azure hostname intentionally left (live dev endpoint)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…, type fixes

Slide decks:
- Video captions: "CO₂ pneumatic net launcher" → "edge AI-guided drone capture"
- QA appendix: key points lead with edge AI/sub-200ms, safety secondary
- QA demo script: AI detects first, pneumatic capture second
- Lightning pitch opener: "CO₂ net launchers" → "edge AI detection, autonomous net capture, blockchain evidence"
- Lightning pitch products: "point and shoot" → "edge AI detection, one-button neutralise"
- Demo pitch tagline: "Pneumatic net launchers for training" → "Edge AI. Autonomous net capture. Blockchain evidence."
- Regulatory backup slides: kept as-is (CO₂ = paintball = no permits is accurate legal fact)

products.ts market positioning:
- Kestrel Mesh: "$3.22B outdoor sports" → "$6.6B consumer counter-drone market"
- NetSnare Lite: "DIY enthusiasts / Makers" → "Property owners / Small businesses / First responders"
- NetSentry Lite: "DIY/Testing" → "System integrators / Security teams"

Docs type fixes:
- products/index.ts: skySnareProducts → kestrelMeshProducts, aeroNetProducts → sentinelRingProducts
- roadmap.ts: "in-progress" → "in_progress" (type literal mismatch)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Brand cleanup:
- downloadWhitepaper.ts: Phoenix_Rooivalk → NexaMesh in download filename
- AIBenefitsSection.tsx + UkraineChallengeSection.tsx: email subjects updated

Positioning fixes:
- ROI calculator: "Homeowners & hobbyists" → "Property owners & training facilities"
- SkyWatch Nano: "backyard awareness, makers/hobbyists" → edge AI, training sites
- Sentinel Ring Events: "concerts, sports, and festivals" → high-profile events/critical gatherings
- FAQ: "drone racing leagues" → government agencies, airports, critical infrastructure operators
- CapabilitiesSection: "flock of birds / light signals" metaphor → technical mesh autonomy description

Case study:
- Replace "Kestrel Mesh at the Drone Racing League" with power station deployment
  scenario (RF-denied, blockchain evidence chain, 90min deploy)

Note: UkraineChallengeSection section content intentionally not modified — strategic
positioning decision pending.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Color fixes:
- InteractiveMesh: rgba(234,124,28) → Signal Amber rgba(199,122,27)
- TeamSection.module.css: hardcoded #0066ff→#00ccff gradient → Signal Amber/Burnt Copper brand gradient

UX:
- FeaturesSection: add closing CTA row (Explore All Products + Preorder Now)
  using global .btn--primary / .btn--secondary classes

Content:
- UkraineChallengeSection: remove Ukraine/Russia/active-conflict framing
  → "The Autonomous Drone Threat Is Accelerating" — same urgency narrative,
  geopolitically neutral, no ITAR exposure
  - Problems: false positives, EW vulnerability, no swarm awareness
  - Solutions: multi-sensor fusion, RF-denied autonomy, deployable today
  - Quote: adversarial drone cost curve vs defender readiness gap
  - CTA email: personal → sales@nexamesh.ai
  - Section id: ukraine-challenge → autonomous-drone-threat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extract ProductLine, MarketTier, SystemType, ProductPhase, BaseProduct
  to packages/types/src/products.ts
- Migrate docs catalog line values from PascalCase to kebab-case
  (SkyWatch→skywatch, KestrelMesh→kestrel, SentinelRing→sentinel-ring, etc.)
- Update products.schema.json line enum to kebab-case
- Split skywatch-thermal into budget/pro SKUs and skywatch-mesh into
  node/central SKUs to match docs catalog splits
- Rename skysnare→kestrel and aeronet→sentinel-ring product lines
- Add @nexamesh/types dependency + path alias to docs package

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add export const metadata to compliance pages (iso-27001, itar,
  security-clearance) by removing "use client" and using server wrappers
- Split login and profile/confirm into server wrapper + client component
  so metadata can be exported
- Fix stale ISO 27001 dates: Q4 2025→Q4 2026, Q2 2025→Q3 2026
- Add type="button" and aria-label to 3 contact page buttons
- Add legal/privacy and legal/terms pages (server wrapper + client split)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move useCountUp hook to packages/ui/src/hooks/ (was marketing-local)
- Add safeGet/safeSet/safeRemove/safeClear to packages/utils/src/storage.ts
- Add isValidEmail/isValidUrl to packages/utils/src/validators.ts
- Delete dead local formatter.ts and downloadWhitepaper.ts from marketing
- Update formatter importers to use @nexamesh/utils (2 components + test)
- Wire CartContext and ThemeContext to use safeGet/safeSet from package
- Wire docs localStorage.ts to use package storage helpers
- Update download filename to NexaMesh_Technical_Whitepaper.md
- Add @nexamesh/ui dependency to marketing; add moduleNameMapper to docs jest

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add MeshDivider and RadarRings UI components
- Revise HeroSection, RevealSection, TimelineSection, CounterDroneMethodsSection
- Navigation, FeaturesSection, ContactSection, HeroSection CSS updates
- globals.css additions for shared layout tokens
- Preorder page enhancements with updated module CSS
- Footer, competitors, ROI calculator, products CSS fixes
- wasm/manifest.json bump

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Brand alignment — 23 key constants across 12 files. Existing user
onboarding state is intentionally cleared (keys don't migrate).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Validates that all docs products have valid ProductLine values, unique SKUs,
positive pricing, and positive BOM totals. Documents the intentional split
between docs (component specs) and marketing (purchasable bundles).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…o update

npm (pnpm overrides):
  flatted      3.4.1 → 3.4.2   Prototype Pollution in parse()
  picomatch    2.3.1 → 2.3.2   Method injection + ReDoS via extglob
  picomatch    4.0.3 → 4.0.4   Method injection + ReDoS via extglob
  smol-toml    1.6.0 → 1.6.1   DoS via consecutive commented lines
  svgo         3.3.2 → 4.0.1   Billion Laughs DoS via DOCTYPE entity expansion
  undici       7.22.0 → 7.24.6 WebSocket overflow, CRLF injection, memory DoS
  yaml         2.8.2 → 2.8.3   Stack overflow via deeply nested collections

Rust (cargo update):
  aws-lc-rs    1.16.1 → 1.16.2
  aws-lc-sys   0.38.0 → 0.39.0 CRL scope check logic + X.509 Name Constraints bypass
  rustls-webpki 0.103.9 → 0.103.10 CRL Distribution Point matching logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- NexaMeshOrb: 8 concentric hexagons with counter-rotating animation
  groups, SVG feGaussianBlur bloom filter, brand amber neon glow
- Hero restructured to left-copy / right-orb split layout (Graphite-style)
- Mobile: orb hidden, text recentered
- prefers-reduced-motion: all animations disabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- AnnouncementBar: dismissable preorder strip with live dot + amber CTA
- TechStackSection: "Built on" strip — Rust, Azure, Solana, WASM, Edge AI, Blockchain
- SimulatorShowcase: angled CSS-perspective product screenshot section
- ThreatSimulatorDemo: dark tactical CSS module with amber accents
- Wire all three sections into home.tsx above/below HeroSection
- Playwright-captured simulator screenshot at 1440×900 for showcase

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Convert all infra/azure/modules/*.bicep to reusable Terraform modules
under infra/terraform/_modules/, wired together by the nexamesh-core
orchestrator and deployed via live/{dev,stg,prd}/nexamesh-core/.

New modules (each with main.tf / variables.tf / outputs.tf):
- keyvault      — Key Vault (RBAC auth, soft delete)
- storage       — Storage account + assets container + blob CORS
- appinsights   — Log Analytics workspace + Application Insights
- cosmosdb      — Cosmos DB account + nexamesh-docs DB + 12 containers
                  with partition keys, TTLs, and composite indexes
- notificationhub — Notification Hub namespace + hub + auth rules
- functions     — Consumption/Premium Linux Function App (Node 20),
                  all 18 app settings, CORS, KV role assignment
- containerapps-env — Container Apps Environment (Consumption, mTLS)
- staticwebapp  — Static Web App (Free/Standard SKU)

Orchestrator: _modules/nexamesh-core/ mirrors main.bicep exactly,
using v3.0 naming (nex-{env}-{product}-{resourcetype}).

Live Terragrunt configs: live/{dev,stg,prd}/nexamesh-core/terragrunt.hcl

Also adds:
- infra/terraform/.gitignore
- infra/terraform/scripts/bootstrap-tfstate.sh
- Fix: cosmosdb enable_free_tier defaults false (was incorrectly
  inverted from use_serverless)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dev:
- Cosmos DB free tier (1000 RU/s + 25 GB free; one per subscription)
- Notification Hub skipped (not wired yet)
- Container Apps Env skipped (no containers deployed yet)

Stg:
- Cosmos DB serverless (pay-per-RU, scales to zero between runs)
- Notification Hub + Container Apps Env skipped

Prd:
- Cosmos DB serverless (cheapest at current traffic levels)
- Static Web Apps Free SKU (was Standard; upgrade when SLA needed)
- Notification Hub Free SKU (1M pushes/month included)
- Container Apps Env Consumption (scales to zero)

Module changes:
- nexamesh-core: add create_notification_hub, create_container_apps_env,
  enable_free_tier_cosmos variables; make hub + CAE conditional via count
- cosmosdb: free tier forces use_serverless = false automatically
- Outputs return null instead of crashing when optional resources skipped

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Serverless scales to zero between dev sessions — better fit than
provisioned free tier when usage is sporadic.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- plan on every PR touching infra/terraform/** paths → posts formatted
  output as a sticky PR comment (updates in place on re-runs)
- apply on push to dev (auto) + workflow_dispatch for manual prd deploys
- OIDC auth (ARM_USE_OIDC=true, no long-lived credentials in runner)
- bootstrap-tfstate.sh runs idempotently before init
- GitHub Environments used for apply jobs (add reviewers to prd env
  in Settings → Environments to gate production deploys)
- Provider cache keyed on module + root hcl hash to save minutes
- All github.* context values passed via env: to avoid script injection

Required GitHub Secrets:
  AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID  (OIDC)
  AZURE_ENTRA_TENANT_ID, AZURE_ENTRA_CLIENT_ID             (TF vars)
  AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT              (optional)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaced unverified SHAs with verified commit SHAs fetched from GitHub API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
find_in_parent_folders() searches for 'terragrunt.hcl' by default.
The misnamed root file caused ParentFileNotFoundError on every init.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Terragrunt 0.68 removed overwrite_terraformignore as a valid if_exists
value for generate blocks. Use overwrite instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ling modules

Without //, Terragrunt only copies nexamesh-core into the cache and the
relative ../appinsights, ../cosmosdb etc. paths in main.tf resolve to
missing directories. The // notation copies the entire _modules directory
and uses nexamesh-core as the working subdirectory within it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ted credential

The GitHub OIDC subject changes from ref:refs/heads/dev to environment:dev
when environment: is set. The registered federated credential expects the
ref subject. Re-enable environment: once a matching credential is added.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…osdb module

Terraform 1.9+ requires single-line block definitions to have exactly one
argument. The composite_index.index blocks had both path and order on one
line, causing HCL parse errors during terraform init.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- containerapps-env: remove zone_redundancy_enabled (requires infrastructure_subnet_id)
- keyvault: use nonsensitive(keys()) for for_each to allow sensitive map values
- staticwebapp: remove repository_url and branch (not valid azurerm_static_web_app attrs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add swa_location variable (default eastus2) — eastus doesn't support
  Microsoft.Web/staticSites
- Switch staticwebapp module calls to var.swa_location
- KV Secrets Officer role assigned out-of-band via az rest

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Azure Sponsorship subscriptions have Dynamic VM quota of 0, blocking Y1
Consumption plan creation. Gate Functions behind create_functions variable
(default true) so dev can skip it until quota is raised.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
After terragrunt apply, capture the docs and marketing Static Web App
deployment tokens from Terraform outputs and write them to GitHub Secrets
(SWA_TOKEN_DOCS_DEV, SWA_TOKEN_MARKETING_DEV) using GITHUB_TOKEN.

Also fix stale root.terragrunt.hcl path filter (renamed to terragrunt.hcl).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GITHUB_TOKEN cannot write repository secrets (not a valid permission).
After apply, write SwaTokenDocs and SwaTokenMarketing to the provisioned
Key Vault using az keyvault secret set. Deployment workflows retrieve them
via OIDC + az keyvault secret show.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

export function isValidEmail(email: string): boolean {
return EMAIL_RE.test(email.trim());

Check failure

Code scanning / CodeQL

Polynomial regular expression used on uncontrolled data High

This
regular expression
that depends on
library input
may run slow on strings starting with '!@!.' and with many repetitions of '!.'.
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.

3 participants