Merge branch 'phase/001-projekt-setup'
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
@@ -0,0 +1,5 @@
|
||||
* text=auto eol=lf
|
||||
*.sh text eol=lf
|
||||
*.ico binary
|
||||
*.png binary
|
||||
*.pdf binary
|
||||
@@ -0,0 +1,6 @@
|
||||
.next
|
||||
node_modules
|
||||
coverage
|
||||
docs
|
||||
*.md
|
||||
package-lock.json
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 110
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<!-- BEGIN:nextjs-agent-rules -->
|
||||
|
||||
# This is NOT the Next.js you know
|
||||
|
||||
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
|
||||
|
||||
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
|
||||
|
||||
<!-- END:nextjs-agent-rules -->
|
||||
@@ -10,6 +10,7 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
||||
### Hinzugefügt
|
||||
- Projektorganisation: Devlog, Changelog, Issue-Übersicht und Issues pro Phase (#001)
|
||||
- Architektur- und Umsetzungsplan in `docs/architektur.md` (#001)
|
||||
- Next.js-Grundgerüst mit AdminLTE-CSS, Bootstrap Icons, zod, ESLint, Prettier und Vitest (#001)
|
||||
|
||||
### Geändert
|
||||
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
## Zeitübersicht
|
||||
|
||||
**Gesamt:** 0 h 00 min (laufende Sitzung nicht eingerechnet)
|
||||
**Gesamt:** 0 h 08 min
|
||||
|
||||
| Issue | Zeit |
|
||||
|---|---|
|
||||
| #001 Projekt-Setup | 0 h 00 min |
|
||||
| #001 Projekt-Setup | 0 h 08 min |
|
||||
|
||||
| Meilenstein | Zeit |
|
||||
|---|---|
|
||||
| v0.1.0 | 0 h 00 min |
|
||||
| v0.1.0 | 0 h 08 min |
|
||||
|
||||
---
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
- Umgebung geprüft: Ubuntu 26.04, Git 2.53; Node/Docker fehlten → Node 24 LTS per nvm installiert
|
||||
- Repository-Rechte korrigiert (Verzeichnis gehörte root), Branch `master` → `main`, Git-Identität lokal gesetzt
|
||||
- `.gitignore`, `CHANGELOG.md`, `DEVLOG.md`, Architekturplan und 15 Issues angelegt
|
||||
- #001 abgeschlossen: Next.js 16 (App Router, TypeScript strict), AdminLTE-CSS, Bootstrap Icons, zod, ESLint/Prettier/Vitest; Lint, Typecheck, Test und Build grün
|
||||
|
||||
### Entscheidungen
|
||||
- **AdminLTE 4.9.1 nur als CSS:** stabil, Bootstrap 5.3.8, kein jQuery; die JS-Plugins manipulieren das DOM und werden daher als React-Komponenten nachgebaut.
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# ProxLedger
|
||||
|
||||
Zentrales Dashboard für den Subscription-Status aller Proxmox-Hosts (VE, Backup Server, Mail Gateway).
|
||||
Auf jedem Host meldet ein schlanker Agent täglich per HTTPS seinen Status (Push-Modell) – auch aus Kundennetzen hinter NAT.
|
||||
|
||||
> **Status:** in Entwicklung (0.1.0-dev). Noch nicht produktiv einsetzen.
|
||||
|
||||
## Entwicklung
|
||||
|
||||
Voraussetzungen: Node.js ≥ 24, Docker (für PostgreSQL ab #003).
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev # http://localhost:3000
|
||||
npm run lint
|
||||
npm run typecheck
|
||||
npm test
|
||||
```
|
||||
|
||||
## Dokumentation
|
||||
|
||||
- [Architektur- und Umsetzungsplan](docs/architektur.md)
|
||||
- [Issues](docs/issues/README.md)
|
||||
- [Changelog](CHANGELOG.md) · [Devlog](DEVLOG.md)
|
||||
@@ -1,8 +1,8 @@
|
||||
# #001 Projekt-Setup
|
||||
**Status:** in Arbeit
|
||||
**Status:** erledigt
|
||||
**Meilenstein:** v0.1.0
|
||||
**Labels:** chore, infrastruktur
|
||||
**Geschätzt:** 3 h **Tatsächlich:** –
|
||||
**Geschätzt:** 3 h **Tatsächlich:** 0 h 08 min
|
||||
|
||||
## Ziel
|
||||
Arbeitsfähiges Repository mit Projektorganisation (Devlog, Changelog, Issues) und einem lauffähigen Next.js-Grundgerüst inklusive AdminLTE-CSS, Linting und Prisma-Grundkonfiguration.
|
||||
@@ -12,16 +12,16 @@ Arbeitsfähiges Repository mit Projektorganisation (Devlog, Changelog, Issues) u
|
||||
- [x] `DEVLOG.md`, `CHANGELOG.md`, `docs/issues/` mit Übersicht
|
||||
- [x] Architektur- und Umsetzungsplan (`docs/architektur.md`)
|
||||
- [x] Issues pro Phase anlegen
|
||||
- [ ] Next.js (App Router, TypeScript strict, `src/`) aufsetzen
|
||||
- [ ] Abhängigkeiten: `admin-lte`, `bootstrap`, `bootstrap-icons`, zod
|
||||
- [ ] ESLint + Prettier, `npm run lint`, `npm run typecheck`
|
||||
- [ ] Version `0.1.0-dev` in `package.json`, Versionsanzeige-Helfer
|
||||
- [ ] Vitest-Grundkonfiguration
|
||||
- [x] Next.js (App Router, TypeScript strict, `src/`) aufsetzen
|
||||
- [x] Abhängigkeiten: `admin-lte`, `bootstrap`, `bootstrap-icons`, zod
|
||||
- [x] ESLint + Prettier, `npm run lint`, `npm run typecheck`
|
||||
- [x] Version `0.1.0-dev` in `package.json`, Versionsanzeige-Helfer
|
||||
- [x] Vitest-Grundkonfiguration
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- [ ] `npm run dev` startet ohne Fehler
|
||||
- [ ] `npm run lint` und `npm run typecheck` sind grün
|
||||
- [ ] Keine Remote-URL in Projektdateien
|
||||
- [x] `npm run dev` startet ohne Fehler
|
||||
- [x] `npm run lint` und `npm run typecheck` sind grün
|
||||
- [x] Keine Remote-URL in Projektdateien
|
||||
|
||||
## Abhängigkeiten
|
||||
–
|
||||
|
||||
@@ -4,8 +4,8 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a
|
||||
|
||||
| Nr. | Titel | Status | Meilenstein | Geschätzt | Tatsächlich |
|
||||
|---|---|---|---|---|---|
|
||||
| [#001](001-projekt-setup.md) | Projekt-Setup | in Arbeit | v0.1.0 | 3 h | – |
|
||||
| [#002](002-prototyp.md) | Klickbarer Prototyp | offen | v0.1.0 | 8 h | – |
|
||||
| [#001](001-projekt-setup.md) | Projekt-Setup | erledigt | v0.1.0 | 3 h | 0 h 08 min |
|
||||
| [#002](002-prototyp.md) | Klickbarer Prototyp | in Arbeit | v0.1.0 | 8 h | – |
|
||||
| [#003](003-datenmodell.md) | Datenmodell und Migrationen | offen | v0.1.0 | 5 h | – |
|
||||
| [#004](004-agent-api.md) | Agent-API | offen | v0.1.0 | 6 h | – |
|
||||
| [#005](005-agent-skript.md) | Agent-Skript | offen | v0.2.0 | 8 h | – |
|
||||
@@ -19,4 +19,4 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a
|
||||
| [#013](013-authentifizierung.md) | Authentifizierung und Audit-Log | offen | v0.9.0 | 6 h | – |
|
||||
| [#014](014-deployment.md) | Deployment und Dokumentation | offen | v0.10.0 | 8 h | – |
|
||||
| [#015](015-feinschliff-v1.md) | Feinschliff für 1.0 | offen | v1.0.0 | 6 h | – |
|
||||
| | **Summe** | | | **101 h** | **–** |
|
||||
| | **Summe** | | | **101 h** | **0 h 08 min** |
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import { defineConfig, globalIgnores } from "eslint/config";
|
||||
import nextVitals from "eslint-config-next/core-web-vitals";
|
||||
import nextTs from "eslint-config-next/typescript";
|
||||
import prettier from "eslint-config-prettier/flat";
|
||||
|
||||
const eslintConfig = defineConfig([
|
||||
...nextVitals,
|
||||
...nextTs,
|
||||
prettier,
|
||||
globalIgnores([".next/**", "out/**", "build/**", "coverage/**", "next-env.d.ts"]),
|
||||
]);
|
||||
|
||||
export default eslintConfig;
|
||||
@@ -0,0 +1,7 @@
|
||||
import type { NextConfig } from "next";
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
/* config options here */
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
Generated
+7379
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "proxledger",
|
||||
"version": "0.1.0-dev",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "eslint",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"format": "prettier --write ."
|
||||
},
|
||||
"dependencies": {
|
||||
"admin-lte": "^4.9.1",
|
||||
"bootstrap": "^5.3.8",
|
||||
"bootstrap-icons": "^1.13.1",
|
||||
"next": "16.3.5",
|
||||
"react": "19.2.8",
|
||||
"react-dom": "19.2.8",
|
||||
"zod": "^4.6.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^24.13.5",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "16.3.5",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"prettier": "^3.9.7",
|
||||
"typescript": "^5",
|
||||
"vitest": "^5.0.1"
|
||||
},
|
||||
"description": "Proxmox Subscription Dashboard",
|
||||
"engines": {
|
||||
"node": ">=24"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
/* Wird in #002 durch das ProxLedger-Theme ersetzt. */
|
||||
@@ -0,0 +1,17 @@
|
||||
import type { Metadata } from "next";
|
||||
import "admin-lte/dist/css/adminlte.css";
|
||||
import "bootstrap-icons/font/bootstrap-icons.css";
|
||||
import "./globals.css";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "ProxLedger",
|
||||
description: "Proxmox Subscription Dashboard",
|
||||
};
|
||||
|
||||
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
|
||||
return (
|
||||
<html lang="de">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { APP_VERSION } from "@/lib/version";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main className="container py-5">
|
||||
<h1>ProxLedger</h1>
|
||||
<p className="text-body-secondary">Proxmox Subscription Dashboard · Version {APP_VERSION}</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import pkg from "../../package.json";
|
||||
|
||||
/** Anwendungsversion aus package.json, wird im Footer angezeigt. */
|
||||
export const APP_VERSION: string = pkg.version;
|
||||
@@ -0,0 +1,8 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { APP_VERSION } from "@/lib/version";
|
||||
|
||||
describe("APP_VERSION", () => {
|
||||
it("entspricht Semantic Versioning", () => {
|
||||
expect(APP_VERSION).toMatch(/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "react-jsx",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts",
|
||||
".next/dev/types/**/*.ts",
|
||||
"**/*.mts"
|
||||
],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { defineConfig } from "vitest/config";
|
||||
|
||||
export default defineConfig({
|
||||
resolve: {
|
||||
alias: { "@": fileURLToPath(new URL("./src", import.meta.url)) },
|
||||
},
|
||||
test: {
|
||||
include: ["tests/**/*.test.ts", "src/**/*.test.ts"],
|
||||
environment: "node",
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user