Drei Anlaesse: fehlgeschlagener Abgleich, rote CI, neues Release. Die Daten dafuer liegen seit dem CI-Status vor, es fehlte nur der Weg nach draussen. Der Kern ist die Entprellung. Gemeldet wird ausschliesslich bei einer Aenderung gegenueber dem zuletzt gemeldeten Stand, der am Projekt vermerkt ist. Ein Repo mit abgelaufenem Token meldet sich damit einmal statt bei jedem stuendlichen Durchlauf. Zwei Feinheiten: - Beim allerersten Abgleich wird kein Release gemeldet, sonst waere jede bereits vorhandene Version eine "Neuigkeit". - Der Merkstand wird auch ohne eingerichtetes Ziel fortgeschrieben, sonst kaeme beim ersten Ziel die ganze Vergangenheit hinterher. Zustellwege: - ntfy mit Titel, Prioritaet und Symbol als Kopfzeilen, optionalem Bearer-Token. Emojis werden aus den Kopfzeilen entfernt statt durch Fragezeichen ersetzt - Kopfzeilen duerfen nur Latin-1 tragen, und das Sinnbild liefert ohnehin der Tags-Header. - Webhook mit JSON, Projektbezug und Tieflink. Mit Geheimnis wird der Rumpf per HMAC-SHA256 signiert, damit der Empfaenger die Herkunft pruefen kann. - E-Mail ueber SMTP, verfuegbar sobald SMTP_HOST gesetzt ist. Zieladressen sind Benutzereingaben, die der Server abruft - sie laufen deshalb durch denselben SSRF-Schutz wie die Git-Verbindungen. Redirects werden nicht verfolgt, weil ein Umleitungsziel nicht geprueft waere. Fehler beim Zustellen werden geschluckt: eine kaputte Benachrichtigung darf den Abgleich nicht scheitern lassen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
70 lines
2.1 KiB
JSON
70 lines
2.1 KiB
JSON
{
|
||
"name": "nebula",
|
||
"version": "0.7.0",
|
||
"private": true,
|
||
"description": "Nebula – Dashboard fuer Vibe-Coding Projekte mit Git-Anbindung (GitHub, GitLab, Gitea)",
|
||
"scripts": {
|
||
"dev": "next dev",
|
||
"build": "prisma generate && next build",
|
||
"start": "next start",
|
||
"lint": "next lint",
|
||
"typecheck": "tsc --noEmit",
|
||
"db:generate": "prisma generate",
|
||
"db:migrate": "prisma migrate deploy",
|
||
"db:migrate:dev": "prisma migrate dev",
|
||
"db:push": "prisma db push",
|
||
"db:studio": "prisma studio",
|
||
"db:seed": "prisma db seed",
|
||
"db:reset": "prisma migrate reset",
|
||
"docker:db": "docker compose up -d db",
|
||
"docker:db:down": "docker compose stop db",
|
||
"docker:up": "docker compose --profile full up -d --build",
|
||
"docker:down": "docker compose --profile full down",
|
||
"docker:logs": "docker compose --profile full logs -f app",
|
||
"docker:tools": "docker compose --profile tools up -d",
|
||
"setup": "node scripts/setup.mjs",
|
||
"postinstall": "prisma generate",
|
||
"test": "vitest run",
|
||
"test:watch": "vitest",
|
||
"test:e2e": "npm run build && playwright test",
|
||
"test:e2e:ui": "playwright test --ui",
|
||
"test:all": "npm test && npm run test:e2e"
|
||
},
|
||
"prisma": {
|
||
"seed": "tsx prisma/seed.ts"
|
||
},
|
||
"dependencies": {
|
||
"@dnd-kit/core": "^6.3.1",
|
||
"@dnd-kit/modifiers": "^9.0.0",
|
||
"@dnd-kit/sortable": "^10.0.0",
|
||
"@prisma/client": "^6.8.2",
|
||
"@simplewebauthn/browser": "^13.3.0",
|
||
"@simplewebauthn/server": "^13.3.2",
|
||
"lucide-react": "^0.511.0",
|
||
"next": "^15.3.3",
|
||
"nodemailer": "^9.0.3",
|
||
"react": "^19.1.0",
|
||
"react-dom": "^19.1.0",
|
||
"react-markdown": "^10.1.0",
|
||
"rehype-sanitize": "^6.0.0",
|
||
"remark-gfm": "^4.0.1",
|
||
"zod": "^3.25.28"
|
||
},
|
||
"devDependencies": {
|
||
"@playwright/test": "^1.62.0",
|
||
"@tailwindcss/postcss": "^4.1.7",
|
||
"@types/node": "^22.15.21",
|
||
"@types/nodemailer": "^8.0.1",
|
||
"@types/react": "^19.1.5",
|
||
"@types/react-dom": "^19.1.5",
|
||
"prisma": "^6.8.2",
|
||
"tailwindcss": "^4.1.7",
|
||
"tsx": "^4.19.4",
|
||
"typescript": "^5.8.3",
|
||
"vitest": "^4.1.10"
|
||
},
|
||
"engines": {
|
||
"node": ">=20.11"
|
||
}
|
||
}
|