AI Engineering modules and deployment for Org Pulse, an internal engineering dashboard connecting Jira, GitHub, and GitLab data with team rosters to surface delivery insights.
This repo contains AI Eng-specific modules, platform customizations, and deployment overlays. The core platform (@org-pulse/core) is installed as an npm dependency.
Run the app with sample data — no credentials needed:
npm install
npm run setup # Symlinks core platform files into the workspace
echo "DEMO_MODE=true" > .env
echo "VITE_DEMO_MODE=true" >> .env
npm run dev:fullOpen http://localhost:5173.
For real Jira and GitHub data:
- Node.js 22+
- Red Hat VPN (required for LDAP roster sync)
- @redhat.com Google account
npm install
npm run setup # Symlinks core platform files into the workspacecp .env.example .envEdit .env with your credentials:
# Required
JIRA_EMAIL=you@redhat.com
JIRA_TOKEN=your-jira-api-token # From https://id.atlassian.com/manage-profile/security/api-tokens
ADMIN_EMAILS=you@redhat.com
# Optional — GitHub contribution stats
GITHUB_TOKEN=your-github-classic-pat # Classic PAT with read:user scope
# Optional — automated roster sync from Google Sheets
GOOGLE_SERVICE_ACCOUNT_KEY_FILE=./secrets/google-sa-key.json
# Optional — Workflow Validation (backend only; read-only account)
WORKFLOW_VALIDATION_OPENSEARCH_URL=https://your-opensearch-api.example.com
WORKFLOW_VALIDATION_OPENSEARCH_USERNAME=your-read-only-username
WORKFLOW_VALIDATION_OPENSEARCH_PASSWORD=your-read-only-passwordOpenSearch credentials are consumed only by the Express backend. The Vue app
calls the module API and must never receive or query OpenSearch with them. An
unauthenticated local POC remains available by setting only
WORKFLOW_VALIDATION_OPENSEARCH_URL=http://localhost:9200.
Jira API Token: Go to https://id.atlassian.com/manage-profile/security/api-tokens, click "Create API token", and paste the value as JIRA_TOKEN.
GitHub Token: Create a classic Personal Access Token (not fine-grained — GraphQL API doesn't support those yet) at https://github.com/settings/tokens with the read:user scope.
Google Service Account (for roster sync): See Google Service Account Setup below.
npm run dev:fullThis starts both the Vite frontend (port 5173) and the Express backend (port 3001). Vite proxies /api requests to the backend.
- Frontend: http://localhost:5173
- API: http://localhost:3001/api
Set PRODUCT_BUILDS_API_URL in .env, or the Product Builds API URL in
Settings, to a dashboard service that exposes GET /channels and
GET /channels/{name}. Restart the Express server after changing .env.
The Channels view reads its catalog, package versions and base-image history
through that service. A configured URL is used even when the rest of Org Pulse
runs in demo mode. Only an unconfigured demo uses sample channels; failed
dashboard requests remain errors.
The page labels dashboard data and its catalog update date. An empty build history and missing wheel classifications are displayed as supplied by the dashboard. The catalog update date does not guarantee every package index was refreshed successfully.
On first launch, a yellow banner will appear directing you to Settings. There you can configure:
- Org roots — LDAP UIDs of org leaders whose teams you want to track (e.g.,
shgriffi) - Google Sheet ID — The spreadsheet ID from the Google Sheets URL (the long alphanumeric string). Sheet names are auto-discovered.
Click "Sync Now" to populate the roster. The app will also sync automatically once every 24 hours.
To use the Google Sheets roster sync:
- Go to the Google Cloud Console
- Create or select a project
- Enable the Google Sheets API (APIs & Services > Library)
- Create a Service Account (APIs & Services > Credentials > Create Credentials)
- Create a JSON key for the service account and download it
- Place the key file at
secrets/google-sa-key.json(this path is gitignored) - Set
GOOGLE_SERVICE_ACCOUNT_KEY_FILE=./secrets/google-sa-key.jsonin.env - Share your Google Sheet with the service account email (the
client_emailin the JSON key)
npm run dev:full # Start frontend + backend
npm run dev # Frontend only (Vite)
npm run dev:server # Backend only (Express, needs .env)
npm test # Run all tests
npm run test:watch # Tests in watch mode
npm run lint # ESLint
npm run build # Production build
npm run setup # Symlink core platform into workspace
npm run validate:modules # Validate module manifests
npm run validate:openapi # Validate OpenAPI annotations
npm run validate:dockerfile-deps # Verify Dockerfile deps match package.json
npm run analyze:release-blockers # Fetch, analyze, and upload blocker insights (CI secrets required)
npm run update:view-owners # Regenerate platform/view-owners/owners.js from git history
# Container-based tests (requires Docker/Podman)
make smoke-test # Run smoke tests against AI Eng images
make test-module MODULE=<name> # Run integration tests for a module- Frontend: Vue 3, Vite 8, Tailwind CSS 3, Chart.js 4
- Backend: Express (single server for local dev and production)
- Auth: OpenShift OAuth proxy (production), no auth (local dev)
- Storage: Local filesystem (
./data/), PVC in OpenShift - Hosting: OpenShift with ArgoCD
- Testing: Vitest (unit), Playwright (smoke & integration)
Deployed to OpenShift via ArgoCD. AI Eng images extend core images from @org-pulse/core. See docs/DEPLOYMENT.md for the full deployment guide.
See CONTRIBUTING.md for development workflow, project structure, and code style guidelines.
Architecture and deployment details are in .claude/CLAUDE.md — Claude Code reads this automatically.