Prerequisites
- Node.js 18+ installed
- npm installed
- Git clone of the repository
-
(Optional) API keys for AI providers:
OPENAI_API_KEY,ANTHROPIC_API_KEY
Install Dependencies
npm install
Build the Project
npm run build
Start in Demo Mode
npm run dev:demo
Uses demo-safe defaults (including local embeddings) and starts on port 3000 by default with automatic fallback to 3001/3002 if occupied.
Verify
-
Open
http://localhost:3000/squire-v2-media-demo/index.htmlin your browser - You should see the demo landing page with Watch / Click / Read tracks
-
If the server auto-falls back to another port, check the
.server-portfile in the repo root.
Tier 1 + Tier 2 + MCP Tier 3 API Smoke Tests
Run these commands in a second terminal while the app is running.
Create a dev JWT for compliance endpoints:
TOKEN=$(node -e "const jwt=require('jsonwebtoken');console.log(jwt.sign({sub:'demo-user',username:'demo',roles:['admin'],permissions:['*']},process.env.JWT_SECRET||'test-jwt-secret-for-development-only',{expiresIn:'1h'}));")
Tier 1 checks:
curl -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/compliance/summary
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"format":"json"}' http://localhost:3000/api/compliance/export
Tier 2 checks:
curl http://localhost:3000/api/context/netsuite/vendor/V-001
curl http://localhost:3000/api/ai/proxy/mcp/tools
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
http://localhost:3000/api/ai/proxy/mcp
MCP Tier 3 checks:
# Gateway discovery (when MCP_GATEWAY_ENABLED=true)
curl -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"suitecentral.mcp_discover","arguments":{}}}' \
http://localhost:3000/api/ai/proxy/mcp
# Tenant MCP policy snapshot (auth required)
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:3000/api/mcp/policies
Scripted contract/smoke verification:
npm run mcp:contract
npm run mcp:smoke
NL Action Gate: Parse → Propose → Approve → Execute
This verifies the Tier 2 live action flow (not stubbed behavior).
1) Parse intent:
curl -s -X POST -H "Content-Type: application/json" \
-d '{"input":"cancel subscription SUB-001"}' \
http://localhost:3000/api/nl-action-gate/parse
2) Propose action:
curl -s -X POST -H "Content-Type: application/json" \
-d '{"input":"cancel subscription SUB-001"}' \
http://localhost:3000/api/nl-action-gate/propose
3) Approve and execute (replace ACTION_ID):
curl -s -X POST -H "Content-Type: application/json" \
-d '{"userId":"demo-user"}' \
http://localhost:3000/api/nl-action-gate/actions/ACTION_ID/approve
curl -s -X POST \
http://localhost:3000/api/nl-action-gate/actions/ACTION_ID/execute
If no active/pending subscription exists for the demo ID, the request still proves service dispatch through structured error codes.
Troubleshooting
"Cannot GET" errors
HTML files must be registered in src/middleware/setup/RouteSetup.ts. Add the filename to the htmlFiles array and rebuild.
Port conflicts
Kill zombie processes:
# Windows
taskkill /F /IM node.exe
# Unix / WSL
pkill -f "node.*index"
AI features without API keys
Demo mode provides deterministic fallback data for all AI-powered features. No API keys are required to explore the demo.
Optional: Docker
docker-compose up --build
# Access at http://localhost:3003
Docker always uses port 3003 to avoid WSL2 port conflicts.