The recent "Initial import" of main is app-only and dropped .claude/. This brings the AI-team config into the repo: all 11 .claude/agents/*.md and 11 .claude/skills/*/SKILL.md, each carrying the "Git workflow (every task)" rule (at task start: commit+push unpushed work, branch off main, build on the branch, commit+push at the end; mid-chain and read-only agents stay on the branch and don't re-branch). Also gitignores the per-user local .claude files (.claude/settings.local.json, .claude/*.lock) so only the shared team config is tracked. claude_artifacts/ left untracked by choice. verifier PASS: 23 files staged (22 team + .gitignore); rule byte-identical in all 22; gitignore scoped so tracked team files stay tracked; branch descends from origin/main (PRs cleanly). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VEsaHQx8cXr1hFrKU42UK6
FORGE
A ServiceNow ticket dashboard for the Marketing Web Presence L3 queues — RITM/SCTASK requests pulled out of ServiceNow and shown as an operational board plus closed-ticket analytics. Ported from the Let it Snow Chrome extension into a full-stack web app, built on the shape of the Husky repo list template.
┌──────────────┐ Bearer token ┌───────────────┐ Postgres
│ Chrome ext │ ──── POST /api/sync ─▶│ FORGE server │ ────────────▶ forge DB
│ (Snow Sync) │ │ Express + TS │
└──────────────┘ └───────┬───────┘
▲ │ serves
reads ServiceNow ▼
Table API in-page ┌───────────────────────────┐
│ React client (Vite + TS) │
│ Board · Closed · Stats │
└───────────────────────────┘
Stack
- client/ — React 18 + Vite + TypeScript, SCSS modules, react-router. Three views: Active board (filters, search, ticket detail + activity timeline), Closed (cost / time-to-first-reply analytics), Statistics (distribution).
- server (
index.ts+server/) — Express + TypeScript on Postgres. Schema self-bootstraps ininitDB()and seeds the bundled ticket archives on first boot. REST:GET /api/tickets,/api/tickets/:number,/api/stats,/healthz, and a token-authedPOST /api/syncingest. - extension/ — a Manifest V3 Chrome extension ("FORGE Snow Sync") that reads active RITM tickets from the ServiceNow Table API and pushes them to the server with an API token, exactly like the Husky sync extension.
Quick start (local)
# 1. a Postgres named `forge` (compose brings one up, or use your own)
docker compose up -d db # or point DATABASE_URL at any Postgres
cp .env.example .env # DATABASE_URL defaults to the compose db
# 2. install + run both server and client with live reload
npm install
npm run dev # server :3000, client :5173 (proxies /api)
Open http://localhost:5173 and sign in with the AUTH_USER / AUTH_PASS you
set in .env (the read UI is auth-gated; see docs/SETUP.md).
On first boot the server seeds the ticket archives
in server/data/*.json (100 active + 866 closed after de-duping the ~99
tickets that appear in both), so the board is populated before any real sync
runs. Those archives are generated from a Let it Snow storage dump — see
docs/SETUP.md to regenerate them.
Production
docker compose up -d --build # app on host :3099, bundled Postgres
Behind the Synology reverse proxy this is what forge.mycloud.dp.ua maps to.
See docs/SETUP.md for the sync token + Chrome extension setup.
Tests
npm test # client (vitest) + server (vitest)