diff --git a/README.md b/README.md index 1b43f91..385284f 100644 --- a/README.md +++ b/README.md @@ -123,16 +123,12 @@ Vul daarna `DATABASE_URL` en `SESSION_SECRET` in. `DIRECT_URL` is optioneel loka npx prisma db push ``` -4. Genereer Prisma Client en de ERD: +4. Genereer Prisma Client: ```bash -npm run db:erd +npx prisma generate ``` -Deze command voert lokaal `prisma generate` uit. Daardoor worden zowel de Prisma Client als `docs/assets/erd.svg` opnieuw opgebouwd. - -In CI en deployment wordt bewust alleen de Prisma Client gegenereerd met `prisma generate --generator client`. Het ERD-diagram gebruikt Mermaid/Puppeteer en wordt daarom niet in GitHub Actions of Vercel gegenereerd. - 5. Seed testdata indien nodig: ```bash @@ -166,19 +162,9 @@ De curl-tests dekken alle 7 API-endpoints: auth (401), demo-blokkering (403), in ## Database -![ERD](./docs/assets/erd.svg) +Het schema staat in `prisma/schema.prisma`; uitgebreide documentatie in [`docs/architecture/data-model.md`](./docs/architecture/data-model.md). -De databasevisualisatie wordt lokaal gegenereerd uit `prisma/schema.prisma` via `prisma-erd-generator`. - -Handmatige generatie: - -```bash -npm run db:erd -``` - -Optioneel: `npm run db:erd:watch` parallel aan `npm run dev` om bij wijzigingen in `prisma/schema.prisma` `docs/assets/erd.svg` automatisch opnieuw te genereren. - -Gebruik `npx prisma db push` alleen om het schema naar de database te synchroniseren. Gebruik `npm run db:erd` om lokaal Prisma Client en de ERD te genereren. Gebruik in CI uitsluitend `npx prisma generate --generator client`. +Gebruik `npx prisma db push` om schema-wijzigingen naar de database te synchroniseren. `npx prisma generate` (of `prisma generate --generator client` in CI) genereert de Prisma Client. De app draait standaard op `http://localhost:3000`. @@ -189,7 +175,6 @@ npm run dev # lokale development server npm run lint # ESLint npm test # Vitest test suite npm run build # productiebuild zoals Vercel die verwacht -npm run db:erd # Prisma Client + docs/assets/erd.svg genereren ``` ### Environment variables diff --git a/docs/architecture/auth-and-sessions.md b/docs/architecture/auth-and-sessions.md index 4d633c3..af4f069 100644 --- a/docs/architecture/auth-and-sessions.md +++ b/docs/architecture/auth-and-sessions.md @@ -187,7 +187,7 @@ NODE_ENV="development" **CI/CD:** GitHub Actions → lint + typecheck + `prisma validate` op elke PR; Vercel deploy automatisch bij merge naar `main` **Database (cloud):** Neon — migraties via `prisma migrate deploy` in de Vercel build-stap **Database (lokaal):** Neon (gratis tier) — `npx prisma db push` synchroniseert schema -**Prisma generatie:** CI/deployment gebruikt `prisma generate --generator client`; `npm run db:erd` is alleen lokaal en bouwt ook `docs/assets/erd.svg` +**Prisma generatie:** `prisma generate` (single client generator) **Seeding:** `npx prisma db seed` laadt de testdata uit het Product Backlog document ### Deployment checklist (pre-launch) diff --git a/docs/architecture/data-model.md b/docs/architecture/data-model.md index c5d0da4..befa797 100644 --- a/docs/architecture/data-model.md +++ b/docs/architecture/data-model.md @@ -516,4 +516,4 @@ Schrijfoperaties volgen deze invarianten: ## Prisma Schema -De volledige, levende definitie staat in [`prisma/schema.prisma`](../../prisma/schema.prisma). Genereer de ERD lokaal met `npm run db:erd` (zie [README — Database](../../README.md#database)). Het ERD-diagram zelf staat in [docs/assets/erd.svg](../assets/erd.svg). +De volledige, levende definitie staat in [`prisma/schema.prisma`](../../prisma/schema.prisma). diff --git a/docs/erd.svg b/docs/erd.svg deleted file mode 100644 index c31a152..0000000 --- a/docs/erd.svg +++ /dev/null @@ -1 +0,0 @@ -

active_product

user

enum:role

user

user

enum:pr_strategy

product

enum:status

pbi

product

sprint

assignee

enum:status

story

enum:type

enum:status

product

enum:status

sprint

started_by

enum:status

enum:pr_strategy

failed_task

previous_run

story

product

sprint

enum:status

enum:verify_required

user

product

task

idea

sprint_run

enum:kind

enum:status

claimed_by_token

enum:verify_result

sprint_job

task

enum:verify_required_snapshot

enum:status

enum:verify_result

user

token

product

user

user

product

pbi

enum:status

idea

product

idea

enum:type

enum:status

idea

user

story

task

idea

product

asker

answerer

user

Role

PRODUCT_OWNER

PRODUCT_OWNER

SCRUM_MASTER

SCRUM_MASTER

DEVELOPER

DEVELOPER

ADMIN

ADMIN

StoryStatus

OPEN

OPEN

IN_SPRINT

IN_SPRINT

DONE

DONE

FAILED

FAILED

PbiStatus

READY

READY

BLOCKED

BLOCKED

FAILED

FAILED

DONE

DONE

ClaudeJobStatus

QUEUED

QUEUED

CLAIMED

CLAIMED

RUNNING

RUNNING

DONE

DONE

FAILED

FAILED

CANCELLED

CANCELLED

SKIPPED

SKIPPED

VerifyResult

ALIGNED

ALIGNED

PARTIAL

PARTIAL

EMPTY

EMPTY

DIVERGENT

DIVERGENT

VerifyRequired

ALIGNED

ALIGNED

ALIGNED_OR_PARTIAL

ALIGNED_OR_PARTIAL

ANY

ANY

TaskStatus

TO_DO

TO_DO

IN_PROGRESS

IN_PROGRESS

REVIEW

REVIEW

DONE

DONE

FAILED

FAILED

EXCLUDED

EXCLUDED

LogType

IMPLEMENTATION_PLAN

IMPLEMENTATION_PLAN

TEST_RESULT

TEST_RESULT

COMMIT

COMMIT

TestStatus

PASSED

PASSED

FAILED

FAILED

SprintStatus

OPEN

OPEN

CLOSED

CLOSED

ARCHIVED

ARCHIVED

FAILED

FAILED

SprintRunStatus

QUEUED

QUEUED

RUNNING

RUNNING

PAUSED

PAUSED

DONE

DONE

FAILED

FAILED

CANCELLED

CANCELLED

PrStrategy

SPRINT

SPRINT

STORY

STORY

SPRINT_BATCH

SPRINT_BATCH

IdeaStatus

DRAFT

DRAFT

GRILLING

GRILLING

GRILL_FAILED

GRILL_FAILED

GRILLED

GRILLED

PLANNING

PLANNING

PLAN_FAILED

PLAN_FAILED

PLAN_READY

PLAN_READY

PLANNED

PLANNED

ClaudeJobKind

TASK_IMPLEMENTATION

TASK_IMPLEMENTATION

IDEA_GRILL

IDEA_GRILL

IDEA_MAKE_PLAN

IDEA_MAKE_PLAN

PLAN_CHAT

PLAN_CHAT

SPRINT_IMPLEMENTATION

SPRINT_IMPLEMENTATION

SprintTaskExecutionStatus

PENDING

PENDING

RUNNING

RUNNING

DONE

DONE

FAILED

FAILED

SKIPPED

SKIPPED

IdeaLogType

DECISION

DECISION

NOTE

NOTE

GRILL_RESULT

GRILL_RESULT

PLAN_RESULT

PLAN_RESULT

STATUS_CHANGE

STATUS_CHANGE

JOB_EVENT

JOB_EVENT

UserQuestionStatus

pending

pending

answered

answered

users

String

id

đŸ—ī¸

String

username

String

email

❓

String

password_hash

Boolean

is_demo

String

bio

❓

String

bio_detail

❓

Boolean

must_reset_password

Bytes

avatar_data

❓

Int

idea_code_counter

Int

min_quota_pct

DateTime

created_at

DateTime

updated_at

user_roles

String

id

đŸ—ī¸

Role

role

api_tokens

String

id

đŸ—ī¸

String

token_hash

String

label

❓

DateTime

created_at

DateTime

revoked_at

❓

products

String

id

đŸ—ī¸

String

name

String

code

❓

String

description

❓

String

repo_url

❓

String

definition_of_done

Boolean

auto_pr

PrStrategy

pr_strategy

Boolean

archived

DateTime

created_at

DateTime

updated_at

pbis

String

id

đŸ—ī¸

String

code

String

title

String

description

❓

Int

priority

Float

sort_order

PbiStatus

status

String

pr_url

❓

DateTime

pr_merged_at

❓

DateTime

created_at

DateTime

updated_at

stories

String

id

đŸ—ī¸

String

code

String

title

String

description

❓

String

acceptance_criteria

❓

Int

priority

Float

sort_order

StoryStatus

status

DateTime

created_at

DateTime

updated_at

story_logs

String

id

đŸ—ī¸

LogType

type

String

content

TestStatus

status

❓

String

commit_hash

❓

String

commit_message

❓

Json

metadata

❓

DateTime

created_at

sprints

String

id

đŸ—ī¸

String

code

String

sprint_goal

SprintStatus

status

DateTime

start_date

❓

DateTime

end_date

❓

DateTime

created_at

DateTime

completed_at

❓

sprint_runs

String

id

đŸ—ī¸

SprintRunStatus

status

PrStrategy

pr_strategy

String

branch

❓

String

pr_url

❓

DateTime

started_at

❓

DateTime

finished_at

❓

String

failure_reason

❓

Json

pause_context

❓

DateTime

created_at

DateTime

updated_at

tasks

String

id

đŸ—ī¸

String

code

String

title

String

description

❓

String

implementation_plan

❓

Int

priority

Float

sort_order

TaskStatus

status

Boolean

verify_only

VerifyRequired

verify_required

String

repo_url

❓

DateTime

created_at

DateTime

updated_at

claude_jobs

String

id

đŸ—ī¸

ClaudeJobKind

kind

ClaudeJobStatus

status

DateTime

claimed_at

❓

DateTime

started_at

❓

DateTime

finished_at

❓

DateTime

pushed_at

❓

VerifyResult

verify_result

❓

String

model_id

❓

Int

input_tokens

❓

Int

output_tokens

❓

Int

cache_read_tokens

❓

Int

cache_write_tokens

❓

String

plan_snapshot

❓

String

base_sha

❓

String

head_sha

❓

String

branch

❓

String

pr_url

❓

String

summary

❓

String

error

❓

Int

retry_count

DateTime

lease_until

❓

DateTime

created_at

DateTime

updated_at

sprint_task_executions

String

id

đŸ—ī¸

Int

order

String

plan_snapshot

VerifyRequired

verify_required_snapshot

Boolean

verify_only_snapshot

String

base_sha

❓

String

head_sha

❓

SprintTaskExecutionStatus

status

VerifyResult

verify_result

❓

String

verify_summary

❓

String

skip_reason

❓

DateTime

started_at

❓

DateTime

finished_at

❓

DateTime

created_at

DateTime

updated_at

model_prices

String

id

đŸ—ī¸

String

model_id

Decimal

input_price_per_1m

Decimal

output_price_per_1m

Decimal

cache_read_price_per_1m

Decimal

cache_write_price_per_1m

String

currency

DateTime

created_at

DateTime

updated_at

claude_workers

String

id

đŸ—ī¸

String

product_id

❓

DateTime

started_at

DateTime

last_seen_at

Int

last_quota_pct

❓

DateTime

last_quota_check_at

❓

product_members

String

id

đŸ—ī¸

DateTime

created_at

ideas

String

id

đŸ—ī¸

String

code

String

title

String

description

❓

String

grill_md

❓

String

plan_md

❓

IdeaStatus

status

Boolean

archived

DateTime

created_at

DateTime

updated_at

idea_products

String

id

đŸ—ī¸

DateTime

created_at

idea_logs

String

id

đŸ—ī¸

IdeaLogType

type

String

content

Json

metadata

❓

DateTime

created_at

user_questions

String

id

đŸ—ī¸

String

user_id

String

question

String

answer

❓

UserQuestionStatus

status

DateTime

created_at

DateTime

updated_at

login_pairings

String

id

đŸ—ī¸

String

secret_hash

String

desktop_token_hash

String

status

String

desktop_ua

❓

String

desktop_ip

❓

DateTime

created_at

DateTime

expires_at

DateTime

approved_at

❓

DateTime

consumed_at

❓

claude_questions

String

id

đŸ—ī¸

String

question

Json

options

❓

String

status

String

answer

❓

DateTime

answered_at

❓

DateTime

created_at

DateTime

expires_at

push_subscriptions

String

id

đŸ—ī¸

String

endpoint

String

p256dh

String

auth

String

user_agent

❓

DateTime

created_at

DateTime

last_used_at

\ No newline at end of file diff --git a/docs/obsidian-authoring.md b/docs/obsidian-authoring.md index 4d7f017..0848e43 100644 --- a/docs/obsidian-authoring.md +++ b/docs/obsidian-authoring.md @@ -163,8 +163,7 @@ Use with care: Avoid as canonical source: - **Canvas**, **Excalidraw** — not diff-able, not agent-readable. Keep - diagrams as committed SVG (`docs/assets/erd.svg`) or as Mermaid blocks inside - Markdown. + diagrams as committed SVG or as Mermaid blocks inside Markdown. ## Index generator interaction diff --git a/docs/patterns/prisma-client.md b/docs/patterns/prisma-client.md index bbc98a4..c995eec 100644 --- a/docs/patterns/prisma-client.md +++ b/docs/patterns/prisma-client.md @@ -49,27 +49,17 @@ export default defineConfig({ }) ``` -## Prisma generators +## Prisma generator -`prisma/schema.prisma` bevat twee generators: +`prisma/schema.prisma` bevat ÊÊn generator: ```prisma generator client { provider = "prisma-client-js" } - -generator erd { - provider = "prisma-erd-generator" - output = "../docs/assets/erd.svg" -} ``` -`prisma generate` bouwt dus twee artifacts: - -- Prisma Client in `node_modules/@prisma/client` -- het ERD-diagram in `docs/assets/erd.svg` - -Gebruik volledige `prisma generate` alleen lokaal. De ERD-generator gebruikt Mermaid/Puppeteer en mag niet in CI of Vercel draaien. +`prisma generate` bouwt de Prisma Client naar `node_modules/@prisma/client`. ## Commands @@ -77,9 +67,5 @@ Gebruik volledige `prisma generate` alleen lokaal. De ERD-generator gebruikt Mer |---|---| | `npx prisma db push` | Schema synchroniseren naar de database | | `npx prisma db seed` | Seeddata laden | -| `npx prisma generate --generator client` | Alleen Prisma Client genereren; gebruiken in CI/deployment | -| `npm run db:erd` | `prisma generate`: Prisma Client en `docs/assets/erd.svg` genereren | -| `npm run db:erd:watch` | `prisma/schema.prisma` watchen en ERD opnieuw genereren | -| `npm run dev` | Next.js dev server plus ERD watcher starten | - -Belangrijk: `db push` schrijft naar de database, maar genereert geen ERD. Gebruik na schemawijzigingen lokaal `npm run db:erd` of laat `npm run dev` de watcher draaien. Gebruik in CI en deployment alleen `npx prisma generate --generator client`. +| `npx prisma generate` | Prisma Client genereren (lokaal of CI) | +| `npx prisma migrate deploy` | Pending migrations toepassen op de database | diff --git a/package-lock.json b/package-lock.json index 442fbdf..06db5c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scrum4me", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scrum4me", - "version": "1.2.0", + "version": "1.3.0", "hasInstallScript": true, "dependencies": { "@base-ui/react": "^1.4.1", @@ -63,14 +63,12 @@ "@types/react-dom": "^19", "@types/web-push": "^3.6.4", "@vitest/coverage-v8": "^4.1.5", - "chokidar-cli": "^3.0.0", "concurrently": "^9.2.1", "eslint": "^9", "eslint-config-next": "16.2.4", "husky": "^9.1.7", "jsdom": "^29.1.1", "lint-staged": "^16.4.0", - "prisma-erd-generator": "^2.4.2", "tailwindcss": "^4", "tsx": "^4.21.0", "typescript": "^5", @@ -3687,13 +3685,6 @@ "zeptomatch": "2.1.0" } }, - "node_modules/@prisma/dmmf": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/dmmf/-/dmmf-7.8.0.tgz", - "integrity": "sha512-7xzcSFWO6J+dFUgIX7jL7QqUhEDfaa8GSZGsjjHyZct1Su+6KrvMl3S2+fnRkuKUIoTPg3Mj02oZuUdaNSfsaw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@prisma/driver-adapter-utils": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.8.0.tgz", @@ -3751,25 +3742,6 @@ "@prisma/debug": "7.8.0" } }, - "node_modules/@prisma/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-KHGB0b8/9pNWyiK9EPJNE2/v1bMtqJgJldqjNNVvoE4uOhNSSWTmhHhPVfRsiuOVybzHCdCUQ/gdidCbpYAD5w==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/generator-helper": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-7.8.0.tgz", - "integrity": "sha512-i+2Gad6D/0dS0YHKFdYX3M8KYN1gwNkET813WXKfW2HeWmgipmSJsNSzOA44kTM+Rx6Dev3yBQwx5sZXXdtgtQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "7.8.0", - "@prisma/dmmf": "7.8.0", - "@prisma/generator": "7.8.0" - } - }, "node_modules/@prisma/get-platform": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", @@ -8681,16 +8653,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -8853,291 +8815,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/chokidar-cli": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-3.0.0.tgz", - "integrity": "sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "yargs": "^13.3.0" - }, - "bin": { - "chokidar": "index.js" - }, - "engines": { - "node": ">= 8.10.0" - } - }, - "node_modules/chokidar-cli/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar-cli/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar-cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/chokidar-cli/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/chokidar-cli/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar-cli/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar-cli/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar-cli/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar-cli/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chokidar-cli/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar-cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/chokidar-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chokidar-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/chokidar-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/chokidar-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -10252,16 +9929,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", @@ -14448,13 +14115,6 @@ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -14462,13 +14122,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", @@ -16532,16 +16185,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", @@ -17359,40 +17002,6 @@ } } }, - "node_modules/prisma-erd-generator": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prisma-erd-generator/-/prisma-erd-generator-2.4.2.tgz", - "integrity": "sha512-AmFuCB4wKhCF7HNj4b73tmgewRJTuwKrR7eucjctIKOmZSiY/0uTlBYNCKxkYrcXsXGvePVb7IP0z8aD8nCogA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mermaid-js/mermaid-cli": "^11.9.0", - "@prisma/generator-helper": "^7.0.0", - "dotenv": "^16.6.1" - }, - "bin": { - "prisma-erd-generator": "dist/index.js" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/prisma-erd-generator/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -18157,13 +17766,6 @@ "node": ">=9.3.0 || >=8.10.0 <9.0.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, "node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", @@ -18678,13 +18280,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, "node_modules/set-cookie-parser": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", @@ -21231,13 +20826,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "license": "ISC" - }, "node_modules/which-typed-array": { "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", diff --git a/package.json b/package.json index 3ac913f..f6a7b40 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "scrum4me", - "version": "1.2.0", + "version": "1.3.0", "private": true, "scripts": { "predev": "npx --yes kill-port 3000 || exit 0", "dev": "next dev -p 3000", "prebuild": "npm run manual:build", - "build": "next build", + "build": "prisma generate && next build", "start": "next start", "lint": "eslint", "typecheck": "tsc --noEmit", @@ -15,8 +15,6 @@ "test:watch": "vitest", "prepare": "husky", "postinstall": "prisma generate --generator client", - "db:erd": "prisma generate", - "db:erd:watch": "chokidar \"prisma/schema.prisma\" -c \"npm run db:erd\"", "db:insert-milestone": "tsx scripts/insert-milestone.ts", "db:sync-model-prices": "tsx scripts/sync-model-prices.ts", "create-admin": "tsx scripts/create-admin.ts", @@ -88,14 +86,12 @@ "@types/react-dom": "^19", "@types/web-push": "^3.6.4", "@vitest/coverage-v8": "^4.1.5", - "chokidar-cli": "^3.0.0", "concurrently": "^9.2.1", "eslint": "^9", "eslint-config-next": "16.2.4", "husky": "^9.1.7", "jsdom": "^29.1.1", "lint-staged": "^16.4.0", - "prisma-erd-generator": "^2.4.2", "tailwindcss": "^4", "tsx": "^4.21.0", "typescript": "^5", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ef65cce..4f6b086 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -2,11 +2,6 @@ generator client { provider = "prisma-client-js" } -generator erd { - provider = "prisma-erd-generator" - output = "../docs/erd.svg" -} - datasource db { provider = "postgresql" }