NXGEN Documentation Site - Pre-Handover Task Dashboard
Target Handover Date: Tomorrow Total Estimated Time: 11 hours (parallelized across 3 agents) Last Updated: 2025-12-28
🎯 Mission Critical Overview
Fix all CRITICAL and HIGH priority issues before business team handover tomorrow.
Status Legend:
- 🔴 NOT STARTED
- 🟡 IN PROGRESS
- ✅ COMPLETE
- ⚠️ BLOCKED
👥 AGENT ASSIGNMENTS
Claude Code Agent (Primary Architect)
Specialty: Git operations, security fixes, architectural changes Estimated Time: 4 hours
Cursor Agent (Code Quality Specialist)
Specialty: TypeScript fixes, component refactoring, code editing Estimated Time: 4 hours
Amazon Q Agent (DevOps & Testing)
Specialty: Dependency management, deployment, verification Estimated Time: 3 hours
📋 TASK BREAKDOWN BY AGENT
🤖 CLAUDE CODE AGENT TASKS
TASK CC-1: Security Credential Rotation & Removal 🔴 CRITICAL
Priority: P1 - MUST DO FIRST Estimated Time: 2 hours Status: 🔴 NOT STARTED
Objective: Remove all hardcoded credentials from codebase and rotate exposed tokens.
Detailed Instructions:
-
Identify all exposed credentials:
# List of exposed credentials to rotate:
- Storyblok Access Token: lZ1VpFd6y9FjoNcJQFlXLAtt
- Storyblok Management Token: SnZKlMe1dDulcvVEAt6EQAtt-127355674276436-YjsPjJbmPT5X5gxV9GD1
- SMTP Password: HtPkPzaSjssz
- SMTP User: emailappsmtp.1bb47c6b0a9025c9
- Hygraph JWT tokens (3 tokens in .env.local) -
Remove hardcoded tokens from source:
File:
classic/src/lib/storyblok.ts// BEFORE (Line 10):
const STORYBLOK_TOKEN = process.env.STORYBLOK_ACCESS_TOKEN || 'lZ1VpFd6y9FjoNcJQFlXLAtt';
// AFTER:
const STORYBLOK_TOKEN = process.env.STORYBLOK_ACCESS_TOKEN;
if (!STORYBLOK_TOKEN) {
throw new Error('STORYBLOK_ACCESS_TOKEN environment variable is required');
}File:
classic/src/pages/storyblok-preview.tsx// BEFORE (Line 47):
window.storyblok.init({
accessToken: 'lZ1VpFd6y9FjoNcJQFlXLAtt',
});
// AFTER:
window.storyblok.init({
accessToken: process.env.STORYBLOK_ACCESS_TOKEN,
});File:
classic/netlify.toml# BEFORE (Lines 7-9):
STORYBLOK_ACCESS_TOKEN = "lZ1VpFd6y9FjoNcJQFlXLAtt"
# AFTER:
# IMPORTANT: Set STORYBLOK_ACCESS_TOKEN in Netlify Dashboard
# Do not commit tokens to version controlFile:
classic/api/feedback.ts// BEFORE (Lines 7-11):
const mailConfig = {
user: 'emailappsmtp.1bb47c6b0a9025c9',
pass: 'HtPkPzaSjssz',
};
// AFTER:
const mailConfig = {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
};
if (!mailConfig.user || !mailConfig.pass) {
throw new Error('SMTP_USER and SMTP_PASS environment variables required');
} -
Update .env.example with all required variables:
# Add to classic/.env.example:
STORYBLOK_ACCESS_TOKEN=your_public_token_here
STORYBLOK_MANAGEMENT_TOKEN=your_management_token_here
STORYBLOK_REGION=eu
STORYBLOK_SPACE_ID=289434723537263
STORYBLOK_IS_PREVIEW=true
SMTP_USER=your_smtp_user_here
SMTP_PASS=your_smtp_password_here -
Create NEW credentials (do not use old exposed ones):
- Go to Storyblok Dashboard → Settings → Access Tokens
- Generate NEW Public Access Token (replace lZ1VpFd6y9FjoNcJQFlXLAtt)
- Generate NEW Management Token (replace SnZKlMe1dDulcvVEAt6EQAtt...)
- Update SMTP credentials (contact email provider)
- Update local .env.local with NEW tokens
-
Verify build still works locally:
cd classic
npm run build
# Should succeed with new env vars
Deliverables:
- All hardcoded credentials removed from source files
- New credentials generated and documented
- .env.example updated with all required variables
- Local build verified working with new credentials
- List of new credentials provided (securely, not in git)
Report Back Format:
TASK CC-1 STATUS: ✅ COMPLETE
Files Modified:
1. classic/src/lib/storyblok.ts - Removed hardcoded token, added validation
2. classic/src/pages/storyblok-preview.tsx - Now uses env var
3. classic/netlify.toml - Removed exposed token
4. classic/api/feedback.ts - Now uses env vars for SMTP
5. classic/.env.example - Added all required variables
New Credentials Generated:
- Storyblok Access Token: [NEW_TOKEN_VALUE] (length: 24 chars)
- Storyblok Management Token: [NEW_TOKEN_VALUE] (length: 64 chars)
- SMTP credentials: Updated (contact: user@example.com)
Verification:
✅ npm run build - SUCCESS (2m 15s)
✅ No hardcoded credentials detected in source
✅ All env vars documented in .env.example
Issues/Blockers: None
TASK CC-2: Purge .env.local from Git History 🔴 CRITICAL
Priority: P1 - CRITICAL Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Remove .env.local file from entire git history to eliminate exposed credentials.
Detailed Instructions:
-
Verify .env.local is in git history:
cd c:\Users\abdel\.gemini\antigravity\scratch\nxgen-docs
git log --all --full-history -- classic/.env.local
# If output shows commits, file was committed -
Backup current repository:
# Create backup before destructive operation
cd ..
cp -r nxgen-docs nxgen-docs-backup-$(date +%Y%m%d)
cd nxgen-docs -
Install git-filter-repo (if not installed):
# Check if installed
git filter-repo --version
# If not installed:
# Windows: pip install git-filter-repo
# Or download from: https://github.com/newren/git-filter-repo -
Remove .env.local from entire history:
# Using git-filter-repo (recommended):
git filter-repo --invert-paths --path classic/.env.local --force
# OR using BFG Repo-Cleaner (alternative):
# Download BFG from: https://rtyley.github.io/bfg-repo-cleaner/
# java -jar bfg.jar --delete-files .env.local
# git reflog expire --expire=now --all
# git gc --prune=now --aggressive -
Verify removal:
# Check that .env.local is gone from history
git log --all --full-history -- classic/.env.local
# Should return: "fatal: ambiguous argument" or no results
# Verify file still exists locally (not in git)
ls classic/.env.local
# Should still exist (not tracked)
# Verify it's in .gitignore
grep ".env.local" classic/.gitignore
# Should show .env.local in gitignore -
Force push to remote (COORDINATE WITH TEAM FIRST):
# WARNING: This rewrites history - notify team before doing this
# All team members will need to re-clone the repository
git push origin --force --all
git push origin --force --tags
Deliverables:
- .env.local completely removed from git history
- Repository backup created
- Verification commands run successfully
- Team notified before force push (if applicable)
- Remote repository updated with cleaned history
Report Back Format:
TASK CC-2 STATUS: ✅ COMPLETE
Actions Taken:
1. Backup created: nxgen-docs-backup-20251228
2. git-filter-repo installed (version: X.X.X)
3. Removed classic/.env.local from entire git history
4. Force pushed to origin (all team members notified)
Verification:
✅ git log shows no history for .env.local
✅ File still exists locally (not tracked)
✅ File is in .gitignore
✅ Repository size reduced by: X MB
Before History Size: XXX commits
After History Size: XXX commits (rewrites applied)
Issues/Blockers: None
TASK CC-3: Clean Up Test Content & Organize Commits 🔴 HIGH
Priority: P2 Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Remove test files, organize status documents, and commit all changes in logical groups.
Detailed Instructions:
-
Remove test articles:
cd classic/docs
# Remove test files:
rm -f api-test-*.md
rm -f cms-test-article.md
rm -f cms-configuration-test.md
rm -f publish.md # Minimal content, appears to be test
# Verify removal:
git status -
Organize status documents:
# Create internal docs folder
mkdir -p classic/docs/internal
# Move status documents to internal folder
mv ARTICLES_CREATION_SUMMARY.md classic/docs/internal/
mv ARTICLE_ENHANCEMENT_SUMMARY.md classic/docs/internal/
mv FEEDBACK_WIDGET_PRD.md classic/docs/internal/
mv STORYBLOK_BUILD_FIX_SUMMARY.md classic/docs/internal/
mv UNMAPPED_BUTTONS_AND_CARDS.md classic/docs/internal/
# Update .gitignore to exclude internal docs from builds
echo "docs/internal/" >> classic/.gitignore -
Handle PDF files (do NOT commit large binaries):
# Move PDFs to separate location outside repo
mkdir -p ../nxgen-docs-assets
mv "Missing articles/" ../nxgen-docs-assets/pdf-sources/
# Or delete if no longer needed:
# rm -rf "Missing articles/" -
Review uncommitted changes:
git status
git diff classic/src/pages/index.tsx
git diff classic/docs/alarm-management/
# Review each changed file -
Commit changes in logical groups:
# Commit 1: Remove test content
git add -A
git reset classic/docs/device-integration/ # Don't include in this commit
git commit -m "chore: Remove test articles and organize internal documentation
- Removed api-test-*.md, cms-test-article.md test files
- Moved status documents to docs/internal/
- Excluded internal docs from builds
🤖 Generated with Claude Code"
# Commit 2: Add device integration docs
git add classic/docs/device-integration/
git add classic/static/img/device-integration/
git commit -m "docs: Add comprehensive device integration guides
- IP Camera integration guide with examples
- Alarm panel integration guide
- IoT sensor integration guide
- Added device-specific images and diagrams
🤖 Generated with Claude Code"
# Commit 3: Update landing page
git add classic/src/pages/index.tsx
git commit -m "fix: Update landing page with correct documentation links
- Fixed Video Tutorials link
- Fixed Release Notes link
- Updated Popular Devices card links
- Improved device monitoring card links
🤖 Generated with Claude Code"
# Commit 4: Update alarm management docs
git add classic/docs/alarm-management/
git add classic/docs/reporting/
git commit -m "docs: Update alarm management and reporting documentation
- Enhanced alarm configuration documentation
- Updated device activity reporting
- Improved troubleshooting guides
🤖 Generated with Claude Code"
# Commit 5: Remove Payload CMS
git add -A # Include all deleted payload-cms files
git commit -m "refactor: Remove unused Payload CMS integration
- Deleted payload-cms/ directory (13 files)
- Removed Payload CMS dependencies
- Simplified CMS strategy to Storyblok only
🤖 Generated with Claude Code"
# Commit 6: Update styles and UI components
git add classic/src/css/custom.css
git add classic/src/components/
git commit -m "style: Update custom styles and remove unused components
- Removed FloatingDarkModeToggle (functionality moved to theme)
- Removed FloatingLanguageToggle (functionality moved to theme)
- Updated custom CSS for brand consistency
🤖 Generated with Claude Code" -
Push all commits:
git push origin main
Deliverables:
- All test articles removed
- Status documents organized into docs/internal/
- PDF files moved outside repository
- 6 logical commits created with clear messages
- All commits pushed to remote
Report Back Format:
TASK CC-3 STATUS: ✅ COMPLETE
Files Removed:
- classic/docs/api-test-1766839639439.md
- classic/docs/cms-test-article.md
- classic/docs/cms-configuration-test.md
- classic/docs/publish.md
Files Organized:
- Moved 5 status documents to docs/internal/
- Moved PDFs to ../nxgen-docs-assets/
Commits Created:
1. chore: Remove test articles and organize internal documentation (abc1234)
2. docs: Add comprehensive device integration guides (def5678)
3. fix: Update landing page with correct documentation links (ghi9012)
4. docs: Update alarm management and reporting documentation (jkl3456)
5. refactor: Remove unused Payload CMS integration (mno7890)
6. style: Update custom styles and remove unused components (pqr1234)
Git Status:
✅ All commits pushed to origin/main
✅ Working tree clean
✅ No uncommitted changes
Issues/Blockers: None
🎨 CURSOR AGENT TASKS
TASK CU-1: Fix TypeScript Configuration & JSX Errors 🔴 HIGH
Priority: P2 Estimated Time: 1.5 hours Status: 🔴 NOT STARTED
Objective: Fix tsconfig.json to resolve 14 JSX namespace errors and improve type safety.
Detailed Instructions:
-
Update tsconfig.json:
{
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": ".",
"types": ["react", "react-dom", "@docusaurus/types", "node"],
"jsx": "react-jsx",
"jsxImportSource": "react",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": false,
"skipLibCheck": true
},
"include": [
"src/**/*",
".docusaurus/**/*"
],
"exclude": [
"node_modules",
"build",
".docusaurus/dist"
]
} -
Run typecheck to see remaining errors:
cd classic
npm run typecheck 2>&1 | tee typecheck-errors.log
# This will show remaining errors after tsconfig fix -
Fix remaining errors one by one:
Error Group 1: Missing imports (3 files)
File:
src/components/SidebarOverlay/index.tsx// ERROR: Cannot find module '../../contexts/CMSContext'
// DECISION NEEDED:
// Option A: Create the missing CMSContext
// Option B: Remove CMSContext dependency (recommended if not used)
// If Option B, replace CMSContext usage with simple state:
import React, { useState } from 'react';
// Remove: import { useCMS } from '../../contexts/CMSContext';
// Replace with local state managementFile:
src/pages/download-integration.tsx// ERROR: Cannot find name 'FileText' (Line 631)
// FIX: Add missing import
import { FileText } from 'lucide-react';Error Group 2: Framer Motion type errors (5 occurrences)
File:
src/components/NXGENSphereHero.tsx// ERROR: Type '{ ease: string; duration: number; }' is not compatible
// BEFORE (Line 172):
const variants = {
animate: {
transition: {
ease: "easeInOut", // ❌ Wrong type
duration: 2
}
}
};
// AFTER:
const variants = {
animate: {
transition: {
ease: [0.645, 0.045, 0.355, 1.000], // ✅ Correct type (cubic bezier array)
duration: 2
}
}
};
// Search and replace all string easing values with arrays:
// "easeInOut" → [0.645, 0.045, 0.355, 1.000]
// "easeOut" → [0.16, 1, 0.3, 1]
// "easeIn" → [0.42, 0, 1, 1]Error Group 3: Chart.js global type (1 file)
File:
src/pages/quick-start/platform-overview.tsx// ERROR: Property 'Chart' does not exist on type 'Window'
// FIX: Add type declaration at top of file
declare global {
interface Window {
Chart: any;
}
}Error Group 4: Disabled component (can skip or fix)
File:
src/theme/DocCardList.disabled/index.tsx// ERROR: Property 'items' does not exist on type 'unknown'
// Since this component is .disabled, you can either:
// Option A: Skip fixing (it's disabled anyway)
// Option B: Add proper type annotation
// If Option B:
interface DocCardListProps {
items?: any[];
}
export default function DocCardList({ items }: DocCardListProps) {
// ...
} -
Run typecheck again to verify all fixed:
npm run typecheck
# Should show 0 errors or minimal acceptable errors -
Test build to ensure no runtime errors:
npm run build
# Should succeed
Deliverables:
- tsconfig.json updated with proper configuration
- All 22 TypeScript errors resolved
- typecheck command runs successfully (0 errors)
- Build succeeds without type-related errors
- Before/after error count documented
Report Back Format:
TASK CU-1 STATUS: ✅ COMPLETE
TypeScript Configuration:
✅ Updated tsconfig.json with proper types array
✅ Added jsx: "react-jsx" configuration
✅ Included all necessary type definitions
Errors Fixed:
1. JSX Namespace Errors: 14 → 0 (tsconfig fix)
2. Missing CMSContext: 1 → 0 (removed dependency)
3. Missing FileText import: 1 → 0 (added import)
4. Framer Motion type errors: 5 → 0 (fixed easing values)
5. Chart.js global: 1 → 0 (added type declaration)
6. DocCardList disabled: 1 → 0 (skipped - component disabled)
Before: 22 errors
After: 0 errors
Verification:
✅ npm run typecheck - 0 errors
✅ npm run build - SUCCESS (2m 10s)
Files Modified:
1. classic/tsconfig.json - Updated configuration
2. classic/src/components/SidebarOverlay/index.tsx - Removed CMSContext
3. classic/src/pages/download-integration.tsx - Added FileText import
4. classic/src/components/NXGENSphereHero.tsx - Fixed easing types
5. classic/src/pages/quick-start/platform-overview.tsx - Added Chart global
Issues/Blockers: None
TASK CU-2: Add XSS Protection to Storyblok Components 🔴 HIGH
Priority: P2 Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Add DOMPurify sanitization to prevent XSS attacks in Storyblok rich text rendering.
Detailed Instructions:
-
Verify DOMPurify is installed:
cd classic
grep "dompurify" package.json
# Should show: "dompurify": "^3.0.0" or similar
# If not installed:
npm install dompurify
npm install --save-dev @types/dompurify -
Update DocPage component with sanitization:
File:
classic/src/components/storyblok/DocPage.tsximport React from 'react';
import { storyblokEditable, renderRichText, SbBlokData } from '@storyblok/react';
import DOMPurify from 'dompurify'; // ← ADD THIS
import type { DocPage as DocPageType } from '../../../.storyblok/types/289434723537263/storyblok-components';
interface DocPageProps {
blok: DocPageType;
}
const DocPage: React.FC<DocPageProps> = ({ blok }) => {
// Render rich text content
const renderedBody = blok.body ? renderRichText(blok.body as any) : '';
// ← ADD SANITIZATION HERE
const sanitizedBody = DOMPurify.sanitize(renderedBody, {
ALLOWED_TAGS: [
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'p', 'br', 'hr',
'strong', 'em', 'u', 's', 'code', 'pre',
'ul', 'ol', 'li',
'a', 'img',
'blockquote',
'table', 'thead', 'tbody', 'tr', 'th', 'td',
'div', 'span'
],
ALLOWED_ATTR: [
'href', 'target', 'rel',
'src', 'alt', 'width', 'height',
'class', 'id'
],
ALLOW_DATA_ATTR: false
});
return (
<article {...storyblokEditable(blok as SbBlokData)} className="storyblok-doc-page">
{blok.title && <h1 className="doc-title">{blok.title}</h1>}
{blok.description && (
<p className="doc-description">{blok.description}</p>
)}
{sanitizedBody && (
<div
className="doc-content"
dangerouslySetInnerHTML={{ __html: sanitizedBody }} // ← USE SANITIZED VERSION
/>
)}
</article>
);
};
export default DocPage; -
Update Page component (if it uses rich text):
File:
classic/src/components/storyblok/Page.tsximport React from 'react';
import { storyblokEditable, SbBlokData } from '@storyblok/react';
import DOMPurify from 'dompurify'; // ← ADD THIS
import type { Page as PageType } from '../../../.storyblok/types/289434723537263/storyblok-components';
interface PageProps {
blok: PageType;
}
const Page: React.FC<PageProps> = ({ blok }) => {
// Sanitize body if it contains HTML
const sanitizedBody = blok.body ? DOMPurify.sanitize(blok.body) : '';
return (
<div {...storyblokEditable(blok as SbBlokData)} className="storyblok-page">
{blok.title && <h1>{blok.title}</h1>}
{sanitizedBody && (
<div
className="page-content"
dangerouslySetInnerHTML={{ __html: sanitizedBody }}
/>
)}
</div>
);
};
export default Page; -
Create sanitization utility (optional but recommended):
New File:
classic/src/lib/sanitize.tsimport DOMPurify from 'dompurify';
/**
* Sanitize HTML content to prevent XSS attacks
* Uses DOMPurify with strict allowlist
*/
export function sanitizeHTML(html: string): string {
return DOMPurify.sanitize(html, {
ALLOWED_TAGS: [
// Headings
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
// Text formatting
'p', 'br', 'hr', 'strong', 'em', 'u', 's', 'code', 'pre',
// Lists
'ul', 'ol', 'li',
// Links and media
'a', 'img',
// Quotes and blocks
'blockquote',
// Tables
'table', 'thead', 'tbody', 'tr', 'th', 'td',
// Containers
'div', 'span'
],
ALLOWED_ATTR: [
'href', 'target', 'rel',
'src', 'alt', 'width', 'height',
'class', 'id'
],
ALLOW_DATA_ATTR: false,
FORCE_BODY: true
});
}
/**
* Sanitize rich text from Storyblok
*/
export function sanitizeRichText(richTextHTML: string): string {
return sanitizeHTML(richTextHTML);
}Then update components to use utility:
import { sanitizeRichText } from '../../lib/sanitize';
const sanitizedBody = sanitizeRichText(renderedBody); -
Test sanitization:
# Build should succeed
npm run build
# Test that XSS attempts are blocked:
# In Storyblok, try adding: <script>alert('XSS')</script>
# Should be stripped out when rendered
Deliverables:
- DOMPurify installed and configured
- DocPage component sanitizes rich text
- Page component sanitizes HTML
- Sanitization utility created (optional)
- XSS protection tested and verified
- Build succeeds with sanitization
Report Back Format:
TASK CU-2 STATUS: ✅ COMPLETE
DOMPurify Installation:
✅ dompurify@3.0.0 installed
✅ @types/dompurify installed
Components Updated:
1. classic/src/components/storyblok/DocPage.tsx
- Added DOMPurify sanitization
- Configured strict allowlist (18 allowed tags)
- Sanitizes before dangerouslySetInnerHTML
2. classic/src/components/storyblok/Page.tsx
- Added DOMPurify sanitization
- Handles plain HTML body field
3. classic/src/lib/sanitize.ts (NEW)
- Created reusable sanitization utility
- Consistent configuration across components
- Documentation included
XSS Protection Testing:
✅ Tested <script> tag injection - BLOCKED
✅ Tested onclick handler injection - BLOCKED
✅ Tested data: URI in img src - BLOCKED
✅ Allowed tags render correctly (headings, links, images)
Verification:
✅ npm run build - SUCCESS
✅ TypeScript compilation - No errors
✅ XSS attempts properly sanitized
Issues/Blockers: None
TASK CU-3: Improve Storyblok Page Component Rich Text Rendering 🟡 MEDIUM
Priority: P2 Estimated Time: 0.5 hours Status: 🔴 NOT STARTED
Objective: Fix Page component to properly render rich text like DocPage does.
Detailed Instructions:
-
Check current Page component implementation:
// Current issue: blok.body is displayed raw, not rendered as HTML
{blok.body && (
<div className="page-content">
{blok.body} // ← This just shows raw text/HTML
</div>
)} -
Check Storyblok schema for Page component:
# Check what type 'body' field is
cat classic/.storyblok/components/289434723537263/components.json | grep -A 20 '"name": "page"'
# Look for body field type:
# - If "plugin": "richtext" → needs renderRichText()
# - If "type": "text" → can use as plain text
# - If "type": "textarea" → can use as plain text or markdown -
Update Page component based on body field type:
Option A: If body is rich text (like DocPage):
import React from 'react';
import { storyblokEditable, renderRichText, SbBlokData } from '@storyblok/react';
import DOMPurify from 'dompurify';
import type { Page as PageType } from '../../../.storyblok/types/289434723537263/storyblok-components';
interface PageProps {
blok: PageType;
}
const Page: React.FC<PageProps> = ({ blok }) => {
// Render and sanitize rich text
const renderedBody = blok.body ? renderRichText(blok.body as any) : '';
const sanitizedBody = DOMPurify.sanitize(renderedBody);
return (
<div {...storyblokEditable(blok as SbBlokData)} className="storyblok-page">
{blok.title && <h1>{blok.title}</h1>}
{sanitizedBody && (
<div
className="page-content"
dangerouslySetInnerHTML={{ __html: sanitizedBody }}
/>
)}
</div>
);
};
export default Page;Option B: If body is plain text:
const Page: React.FC<PageProps> = ({ blok }) => {
return (
<div {...storyblokEditable(blok as SbBlokData)} className="storyblok-page">
{blok.title && <h1>{blok.title}</h1>}
{blok.body && (
<div className="page-content">
<p>{blok.body}</p> {/* Plain text, no HTML rendering */}
</div>
)}
</div>
);
};Option C: If body is markdown:
import ReactMarkdown from 'react-markdown';
const Page: React.FC<PageProps> = ({ blok }) => {
return (
<div {...storyblokEditable(blok as SbBlokData)} className="storyblok-page">
{blok.title && <h1>{blok.title}</h1>}
{blok.body && (
<div className="page-content">
<ReactMarkdown>{blok.body}</ReactMarkdown>
</div>
)}
</div>
);
}; -
Test the Page component:
# Build should succeed
npm run build
# Test in Storyblok:
# 1. Create a test Page story in Storyblok
# 2. Add content to the body field
# 3. Preview should render correctly (not show raw HTML/text)
Deliverables:
- Page component body field type identified
- Page component updated with correct rendering method
- Sanitization applied if rendering HTML
- Build succeeds
- Component tested with Storyblok preview
Report Back Format:
TASK CU-3 STATUS: ✅ COMPLETE
Investigation:
- Checked Storyblok schema for Page component
- Body field type: [richtext/text/textarea]
- Current behavior: Raw text display (incorrect)
Implementation:
- Updated Page component to use [renderRichText/plain text/markdown]
- Added DOMPurify sanitization (if HTML rendering)
- Improved component structure
Files Modified:
1. classic/src/components/storyblok/Page.tsx - Fixed body rendering
Verification:
✅ npm run build - SUCCESS
✅ Created test Page story in Storyblok
✅ Preview renders correctly (not raw HTML)
✅ Sanitization working (tested XSS attempt)
Issues/Blockers: None
TASK CU-4: Fix or Remove Broken Components 🟡 MEDIUM
Priority: P2 Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Address recently deleted components and components with errors.
Detailed Instructions:
-
Investigate deleted FloatingDarkModeToggle:
# Check git history to see why it was deleted
git log --oneline --all -- classic/src/components/FloatingDarkModeToggle/
git show <commit-hash> # View deletion commit
# Check if functionality was moved elsewhere
grep -r "dark.*mode.*toggle" classic/src/theme/
grep -r "DarkModeToggle" classic/src/Actions based on findings:
- If functionality moved to theme → Document in comments
- If functionality lost → Consider if it needs to be restored
- If intentional deletion → Verify dark mode still works
-
Investigate deleted FloatingLanguageToggle:
# Check git history
git log --oneline --all -- classic/src/components/FloatingLanguageToggle/
# Check if language switching still works
grep -r "language.*toggle" classic/src/
grep -r "LanguageToggle" classic/src/Actions:
- Verify language switching functionality exists elsewhere
- Test language switching in browser
- Document if intentional deletion
-
Fix SidebarOverlay missing CMSContext:
File:
classic/src/components/SidebarOverlay/index.tsxDecision: Remove CMSContext dependency (already done in TASK CU-1)
// If CMSContext was for sidebar state, use local state instead:
import React, { useState } from 'react';
interface SidebarOverlayProps {
isOpen: boolean;
onClose: () => void;
}
const SidebarOverlay: React.FC<SidebarOverlayProps> = ({ isOpen, onClose }) => {
if (!isOpen) return null;
return (
<div className="sidebar-overlay" onClick={onClose}>
{/* Overlay content */}
</div>
);
};
export default SidebarOverlay; -
Check if SidebarOverlay is actually used:
# Search for SidebarOverlay usage
grep -r "SidebarOverlay" classic/src/ --exclude-dir=node_modules
# If not used anywhere:
# Consider deleting the component entirely -
Review DocCardList.disabled:
# Check why it's disabled
git log --oneline -- classic/src/theme/DocCardList.disabled/
# Options:
# A. Try to re-enable if issues are fixed
# B. Delete if permanently unused
# C. Keep disabled but fix TypeScript errors for future use -
Test UI components:
# Start dev server
npm start
# Open browser and test:
# - Dark mode toggle (should work)
# - Language switching (should work)
# - Sidebar overlay (if used)
# - Doc card lists (on doc pages)
Deliverables:
- FloatingDarkModeToggle deletion investigated and documented
- FloatingLanguageToggle deletion investigated and documented
- SidebarOverlay CMSContext dependency removed or component deleted
- DocCardList.disabled decision made (fix/delete/keep)
- All UI components tested in browser
- Dark mode and language switching verified working
Report Back Format:
TASK CU-4 STATUS: ✅ COMPLETE
Deleted Components Investigation:
1. FloatingDarkModeToggle:
- Deleted in commit: abc1234 on 2025-12-27
- Reason: Functionality moved to Docusaurus theme toggle
- Current status: ✅ Dark mode works via theme toggle
- Action: No restoration needed
2. FloatingLanguageToggle:
- Deleted in commit: abc1234 on 2025-12-27
- Reason: Functionality moved to navbar language dropdown
- Current status: ✅ Language switching works via navbar
- Action: No restoration needed
Component Fixes:
3. SidebarOverlay:
- Removed CMSContext dependency
- Checked usage: NOT USED anywhere in codebase
- Decision: DELETED component (not needed)
- File removed: classic/src/components/SidebarOverlay/
4. DocCardList.disabled:
- Status: Kept disabled for now
- Reason: SSG errors per documentation
- Action: Fixed TypeScript errors for future re-enabling
- Can be re-enabled when SSG issues resolved
UI Testing:
✅ Dark mode toggle - Working (theme toggle in navbar)
✅ Language switching - Working (navbar dropdown)
✅ Sidebar - Working (no overlay needed)
✅ Doc cards - Render correctly on documentation pages
Files Modified:
1. Deleted: classic/src/components/SidebarOverlay/ (not used)
2. Updated: classic/src/theme/DocCardList.disabled/ (TypeScript fixes)
Issues/Blockers: None
☁️ AMAZON Q AGENT TASKS
TASK AQ-1: Update Security-Critical Dependencies 🔴 HIGH
Priority: P2 Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Update security-critical packages to latest versions, especially DOMPurify and other security libraries.
Detailed Instructions:
-
Check current versions:
cd classic
npm outdated
# Note all outdated packages -
Update security-critical packages (HIGH PRIORITY):
# DOMPurify (XSS protection)
npm update dompurify
# Should update to 3.2.0 or later
# Check for other security packages:
npm audit
npm audit fix -
Update Docusaurus to latest patch version (MEDIUM PRIORITY):
# Update all Docusaurus packages
npm update @docusaurus/core@3.9.2
npm update @docusaurus/preset-classic@3.9.2
npm update @docusaurus/theme-mermaid@3.9.2
npm update @docusaurus/plugin-client-redirects@3.9.2
npm update @docusaurus/plugin-content-docs@3.9.2
npm update @docusaurus/plugin-content-blog@3.9.2
npm update @docusaurus/plugin-content-pages@3.9.2
# Or use single command:
npm update @docusaurus/core @docusaurus/preset-classic @docusaurus/theme-mermaid -
Update Storyblok packages (LOW PRIORITY):
npm update @storyblok/react
npm update storyblok-js-client -
Update Algolia search (MEDIUM PRIORITY):
# Check current version
npm list algoliasearch
# Algolia 4 → 5 is a MAJOR version upgrade
# Skip for now if build is working
# Document for future upgrade:
echo "TODO: Plan Algolia v5 upgrade" >> classic/docs/internal/upgrade-todos.md -
DO NOT update React (breaking changes):
# React 18 → 19 has breaking changes
# Keep React 18 for now
# Document in upgrade plan:
echo "TODO: Plan React 19 upgrade (test for breaking changes)" >> classic/docs/internal/upgrade-todos.md -
Test after updates:
# Clean install
rm -rf node_modules package-lock.json
npm install
# Run typecheck
npm run typecheck
# Run build
npm run build
# Test dev server
npm start
# Open http://localhost:3000 and click around -
Document updates:
# Create update log
npm list --depth=0 > updated-dependencies.txt
git add package.json package-lock.json updated-dependencies.txt
git commit -m "chore: Update security-critical dependencies
- Updated DOMPurify to latest version
- Updated Docusaurus to 3.9.2 (bug fixes)
- Ran security audit and fixed vulnerabilities
- Tested build and dev server
🤖 Generated with Amazon Q"
Deliverables:
- Security audit run and vulnerabilities fixed
- DOMPurify updated to latest
- Docusaurus updated to 3.9.2
- All tests passed (typecheck, build, dev server)
- package.json and package-lock.json updated
- Upgrade plan documented for React 19 and Algolia v5
- Changes committed
Report Back Format:
TASK AQ-1 STATUS: ✅ COMPLETE
Dependency Updates:
Security-Critical (UPDATED):
- dompurify: 3.0.0 → 3.2.1 ✅
- react-helmet: X.X.X → X.X.X ✅
- [other security packages]
Docusaurus (UPDATED):
- @docusaurus/core: 3.8.1 → 3.9.2 ✅
- @docusaurus/preset-classic: 3.8.1 → 3.9.2 ✅
- @docusaurus/theme-mermaid: 3.8.1 → 3.9.2 ✅
Storyblok (UPDATED):
- @storyblok/react: X.X.X → X.X.X ✅
- storyblok-js-client: X.X.X → X.X.X ✅
Deferred for Future:
- React: 18.3.1 (keep) - React 19 requires testing
- algoliasearch: 4.25.3 (keep) - v5 is major upgrade
- Documented in: docs/internal/upgrade-todos.md
Security Audit:
✅ npm audit - 0 high severity vulnerabilities
✅ npm audit fix - Applied automatic fixes
⚠️ X moderate vulnerabilities (acceptable for now)
Verification:
✅ npm run typecheck - 0 errors
✅ npm run build - SUCCESS (2m 18s)
✅ npm start - Dev server working
✅ Tested in browser - All features working
Commit:
✅ Committed as: chore: Update security-critical dependencies (xyz1234)
Issues/Blockers: None
TASK AQ-2: Verify Netlify Deployment & Environment Variables 🔴 HIGH
Priority: P1 (after CC-1 completes) Status: 🔴 NOT STARTED
Objective: Update Netlify dashboard with new credentials and verify deployment works.
Detailed Instructions:
-
Wait for Claude Code Agent to complete TASK CC-1:
- You will need the NEW credentials generated in CC-1
- Do not proceed until CC-1 is marked ✅ COMPLETE
-
Login to Netlify dashboard:
URL: https://app.netlify.com
Site: gcxone.netlify.app (or current site) -
Update environment variables with NEW credentials:
Navigate to: Site Settings → Environment Variables
DELETE old variables (exposed credentials):
❌ Remove: STORYBLOK_ACCESS_TOKEN (old value)
❌ Remove: STORYBLOK_MANAGEMENT_TOKEN (old value)
❌ Remove: SMTP_USER (old value)
❌ Remove: SMTP_PASS (old value)
❌ Remove: HYGRAPH_TOKEN (old value)
ADD new variables (from CC-1):
✅ Add: STORYBLOK_ACCESS_TOKEN = [NEW_TOKEN_FROM_CC1]
✅ Add: STORYBLOK_MANAGEMENT_TOKEN = [NEW_TOKEN_FROM_CC1]
✅ Add: STORYBLOK_REGION = eu
✅ Add: STORYBLOK_SPACE_ID = 289434723537263
✅ Add: STORYBLOK_IS_PREVIEW = false (production mode)
✅ Add: SMTP_USER = [NEW_USER_FROM_CC1]
✅ Add: SMTP_PASS = [NEW_PASS_FROM_CC1]
Optional (if using Hygraph):
✅ Add: HYGRAPH_TOKEN = [NEW_TOKEN_FROM_CC1]
✅ Add: HYGRAPH_AS_SOURCE = false (using Storyblok instead) -
Trigger manual deploy to test new environment variables:
Navigate to: Deploys → Trigger deploy → Deploy site
Watch build log:
- Should fetch Storyblok content successfully
- Should build without errors
- Should deploy successfully -
Verify build log doesn't expose secrets:
Check build log:
✅ No API tokens visible in logs
✅ No passwords visible in logs
✅ Environment variables loaded correctly
✅ Build succeeds -
Test deployed site:
Open: https://gcxone.netlify.app (or your production URL)
Test:
✅ Site loads correctly
✅ Documentation pages work
✅ Search works (Algolia)
✅ Images load
✅ No console errors
✅ Feedback widget works (tests SMTP) -
Configure deploy notifications (optional but recommended):
Navigate to: Site Settings → Notifications
Add:
- Deploy succeeded notification (email or Slack)
- Deploy failed notification (email or Slack) -
Document Netlify configuration:
# Create Netlify configuration document
cat > classic/docs/internal/NETLIFY_SETUP.md <<'EOF'
# Netlify Configuration
## Site Information
- Site Name: gcxone
- URL: https://gcxone.netlify.app
- Production URL: https://docs.nxgen.cloud
- Git Repository: [GitLab URL]
## Environment Variables
Required for Production:
- STORYBLOK_ACCESS_TOKEN - Storyblok public API token
- STORYBLOK_MANAGEMENT_TOKEN - Storyblok management API token
- STORYBLOK_REGION - eu
- STORYBLOK_SPACE_ID - 289434723537263
- STORYBLOK_IS_PREVIEW - false
- SMTP_USER - Email service username
- SMTP_PASS - Email service password
- NODE_VERSION - 18 (set in netlify.toml)
Optional:
- HYGRAPH_TOKEN - Only if using Hygraph
- HYGRAPH_AS_SOURCE - false (we use Storyblok)
## Build Settings
- Build command: npm run sync:storyblok:safe && npm run build
- Publish directory: build
- Node version: 18
## Deploy Settings
- Auto-deploy: Enabled (on push to main)
- Deploy previews: Enabled (on pull requests)
- Branch deploys: Disabled
## Notifications
- Deploy succeeded: [Email/Slack]
- Deploy failed: [Email/Slack]
## Last Updated
2025-12-28
EOF
Deliverables:
- All old environment variables removed from Netlify
- All new credentials added to Netlify dashboard
- Manual deploy triggered and succeeded
- Build log verified (no exposed secrets)
- Production site tested and working
- Deploy notifications configured
- Netlify configuration documented
Report Back Format:
TASK AQ-2 STATUS: ✅ COMPLETE
Netlify Dashboard Updates:
Environment Variables:
❌ Removed 5 old variables (exposed credentials)
✅ Added 7 new variables (fresh credentials)
✅ Set STORYBLOK_IS_PREVIEW = false (production mode)
Variables Configured:
- STORYBLOK_ACCESS_TOKEN: ✅ Set (new token)
- STORYBLOK_MANAGEMENT_TOKEN: ✅ Set (new token)
- STORYBLOK_REGION: ✅ eu
- STORYBLOK_SPACE_ID: ✅ 289434723537263
- STORYBLOK_IS_PREVIEW: ✅ false
- SMTP_USER: ✅ Set (new credentials)
- SMTP_PASS: ✅ Set (new credentials)
Deployment Test:
✅ Manual deploy triggered
✅ Build time: 5m 23s
✅ Build succeeded (exit code 0)
✅ No secrets exposed in build log
✅ Deploy successful
Production Site Verification:
URL: https://gcxone.netlify.app
✅ Site loads correctly
✅ Documentation pages render
✅ Search functionality works
✅ Images load correctly
✅ No console errors
✅ Feedback widget works (SMTP tested)
Deploy Notifications:
✅ Configured email notifications for:
- Deploy succeeded → team@example.com
- Deploy failed → team@example.com
Documentation:
✅ Created classic/docs/internal/NETLIFY_SETUP.md
Issues/Blockers: None
TASK AQ-3: Verify Device Documentation Links 🟡 MEDIUM
Priority: P3 Estimated Time: 1 hour Status: 🔴 NOT STARTED
Objective: Check all device integration hub links and identify broken links to missing documentation.
Detailed Instructions:
-
Extract all device links from integration-hub page:
cd classic
# Extract device links
grep -oP 'href="/docs/devices/[^"]+' src/pages/integration-hub.tsx > device-links.txt
# Count total links
wc -l device-links.txt
# Should show ~50 device links -
Check which documentation files exist:
# Create script to check links
cat > check-device-links.sh <<'EOF'
#!/bin/bash
echo "Checking device documentation links..."
echo ""
missing_count=0
existing_count=0
while IFS= read -r link; do
# Remove /docs prefix and add .md extension
file_path="docs${link#/docs}.md"
if [ -f "$file_path" ]; then
echo "✅ EXISTS: $link"
((existing_count++))
else
echo "❌ MISSING: $link (expected: $file_path)"
((missing_count++))
fi
done < device-links.txt
echo ""
echo "Summary:"
echo "✅ Existing: $existing_count"
echo "❌ Missing: $missing_count"
echo "📊 Total: $((existing_count + missing_count))"
EOF
chmod +x check-device-links.sh
bash check-device-links.sh > device-links-report.txt
cat device-links-report.txt -
Create list of missing documentation:
# Extract just the missing links
grep "MISSING" device-links-report.txt > missing-device-docs.txt
# Count missing
wc -l missing-device-docs.txt -
Create placeholder pages for critical missing docs:
# Create script to generate placeholder pages
cat > create-placeholders.sh <<'EOF'
#!/bin/bash
# Read missing docs and create placeholders
while IFS= read -r line; do
# Extract file path
file_path=$(echo "$line" | grep -oP 'expected: \K[^)]+')
if [ ! -f "$file_path" ]; then
# Create directory if needed
mkdir -p "$(dirname "$file_path")"
# Extract device name and page type
device=$(echo "$file_path" | grep -oP 'devices/\K[^/]+')
page=$(basename "$file_path" .md)
# Create placeholder content
cat > "$file_path" <<PLACEHOLDER
---
id: $page
title: $(echo $device | tr '[:lower:]' '[:upper:]') - $(echo $page | sed 's/-/ /g' | sed 's/\b\(.\)/\u\1/g')
sidebar_label: $(echo $page | sed 's/-/ /g' | sed 's/\b\(.\)/\u\1/g')
---
# $(echo $device | tr '[:lower:]' '[:upper:]') - $(echo $page | sed 's/-/ /g' | sed 's/\b\(.\)/\u\1/g')
:::info[Coming Soon]
Documentation for this device is currently being developed.
:::
## Overview
This page will contain detailed information about $(echo $device | tr '[:lower:]' '[:upper:]') $page.
## Available Resources
For immediate assistance, please:
- Contact NXGEN support
- Check general device integration guides
- Review manufacturer documentation
---
*Last updated: $(date +%Y-%m-%d)*
PLACEHOLDER
echo "✅ Created placeholder: $file_path"
fi
done < missing-device-docs.txt
EOF
chmod +x create-placeholders.sh
# DON'T RUN YET - get approval first -
Run link checker tool (optional):
# Install markdown-link-check
npm install -g markdown-link-check
# Check all docs
find docs -name "*.md" -exec markdown-link-check {} \; > link-check-report.txt
# Summarize broken links
grep "✖" link-check-report.txt | wc -l -
Create report for business team:
cat > DEVICE_DOCUMENTATION_STATUS.md <<'EOF'
# Device Documentation Status Report
**Generated:** $(date)
**Total Devices:** 48
## Summary
- ✅ Complete Documentation: X devices
- ⚠️ Partial Documentation: Y devices
- ❌ Missing Documentation: Z devices
## Complete Documentation
[List devices with all pages: overview, installer-configuration, admin-configuration, troubleshooting]
## Partial Documentation
[List devices with some pages missing]
## Missing Documentation
[List devices with no pages or minimal pages]
## Recommendations
1. Create placeholder pages for all missing docs (prevents 404 errors)
2. Prioritize top 10 most-used devices for complete documentation
3. Set up documentation queue for technical writing team
## Action Items
- [ ] Create placeholders for all missing device docs
- [ ] Identify top 10 priority devices (by usage analytics)
- [ ] Create device documentation templates
- [ ] Assign documentation tasks to technical writers
EOF
Deliverables:
- All device links extracted and checked
- Report generated showing existing vs missing docs
- List of missing documentation created
- Placeholder creation script prepared (not run yet)
- Link checker report generated
- Device documentation status report for business team
- Recommendations documented
Report Back Format:
TASK AQ-3 STATUS: ✅ COMPLETE
Device Link Analysis:
Total Device Links: 52
✅ Existing Documentation: 34 (65%)
❌ Missing Documentation: 18 (35%)
Missing Documentation Breakdown:
- overview.md: 8 missing
- installer-configuration.md: 4 missing
- admin-configuration.md: 12 missing
- troubleshooting.md: 6 missing
Critical Missing Devices (high priority):
1. /docs/devices/adpro/overview.md
2. /docs/devices/spykebox/overview.md
3. /docs/devices/miwi/overview.md
[... more]
Link Checker Results:
- Total links checked: 523
- ✅ Valid links: 498 (95%)
- ❌ Broken links: 25 (5%)
Deliverables Created:
✅ device-links.txt - All extracted links
✅ device-links-report.txt - Detailed check results
✅ missing-device-docs.txt - List of missing files
✅ create-placeholders.sh - Script to create placeholders
✅ link-check-report.txt - Full link validation report
✅ DEVICE_DOCUMENTATION_STATUS.md - Status report for business team
Recommendations:
1. Run placeholder creation script (18 files)
2. Prioritize top 10 devices for full documentation
3. Set up documentation workflow for technical writers
Issues/Blockers:
⚠️ Placeholder script ready but NOT executed (awaiting approval)
📊 PROGRESS TRACKING
Overall Progress
- Claude Code Tasks: 0/3 complete (0%)
- Cursor Tasks: 0/4 complete (0%)
- Amazon Q Tasks: 0/3 complete (0%)
Total Progress: 0/10 tasks (0%)
🚦 DEPENDENCIES & COORDINATION
Critical Path (Must be done in order):
-
CC-1 (Security credential rotation) → AQ-2 (Netlify deployment)
- AQ-2 CANNOT start until CC-1 is complete
- AQ-2 needs new credentials from CC-1
-
CU-1 (TypeScript fixes) → All Cursor tasks
- Fix TypeScript config first, then other code fixes
- Reduces cascading errors
-
CC-3 (Clean up & commits) → Should be LAST
- All other tasks should be complete first
- Final cleanup and commit organization
Parallel Work (Can be done simultaneously):
Group 1: Security (P1)
- CC-1: Security credential rotation (Claude Code)
- CC-2: Purge .env.local from git (Claude Code)
Group 2: Code Quality (P2)
- CU-1: TypeScript fixes (Cursor)
- CU-2: XSS protection (Cursor)
- CU-3: Storyblok component improvements (Cursor)
- CU-4: Fix broken components (Cursor)
- AQ-1: Dependency updates (Amazon Q)
Group 3: Verification (P2-P3)
- AQ-2: Netlify deployment (Amazon Q) - DEPENDS ON CC-1
- AQ-3: Device link verification (Amazon Q)
Group 4: Final Cleanup (P2)
- CC-3: Clean up and commits (Claude Code) - SHOULD BE LAST
🔄 STATUS UPDATE PROTOCOL
When Starting a Task:
## [Agent Name] - Starting TASK XX-X
**Status:** 🟡 IN PROGRESS
**Started:** [Timestamp]
**Expected Completion:** [Estimate]
When Completing a Task:
## [Agent Name] - Completed TASK XX-X
**Status:** ✅ COMPLETE
**Completed:** [Timestamp]
**Time Taken:** [Actual]
[Use "Report Back Format" template from task instructions]
When Blocked:
## [Agent Name] - BLOCKED on TASK XX-X
**Status:** ⚠️ BLOCKED
**Blocker:** [Description]
**Waiting For:** [What's needed to unblock]
**Impact:** [What this delays]
🎯 SUCCESS CRITERIA
All tasks complete when:
✅ Security (P1)
- All hardcoded credentials removed from codebase
- All credentials rotated (new values generated)
- .env.local purged from git history
- Netlify environment variables updated with new credentials
- No secrets exposed in build logs or source code
✅ Code Quality (P2)
- TypeScript compilation: 0 errors
- XSS protection: DOMPurify sanitization added
- All Storyblok components properly implemented
- Broken components fixed or removed
- Dependencies updated (security-critical)
✅ Deployment (P2)
- Netlify build succeeds with new credentials
- Production site working correctly
- All tests passed (build, typecheck, manual testing)
✅ Documentation (P3)
- Device documentation status report created
- Broken links identified
- Placeholder creation plan ready
✅ Git Hygiene (P2)
- All test files removed
- Changes committed in logical groups
- Git history clean (no .env.local)
- All changes pushed to remote
📋 HANDOVER CHECKLIST
Before declaring "Ready for Business Handover":
Technical Checklist
- All P1 (CRITICAL) tasks complete
- All P2 (HIGH) tasks complete
- Build succeeds on Netlify
- Production site tested and working
- No exposed credentials in codebase or git history
- TypeScript compilation passes
- No critical errors in console
Documentation Checklist
- NETLIFY_SETUP.md created
- DEVICE_DOCUMENTATION_STATUS.md created
- All task completion reports in this file
- Upgrade plan documented (React 19, Algolia v5)
Verification Checklist
- Site loads: https://gcxone.netlify.app
- Documentation pages render correctly
- Search works (Algolia)
- Storyblok integration works
- Feedback widget works (SMTP)
- Dark mode toggle works
- Language switching works
🆘 ESCALATION
If any agent encounters:
- Blocker that can't be resolved in 30 minutes
- Security concern during implementation
- Breaking changes from dependency updates
- Git history issues during purge
STOP and report immediately to user for guidance.
Last Updated: 2025-12-28 Status: 🔴 NOT STARTED Target Completion: Within 11 hours (parallelized)