Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .github/scripts/audit-gate.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ import { execSync } from 'node:child_process';

// Begründete Ausnahmen: GHSA-ID -> Grund + Datum. Jede Zeile muss auch in .trivyignore
// gespiegelt sein (Trivy-Gate) und via Dependabot-Alert-Dismiss abgedeckt werden.
const ALLOWLIST = {
'GHSA-QWWW-VCR4-C8H2':
'react-router RSC-only CSRF (CWE-352); TaskWolf ist Client-SPA (createBrowserRouter, kein RSC/SSR) -> nicht ausnutzbar. Fix nur in react-router 8.3.0 (Major); v8-Migration geplant, 2026-07-29',
};
const ALLOWLIST = {};

const BLOCK = new Set(['high', 'critical']);
const GHSA_RE = /GHSA-[a-z0-9]{4,}-[a-z0-9]{4,}-[a-z0-9]{4,}/i;
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ jobs:

- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: '20'
# react-router v8 requires Node >= 22.22 at build time.
node-version: '22'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json

Expand Down
7 changes: 0 additions & 7 deletions .trivyignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,2 @@
# Begründete Ausnahmen. Format pro Zeile: CVE-ID # Grund + Datum
# z.B.: CVE-2024-12345 # nicht ausnutzbar (Komponente ungenutzt), 2026-06-28

# react-router GHSA-qwww-vcr4-c8h2 (CSRF, CWE-352, CVSS 7.1): betrifft AUSSCHLIESSLICH
# den unstable RSC-Modus (React Server Components). TaskWolf-Frontend ist eine reine
# Client-SPA (createBrowserRouter, kein SSR/RSC, keine unstable_ APIs) -> Code-Pfad
# ungenutzt, nicht ausnutzbar. Fix nur in react-router 8.3.0 (Major, react-router-dom
# in v8 aufgelöst). Auflösung geplant via v8-Migration -> docs/superpowers/plans/2026-07-29-react-router-v8-migration.md
GHSA-qwww-vcr4-c8h2 # RSC-only CSRF, Client-SPA nicht betroffen, 2026-07-29
56 changes: 13 additions & 43 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"react-dom": "^19.0.0",
"react-grid-layout": "^2.2.3",
"react-i18next": "^17.0.9",
"react-router-dom": "^7.18.1",
"react-router": "^8.3.1",
"recharts": "^3.9.2",
"tailwind-merge": "^3.6.0",
"zustand": "^5.0.14"
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/app/router.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createBrowserRouter, Navigate } from 'react-router-dom'
import { createBrowserRouter, Navigate } from 'react-router'
import { AuthLayout } from '@/layouts/AuthLayout'
import { AppLayout } from '@/layouts/AppLayout'
import { LoginPage } from '@/pages/auth/LoginPage'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/dashboard/IssueListWidget.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'
import { apiClient } from '@/api/client'
import { Link } from 'react-router-dom'
import { Link } from 'react-router'
import type { Issue, Page } from '@/types'
import { useTranslation } from 'react-i18next'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/issue/IssueDetailContent.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useTranslation } from 'react-i18next'
import { useIssue, useUpdateIssue } from '@/hooks/useIssues'
import { useMe } from '@/hooks/useAuth'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/issue/IssueDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useEffect, useRef } from 'react'
import { createPortal } from 'react-dom'
import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import { Link } from 'react-router'
import { IssueDetailContent } from '@/components/issue/IssueDetailContent'

interface Props {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/issue/IssueDialogHost.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useCallback } from 'react'
import { useSearchParams, useMatch } from 'react-router-dom'
import { useSearchParams, useMatch } from 'react-router'
import { IssueDialog } from '@/components/issue/IssueDialog'

interface Props { projectKey: string }
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/nav/NavItem.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NavLink } from 'react-router-dom'
import { NavLink } from 'react-router'
import type { LucideIcon } from 'lucide-react'

export interface NavItemProps {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/notifications/NotificationBell.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useUnreadCount } from '@/hooks/useNotifications'
import { useTranslation } from 'react-i18next'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/hooks/useOpenIssue.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useCallback } from 'react'
import { useSearchParams } from 'react-router-dom'
import { useSearchParams } from 'react-router'

/** Öffnet ein Issue als Modal, indem `?issue=KEY` gesetzt wird (übrige Query-Parameter bleiben erhalten). */
export function useOpenIssue() {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/layouts/AppLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Outlet, Link, useNavigate, useMatch } from 'react-router-dom'
import { Outlet, Link, useNavigate, useMatch } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/layouts/AuthLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Outlet } from 'react-router-dom'
import { Outlet } from 'react-router'
import { VersionTag } from '@/components/VersionTag'

export function AuthLayout() {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/layouts/SettingsLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Outlet, NavLink } from 'react-router-dom'
import { Outlet, NavLink } from 'react-router'
import { useTranslation } from 'react-i18next'
import { User, Shield, Bell, KeyRound, UserX } from 'lucide-react'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { QueryClientProvider } from '@tanstack/react-query'
import { RouterProvider } from 'react-router-dom'
import { RouterProvider } from 'react-router/dom'
import { queryClient } from './app/queryClient'
import { router } from './app/router'
import './index.css'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/admin/AdminAutomationPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useSystemRules, useToggleSystemRule } from '../../hooks/useAutomation'
import { useTranslation } from 'react-i18next'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/auth/LoginPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useNavigate, Link } from 'react-router-dom'
import { useNavigate, Link } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { authApi } from '@/api/auth'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/auth/RegisterPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useNavigate, Link } from 'react-router-dom'
import { useNavigate, Link } from 'react-router'
import { useTranslation } from 'react-i18next'
import { authApi } from '@/api/auth'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/automation/AutomationPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useParams, useNavigate } from 'react-router-dom'
import { useParams, useNavigate } from 'react-router'
import { useAutomationRules, useToggleRule, useDeleteRule } from '../../hooks/useAutomation'
import { useTranslation } from 'react-i18next'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/automation/AutomationRuleEditorPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useParams, useNavigate } from 'react-router-dom'
import { useParams, useNavigate } from 'react-router'
import { useCreateRule } from '../../hooks/useAutomation'
import { RuleEditor } from '../../components/automation/RuleEditor'
import type { TriggerType, RuleConditionGroup, RuleAction } from '../../types'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/backlog/BacklogPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useBacklog } from '@/hooks/useBoard'
import { useStartSprint, useAssignIssue, useUnassignIssue } from '@/hooks/useSprints'
import { useProjectSocket } from '@/hooks/useProjectSocket'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/board/BoardPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useParams, Link } from 'react-router-dom'
import { useParams, Link } from 'react-router'
import { DndContext, DragEndEvent, PointerSensor, useSensor, useSensors } from '@dnd-kit/core'
import { useBoard, useMoveIssue } from '@/hooks/useBoard'
import { useCompleteSprint } from '@/hooks/useSprints'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/dashboard/DashboardPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Link } from 'react-router-dom'
import { Link } from 'react-router'
import { useProjects } from '@/hooks/useProjects'
import { useTranslation } from 'react-i18next'

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/issues/IssueDetailPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { IssueDetailContent } from '@/components/issue/IssueDetailContent'

export function IssueDetailPage() {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/issues/IssueListPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState, useEffect } from 'react'
import { useParams, useSearchParams } from 'react-router-dom'
import { useParams, useSearchParams } from 'react-router'
import { useTranslation } from 'react-i18next'
import { useIssues, useCreateIssue } from '@/hooks/useIssues'
import { useLabels } from '@/hooks/useLabels'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/orgs/OrgSettingsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { organizationsApi } from '@/api/organizations'
import { useOrgMembers, useAddOrgMember, useChangeOrgMemberRole, useRemoveOrgMember } from '@/hooks/useOrganizations'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/orgs/OrgsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { Link } from 'react-router-dom'
import { Link } from 'react-router'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { organizationsApi, CreateOrganizationRequest, Organization } from '@/api/organizations'
import { useMe } from '@/hooks/useAuth'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useProjectDashboard, useSaveDashboardLayout, useAddWidget, useRemoveWidget } from '@/hooks/useProjectDashboard'
import type { WidgetData } from '@/hooks/useProjectDashboard'
import { DashboardCanvas } from '@/components/dashboard/DashboardCanvas'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/ProjectCreatePage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useCreateProject } from '@/hooks/useProjects'
import { useTranslation } from 'react-i18next'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { serviceDeskApi } from '@/api/servicedesk'
import { useTranslation } from 'react-i18next'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { serviceDeskApi } from '@/api/servicedesk'
import { useTranslation } from 'react-i18next'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/settings/CustomFieldsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// frontend/src/pages/projects/settings/CustomFieldsPage.tsx
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { DndContext, closestCenter, DragEndEvent } from '@dnd-kit/core'
import { SortableContext, verticalListSortingStrategy, arrayMove, useSortable } from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/settings/LabelsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useLabels, useCreateLabel, useUpdateLabel, useDeleteLabel } from '@/hooks/useLabels'
import { useProjectRole } from '@/hooks/useProjectRole'
import { LabelChip } from '@/components/issue/LabelChip'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/settings/MembersPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { useProject } from '@/hooks/useProjects'
import {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { useProject } from '@/hooks/useProjects'
import { organizationsApi } from '@/api/organizations'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/settings/ProjectAuditPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useQuery } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { auditApi, AuditEvent } from '../../../api/audit'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/projects/settings/VersionsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useVersions, useCreateVersion, useUpdateVersion, useDeleteVersion } from '@/hooks/useVersions'
import { useProjectRole } from '@/hooks/useProjectRole'
import type { Version } from '@/types'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/reports/ReportsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useSprints } from '@/hooks/useSprints'
import { useBurndown, useVelocity } from '@/hooks/useReports'
import {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/settings/AccountSettingsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useNavigate } from 'react-router-dom'
import { useNavigate } from 'react-router'
import { useDeleteAccount } from '@/hooks/useAccount'

export function AccountSettingsPage() {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/settings/ApiKeysPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import { useApiKeys, useCreateApiKey, useRevokeApiKey } from '@/hooks/useApiKeys'
import type { CreateApiKeyResponse } from '@/hooks/useApiKeys'
import { DataTable, type Column } from '@/components/table/DataTable'
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/pages/settings/IntegrationsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useParams } from 'react-router'
import {
useProjectIntegrations, useCreateIntegration, useDeleteIntegration
} from '@/hooks/useProjectIntegrations'
Expand Down
Loading
Loading