beads-kanban-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.designs/beads-kanban-ui-bj0.md +73 -0
  2. package/.designs/beads-kanban-ui-qxq.md +144 -0
  3. package/.designs/epic-support.md +282 -0
  4. package/.env.local.example +2 -0
  5. package/.eslintrc.json +3 -0
  6. package/.gitattributes +3 -0
  7. package/.github/workflows/release.yml +123 -0
  8. package/.history/README_20260121193710.md +227 -0
  9. package/.history/README_20260121193918.md +227 -0
  10. package/.history/README_20260121193921.md +227 -0
  11. package/.history/README_20260121193933.md +227 -0
  12. package/.history/README_20260121193934.md +227 -0
  13. package/.history/README_20260121193944.md +227 -0
  14. package/.history/README_20260121193953.md +227 -0
  15. package/.history/src/app/page_20260121133429.tsx +134 -0
  16. package/.history/src/app/page_20260121133928.tsx +134 -0
  17. package/.history/src/app/page_20260121144850.tsx +138 -0
  18. package/.history/src/app/page_20260121144854.tsx +138 -0
  19. package/.history/src/app/page_20260121144858.tsx +138 -0
  20. package/.history/src/app/page_20260121144902.tsx +138 -0
  21. package/.history/src/app/page_20260121144906.tsx +138 -0
  22. package/.history/src/app/page_20260121144911.tsx +138 -0
  23. package/.history/src/app/page_20260121144928.tsx +138 -0
  24. package/.playwright-mcp/.playwright-mcp/morphing-dialog-wheel-scroll-fix.png +0 -0
  25. package/.playwright-mcp/beams-test.png +0 -0
  26. package/.playwright-mcp/card-verification.png +0 -0
  27. package/.playwright-mcp/design-doc-dialog-fix-verification.png +0 -0
  28. package/.playwright-mcp/dialog-width-test.png +0 -0
  29. package/.playwright-mcp/homepage.png +0 -0
  30. package/.playwright-mcp/morphing-dialog-expanded.png +0 -0
  31. package/.playwright-mcp/morphing-dialog-fixes-final.png +0 -0
  32. package/.playwright-mcp/morphing-dialog-open.png +0 -0
  33. package/.playwright-mcp/page-2026-01-21T14-08-31-529Z.png +0 -0
  34. package/.playwright-mcp/page-2026-01-21T14-09-23-431Z.png +0 -0
  35. package/.playwright-mcp/page-2026-01-21T14-10-28-773Z.png +0 -0
  36. package/.playwright-mcp/page-2026-01-21T14-10-47-432Z.png +0 -0
  37. package/.playwright-mcp/page-2026-01-21T14-11-12-350Z.png +0 -0
  38. package/.playwright-mcp/screenshot-after-click.png +0 -0
  39. package/.playwright-mcp/screenshot-after-dialog-click.png +0 -0
  40. package/.playwright-mcp/sheet-restored-after-dialog-close.png +0 -0
  41. package/.playwright-mcp/test-1-sheet-open-with-overlay.png +0 -0
  42. package/.playwright-mcp/test-2-morphing-dialog-with-overlay.png +0 -0
  43. package/.playwright-mcp/test-3-sheet-open-dark-overlay.png +0 -0
  44. package/.playwright-mcp/test-4-morphing-dialog-with-dark-overlay.png +0 -0
  45. package/.playwright-mcp/test-5-morphing-dialog-scrolled.png +0 -0
  46. package/.playwright-mcp/test-6-sheet-restored-after-dialog-close.png +0 -0
  47. package/.playwright-mcp/wheel-scroll-fixed.png +0 -0
  48. package/README.md +243 -0
  49. package/Screenshots/bead-detail.png +0 -0
  50. package/Screenshots/dashboard.png +0 -0
  51. package/Screenshots/kanban-board.png +0 -0
  52. package/components.json +27 -0
  53. package/logo/logo.svg +1 -0
  54. package/next.config.js +9 -0
  55. package/npm/README.md +37 -0
  56. package/npm/bin/cli.js +107 -0
  57. package/npm/package.json +20 -0
  58. package/npm/scripts/postinstall.js +132 -0
  59. package/package.json +62 -0
  60. package/postcss.config.js +6 -0
  61. package/public/logo.svg +1 -0
  62. package/restart.sh +5 -0
  63. package/server/Cargo.lock +1685 -0
  64. package/server/Cargo.toml +24 -0
  65. package/server/src/db.rs +570 -0
  66. package/server/src/main.rs +141 -0
  67. package/server/src/routes/beads.rs +413 -0
  68. package/server/src/routes/cli.rs +150 -0
  69. package/server/src/routes/fs.rs +360 -0
  70. package/server/src/routes/git.rs +169 -0
  71. package/server/src/routes/mod.rs +107 -0
  72. package/server/src/routes/projects.rs +177 -0
  73. package/server/src/routes/watch.rs +211 -0
  74. package/src/app/globals.css +101 -0
  75. package/src/app/layout.tsx +36 -0
  76. package/src/app/page.tsx +348 -0
  77. package/src/app/project/kanban-board.tsx +356 -0
  78. package/src/app/project/page.tsx +18 -0
  79. package/src/app/settings/page.tsx +224 -0
  80. package/src/components/Beams.css +5 -0
  81. package/src/components/Beams.jsx +307 -0
  82. package/src/components/Galaxy.css +5 -0
  83. package/src/components/Galaxy.jsx +333 -0
  84. package/src/components/activity-timeline.tsx +172 -0
  85. package/src/components/add-project-dialog.tsx +219 -0
  86. package/src/components/bead-card.tsx +196 -0
  87. package/src/components/bead-detail.tsx +306 -0
  88. package/src/components/color-picker.tsx +101 -0
  89. package/src/components/comment-input.tsx +155 -0
  90. package/src/components/comment-list.tsx +147 -0
  91. package/src/components/dependency-badge.tsx +106 -0
  92. package/src/components/design-doc-dialog.tsx +58 -0
  93. package/src/components/design-doc-preview.tsx +97 -0
  94. package/src/components/design-doc-viewer.tsx +199 -0
  95. package/src/components/editable-project-name.tsx +178 -0
  96. package/src/components/epic-card.tsx +263 -0
  97. package/src/components/folder-browser.tsx +273 -0
  98. package/src/components/footer.tsx +27 -0
  99. package/src/components/kanban/default.tsx +184 -0
  100. package/src/components/kanban-column.tsx +167 -0
  101. package/src/components/project-card.tsx +191 -0
  102. package/src/components/quick-filter-bar.tsx +279 -0
  103. package/src/components/scan-directory-dialog.tsx +368 -0
  104. package/src/components/status-donut.tsx +197 -0
  105. package/src/components/subtask-list.tsx +128 -0
  106. package/src/components/tag-picker.tsx +252 -0
  107. package/src/components/ui/.gitkeep +0 -0
  108. package/src/components/ui/alert-dialog.tsx +141 -0
  109. package/src/components/ui/avatar.tsx +67 -0
  110. package/src/components/ui/badge.tsx +230 -0
  111. package/src/components/ui/button.tsx +433 -0
  112. package/src/components/ui/card/index.tsx +24 -0
  113. package/src/components/ui/card/roiui-card.module.css +197 -0
  114. package/src/components/ui/card/roiui-card.tsx +154 -0
  115. package/src/components/ui/card/shadcn-card.tsx +76 -0
  116. package/src/components/ui/chart.tsx +369 -0
  117. package/src/components/ui/dialog.tsx +122 -0
  118. package/src/components/ui/dropdown-menu.tsx +201 -0
  119. package/src/components/ui/input.tsx +22 -0
  120. package/src/components/ui/kanban.tsx +522 -0
  121. package/src/components/ui/morphing-dialog.tsx +457 -0
  122. package/src/components/ui/popover.tsx +33 -0
  123. package/src/components/ui/progress.tsx +28 -0
  124. package/src/components/ui/scroll-area.tsx +48 -0
  125. package/src/components/ui/select.tsx +159 -0
  126. package/src/components/ui/separator.tsx +31 -0
  127. package/src/components/ui/sheet.tsx +142 -0
  128. package/src/components/ui/skeleton.tsx +15 -0
  129. package/src/components/ui/toast.tsx +129 -0
  130. package/src/components/ui/toaster.tsx +35 -0
  131. package/src/components/ui/tooltip.tsx +30 -0
  132. package/src/hooks/.gitkeep +0 -0
  133. package/src/hooks/use-bead-filters.ts +261 -0
  134. package/src/hooks/use-beads.ts +162 -0
  135. package/src/hooks/use-branch-statuses.ts +161 -0
  136. package/src/hooks/use-epics.ts +173 -0
  137. package/src/hooks/use-file-watcher.ts +111 -0
  138. package/src/hooks/use-keyboard-navigation.ts +282 -0
  139. package/src/hooks/use-project.ts +61 -0
  140. package/src/hooks/use-projects.ts +93 -0
  141. package/src/hooks/use-toast.ts +194 -0
  142. package/src/hooks/useClickOutside.tsx +26 -0
  143. package/src/lib/.gitkeep +0 -0
  144. package/src/lib/api.ts +186 -0
  145. package/src/lib/beads-parser.ts +252 -0
  146. package/src/lib/cli.ts +193 -0
  147. package/src/lib/db.ts +145 -0
  148. package/src/lib/design-doc.ts +74 -0
  149. package/src/lib/epic-parser.ts +242 -0
  150. package/src/lib/git.ts +102 -0
  151. package/src/lib/utils.ts +12 -0
  152. package/src/types/index.ts +107 -0
  153. package/tailwind.config.ts +85 -0
  154. package/tsconfig.json +26 -0
@@ -0,0 +1,73 @@
1
+ # Main Page Design Overhaul
2
+
3
+ ## Epic ID: beads-kanban-ui-bj0
4
+
5
+ ## Overview
6
+
7
+ Modernize the main projects page with an animated beam background, custom typography, and improved layout structure. Remove navbar, add centered heading, create a visually appealing project grid.
8
+
9
+ ## Requirements
10
+
11
+ 1. **Background**: Animated Beams component from @react-bits registry
12
+ - Full-screen, fixed position, behind all content
13
+ - Config: beamWidth=8, beamHeight=14, beamNumber=20, lightColor="#f0c7ff", speed=2, noiseIntensity=1.75, scale=0.2, rotation=30
14
+
15
+ 2. **Typography**: Space Grotesk font family
16
+ - Imported via next/font/google
17
+ - Applied to headings
18
+
19
+ 3. **Layout**:
20
+ - Remove navbar/header completely
21
+ - Add centered heading: "Manage Your Beads Projects"
22
+ - Center the 3-column grid with max-width constraint (~1200px)
23
+ - Keep FAB button for adding projects
24
+ - Move settings icon to top-right corner (fixed position)
25
+
26
+ ## Visual Layout
27
+
28
+ ```
29
+ +--------------------------------------------------+
30
+ | [Settings Icon] (fixed)|
31
+ | |
32
+ | "Manage Your Beads Projects" |
33
+ | (Space Grotesk, centered) |
34
+ | |
35
+ | +-------+ +-------+ +-------+ |
36
+ | | Card | | Card | | Card | |
37
+ | +-------+ +-------+ +-------+ |
38
+ | |
39
+ | [+ FAB] (fixed) |
40
+ +--------------------------------------------------+
41
+ * Animated Beams fill entire viewport behind *
42
+ ```
43
+
44
+ ## Z-Index Layering
45
+
46
+ | Layer | z-index | Component |
47
+ |-------|---------|-----------|
48
+ | Background | 0 | Beams |
49
+ | Content | 10 | Main container, grid, cards |
50
+ | Controls | 20 | FAB, Settings icon |
51
+ | Dialogs | 50 | AddProjectDialog |
52
+
53
+ ## Implementation Tasks
54
+
55
+ 1. **beads-kanban-ui-bj0.1**: Install Beams component
56
+ - `npx shadcn@latest add @react-bits/Beams-JS-CSS`
57
+
58
+ 2. **beads-kanban-ui-bj0.2**: Configure Space Grotesk font
59
+ - Add to layout.tsx via next/font/google
60
+ - Add .font-heading utility class
61
+
62
+ 3. **beads-kanban-ui-bj0.3**: Restructure main page layout
63
+ - Remove header, add Beams background, add heading, center grid
64
+ - Depends on tasks 1 and 2
65
+
66
+ ## File Changes
67
+
68
+ | File | Change |
69
+ |------|--------|
70
+ | src/app/page.tsx | Remove navbar, add Beams, add heading, center layout |
71
+ | src/app/layout.tsx | Add Space Grotesk font |
72
+ | src/app/globals.css | Add .font-heading class |
73
+ | src/components/ui/beams.tsx | New file (from registry) |
@@ -0,0 +1,144 @@
1
+ # Dark Minimalist Theme for Kanban and Settings Pages
2
+
3
+ ## Epic ID: beads-kanban-ui-qxq
4
+
5
+ ## Overview
6
+
7
+ Apply the dark minimalist aesthetic from the home page to the Kanban board (project page) and Settings page. The goal is visual consistency across all pages: dark backgrounds, glass-morphism cards, subtle borders, and refined typography.
8
+
9
+ ## Reference Implementation
10
+
11
+ The home page (`src/app/page.tsx`) establishes the target aesthetic:
12
+ - Root container: `dark min-h-dvh bg-[#0a0a0a]`
13
+ - Nav: `border-zinc-800 bg-[#0a0a0a]/80 backdrop-blur-sm`
14
+ - Cards: roiui glass effect with `backdrop-filter: blur(12px)`
15
+
16
+ ---
17
+
18
+ ## 1. Color Palette
19
+
20
+ ### Background Colors
21
+
22
+ | Usage | Value | Tailwind Class |
23
+ |-------|-------|----------------|
24
+ | Page background | `#0a0a0a` | `bg-[#0a0a0a]` |
25
+ | Column background | - | `bg-zinc-900/50` |
26
+
27
+ ### Border Colors
28
+
29
+ | Usage | Tailwind Class |
30
+ |-------|----------------|
31
+ | Default border | `border-zinc-800` |
32
+ | Hover border | `border-zinc-700` |
33
+ | Focus ring | `ring-zinc-400` |
34
+
35
+ ### Text Colors
36
+
37
+ | Usage | Tailwind Class |
38
+ |-------|----------------|
39
+ | Primary text | `text-white` or `text-foreground` |
40
+ | Secondary text | `text-zinc-400` |
41
+ | Muted text | `text-zinc-500` |
42
+
43
+ ---
44
+
45
+ ## 2. Card Styling (Glass Effect)
46
+
47
+ ```tsx
48
+ <div className={cn(
49
+ "rounded-lg",
50
+ "bg-zinc-900/70 backdrop-blur-md",
51
+ "border border-zinc-800/60",
52
+ "shadow-sm shadow-black/20",
53
+ "transition-all duration-200",
54
+ "hover:-translate-y-0.5 hover:shadow-lg hover:shadow-black/30",
55
+ "hover:border-zinc-700"
56
+ )}>
57
+ ```
58
+
59
+ ### Selected State
60
+ ```tsx
61
+ isSelected && "ring-2 ring-zinc-400 ring-offset-2 ring-offset-[#0a0a0a]"
62
+ ```
63
+
64
+ ### Blocked State
65
+ ```tsx
66
+ blocked ? "border-l-4 border-l-red-500" : "border-l-4 border-l-transparent"
67
+ ```
68
+
69
+ ---
70
+
71
+ ## 3. Column Differentiation
72
+
73
+ Use subtle colored accent bars at the top of each column header instead of colored backgrounds.
74
+
75
+ ### Column Container
76
+ ```tsx
77
+ <div className="flex flex-col h-full min-h-0 rounded-lg bg-zinc-900/30 border border-zinc-800/50">
78
+ ```
79
+
80
+ ### Column Color Mapping
81
+
82
+ | Status | Accent Border | Header Text | Badge BG | Badge Text |
83
+ |--------|---------------|-------------|----------|------------|
84
+ | Open | `border-t-blue-500/60` | `text-blue-400` | `bg-blue-500/20` | `text-blue-400` |
85
+ | In Progress | `border-t-amber-500/60` | `text-amber-400` | `bg-amber-500/20` | `text-amber-400` |
86
+ | In Review | `border-t-purple-500/60` | `text-purple-400` | `bg-purple-500/20` | `text-purple-400` |
87
+ | Closed | `border-t-green-500/60` | `text-green-400` | `bg-green-500/20` | `text-green-400` |
88
+
89
+ ---
90
+
91
+ ## 4. Badge Colors (Dark Theme)
92
+
93
+ ### Priority Badges
94
+
95
+ | Priority | Background | Text |
96
+ |----------|------------|------|
97
+ | P0 (Critical) | `bg-red-500/20` | `text-red-400` |
98
+ | P1 (High) | `bg-orange-500/20` | `text-orange-400` |
99
+ | P2 (Medium) | `bg-zinc-500/20` | `text-zinc-400` |
100
+ | P3/P4 (Low) | `bg-zinc-600/20` | `text-zinc-500` |
101
+
102
+ ### Status Badges
103
+
104
+ | Status | Background | Text |
105
+ |--------|------------|------|
106
+ | BLOCKED | `bg-red-500/20` | `text-red-400` |
107
+ | Open | `bg-blue-500/20` | `text-blue-400` |
108
+ | In Progress | `bg-amber-500/20` | `text-amber-400` |
109
+ | In Review | `bg-purple-500/20` | `text-purple-400` |
110
+ | Closed | `bg-green-500/20` | `text-green-400` |
111
+
112
+ ---
113
+
114
+ ## 5. Page Wrapper Pattern
115
+
116
+ ### Kanban Page
117
+ ```tsx
118
+ <div className="dark min-h-dvh bg-[#0a0a0a]">
119
+ <header className="sticky top-0 z-30 border-b border-zinc-800 bg-[#0a0a0a]/80 backdrop-blur-sm px-4 py-3">
120
+ </header>
121
+ <main className="flex-1 overflow-hidden p-4">
122
+ </main>
123
+ </div>
124
+ ```
125
+
126
+ ### Settings Page
127
+ ```tsx
128
+ <div className="dark min-h-dvh bg-[#0a0a0a]">
129
+ <header className="sticky top-0 z-30 border-b border-zinc-800 bg-[#0a0a0a]/80 backdrop-blur-sm px-6 py-4">
130
+ </header>
131
+ <main className="mx-auto max-w-2xl p-6">
132
+ </main>
133
+ </div>
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 6. Button Variants
139
+
140
+ | Variant | Classes |
141
+ |---------|---------|
142
+ | Primary | `bg-zinc-100 text-zinc-900 hover:bg-white` |
143
+ | Ghost | `text-zinc-400 hover:bg-zinc-800/50 hover:text-zinc-100` |
144
+ | Destructive | `bg-red-900/30 text-red-400 border-red-800/50 hover:bg-red-900/50` |
@@ -0,0 +1,282 @@
1
+ # Epic Support for Beads Kanban UI
2
+
3
+ ## Codebase Analysis Summary
4
+
5
+ ### Technology Stack
6
+ - **Frontend**: Next.js 14, React 18, TypeScript, Tailwind CSS, shadcn/ui (Radix UI primitives)
7
+ - **Backend**: Rust with Axum, SQLite for project metadata
8
+ - **Data Source**: `.beads/issues.jsonl` files (JSONL format)
9
+ - **Real-time**: Server-Sent Events (SSE) for file watching
10
+ - **Icons**: Lucide React
11
+
12
+ ### Current Data Model (`/src/types/index.ts`)
13
+ ```typescript
14
+ interface Bead {
15
+ id: string;
16
+ title: string;
17
+ description?: string;
18
+ status: BeadStatus; // 'open' | 'in_progress' | 'inreview' | 'closed'
19
+ priority: number;
20
+ issue_type: string;
21
+ owner: string;
22
+ created_at: string;
23
+ updated_at: string;
24
+ comments: Comment[];
25
+ }
26
+ ```
27
+
28
+ **Missing fields for epic support**:
29
+ - `parent_id?: string` - For child tasks
30
+ - `children?: string[]` - For epic tasks
31
+ - `issue_type: 'task' | 'epic'` - Already exists but not leveraged
32
+ - `design_doc?: string` - Path to design doc (e.g., `.designs/{EPIC_ID}.md`)
33
+ - `deps?: string[]` - Dependencies for sequencing
34
+
35
+ **Important Notes**:
36
+ - Existing beads without `issue_type` should default to `'task'`
37
+ - `blockers` is a **computed field** derived from `deps` relationships (not stored in data)
38
+
39
+ ### Current Component Structure
40
+ - `KanbanColumn` - Renders a single column with list of `BeadCard` components
41
+ - `BeadCard` - Individual task card with priority, status, branch info
42
+ - `BeadDetail` - Sheet panel showing full bead details
43
+ - `kanban-board.tsx` - Main board orchestrating columns and detail panel
44
+
45
+ ### API Layer
46
+ - Beads read via `GET /api/beads?path=`
47
+ - CLI commands via `POST /api/bd/command` (whitelisted: list, show, comment, update, close, create)
48
+ - File watching via SSE at `/api/watch/beads`
49
+ - Design doc reading would need new endpoint: `GET /api/fs/read?path=`
50
+
51
+ ---
52
+
53
+ ## Implementation Plan
54
+
55
+ ### Phase 1: Backend Extensions (Rust Struct + Endpoints + CLI)
56
+
57
+ **1.1 Extend Rust Bead struct** (`/server/src/routes/beads.rs`)
58
+ ```rust
59
+ pub struct Bead {
60
+ // ... existing fields
61
+ #[serde(default)]
62
+ pub parent_id: Option<String>,
63
+ #[serde(default)]
64
+ pub children: Option<Vec<String>>,
65
+ #[serde(default)]
66
+ pub design_doc: Option<String>,
67
+ #[serde(default)]
68
+ pub deps: Option<Vec<String>>,
69
+ // NOTE: blockers is NOT stored - computed client-side from deps relationships
70
+ }
71
+ ```
72
+
73
+ **1.2 Update CLI whitelist** (`/server/src/routes/bd.rs`)
74
+ ```rust
75
+ const ALLOWED_COMMANDS: &[&str] = &[
76
+ "list", "show", "comment", "update", "close", "create",
77
+ "ready", "epic" // NEW: for bd ready and bd epic status
78
+ ];
79
+ ```
80
+
81
+ **1.3 Add design doc read endpoint** (`/server/src/routes/fs.rs`)
82
+ ```rust
83
+ // GET /api/fs/read?path=.designs/{EPIC_ID}.md
84
+ pub async fn read_file(Query(params): Query<FsReadParams>) -> impl IntoResponse
85
+
86
+ // Security constraints:
87
+ // - Max file size: 100KB
88
+ // - Only .md extension allowed
89
+ // - Path must be within project directory
90
+ // - Path must start with ".designs/"
91
+ ```
92
+
93
+ ---
94
+
95
+ ### Phase 2: Frontend Types & Data Layer
96
+
97
+ **2.1 Extend TypeScript Types** (`/src/types/index.ts`)
98
+ ```typescript
99
+ // Extended Bead interface
100
+ interface Bead {
101
+ // ... existing fields
102
+ parent_id?: string; // ID of parent epic (for children)
103
+ children?: string[]; // IDs of child tasks (for epics)
104
+ design_doc?: string; // Path like ".designs/{EPIC_ID}.md"
105
+ deps?: string[]; // Dependency IDs (blocking this task)
106
+ blockers?: string[]; // COMPUTED: Tasks this blocks (derived from deps relationships)
107
+ }
108
+
109
+ // New Epic-specific types
110
+ interface Epic extends Bead {
111
+ issue_type: 'epic';
112
+ children: string[];
113
+ progress?: EpicProgress;
114
+ }
115
+
116
+ interface EpicProgress {
117
+ total: number;
118
+ completed: number;
119
+ inProgress: number;
120
+ blocked: number;
121
+ }
122
+ ```
123
+
124
+ **Note on blockers field**: The `blockers` field is **computed client-side** from analyzing the `deps` relationships of all beads. It should NOT be stored in the data model. When processing beads, compute blockers dynamically based on which beads list the current bead in their `deps` array.
125
+
126
+ **2.2 Create epic-parser utility** (`/src/lib/epic-parser.ts`)
127
+ - `parseEpicsAndTasks(beads)` - Separate epics from standalone tasks
128
+ - `buildEpicTree(epics, tasks)` - Attach children to parent epics
129
+ - `computeEpicProgress(epic)` - Calculate completion percentages
130
+ - `getBlockedTasks(tasks)` - Identify tasks with unresolved deps
131
+ - `computeBlockers(bead, allBeads)` - Compute which beads this task blocks
132
+
133
+ **2.3 Extend beads-parser** (`/src/lib/beads-parser.ts`)
134
+ - Add `groupByEpicStatus()` for epic-specific grouping
135
+ - Add `getEpicChildren(epicId, beads)` helper
136
+ - Add `isEpicCompleted(epic)` check
137
+
138
+ ---
139
+
140
+ ### Phase 3: UI Components (EpicCard, SubtaskList, DesignDocViewer, DependencyBadge)
141
+
142
+ **3.1 EpicCard Component** (`/src/components/epic-card.tsx`)
143
+ - Larger card with distinctive styling (gradient border, icon)
144
+ - Progress bar showing children completion (3/5)
145
+ - Collapsed children preview (first 2-3 titles)
146
+ - Expand/collapse toggle
147
+ - Design doc indicator badge
148
+ - Different visual treatment from regular BeadCard
149
+
150
+ **3.2 SubtaskList Component** (`/src/components/subtask-list.tsx`)
151
+ - Compact list of child tasks within epic card
152
+ - Checkbox-style status indicators
153
+ - Click to open child detail
154
+ - Drag-to-reorder (future enhancement)
155
+
156
+ **3.3 DesignDocViewer Component** (`/src/components/design-doc-viewer.tsx`)
157
+ - Markdown renderer for `.designs/{EPIC_ID}.md`
158
+ - Collapsible sections
159
+ - Code syntax highlighting
160
+ - Full-screen toggle
161
+ - **Dependencies**: Requires `react-markdown` and `rehype-highlight` (or similar syntax highlighting library) packages
162
+
163
+ **3.4 EpicDetailPanel Component** (`/src/components/epic-detail.tsx`)
164
+ - Extended BeadDetail with:
165
+ - Design doc tab/section
166
+ - Children list with status
167
+ - Dependency graph visualization
168
+ - Progress metrics
169
+ - Epic-level timeline
170
+
171
+ **3.5 DependencyBadge Component** (`/src/components/dependency-badge.tsx`)
172
+ - Shows blocked/blocking status
173
+ - Tooltip with dependency names
174
+ - Click to navigate to blocker
175
+
176
+ ---
177
+
178
+ ### Phase 4: Board Integration (KanbanColumn filtering, useEpics hook, kanban-board updates)
179
+
180
+ **4.1 Update kanban-board.tsx** (`/src/app/project/kanban-board.tsx`)
181
+ - Filter child tasks before rendering columns:
182
+ ```typescript
183
+ // In kanban-board.tsx before passing to KanbanColumn
184
+ const topLevelBeads = beads.filter(b => !b.parent_id);
185
+ ```
186
+ - Render `EpicCard` for `issue_type: 'epic'`
187
+ - Keep `BeadCard` for standalone tasks
188
+ - Hide child tasks from top-level (they show inside epics)
189
+ - Add filter: "Show: All | Epics Only | Tasks Only"
190
+ - Add grouping: "Group by: Status | Epic"
191
+ - Handle epic expansion state
192
+ - Route to EpicDetailPanel or BeadDetail based on type
193
+
194
+ **4.2 Update KanbanColumn** (`/src/components/kanban-column.tsx`)
195
+ - Render `EpicCard` for `issue_type: 'epic'`
196
+ - Keep `BeadCard` for non-epic tasks
197
+ - Only receives top-level beads (already filtered)
198
+
199
+ **4.3 New useEpics hook** (`/src/hooks/use-epics.ts`)
200
+ - Derived from useBeads
201
+ - Separates epics and tasks
202
+ - Computes progress for each epic
203
+ - Handles expansion state
204
+ - Filters to only top-level beads
205
+
206
+ ---
207
+
208
+ ### Phase 5: Enhanced Features (Optional)
209
+
210
+ **5.1 Epic Progress Indicator**
211
+ - Circular progress ring or horizontal bar
212
+ - Color-coded: green (done), amber (in progress), gray (pending), red (blocked)
213
+ - Fraction display: "3/5 children"
214
+
215
+ **5.2 Dependency Visualization**
216
+ - Mini dependency graph in epic detail
217
+ - Lines connecting dependent children
218
+ - Blocked tasks highlighted in red
219
+ - Topological ordering display
220
+
221
+ **5.3 Design Doc Editing** (Future)
222
+ - Inline Markdown editor
223
+ - Auto-save on blur
224
+ - Version history via git
225
+
226
+ **5.4 Epic Timeline/Burndown View**
227
+ - Gantt-style timeline for children
228
+ - Burndown chart showing completion over time
229
+ - Estimated vs actual completion
230
+
231
+ **5.5 Enhanced Filtering**
232
+ - Filter by epic vs standalone
233
+ - Filter by dependency status (blocked/unblocked)
234
+ - Filter by epic parent
235
+ - "Ready to work" view (bd ready equivalent)
236
+
237
+ **5.6 UX Improvements**
238
+ - Keyboard shortcut: `E` to toggle epic filter
239
+ - Drag children between epics
240
+ - Bulk operations on epic children
241
+ - Epic templates for common patterns
242
+
243
+ ---
244
+
245
+ ## Implementation Sequence
246
+
247
+ | Phase | Description | Dependencies |
248
+ |-------|-------------|--------------|
249
+ | 1 | Backend Extensions (Rust struct, GET /api/fs/read, CLI whitelist) | None |
250
+ | 2 | Frontend Types & Data Layer (TypeScript types, epic-parser, beads-parser) | Phase 1 |
251
+ | 3 | UI Components (EpicCard, SubtaskList, DesignDocViewer, DependencyBadge) | Phase 2 |
252
+ | 4 | Board Integration (KanbanColumn filtering, useEpics hook, kanban-board updates) | Phase 3 |
253
+ | 5 | Enhanced Features (progress indicators, dependency visualization, filtering) | Phase 4 |
254
+
255
+ ---
256
+
257
+ ## Critical Files for Implementation
258
+
259
+ | File | Purpose |
260
+ |------|---------|
261
+ | `/src/types/index.ts` | Core type extensions for epic/parent/children |
262
+ | `/src/components/bead-card.tsx` | Pattern to follow for EpicCard |
263
+ | `/src/app/project/kanban-board.tsx` | Main integration point |
264
+ | `/server/src/routes/beads.rs` | Backend bead struct to extend |
265
+ | `/src/lib/beads-parser.ts` | Data processing utilities to extend |
266
+
267
+ ---
268
+
269
+ ## Required Deliverables
270
+
271
+ 1. **Kanban board clearly separates epics/tasks** - EpicCard vs BeadCard rendering
272
+ 2. **Epic item has design document viewer** - DesignDocViewer component
273
+ 3. **Epic items contain all sub tasks** - SubtaskList within EpicCard
274
+ 4. **User can open sub tasks through epic** - Click handler to BeadDetail
275
+
276
+ ## Bonus Features
277
+
278
+ - Progress indicators (3/5 children done)
279
+ - Dependency visualization
280
+ - "Ready to work" filter
281
+ - Epic timeline view
282
+ - Blocked status badges
@@ -0,0 +1,2 @@
1
+ # Backend URL (optional, defaults to http://localhost:3008)
2
+ NEXT_PUBLIC_BACKEND_URL=http://localhost:3008
package/.eslintrc.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "next/core-web-vitals"
3
+ }
package/.gitattributes ADDED
@@ -0,0 +1,3 @@
1
+
2
+ # Use bd merge for beads JSONL files
3
+ .beads/issues.jsonl merge=beads
@@ -0,0 +1,123 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+ workflow_dispatch:
8
+ inputs:
9
+ version:
10
+ description: 'Version to release (e.g., v1.0.0)'
11
+ required: true
12
+ type: string
13
+
14
+ jobs:
15
+ build:
16
+ strategy:
17
+ matrix:
18
+ include:
19
+ - os: macos-latest
20
+ target: aarch64-apple-darwin
21
+ artifact: beads-server-darwin-arm64
22
+ - os: macos-latest
23
+ target: x86_64-apple-darwin
24
+ artifact: beads-server-darwin-x64
25
+ - os: ubuntu-latest
26
+ target: x86_64-unknown-linux-gnu
27
+ artifact: beads-server-linux-x64
28
+ - os: windows-latest
29
+ target: x86_64-pc-windows-msvc
30
+ artifact: beads-server-win32-x64.exe
31
+
32
+ runs-on: ${{ matrix.os }}
33
+
34
+ steps:
35
+ - name: Checkout
36
+ uses: actions/checkout@v4
37
+
38
+ - name: Setup Node.js
39
+ uses: actions/setup-node@v4
40
+ with:
41
+ node-version: '20'
42
+ cache: 'npm'
43
+
44
+ - name: Install frontend dependencies
45
+ run: npm ci
46
+
47
+ - name: Build frontend
48
+ run: npm run build
49
+
50
+ - name: Setup Rust
51
+ uses: dtolnay/rust-toolchain@stable
52
+ with:
53
+ targets: ${{ matrix.target }}
54
+
55
+ - name: Build server
56
+ run: cargo build --release --target ${{ matrix.target }}
57
+ working-directory: server
58
+
59
+ - name: Copy binary (Unix)
60
+ if: runner.os != 'Windows'
61
+ run: cp server/target/${{ matrix.target }}/release/beads-server ${{ matrix.artifact }}
62
+
63
+ - name: Copy binary (Windows)
64
+ if: runner.os == 'Windows'
65
+ run: copy server\target\${{ matrix.target }}\release\beads-server.exe ${{ matrix.artifact }}
66
+
67
+ - name: Upload artifact
68
+ uses: actions/upload-artifact@v4
69
+ with:
70
+ name: ${{ matrix.artifact }}
71
+ path: ${{ matrix.artifact }}
72
+
73
+ release:
74
+ needs: build
75
+ runs-on: ubuntu-latest
76
+ permissions:
77
+ contents: write
78
+
79
+ steps:
80
+ - name: Download all artifacts
81
+ uses: actions/download-artifact@v4
82
+ with:
83
+ path: artifacts
84
+
85
+ - name: Prepare release assets
86
+ run: |
87
+ mkdir -p release
88
+ find artifacts -type f -exec mv {} release/ \;
89
+ ls -la release/
90
+
91
+ - name: Create Release
92
+ uses: softprops/action-gh-release@v1
93
+ with:
94
+ name: ${{ github.ref_name || inputs.version }}
95
+ tag_name: ${{ github.ref_name || inputs.version }}
96
+ files: release/*
97
+ generate_release_notes: true
98
+
99
+ publish-npm:
100
+ needs: release
101
+ runs-on: ubuntu-latest
102
+ steps:
103
+ - name: Checkout
104
+ uses: actions/checkout@v4
105
+
106
+ - name: Setup Node.js
107
+ uses: actions/setup-node@v4
108
+ with:
109
+ node-version: '20'
110
+ registry-url: 'https://registry.npmjs.org'
111
+
112
+ - name: Update package version
113
+ run: |
114
+ VERSION="${{ github.ref_name || inputs.version }}"
115
+ VERSION="${VERSION#v}" # Remove 'v' prefix
116
+ cd npm
117
+ npm version $VERSION --no-git-tag-version --allow-same-version
118
+
119
+ - name: Publish to npm
120
+ run: npm publish
121
+ working-directory: npm
122
+ env:
123
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}