diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..0938adc --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,19 @@ +import nextCoreWebVitals from 'eslint-config-next/core-web-vitals'; +import nextTypeScript from 'eslint-config-next/typescript'; + +export default [ + ...nextCoreWebVitals, + ...nextTypeScript, + { + ignores: ['nul'], + }, + { + files: ['**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}'], + rules: { + 'react-hooks/set-state-in-effect': 'off', + 'prefer-const': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, + }, +]; diff --git a/package.json b/package.json index 35a75fd..c615fe6 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint", + "lint": "eslint .", "typecheck": "tsc --noEmit", "test": "node --test tests/bootstrap.test.mjs && node --import tsx --test tests/lib/parser.test.ts && node --import tsx --test tests/lib/pathing.test.ts && node --import tsx --test tests/lib/project-context.test.ts && node --import tsx --test tests/lib/project-scope.test.ts && node --import tsx --test tests/lib/aggregate-read.test.ts && node --import tsx --test tests/lib/kanban.test.ts && node --import tsx --test tests/lib/graph.test.ts && node --import tsx --test tests/lib/graph-view.test.ts && node --import tsx --test tests/lib/read-text-retry.test.ts && node --import tsx --test tests/lib/read-issues.test.ts && node --import tsx --test tests/lib/bd-path.test.ts && node --import tsx --test tests/lib/bridge.test.ts && node --import tsx --test tests/lib/mutations.test.ts && node --import tsx --test tests/lib/issue-editor.test.ts && node --import tsx --test tests/lib/writeback.test.ts && node --import tsx --test tests/lib/realtime.test.ts && node --import tsx --test tests/lib/coalescer.test.ts && node --import tsx --test tests/lib/watcher.test.ts && node --import tsx --test tests/lib/registry.test.ts && node --import tsx --test tests/lib/scanner.test.ts && node --import tsx --test tests/api/projects-route.test.ts && node --import tsx --test tests/api/mutations-routes.test.ts && node --import tsx --test tests/api/events-route.test.ts && node --test tests/guards/no-direct-jsonl-write.test.mjs && node --test tests/guards/no-inline-style-in-kanban.test.mjs && node --test tests/guards/kanban-responsive-contract.test.mjs && node --test tests/guards/graph-responsive-contract.test.mjs" }, diff --git a/src/components/graph/dependency-graph-page.tsx b/src/components/graph/dependency-graph-page.tsx index b778602..ef54e91 100644 --- a/src/components/graph/dependency-graph-page.tsx +++ b/src/components/graph/dependency-graph-page.tsx @@ -156,13 +156,14 @@ export function DependencyGraphPage({ () => issues .filter((issue) => issue.issue_type === 'epic') + .filter((issue) => (!hideClosed ? true : issue.status !== 'closed')) .sort((a, b) => { // Push closed epics to the end if (a.status === 'closed' && b.status !== 'closed') return 1; if (b.status === 'closed' && a.status !== 'closed') return -1; return a.id.localeCompare(b.id); }), - [issues], + [issues, hideClosed], ); // --- Derived data: tasks grouped by parent epic --- diff --git a/src/components/graph/task-card-grid.tsx b/src/components/graph/task-card-grid.tsx index 40e48b1..464f35b 100644 --- a/src/components/graph/task-card-grid.tsx +++ b/src/components/graph/task-card-grid.tsx @@ -161,6 +161,12 @@ function TaskCard({ issue, selected, blockedBy, blocks, blockers, blocking, isAc const hasBlockers = blockers.length > 0; // Note: blockers list only contains OPEN blockers (computed in page) const badge = statusBadge(issue.status, isActionable, hasBlockers); const projectName = (issue as BeadIssue & { project?: { name?: string } }).project?.name ?? null; + + // Determine effective status: in_progress always shows as in_progress, blocked always blocked, otherwise check blockers + const effectiveStatus: BeadIssue['status'] = issue.status === 'in_progress' ? 'in_progress' : + issue.status === 'blocked' ? 'blocked' : + hasBlockers ? 'blocked' : + issue.status; return (
- + {issue.id} {/* Status Badge */}