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.
- package/.designs/beads-kanban-ui-bj0.md +73 -0
- package/.designs/beads-kanban-ui-qxq.md +144 -0
- package/.designs/epic-support.md +282 -0
- package/.env.local.example +2 -0
- package/.eslintrc.json +3 -0
- package/.gitattributes +3 -0
- package/.github/workflows/release.yml +123 -0
- package/.history/README_20260121193710.md +227 -0
- package/.history/README_20260121193918.md +227 -0
- package/.history/README_20260121193921.md +227 -0
- package/.history/README_20260121193933.md +227 -0
- package/.history/README_20260121193934.md +227 -0
- package/.history/README_20260121193944.md +227 -0
- package/.history/README_20260121193953.md +227 -0
- package/.history/src/app/page_20260121133429.tsx +134 -0
- package/.history/src/app/page_20260121133928.tsx +134 -0
- package/.history/src/app/page_20260121144850.tsx +138 -0
- package/.history/src/app/page_20260121144854.tsx +138 -0
- package/.history/src/app/page_20260121144858.tsx +138 -0
- package/.history/src/app/page_20260121144902.tsx +138 -0
- package/.history/src/app/page_20260121144906.tsx +138 -0
- package/.history/src/app/page_20260121144911.tsx +138 -0
- package/.history/src/app/page_20260121144928.tsx +138 -0
- package/.playwright-mcp/.playwright-mcp/morphing-dialog-wheel-scroll-fix.png +0 -0
- package/.playwright-mcp/beams-test.png +0 -0
- package/.playwright-mcp/card-verification.png +0 -0
- package/.playwright-mcp/design-doc-dialog-fix-verification.png +0 -0
- package/.playwright-mcp/dialog-width-test.png +0 -0
- package/.playwright-mcp/homepage.png +0 -0
- package/.playwright-mcp/morphing-dialog-expanded.png +0 -0
- package/.playwright-mcp/morphing-dialog-fixes-final.png +0 -0
- package/.playwright-mcp/morphing-dialog-open.png +0 -0
- package/.playwright-mcp/page-2026-01-21T14-08-31-529Z.png +0 -0
- package/.playwright-mcp/page-2026-01-21T14-09-23-431Z.png +0 -0
- package/.playwright-mcp/page-2026-01-21T14-10-28-773Z.png +0 -0
- package/.playwright-mcp/page-2026-01-21T14-10-47-432Z.png +0 -0
- package/.playwright-mcp/page-2026-01-21T14-11-12-350Z.png +0 -0
- package/.playwright-mcp/screenshot-after-click.png +0 -0
- package/.playwright-mcp/screenshot-after-dialog-click.png +0 -0
- package/.playwright-mcp/sheet-restored-after-dialog-close.png +0 -0
- package/.playwright-mcp/test-1-sheet-open-with-overlay.png +0 -0
- package/.playwright-mcp/test-2-morphing-dialog-with-overlay.png +0 -0
- package/.playwright-mcp/test-3-sheet-open-dark-overlay.png +0 -0
- package/.playwright-mcp/test-4-morphing-dialog-with-dark-overlay.png +0 -0
- package/.playwright-mcp/test-5-morphing-dialog-scrolled.png +0 -0
- package/.playwright-mcp/test-6-sheet-restored-after-dialog-close.png +0 -0
- package/.playwright-mcp/wheel-scroll-fixed.png +0 -0
- package/README.md +243 -0
- package/Screenshots/bead-detail.png +0 -0
- package/Screenshots/dashboard.png +0 -0
- package/Screenshots/kanban-board.png +0 -0
- package/components.json +27 -0
- package/logo/logo.svg +1 -0
- package/next.config.js +9 -0
- package/npm/README.md +37 -0
- package/npm/bin/cli.js +107 -0
- package/npm/package.json +20 -0
- package/npm/scripts/postinstall.js +132 -0
- package/package.json +62 -0
- package/postcss.config.js +6 -0
- package/public/logo.svg +1 -0
- package/restart.sh +5 -0
- package/server/Cargo.lock +1685 -0
- package/server/Cargo.toml +24 -0
- package/server/src/db.rs +570 -0
- package/server/src/main.rs +141 -0
- package/server/src/routes/beads.rs +413 -0
- package/server/src/routes/cli.rs +150 -0
- package/server/src/routes/fs.rs +360 -0
- package/server/src/routes/git.rs +169 -0
- package/server/src/routes/mod.rs +107 -0
- package/server/src/routes/projects.rs +177 -0
- package/server/src/routes/watch.rs +211 -0
- package/src/app/globals.css +101 -0
- package/src/app/layout.tsx +36 -0
- package/src/app/page.tsx +348 -0
- package/src/app/project/kanban-board.tsx +356 -0
- package/src/app/project/page.tsx +18 -0
- package/src/app/settings/page.tsx +224 -0
- package/src/components/Beams.css +5 -0
- package/src/components/Beams.jsx +307 -0
- package/src/components/Galaxy.css +5 -0
- package/src/components/Galaxy.jsx +333 -0
- package/src/components/activity-timeline.tsx +172 -0
- package/src/components/add-project-dialog.tsx +219 -0
- package/src/components/bead-card.tsx +196 -0
- package/src/components/bead-detail.tsx +306 -0
- package/src/components/color-picker.tsx +101 -0
- package/src/components/comment-input.tsx +155 -0
- package/src/components/comment-list.tsx +147 -0
- package/src/components/dependency-badge.tsx +106 -0
- package/src/components/design-doc-dialog.tsx +58 -0
- package/src/components/design-doc-preview.tsx +97 -0
- package/src/components/design-doc-viewer.tsx +199 -0
- package/src/components/editable-project-name.tsx +178 -0
- package/src/components/epic-card.tsx +263 -0
- package/src/components/folder-browser.tsx +273 -0
- package/src/components/footer.tsx +27 -0
- package/src/components/kanban/default.tsx +184 -0
- package/src/components/kanban-column.tsx +167 -0
- package/src/components/project-card.tsx +191 -0
- package/src/components/quick-filter-bar.tsx +279 -0
- package/src/components/scan-directory-dialog.tsx +368 -0
- package/src/components/status-donut.tsx +197 -0
- package/src/components/subtask-list.tsx +128 -0
- package/src/components/tag-picker.tsx +252 -0
- package/src/components/ui/.gitkeep +0 -0
- package/src/components/ui/alert-dialog.tsx +141 -0
- package/src/components/ui/avatar.tsx +67 -0
- package/src/components/ui/badge.tsx +230 -0
- package/src/components/ui/button.tsx +433 -0
- package/src/components/ui/card/index.tsx +24 -0
- package/src/components/ui/card/roiui-card.module.css +197 -0
- package/src/components/ui/card/roiui-card.tsx +154 -0
- package/src/components/ui/card/shadcn-card.tsx +76 -0
- package/src/components/ui/chart.tsx +369 -0
- package/src/components/ui/dialog.tsx +122 -0
- package/src/components/ui/dropdown-menu.tsx +201 -0
- package/src/components/ui/input.tsx +22 -0
- package/src/components/ui/kanban.tsx +522 -0
- package/src/components/ui/morphing-dialog.tsx +457 -0
- package/src/components/ui/popover.tsx +33 -0
- package/src/components/ui/progress.tsx +28 -0
- package/src/components/ui/scroll-area.tsx +48 -0
- package/src/components/ui/select.tsx +159 -0
- package/src/components/ui/separator.tsx +31 -0
- package/src/components/ui/sheet.tsx +142 -0
- package/src/components/ui/skeleton.tsx +15 -0
- package/src/components/ui/toast.tsx +129 -0
- package/src/components/ui/toaster.tsx +35 -0
- package/src/components/ui/tooltip.tsx +30 -0
- package/src/hooks/.gitkeep +0 -0
- package/src/hooks/use-bead-filters.ts +261 -0
- package/src/hooks/use-beads.ts +162 -0
- package/src/hooks/use-branch-statuses.ts +161 -0
- package/src/hooks/use-epics.ts +173 -0
- package/src/hooks/use-file-watcher.ts +111 -0
- package/src/hooks/use-keyboard-navigation.ts +282 -0
- package/src/hooks/use-project.ts +61 -0
- package/src/hooks/use-projects.ts +93 -0
- package/src/hooks/use-toast.ts +194 -0
- package/src/hooks/useClickOutside.tsx +26 -0
- package/src/lib/.gitkeep +0 -0
- package/src/lib/api.ts +186 -0
- package/src/lib/beads-parser.ts +252 -0
- package/src/lib/cli.ts +193 -0
- package/src/lib/db.ts +145 -0
- package/src/lib/design-doc.ts +74 -0
- package/src/lib/epic-parser.ts +242 -0
- package/src/lib/git.ts +102 -0
- package/src/lib/utils.ts +12 -0
- package/src/types/index.ts +107 -0
- package/tailwind.config.ts +85 -0
- 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
|
package/.eslintrc.json
ADDED
package/.gitattributes
ADDED
|
@@ -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 }}
|