From cd78f72f33f662838097c5f99a30016ef164084f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Fri, 27 Mar 2026 13:18:09 +0100 Subject: [PATCH] =?UTF-8?q?chore:=20full=20technical=20rename=20planarchy?= =?UTF-8?q?=20=E2=86=92=20capakraken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete rename of all technical identifiers across the codebase: Package names (11 packages): - @planarchy/* → @capakraken/* in all package.json, tsconfig, imports Import statements: 277 files, 548 occurrences replaced Database & Docker: - PostgreSQL user/db: planarchy → capakraken - Docker volumes: planarchy_pgdata → capakraken_pgdata - Connection strings updated in docker-compose, .env, CI CI/CD: - GitHub Actions workflow: all filter commands updated - Test database credentials updated Infrastructure: - Redis channel: planarchy:sse → capakraken:sse - Logger service name: planarchy-api → capakraken-api - Anonymization seed updated - Start/stop/restart scripts updated Test data: - Seed emails: @planarchy.dev → @capakraken.dev - E2E test credentials: all 11 spec files updated - Email defaults: @planarchy.app → @capakraken.app - localStorage keys: planarchy_* → capakraken_* Documentation: 30+ .md files updated Verification: - pnpm install: workspace resolution works - TypeScript: only pre-existing TS2589 (no new errors) - Engine: 310/310 tests pass - Staffing: 37/37 tests pass Co-Authored-By: claude-flow --- .claude/commands/gitlooper/gitlooper.md | 2 +- .claude/commands/implement.md | 10 +- .claude/commands/perf.md | 2 +- .claude/commands/plan.md | 2 +- .claude/commands/review.md | 2 +- .github/workflows/ci.yml | 50 +-- CLAUDE.md | 6 +- LEARNINGS.md | 12 +- apps/web/e2e/admin.spec.ts | 4 +- apps/web/e2e/allocations.spec.ts | 2 +- apps/web/e2e/auth.spec.ts | 2 +- apps/web/e2e/dashboard.spec.ts | 2 +- apps/web/e2e/estimates.spec.ts | 2 +- apps/web/e2e/navigation.spec.ts | 2 +- apps/web/e2e/projects.spec.ts | 2 +- apps/web/e2e/resources.spec.ts | 2 +- apps/web/e2e/staffing.spec.ts | 2 +- apps/web/e2e/timeline.spec.ts | 4 +- apps/web/e2e/vacations.spec.ts | 4 +- apps/web/next.config.ts | 12 +- apps/web/package.json | 16 +- .../app/(app)/estimates/EstimatesClient.tsx | 2 +- .../src/app/(app)/projects/ProjectsClient.tsx | 4 +- .../app/(app)/resources/ResourcesClient.tsx | 6 +- .../api/cron/chargeability-alerts/route.ts | 4 +- .../app/api/cron/estimate-reminders/route.ts | 4 +- .../src/app/api/cron/public-holidays/route.ts | 4 +- apps/web/src/app/api/perf/route.ts | 2 +- apps/web/src/app/api/ready/route.ts | 4 +- .../src/app/api/reports/allocations/route.ts | 8 +- apps/web/src/app/api/sse/timeline/route.ts | 6 +- apps/web/src/app/api/trpc/[trpc]/route.ts | 6 +- apps/web/src/app/layout.tsx | 4 +- .../src/components/admin/BatchSkillImport.tsx | 2 +- .../components/admin/DispoImportClient.tsx | 4 +- .../admin/DispoImportDetailClient.tsx | 4 +- .../components/admin/SystemRolesClient.tsx | 2 +- .../components/admin/SystemSettingsClient.tsx | 4 +- apps/web/src/components/admin/UsersClient.tsx | 2 +- .../allocations/AllocationModal.tsx | 4 +- .../allocations/AllocationsClient.tsx | 8 +- .../allocations/FillOpenDemandModal.tsx | 2 +- .../allocations/RecurrenceEditor.tsx | 4 +- .../src/components/assistant/ChatPanel.tsx | 2 +- .../blueprints/BlueprintFieldCatalog.tsx | 4 +- .../blueprints/BlueprintFieldEditor.tsx | 4 +- .../blueprints/BlueprintsClient.tsx | 6 +- .../src/components/blueprints/FieldCard.tsx | 4 +- .../blueprints/RolePresetsEditor.tsx | 2 +- .../components/dashboard/AddWidgetModal.tsx | 2 +- .../components/dashboard/DashboardClient.tsx | 2 +- .../components/dashboard/widget-registry.ts | 2 +- .../dashboard/widgets/ProjectTableWidget.tsx | 2 +- .../dynamic-fields/DynamicFieldEditor.tsx | 4 +- .../dynamic-fields/DynamicFieldRenderer.tsx | 4 +- .../estimates/CommercialTermsEditor.tsx | 4 +- .../components/estimates/EstimateWizard.tsx | 4 +- .../EstimateWorkspace.calculations.ts | 2 +- .../estimates/EstimateWorkspace.types.ts | 2 +- .../estimates/EstimateWorkspaceClient.tsx | 2 +- .../EstimateWorkspaceDraftEditor.tsx | 4 +- .../components/estimates/VersionCompare.tsx | 2 +- .../estimates/editors/DemandLineEditor.tsx | 4 +- .../components/estimates/tabs/ExportsTab.tsx | 2 +- .../components/estimates/tabs/OverviewTab.tsx | 2 +- .../components/estimates/tabs/StaffingTab.tsx | 4 +- .../components/estimates/tabs/VersionsTab.tsx | 2 +- apps/web/src/components/layout/AppShell.tsx | 2 +- .../src/components/layout/InstallPrompt.tsx | 2 +- .../src/components/layout/ThemeProvider.tsx | 2 +- .../projects/ProjectDemandsTable.tsx | 2 +- .../projects/ProjectDetailClient.tsx | 2 +- .../src/components/projects/ProjectModal.tsx | 4 +- .../src/components/projects/ProjectWizard.tsx | 6 +- .../components/resources/BulkEditModal.tsx | 4 +- .../components/resources/ResourceDetail.tsx | 2 +- .../components/resources/ResourceModal.tsx | 4 +- .../resources/SkillMatrixUpload.tsx | 2 +- .../components/resources/SkillRadarChart.tsx | 2 +- apps/web/src/components/roles/RoleModal.tsx | 2 +- apps/web/src/components/roles/RolesClient.tsx | 2 +- .../src/components/staffing/StaffingPanel.tsx | 4 +- .../components/timeline/AllocationPopover.tsx | 2 +- .../timeline/BatchAssignPopover.tsx | 2 +- .../timeline/NewAllocationPopover.tsx | 2 +- .../src/components/timeline/ProjectPanel.tsx | 2 +- .../components/timeline/ResourceHoverCard.tsx | 2 +- .../components/timeline/TimelineContext.tsx | 2 +- .../src/components/ui/ColumnTogglePanel.tsx | 2 +- .../components/ui/CustomFieldFilterBar.tsx | 4 +- .../web/src/components/ui/ProjectCombobox.tsx | 2 +- .../vacations/MyVacationsClient.tsx | 2 +- .../vacations/PublicHolidayBatch.tsx | 2 +- .../src/components/vacations/TeamCalendar.tsx | 2 +- .../components/vacations/VacationCalendar.tsx | 2 +- .../components/vacations/VacationClient.tsx | 2 +- .../components/vacations/VacationModal.tsx | 2 +- apps/web/src/hooks/useAppPreferences.ts | 4 +- apps/web/src/hooks/useColumnConfig.ts | 2 +- apps/web/src/hooks/useDashboardLayout.ts | 6 +- apps/web/src/hooks/useFilters.ts | 2 +- apps/web/src/hooks/useProjectDragContext.ts | 2 +- apps/web/src/hooks/useTheme.ts | 2 +- apps/web/src/hooks/useTimelineSSE.ts | 2 +- apps/web/src/hooks/useViewPrefs.ts | 2 +- apps/web/src/lib/blueprint-field-catalog.ts | 4 +- apps/web/src/lib/skillMatrixParser.ts | 2 +- apps/web/src/lib/trpc/client.ts | 2 +- apps/web/src/server/auth.ts | 2 +- apps/web/src/server/trpc.ts | 8 +- apps/web/tsconfig.json | 2 +- docker-compose.prod.yml | 16 +- docker-compose.yml | 22 +- docs/ci-cd-manual.md | 32 +- docs/demand-assignment-migration-cutover.md | 10 +- docs/dispo-import-implementation.md | 6 +- docs/refactor-v2-plan.md | 16 +- docs/security-audit-2026-03-15.md | 2 +- package.json | 20 +- packages/api/package.json | 14 +- .../src/__tests__/allocation-router.test.ts | 2 +- .../__tests__/blueprint-validation.test.ts | 2 +- .../chargeability-report-router.test.ts | 8 +- .../__tests__/custom-field-filters.test.ts | 2 +- .../src/__tests__/dashboard-router.test.ts | 8 +- .../src/__tests__/effort-rule-router.test.ts | 4 +- .../src/__tests__/entitlement-router.test.ts | 6 +- .../api/src/__tests__/estimate-router.test.ts | 4 +- .../src/__tests__/event-bus-debounce.test.ts | 2 +- .../experience-multiplier-router.test.ts | 8 +- .../src/__tests__/notification-router.test.ts | 2 +- .../project-planning-read-model.test.ts | 2 +- .../project-router-planning-counts.test.ts | 2 +- .../api/src/__tests__/project-router.test.ts | 10 +- .../__tests__/resource-router-crud.test.ts | 6 +- .../api/src/__tests__/resource-router.test.ts | 10 +- .../role-router-planning-counts.test.ts | 2 +- .../api/src/__tests__/staffing-router.test.ts | 10 +- .../src/__tests__/timeline-allocation.test.ts | 2 +- .../__tests__/timeline-shift-planning.test.ts | 2 +- .../api/src/__tests__/vacation-router.test.ts | 4 +- packages/api/src/lib/anonymization.ts | 4 +- packages/api/src/lib/audit.ts | 2 +- packages/api/src/lib/auto-staffing.ts | 6 +- packages/api/src/lib/budget-alerts.ts | 2 +- packages/api/src/lib/chargeability-alerts.ts | 8 +- packages/api/src/lib/email.ts | 4 +- packages/api/src/lib/holiday-auto-import.ts | 2 +- packages/api/src/lib/logger.ts | 2 +- .../api/src/lib/notification-targeting.ts | 2 +- packages/api/src/lib/reminder-scheduler.ts | 2 +- packages/api/src/lib/task-actions.ts | 2 +- packages/api/src/lib/vacation-conflicts.ts | 2 +- packages/api/src/router/allocation.ts | 20 +- packages/api/src/router/assistant-tools.ts | 14 +- packages/api/src/router/assistant.ts | 6 +- .../api/src/router/blueprint-validation.ts | 4 +- packages/api/src/router/blueprint.ts | 16 +- packages/api/src/router/calculation-rules.ts | 2 +- .../api/src/router/chargeability-report.ts | 10 +- packages/api/src/router/client.ts | 4 +- packages/api/src/router/comment.ts | 2 +- packages/api/src/router/computation-graph.ts | 6 +- packages/api/src/router/country.ts | 4 +- .../api/src/router/custom-field-filters.ts | 2 +- packages/api/src/router/dashboard.ts | 2 +- packages/api/src/router/dispo.ts | 4 +- packages/api/src/router/effort-rule.ts | 4 +- packages/api/src/router/entitlement.ts | 2 +- packages/api/src/router/estimate.ts | 8 +- .../api/src/router/experience-multiplier.ts | 4 +- packages/api/src/router/import-export.ts | 4 +- packages/api/src/router/management-level.ts | 2 +- packages/api/src/router/org-unit.ts | 4 +- .../src/router/project-planning-read-model.ts | 6 +- packages/api/src/router/project.ts | 14 +- packages/api/src/router/rate-card.ts | 4 +- packages/api/src/router/resource.ts | 26 +- packages/api/src/router/role.ts | 10 +- packages/api/src/router/scenario.ts | 2 +- packages/api/src/router/settings.ts | 2 +- packages/api/src/router/staffing.ts | 12 +- .../api/src/router/timeline-shift-planning.ts | 6 +- packages/api/src/router/timeline.ts | 24 +- packages/api/src/router/user.ts | 12 +- .../api/src/router/utilization-category.ts | 2 +- packages/api/src/router/vacation.ts | 4 +- packages/api/src/sse/event-bus.ts | 4 +- packages/api/src/trpc.ts | 8 +- packages/api/tsconfig.json | 2 +- packages/application/package.json | 12 +- .../allocation-entry-resolution.test.ts | 2 +- .../allocation-entry-updates.test.ts | 2 +- .../__tests__/allocation-read-model.test.ts | 2 +- ...-estimate-handoff-planning-entries.test.ts | 2 +- .../__tests__/count-planning-entries.test.ts | 2 +- .../src/__tests__/demand-assignment.test.ts | 2 +- .../src/__tests__/estimate.test.ts | 2 +- .../split-allocation-read-model.test.ts | 2 +- .../apply-demand-requirement-fill-progress.ts | 4 +- .../allocation/build-allocation-read-model.ts | 2 +- .../build-split-allocation-read-model.ts | 2 +- .../allocation/chargeability-bookings.ts | 2 +- ...count-estimate-handoff-planning-entries.ts | 2 +- .../allocation/count-planning-entries.ts | 2 +- .../use-cases/allocation/create-assignment.ts | 6 +- .../allocation/create-demand-requirement.ts | 4 +- .../allocation/delete-allocation-entry.ts | 2 +- .../use-cases/allocation/delete-assignment.ts | 4 +- .../allocation/delete-demand-requirement.ts | 2 +- ...ill-demand-requirement-with-legacy-sync.ts | 4 +- .../allocation/fill-demand-requirement.ts | 6 +- .../use-cases/allocation/fill-open-demand.ts | 4 +- .../allocation/list-assignment-bookings.ts | 2 +- .../allocation/load-allocation-entry.ts | 4 +- .../allocation/update-allocation-entry.ts | 4 +- .../use-cases/allocation/update-assignment.ts | 4 +- .../allocation/update-demand-requirement.ts | 4 +- .../dashboard/get-budget-forecast.ts | 2 +- .../dashboard/get-chargeability-overview.ts | 6 +- .../src/use-cases/dashboard/get-demand.ts | 2 +- .../src/use-cases/dashboard/get-overview.ts | 4 +- .../src/use-cases/dashboard/get-peak-times.ts | 2 +- .../use-cases/dashboard/get-project-health.ts | 2 +- .../src/use-cases/dashboard/get-skill-gaps.ts | 2 +- .../dashboard/get-top-value-resources.ts | 2 +- .../load-dashboard-planning-read-model.ts | 4 +- .../dispo-import/assess-import-readiness.ts | 2 +- .../dispo-import/build-dispo-maps.ts | 4 +- .../dispo-import/commit-dispo-batch-types.ts | 2 +- .../dispo-import/commit-dispo-import-batch.ts | 6 +- .../dispo-import/determine-placement.ts | 4 +- .../parse-chargeability-workbook.ts | 2 +- .../dispo-import/parse-dispo-matrix.ts | 4 +- .../parse-dispo-roster-workbook.ts | 4 +- .../parse-resource-roster-master-workbook.ts | 2 +- .../src/use-cases/dispo-import/shared.ts | 6 +- .../stage-chargeability-resources.ts | 4 +- .../dispo-import/stage-dispo-planning.ts | 4 +- .../dispo-import/stage-dispo-projects.ts | 6 +- .../stage-dispo-roster-resources.ts | 4 +- .../dispo-import/stage-reference-data.ts | 4 +- .../use-cases/dispo-import/tbd-projects.ts | 2 +- .../dispo-import/validate-dispo-batch.ts | 2 +- .../src/use-cases/estimate/clone-estimate.ts | 4 +- .../src/use-cases/estimate/create-estimate.ts | 4 +- .../estimate/create-planning-handoff.ts | 4 +- .../src/use-cases/estimate/list-estimates.ts | 2 +- .../src/use-cases/estimate/shared.ts | 4 +- .../estimate/update-estimate-draft.ts | 4 +- .../src/use-cases/estimate/version-actions.ts | 6 +- .../recompute-resource-value-scores.ts | 10 +- packages/application/tsconfig.json | 2 +- packages/db/package.json | 6 +- packages/db/src/generate-excel.ts | 4 +- packages/db/src/import-dispo-batch.ts | 2 +- packages/db/src/reset-dispo-import.ts | 4 +- packages/db/src/seed-dispo-v2.ts | 2 +- packages/db/src/seed.ts | 16 +- packages/db/src/update-blueprints.ts | 2 +- packages/db/tsconfig.json | 2 +- packages/engine/package.json | 6 +- .../engine/src/__tests__/availability.test.ts | 2 +- packages/engine/src/__tests__/budget.test.ts | 2 +- .../src/__tests__/calculator-rules.test.ts | 4 +- .../src/__tests__/commercial-terms.test.ts | 2 +- .../estimate-export-serializer.test.ts | 2 +- .../engine/src/__tests__/recurrence.test.ts | 4 +- .../engine/src/__tests__/rules-engine.test.ts | 2 +- .../src/__tests__/sah-calculator.test.ts | 2 +- .../src/allocation/availability-validator.ts | 2 +- packages/engine/src/allocation/calculator.ts | 4 +- .../engine/src/allocation/chargeability.ts | 2 +- packages/engine/src/allocation/recurrence.ts | 4 +- packages/engine/src/blueprint/validator.ts | 2 +- packages/engine/src/budget/monitor.ts | 4 +- .../engine/src/estimate/commercial-terms.ts | 2 +- .../engine/src/estimate/export-serializer.ts | 2 +- packages/engine/src/estimate/metrics.ts | 2 +- packages/engine/src/rules/default-rules.ts | 2 +- packages/engine/src/rules/engine.ts | 2 +- packages/engine/src/sah/calculator.ts | 2 +- packages/engine/src/shift/validator.ts | 2 +- packages/engine/tsconfig.json | 2 +- packages/shared/package.json | 4 +- packages/shared/tsconfig.json | 2 +- packages/staffing/package.json | 6 +- packages/staffing/src/capacity-analyzer.ts | 2 +- packages/staffing/src/skill-matcher.ts | 4 +- packages/staffing/src/value-scorer.ts | 2 +- packages/staffing/tsconfig.json | 2 +- packages/ui/package.json | 4 +- packages/ui/tsconfig.json | 2 +- plan.md | 376 ++++++++++-------- pnpm-lock.yaml | 104 ++--- .../v2-architecture-proposal-2026-03-11.md | 2 +- review-report.md | 2 +- scripts/start.sh | 14 +- scripts/stop.sh | 6 +- tooling/docker/app-dev-start.sh | 4 +- tooling/eslint/package.json | 2 +- tooling/prettier/package.json | 2 +- tooling/typescript/package.json | 2 +- 303 files changed, 938 insertions(+), 878 deletions(-) diff --git a/.claude/commands/gitlooper/gitlooper.md b/.claude/commands/gitlooper/gitlooper.md index d1bf3a5..90d92d2 100644 --- a/.claude/commands/gitlooper/gitlooper.md +++ b/.claude/commands/gitlooper/gitlooper.md @@ -436,7 +436,7 @@ The agent operates within the Planarchy monorepo and must adhere to all engineer - **tRPC:** New routers must be registered in `packages/api/src/router/index.ts` - **TypeScript:** `exactOptionalPropertyTypes: true` — use spread pattern, never assign `undefined` - **No speculative abstractions** — only build what the ticket requires -- **Quality gates:** `pnpm test:unit`, `pnpm --filter @planarchy/web exec tsc --noEmit`, `pnpm lint` +- **Quality gates:** `pnpm test:unit`, `pnpm --filter @capakraken/web exec tsc --noEmit`, `pnpm lint` ## Arguments diff --git a/.claude/commands/implement.md b/.claude/commands/implement.md index dfe9f1e..57c99cc 100644 --- a/.claude/commands/implement.md +++ b/.claude/commands/implement.md @@ -7,7 +7,7 @@ Lies `plan.md` und implementiere die Tasks Schritt für Schritt. Führe nach jed - Monorepo: pnpm workspaces + Turborepo - Stack: Next.js 15 App Router + tRPC v11 + Prisma + PostgreSQL - Dev-Server: `pnpm dev` auf Port 3100 -- DB: PostgreSQL auf Port 5433 (`postgresql://planarchy:planarchy_dev@localhost:5433/planarchy`) +- DB: PostgreSQL auf Port 5433 (`postgresql://planarchy:capakraken_dev@localhost:5433/planarchy`) ## Implementierungs-Reihenfolge (immer einhalten) 1. **Prisma Schema** (`packages/db/prisma/schema.prisma`) → `pnpm db:push` @@ -18,14 +18,14 @@ Lies `plan.md` und implementiere die Tasks Schritt für Schritt. Führe nach jed ## Nach jeder Schema-Änderung (Pflicht!) ```bash -DATABASE_URL="postgresql://planarchy:planarchy_dev@localhost:5433/planarchy" \ - pnpm --filter @planarchy/db exec prisma generate +DATABASE_URL="postgresql://planarchy:capakraken_dev@localhost:5433/planarchy" \ + pnpm --filter @capakraken/db exec prisma generate rm -rf apps/web/.next ``` ## Quality Gate nach jedem Task ```bash -pnpm --filter @planarchy/web exec tsc --noEmit 2>&1 | grep -v "BlueprintFieldEditor" +pnpm --filter @capakraken/web exec tsc --noEmit 2>&1 | grep -v "BlueprintFieldEditor" # BlueprintFieldEditor TS2589 ist ein bekannter Pre-existing-Error, kein neuer Fehler ``` @@ -47,6 +47,6 @@ refactor: [refactoring-beschreibung] ## Abschluss Wenn alle Tasks erledigt: 1. `pnpm test:unit` – alle Tests grün? -2. `pnpm --filter @planarchy/web exec tsc --noEmit` – sauber? +2. `pnpm --filter @capakraken/web exec tsc --noEmit` – sauber? 3. Learning in `LEARNINGS.md` eintragen 4. `git commit -m "docs: learning erfasst - [kurzbeschreibung]"` diff --git a/.claude/commands/perf.md b/.claude/commands/perf.md index 007c471..1e33b9b 100644 --- a/.claude/commands/perf.md +++ b/.claude/commands/perf.md @@ -113,7 +113,7 @@ Erstelle `research/perf-audit-[datum].md`: 2. Lies alle tRPC Router in `packages/api/src/router/` 3. Prüfe alle `useQuery`-Aufrufe in `apps/web/src/` auf staleTime und placeholderData 4. Führe PostgreSQL `EXPLAIN ANALYZE` auf die wichtigsten Queries aus -5. Prüfe Bundle-Größen via `pnpm --filter @planarchy/web build` (optional) +5. Prüfe Bundle-Größen via `pnpm --filter @capakraken/web build` (optional) 6. Erstelle priorisierten Befundbericht Beginne sofort mit Layer 1 (Datenbank) und arbeite dich durch alle Layer. diff --git a/.claude/commands/plan.md b/.claude/commands/plan.md index 01e574f..9cd867f 100644 --- a/.claude/commands/plan.md +++ b/.claude/commands/plan.md @@ -32,7 +32,7 @@ Analysiere die gegebene Anforderung und erstelle einen konkreten Umsetzungsplan. ### Akzeptanzkriterien - [ ] `pnpm test:unit` läuft grün -- [ ] `pnpm --filter @planarchy/web exec tsc --noEmit` – keine neuen Errors +- [ ] `pnpm --filter @capakraken/web exec tsc --noEmit` – keine neuen Errors - [ ] [Feature-spezifische Kriterien] ### Risiken & offene Fragen diff --git a/.claude/commands/review.md b/.claude/commands/review.md index 517e635..b518683 100644 --- a/.claude/commands/review.md +++ b/.claude/commands/review.md @@ -18,7 +18,7 @@ pnpm test:unit ### 2. TypeScript ```bash -pnpm --filter @planarchy/web exec tsc --noEmit 2>&1 +pnpm --filter @capakraken/web exec tsc --noEmit 2>&1 # Bekannter Pre-existing-Error: BlueprintFieldEditor.tsx TS2589 → ignorieren # Alle anderen Errors müssen 0 sein ``` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b0c644c..747b686 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate Prisma client - run: pnpm --filter @planarchy/db exec prisma generate + run: pnpm --filter @capakraken/db exec prisma generate - name: Cache Turborepo uses: actions/cache@v4 @@ -47,7 +47,7 @@ jobs: restore-keys: turbo-typecheck- - name: Run typecheck - run: pnpm --filter @planarchy/web exec tsc --noEmit + run: pnpm --filter @capakraken/web exec tsc --noEmit # ────────────────────────────────────────────── # Lint — ~20s, no services needed @@ -71,7 +71,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate Prisma client - run: pnpm --filter @planarchy/db exec prisma generate + run: pnpm --filter @capakraken/db exec prisma generate - name: Cache Turborepo uses: actions/cache@v4 @@ -93,13 +93,13 @@ jobs: postgres: image: postgres:16 env: - POSTGRES_DB: planarchy_test - POSTGRES_USER: planarchy - POSTGRES_PASSWORD: planarchy_test + POSTGRES_DB: capakraken_test + POSTGRES_USER: capakraken + POSTGRES_PASSWORD: capakraken_test ports: - 5432:5432 options: >- - --health-cmd="pg_isready -U planarchy -d planarchy_test" + --health-cmd="pg_isready -U capakraken -d capakraken_test" --health-interval=10s --health-timeout=5s --health-retries=5 @@ -113,7 +113,7 @@ jobs: --health-timeout=5s --health-retries=5 env: - DATABASE_URL: postgresql://planarchy:planarchy_test@localhost:5432/planarchy_test + DATABASE_URL: postgresql://capakraken:capakraken_test@localhost:5432/capakraken_test REDIS_URL: redis://localhost:6379 steps: - uses: actions/checkout@v4 @@ -131,16 +131,16 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate Prisma client - run: pnpm --filter @planarchy/db exec prisma generate + run: pnpm --filter @capakraken/db exec prisma generate - name: Run unit tests with coverage run: | - pnpm --filter @planarchy/engine exec vitest run --coverage - pnpm --filter @planarchy/staffing exec vitest run --coverage - pnpm --filter @planarchy/api exec vitest run --coverage - pnpm --filter @planarchy/application exec vitest run --coverage - pnpm --filter @planarchy/shared exec vitest run --coverage - pnpm --filter @planarchy/db test:unit + pnpm --filter @capakraken/engine exec vitest run --coverage + pnpm --filter @capakraken/staffing exec vitest run --coverage + pnpm --filter @capakraken/api exec vitest run --coverage + pnpm --filter @capakraken/application exec vitest run --coverage + pnpm --filter @capakraken/shared exec vitest run --coverage + pnpm --filter @capakraken/db test:unit # ────────────────────────────────────────────── # Build — depends on typecheck passing @@ -167,7 +167,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate Prisma client - run: pnpm --filter @planarchy/db exec prisma generate + run: pnpm --filter @capakraken/db exec prisma generate - name: Cache Turborepo uses: actions/cache@v4 @@ -184,7 +184,7 @@ jobs: restore-keys: nextjs-${{ hashFiles('pnpm-lock.yaml') }}- - name: Build - run: pnpm --filter @planarchy/web exec next build + run: pnpm --filter @capakraken/web exec next build # ────────────────────────────────────────────── # E2E — depends on build, needs PostgreSQL + Redis @@ -197,13 +197,13 @@ jobs: postgres: image: postgres:16 env: - POSTGRES_DB: planarchy_test - POSTGRES_USER: planarchy - POSTGRES_PASSWORD: planarchy_test + POSTGRES_DB: capakraken_test + POSTGRES_USER: capakraken + POSTGRES_PASSWORD: capakraken_test ports: - 5432:5432 options: >- - --health-cmd="pg_isready -U planarchy -d planarchy_test" + --health-cmd="pg_isready -U capakraken -d capakraken_test" --health-interval=10s --health-timeout=5s --health-retries=5 @@ -217,7 +217,7 @@ jobs: --health-timeout=5s --health-retries=5 env: - DATABASE_URL: postgresql://planarchy:planarchy_test@localhost:5432/planarchy_test + DATABASE_URL: postgresql://capakraken:capakraken_test@localhost:5432/capakraken_test REDIS_URL: redis://localhost:6379 PORT: 3100 steps: @@ -236,7 +236,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Generate Prisma client - run: pnpm --filter @planarchy/db exec prisma generate + run: pnpm --filter @capakraken/db exec prisma generate - name: Cache Playwright browsers id: playwright-cache @@ -248,11 +248,11 @@ jobs: - name: Install Playwright browsers if: steps.playwright-cache.outputs.cache-hit != 'true' - run: pnpm --filter @planarchy/web exec playwright install --with-deps chromium + run: pnpm --filter @capakraken/web exec playwright install --with-deps chromium - name: Install Playwright system deps if: steps.playwright-cache.outputs.cache-hit == 'true' - run: pnpm --filter @planarchy/web exec playwright install-deps chromium + run: pnpm --filter @capakraken/web exec playwright install-deps chromium - name: Push DB schema & seed run: | diff --git a/CLAUDE.md b/CLAUDE.md index ffe5d78..14d9b00 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,8 +1,8 @@ -# Planarchy +# CapaKraken ## Ziel -Planarchy ist ein Ressourcenplanungs- und Projektbesetzungs-Tool fuer eine 3D-Produktionsumgebung. Der aktuelle Produktkern umfasst Timeline-Planung, Kapazitaets- und Budgetsicht, Rollenmanagement, Blueprint-basierte dynamische Felder, Skill-Matrix-Workflows und einen AI-unterstuetzten Staffing-/Profilbereich. +CapaKraken ist ein Ressourcenplanungs- und Projektbesetzungs-Tool fuer eine 3D-Produktionsumgebung. Der aktuelle Produktkern umfasst Timeline-Planung, Kapazitaets- und Budgetsicht, Rollenmanagement, Blueprint-basierte dynamische Felder, Skill-Matrix-Workflows und einen AI-unterstuetzten Staffing-/Profilbereich. ## Tech Stack @@ -41,7 +41,7 @@ planarchy/ ## Quality Gates - `pnpm test:unit` -- `pnpm --filter @planarchy/web exec tsc --noEmit` +- `pnpm --filter @capakraken/web exec tsc --noEmit` - `pnpm lint` ## Dokumente diff --git a/LEARNINGS.md b/LEARNINGS.md index b5a3274..6dabb53 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -27,7 +27,7 @@ ### 2026-03-11 | Architecture | Phase 1: Application Layer Extraction - Created `packages/application` with `createAllocation` and `fillPlaceholder` use-case services - `packages/api` router procedures now delegate to use cases; they only check permissions and emit SSE events -- `packages/application` depends on `@planarchy/db`, `@planarchy/engine`, `@planarchy/shared`; `packages/api` depends on `@planarchy/application` +- `packages/application` depends on `@capakraken/db`, `@capakraken/engine`, `@capakraken/shared`; `packages/api` depends on `@capakraken/application` - Use cases throw `TRPCError` directly (pragmatic — project only uses tRPC transport) - `Prisma.AllocationGetPayload<{ include: ... }>` used for precise return type in use cases - `exactOptionalPropertyTypes` + optional params: caller must use spread `...(val !== undefined ? { key: val } : {})` when passing zod inputs to use cases with `{ key?: T }` interfaces @@ -43,7 +43,7 @@ ### 2026-03-12 | Architecture | Estimating foundation slice - Added first-class Prisma estimating models for `Estimate`, `EstimateVersion`, assumptions, scope items, demand lines, rate cards, resource snapshots, metrics, and exports. - Keep this slice deliberately narrow: persistence + shared contracts + application/engine boundaries first, before any wizard/workspace UI. That avoids baking spreadsheet-shaped UI assumptions into the domain model. -- Shared estimate enums/types/schemas now live in `@planarchy/shared`, and initial application commands/queries (`createEstimate`, `listEstimates`, `getEstimateById`) live in `@planarchy/application`. +- Shared estimate enums/types/schemas now live in `@capakraken/shared`, and initial application commands/queries (`createEstimate`, `listEstimates`, `getEstimateById`) live in `@capakraken/application`. - Added a small engine contract `summarizeEstimateDemandLines()` for aggregate financial totals so later estimate work can reuse a typed pure-function boundary instead of recomputing ad hoc in routers/components. ### 2026-03-11 | Architecture | Tasks 23-27: Bulk Edit, Validation, Export, Reorder @@ -61,10 +61,10 @@ - `useSearchParams` requires `` wrapping at the page level in Next.js App Router or the page will be statically rendered without search param access. ### 2026-03-11 | Security | Phase 0 critical fixes -- `user.create` was hashing passwords with SHA-256; `auth.ts` verifies with Argon2 → users created via admin couldn't log in. Fix: import `hash` from `@node-rs/argon2` in the router. Must also declare `@node-rs/argon2` in `packages/api/package.json` — being a dep of `@planarchy/db` is not enough for TS resolution. +- `user.create` was hashing passwords with SHA-256; `auth.ts` verifies with Argon2 → users created via admin couldn't log in. Fix: import `hash` from `@node-rs/argon2` in the router. Must also declare `@node-rs/argon2` in `packages/api/package.json` — being a dep of `@capakraken/db` is not enough for TS resolution. - `notification.create` was `protectedProcedure` → any logged-in user could create notifications for arbitrary users. Fix: changed to `managerProcedure`. - `testAiConnection` always built Azure deployment URLs regardless of `aiProvider`. Fix: branch on provider, use `https://api.openai.com/v1/chat/completions` with `Authorization: Bearer` for OpenAI. -- `@planarchy/shared` had `test:unit: vitest run` in package.json but no test files → turbo failed. Fix: remove the script (tests live only in engine/staffing). +- `@capakraken/shared` had `test:unit: vitest run` in package.json but no test files → turbo failed. Fix: remove the script (tests live only in engine/staffing). - `crypto.randomUUID()` in `packages/shared/src/schemas/project.schema.ts` failed typecheck because base tsconfig uses `"lib": ["ES2022"]` without DOM. Fix: add `"lib": ["ES2022", "DOM"]` in the shared package's own tsconfig. ### 2026-03-09 | Performance | Budget utilization showing 562% due to wrong aggregation @@ -149,7 +149,7 @@ For modal focus trapping: create a `panelRef = useRef(null)`, ca --- ### 2026-02-xx | Architektur | Prisma-Enum vs. Shared-Enum -**Problem:** Prisma generiert eigene Enum-Typen, die TypeScript-seitig nicht mit den `@planarchy/shared`-Enums kompatibel sind. +**Problem:** Prisma generiert eigene Enum-Typen, die TypeScript-seitig nicht mit den `@capakraken/shared`-Enums kompatibel sind. **Lösung:** An Client-Grenzen `as unknown as SharedType` casten: - `project as unknown as Project` - `form.orderType as unknown as OrderType` @@ -181,7 +181,7 @@ For modal focus trapping: create a `panelRef = useRef(null)`, ca ### 2026-03-06 | Architektur | Redis Pub/Sub für SSE **Problem:** SSE Event-Bus war ein In-Memory-Singleton, funktioniert nicht bei mehreren Server-Instanzen. -**Lösung:** `ioredis` in `@planarchy/api` hinzugefügt. Publisher schreibt Events in Redis-Channel `planarchy:sse`, Subscriber auf jeder Instanz empfängt und liefert lokal aus. Graceful Degradation: bei Redis-Ausfall weiterhin lokale Delivery. +**Lösung:** `ioredis` in `@capakraken/api` hinzugefügt. Publisher schreibt Events in Redis-Channel `planarchy:sse`, Subscriber auf jeder Instanz empfängt und liefert lokal aus. Graceful Degradation: bei Redis-Ausfall weiterhin lokale Delivery. **Import-Pattern:** `import { Redis } from "ioredis"` (named export, nicht default) – notwendig mit `moduleResolution: NodeNext` + ioredis v5. **Offene Frage:** In Dev-Umgebung reicht lokale Delivery; Redis läuft auf Port 6380 via Docker Compose. diff --git a/apps/web/e2e/admin.spec.ts b/apps/web/e2e/admin.spec.ts index 5f15fd1..8c40945 100644 --- a/apps/web/e2e/admin.spec.ts +++ b/apps/web/e2e/admin.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Admin Pages", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); @@ -21,7 +21,7 @@ test.describe("Admin Pages", () => { await expect(page.locator("h1", { hasText: /User Management/i })).toBeVisible({ timeout: 10000 }); // Should show a table with at least the admin user await expect(page.locator("table")).toBeVisible({ timeout: 10000 }); - await expect(page.locator("text=admin@planarchy.dev")).toBeVisible({ timeout: 10000 }); + await expect(page.locator("text=admin@capakraken.dev")).toBeVisible({ timeout: 10000 }); }); test("roles page loads", async ({ page }) => { diff --git a/apps/web/e2e/allocations.spec.ts b/apps/web/e2e/allocations.spec.ts index de5320b..c15bb52 100644 --- a/apps/web/e2e/allocations.spec.ts +++ b/apps/web/e2e/allocations.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Allocations", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/auth.spec.ts b/apps/web/e2e/auth.spec.ts index c68f84e..a102fa2 100644 --- a/apps/web/e2e/auth.spec.ts +++ b/apps/web/e2e/auth.spec.ts @@ -8,7 +8,7 @@ test.describe("Authentication", () => { test("admin can sign in", async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/dashboard.spec.ts b/apps/web/e2e/dashboard.spec.ts index 798b5b8..7471d7f 100644 --- a/apps/web/e2e/dashboard.spec.ts +++ b/apps/web/e2e/dashboard.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Dashboard", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/estimates.spec.ts b/apps/web/e2e/estimates.spec.ts index b1c4e58..227dcb7 100644 --- a/apps/web/e2e/estimates.spec.ts +++ b/apps/web/e2e/estimates.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Estimates", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/navigation.spec.ts b/apps/web/e2e/navigation.spec.ts index 1db8faf..abee8a4 100644 --- a/apps/web/e2e/navigation.spec.ts +++ b/apps/web/e2e/navigation.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Navigation", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/projects.spec.ts b/apps/web/e2e/projects.spec.ts index ef827a7..65d854e 100644 --- a/apps/web/e2e/projects.spec.ts +++ b/apps/web/e2e/projects.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Projects", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "manager@planarchy.dev"); + await page.fill('input[type="email"]', "manager@capakraken.dev"); await page.fill('input[type="password"]', "manager123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/resources/); diff --git a/apps/web/e2e/resources.spec.ts b/apps/web/e2e/resources.spec.ts index 77aaf47..5eea395 100644 --- a/apps/web/e2e/resources.spec.ts +++ b/apps/web/e2e/resources.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Resources", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "manager@planarchy.dev"); + await page.fill('input[type="email"]', "manager@capakraken.dev"); await page.fill('input[type="password"]', "manager123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/resources/); diff --git a/apps/web/e2e/staffing.spec.ts b/apps/web/e2e/staffing.spec.ts index d38049c..a6bcd78 100644 --- a/apps/web/e2e/staffing.spec.ts +++ b/apps/web/e2e/staffing.spec.ts @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test"; test.describe("Staffing", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/timeline.spec.ts b/apps/web/e2e/timeline.spec.ts index b442c77..33eeda7 100644 --- a/apps/web/e2e/timeline.spec.ts +++ b/apps/web/e2e/timeline.spec.ts @@ -5,10 +5,10 @@ test.describe("Timeline", () => { test.beforeEach(async ({ page }) => { await page.addInitScript(() => { - localStorage.setItem("planarchy_theme", JSON.stringify({ mode: "dark" })); + localStorage.setItem("capakraken_theme", JSON.stringify({ mode: "dark" })); }); await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/e2e/vacations.spec.ts b/apps/web/e2e/vacations.spec.ts index b5e7bc9..3b8910a 100644 --- a/apps/web/e2e/vacations.spec.ts +++ b/apps/web/e2e/vacations.spec.ts @@ -4,7 +4,7 @@ test.describe("Vacations", () => { test.describe("My Vacations (self-service)", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); @@ -38,7 +38,7 @@ test.describe("Vacations", () => { test.describe("Vacation Management", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); - await page.fill('input[type="email"]', "admin@planarchy.dev"); + await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index be5b7c4..55c04f1 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -8,12 +8,12 @@ const nextConfig: NextConfig = { optimizePackageImports: ["recharts", "date-fns"], }, transpilePackages: [ - "@planarchy/api", - "@planarchy/db", - "@planarchy/engine", - "@planarchy/shared", - "@planarchy/staffing", - "@planarchy/ui", + "@capakraken/api", + "@capakraken/db", + "@capakraken/engine", + "@capakraken/shared", + "@capakraken/staffing", + "@capakraken/ui", ], typedRoutes: true, async headers() { diff --git a/apps/web/package.json b/apps/web/package.json index 714d174..eb5b700 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,5 +1,5 @@ { - "name": "@planarchy/web", + "name": "@capakraken/web", "version": "0.1.0", "private": true, "scripts": { @@ -15,12 +15,12 @@ "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@node-rs/argon2": "^2.0.2", - "@planarchy/api": "workspace:*", - "@planarchy/application": "workspace:*", - "@planarchy/db": "workspace:*", - "@planarchy/engine": "workspace:*", - "@planarchy/shared": "workspace:*", - "@planarchy/ui": "workspace:*", + "@capakraken/api": "workspace:*", + "@capakraken/application": "workspace:*", + "@capakraken/db": "workspace:*", + "@capakraken/engine": "workspace:*", + "@capakraken/shared": "workspace:*", + "@capakraken/ui": "workspace:*", "@react-pdf/renderer": "^4.3.2", "@sentry/nextjs": "^10.45.0", "@tanstack/react-query": "^5.62.16", @@ -44,7 +44,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@planarchy/tsconfig": "workspace:*", + "@capakraken/tsconfig": "workspace:*", "@playwright/test": "^1.49.1", "@types/node": "^22.10.2", "@types/react": "^19.0.6", diff --git a/apps/web/src/app/(app)/estimates/EstimatesClient.tsx b/apps/web/src/app/(app)/estimates/EstimatesClient.tsx index 205db5e..fea1fe0 100644 --- a/apps/web/src/app/(app)/estimates/EstimatesClient.tsx +++ b/apps/web/src/app/(app)/estimates/EstimatesClient.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from "react"; import Link from "next/link"; -import { EstimateStatus, type EstimateVersionStatus } from "@planarchy/shared"; +import { EstimateStatus, type EstimateVersionStatus } from "@capakraken/shared"; import { clsx } from "clsx"; import { EstimateWizard } from "~/components/estimates/EstimateWizard.js"; import { InfoTooltip } from "~/components/ui/InfoTooltip.js"; diff --git a/apps/web/src/app/(app)/projects/ProjectsClient.tsx b/apps/web/src/app/(app)/projects/ProjectsClient.tsx index f05d6e3..9476ac6 100644 --- a/apps/web/src/app/(app)/projects/ProjectsClient.tsx +++ b/apps/web/src/app/(app)/projects/ProjectsClient.tsx @@ -3,8 +3,8 @@ import { useState, useEffect, useCallback, useMemo, useRef } from "react"; import { createPortal } from "react-dom"; import { formatDate, formatMoney } from "~/lib/format.js"; -import type { Project, ColumnDef } from "@planarchy/shared"; -import { ProjectStatus, PROJECT_COLUMNS, BlueprintTarget } from "@planarchy/shared"; +import type { Project, ColumnDef } from "@capakraken/shared"; +import { ProjectStatus, PROJECT_COLUMNS, BlueprintTarget } from "@capakraken/shared"; import Link from "next/link"; import Image from "next/image"; import { clsx } from "clsx"; diff --git a/apps/web/src/app/(app)/resources/ResourcesClient.tsx b/apps/web/src/app/(app)/resources/ResourcesClient.tsx index 086663b..35edc0d 100644 --- a/apps/web/src/app/(app)/resources/ResourcesClient.tsx +++ b/apps/web/src/app/(app)/resources/ResourcesClient.tsx @@ -3,9 +3,9 @@ import { createPortal } from "react-dom"; import { useState, useEffect, useCallback, useMemo, useRef, type ReactNode } from "react"; import Link from "next/link"; -import type { Resource, SkillEntry } from "@planarchy/shared"; -import { RESOURCE_COLUMNS } from "@planarchy/shared"; -import { BlueprintTarget, ResourceType } from "@planarchy/shared"; +import type { Resource, SkillEntry } from "@capakraken/shared"; +import { RESOURCE_COLUMNS } from "@capakraken/shared"; +import { BlueprintTarget, ResourceType } from "@capakraken/shared"; import { trpc } from "~/lib/trpc/client.js"; import { formatMoney } from "~/lib/format.js"; import { generateCsv, downloadCsv } from "~/lib/csv-export.js"; diff --git a/apps/web/src/app/api/cron/chargeability-alerts/route.ts b/apps/web/src/app/api/cron/chargeability-alerts/route.ts index d5c8ac5..b25f80f 100644 --- a/apps/web/src/app/api/cron/chargeability-alerts/route.ts +++ b/apps/web/src/app/api/cron/chargeability-alerts/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; -import { prisma } from "@planarchy/db"; -import { checkChargeabilityAlerts } from "@planarchy/api"; +import { prisma } from "@capakraken/db"; +import { checkChargeabilityAlerts } from "@capakraken/api"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; diff --git a/apps/web/src/app/api/cron/estimate-reminders/route.ts b/apps/web/src/app/api/cron/estimate-reminders/route.ts index f55f82c..32bcce1 100644 --- a/apps/web/src/app/api/cron/estimate-reminders/route.ts +++ b/apps/web/src/app/api/cron/estimate-reminders/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; -import { prisma } from "@planarchy/db"; -import { checkPendingEstimateReminders } from "@planarchy/api"; +import { prisma } from "@capakraken/db"; +import { checkPendingEstimateReminders } from "@capakraken/api"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; diff --git a/apps/web/src/app/api/cron/public-holidays/route.ts b/apps/web/src/app/api/cron/public-holidays/route.ts index 1a6ffef..5f50483 100644 --- a/apps/web/src/app/api/cron/public-holidays/route.ts +++ b/apps/web/src/app/api/cron/public-holidays/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; -import { prisma } from "@planarchy/db"; -import { autoImportPublicHolidays } from "@planarchy/api"; +import { prisma } from "@capakraken/db"; +import { autoImportPublicHolidays } from "@capakraken/api"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; diff --git a/apps/web/src/app/api/perf/route.ts b/apps/web/src/app/api/perf/route.ts index 2e5771d..472fda3 100644 --- a/apps/web/src/app/api/perf/route.ts +++ b/apps/web/src/app/api/perf/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import { eventBus } from "@planarchy/api/sse"; +import { eventBus } from "@capakraken/api/sse"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; diff --git a/apps/web/src/app/api/ready/route.ts b/apps/web/src/app/api/ready/route.ts index cbbe24e..1e58f06 100644 --- a/apps/web/src/app/api/ready/route.ts +++ b/apps/web/src/app/api/ready/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import { prisma } from "@planarchy/db"; +import { prisma } from "@capakraken/db"; import { createConnection } from "net"; export const dynamic = "force-dynamic"; @@ -18,7 +18,7 @@ async function checkPostgres(): Promise<"ok" | "error"> { /** * Lightweight Redis PING check using a raw TCP socket. - * Avoids importing ioredis (which is only a dependency of @planarchy/api). + * Avoids importing ioredis (which is only a dependency of @capakraken/api). */ async function checkRedis(): Promise<"ok" | "error"> { return new Promise((resolve) => { diff --git a/apps/web/src/app/api/reports/allocations/route.ts b/apps/web/src/app/api/reports/allocations/route.ts index 7cbf76c..7a730e5 100644 --- a/apps/web/src/app/api/reports/allocations/route.ts +++ b/apps/web/src/app/api/reports/allocations/route.ts @@ -2,10 +2,10 @@ import { renderToBuffer } from "@react-pdf/renderer"; import { createElement } from "react"; import { NextResponse } from "next/server"; import * as XLSX from "xlsx"; -import { buildSplitAllocationReadModel } from "@planarchy/application"; -import { anonymizeResource, getAnonymizationDirectory } from "@planarchy/api"; -import { prisma } from "@planarchy/db"; -import type { AllocationLike } from "@planarchy/shared"; +import { buildSplitAllocationReadModel } from "@capakraken/application"; +import { anonymizeResource, getAnonymizationDirectory } from "@capakraken/api"; +import { prisma } from "@capakraken/db"; +import type { AllocationLike } from "@capakraken/shared"; import { auth } from "~/server/auth.js"; import { AllocationReport } from "~/components/reports/AllocationReport.js"; diff --git a/apps/web/src/app/api/sse/timeline/route.ts b/apps/web/src/app/api/sse/timeline/route.ts index 2f18dd4..6cd65ee 100644 --- a/apps/web/src/app/api/sse/timeline/route.ts +++ b/apps/web/src/app/api/sse/timeline/route.ts @@ -1,6 +1,6 @@ -import { eventBus } from "@planarchy/api/sse"; -import { startReminderScheduler } from "@planarchy/api/lib/reminder-scheduler"; -import { SSE_EVENT_TYPES } from "@planarchy/shared"; +import { eventBus } from "@capakraken/api/sse"; +import { startReminderScheduler } from "@capakraken/api/lib/reminder-scheduler"; +import { SSE_EVENT_TYPES } from "@capakraken/shared"; import { auth } from "~/server/auth.js"; // Start the reminder scheduler (idempotent — only starts once) diff --git a/apps/web/src/app/api/trpc/[trpc]/route.ts b/apps/web/src/app/api/trpc/[trpc]/route.ts index b50a242..3d32d61 100644 --- a/apps/web/src/app/api/trpc/[trpc]/route.ts +++ b/apps/web/src/app/api/trpc/[trpc]/route.ts @@ -1,6 +1,6 @@ -import { createTRPCContext, loadRoleDefaults } from "@planarchy/api"; -import { appRouter } from "@planarchy/api/router"; -import { prisma } from "@planarchy/db"; +import { createTRPCContext, loadRoleDefaults } from "@capakraken/api"; +import { appRouter } from "@capakraken/api/router"; +import { prisma } from "@capakraken/db"; import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; import type { NextRequest } from "next/server"; import { auth } from "~/server/auth.js"; diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index be1cd13..b872f23 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -18,7 +18,7 @@ const displayFont = Manrope({ }); export const metadata: Metadata = { - metadataBase: new URL("https://planarchy.hartmut-noerenberg.com"), + metadataBase: new URL("https://capakraken.hartmut-noerenberg.com"), title: "CapaKraken — Resource & Capacity Planning", description: "Interactive resource planning and project staffing tool", manifest: "/manifest.json", @@ -51,7 +51,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })