Skip to content

feat: show cross-project dependencies inline as ghost rows - #27

Merged
andrew-blue merged 1 commit into
mainfrom
feat/it-59-cross-project-dependencies
Nov 13, 2026
Merged

andrew-blue merged 1 commit into
mainfrom
feat/it-59-cross-project-dependencies

Conversation

@andrew-blue

Copy link
Copy Markdown

Summary

Surface cross-project Linear issue dependencies (blocks / blocked_by) inline on the Gantt chart as reorderable ghost rows with SVG dependency arrows, schedule violation warnings, 1-click project jumping, and toggleable inline editing.

Design Spec

  • docs/superpowers/specs/2026-11-12-cross-project-dependencies-design.md

Related Issue

Linear: IT-59

Changes

  • src/types.ts: Added optional cross-project metadata (projectId, projectName, isExternal, isUnscheduledExternal) on Task.
  • src/api/linear.ts: Expanded Query 2's relatedIssue selection to fetch cross-project issue metadata in the same GraphQL batch (zero extra API round-trips), deduplicated shared external blockers/blocked issues across local tasks, separated unscheduled external tasks, and excluded ignored/canceled/duplicate/same-project nodes.
  • src/utils/crossProject.ts: Added mergeTasksWithExternalOrder (places external ghost rows inline right above tasks they block / right below tasks that block them while respecting unified customOrder), filterExternalTasks, and pruneUnlinkedExternalTasks.
  • src/utils/tasks.ts: Updated computeDepViolations to detect cross-project schedule conflicts while skipping isUnscheduledExternal tasks.
  • src/hooks/useLinearData.ts & src/App.tsx: Added externalTasks / externalUnscheduledTasks, showExternal persistence, allowExternalEdits write mode (read-only by default, reset on project switch), unified reorderTask across local and ghost rows, cross-project reschedule/rescheduleStart/cycleStatus/createRelation/removeRelation with rollback and undo, while keeping StatsRow, FilterBar counts, Header range, and usePlanningHistory baselines scoped to the active project.
  • src/components/GanttRow.tsx, src/components/GanttChart.tsx, src/components/DependencyArrows.tsx, src/components/FilterBar.tsx, src/components/DetailPanel.tsx, src/components/detailPanelStore.ts, src/components/Tooltip.tsx:
    • Distinct ghost row/bar styling with clickable project badge (1-click jump via selectProject).
    • Violet dashed SVG arrows for cross-project links (#8b5cf6) and amber dashed arrows (#f97316) for violated dependencies.
    • Cross-project visibility pill and Edit external lock/unlock toggle in FilterBar + DetailPanel cross-project banner and enriched dependency chips (including unscheduled external links and working × removal).
  • src/utils/crossProject.test.ts, src/utils/tasks.test.ts, src/api/linear.test.ts, e2e/gantt.spec.ts: Added 11 unit tests and Chrome/Firefox Playwright E2E coverage.

Checklist

  • npm run format:check passes
  • npm run lint passes (eslint . --max-warnings 0)
  • npm run build, VITE_BACKEND=gcp npm run build, and npm run build:server pass
  • npm test passes (23 files / 363 tests passed, 1 file / 17 Firestore emulator tests skipped)
  • npm run test:e2e passes (20/20 across Chrome and Firefox)
  • Interactive review/testing completed by subagent reviewer (found & fixed stale didDragRef.current click lock after dragging & re-locking external bar)

Verification

  • npm run format:check: passed
  • npm run lint: passed (0 errors, 0 warnings)
  • npm run build, VITE_BACKEND=gcp npm run build, npm run build:server: passed
  • npm test: 363 passed, 17 Firestore emulator tests skipped
  • npm run test:e2e: 20/20 passed across Chrome and Firefox

@andrew-blue
andrew-blue merged commit ffbe64d into main Nov 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant