beads-kanban-ui 0.1.0 → 0.1.1
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/README.md +16 -222
- package/package.json +18 -55
- package/.designs/beads-kanban-ui-bj0.md +0 -73
- package/.designs/beads-kanban-ui-qxq.md +0 -144
- package/.designs/epic-support.md +0 -282
- package/.env.local.example +0 -2
- package/.eslintrc.json +0 -3
- package/.gitattributes +0 -3
- package/.github/workflows/release.yml +0 -123
- package/.history/README_20260121193710.md +0 -227
- package/.history/README_20260121193918.md +0 -227
- package/.history/README_20260121193921.md +0 -227
- package/.history/README_20260121193933.md +0 -227
- package/.history/README_20260121193934.md +0 -227
- package/.history/README_20260121193944.md +0 -227
- package/.history/README_20260121193953.md +0 -227
- package/.history/src/app/page_20260121133429.tsx +0 -134
- package/.history/src/app/page_20260121133928.tsx +0 -134
- package/.history/src/app/page_20260121144850.tsx +0 -138
- package/.history/src/app/page_20260121144854.tsx +0 -138
- package/.history/src/app/page_20260121144858.tsx +0 -138
- package/.history/src/app/page_20260121144902.tsx +0 -138
- package/.history/src/app/page_20260121144906.tsx +0 -138
- package/.history/src/app/page_20260121144911.tsx +0 -138
- package/.history/src/app/page_20260121144928.tsx +0 -138
- 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/Screenshots/bead-detail.png +0 -0
- package/Screenshots/dashboard.png +0 -0
- package/Screenshots/kanban-board.png +0 -0
- package/components.json +0 -27
- package/logo/logo.svg +0 -1
- package/next.config.js +0 -9
- package/npm/README.md +0 -37
- package/npm/package.json +0 -20
- package/postcss.config.js +0 -6
- package/public/logo.svg +0 -1
- package/restart.sh +0 -5
- package/server/Cargo.lock +0 -1685
- package/server/Cargo.toml +0 -24
- package/server/src/db.rs +0 -570
- package/server/src/main.rs +0 -141
- package/server/src/routes/beads.rs +0 -413
- package/server/src/routes/cli.rs +0 -150
- package/server/src/routes/fs.rs +0 -360
- package/server/src/routes/git.rs +0 -169
- package/server/src/routes/mod.rs +0 -107
- package/server/src/routes/projects.rs +0 -177
- package/server/src/routes/watch.rs +0 -211
- package/src/app/globals.css +0 -101
- package/src/app/layout.tsx +0 -36
- package/src/app/page.tsx +0 -348
- package/src/app/project/kanban-board.tsx +0 -356
- package/src/app/project/page.tsx +0 -18
- package/src/app/settings/page.tsx +0 -224
- package/src/components/Beams.css +0 -5
- package/src/components/Beams.jsx +0 -307
- package/src/components/Galaxy.css +0 -5
- package/src/components/Galaxy.jsx +0 -333
- package/src/components/activity-timeline.tsx +0 -172
- package/src/components/add-project-dialog.tsx +0 -219
- package/src/components/bead-card.tsx +0 -196
- package/src/components/bead-detail.tsx +0 -306
- package/src/components/color-picker.tsx +0 -101
- package/src/components/comment-input.tsx +0 -155
- package/src/components/comment-list.tsx +0 -147
- package/src/components/dependency-badge.tsx +0 -106
- package/src/components/design-doc-dialog.tsx +0 -58
- package/src/components/design-doc-preview.tsx +0 -97
- package/src/components/design-doc-viewer.tsx +0 -199
- package/src/components/editable-project-name.tsx +0 -178
- package/src/components/epic-card.tsx +0 -263
- package/src/components/folder-browser.tsx +0 -273
- package/src/components/footer.tsx +0 -27
- package/src/components/kanban/default.tsx +0 -184
- package/src/components/kanban-column.tsx +0 -167
- package/src/components/project-card.tsx +0 -191
- package/src/components/quick-filter-bar.tsx +0 -279
- package/src/components/scan-directory-dialog.tsx +0 -368
- package/src/components/status-donut.tsx +0 -197
- package/src/components/subtask-list.tsx +0 -128
- package/src/components/tag-picker.tsx +0 -252
- package/src/components/ui/.gitkeep +0 -0
- package/src/components/ui/alert-dialog.tsx +0 -141
- package/src/components/ui/avatar.tsx +0 -67
- package/src/components/ui/badge.tsx +0 -230
- package/src/components/ui/button.tsx +0 -433
- package/src/components/ui/card/index.tsx +0 -24
- package/src/components/ui/card/roiui-card.module.css +0 -197
- package/src/components/ui/card/roiui-card.tsx +0 -154
- package/src/components/ui/card/shadcn-card.tsx +0 -76
- package/src/components/ui/chart.tsx +0 -369
- package/src/components/ui/dialog.tsx +0 -122
- package/src/components/ui/dropdown-menu.tsx +0 -201
- package/src/components/ui/input.tsx +0 -22
- package/src/components/ui/kanban.tsx +0 -522
- package/src/components/ui/morphing-dialog.tsx +0 -457
- package/src/components/ui/popover.tsx +0 -33
- package/src/components/ui/progress.tsx +0 -28
- package/src/components/ui/scroll-area.tsx +0 -48
- package/src/components/ui/select.tsx +0 -159
- package/src/components/ui/separator.tsx +0 -31
- package/src/components/ui/sheet.tsx +0 -142
- package/src/components/ui/skeleton.tsx +0 -15
- package/src/components/ui/toast.tsx +0 -129
- package/src/components/ui/toaster.tsx +0 -35
- package/src/components/ui/tooltip.tsx +0 -30
- package/src/hooks/.gitkeep +0 -0
- package/src/hooks/use-bead-filters.ts +0 -261
- package/src/hooks/use-beads.ts +0 -162
- package/src/hooks/use-branch-statuses.ts +0 -161
- package/src/hooks/use-epics.ts +0 -173
- package/src/hooks/use-file-watcher.ts +0 -111
- package/src/hooks/use-keyboard-navigation.ts +0 -282
- package/src/hooks/use-project.ts +0 -61
- package/src/hooks/use-projects.ts +0 -93
- package/src/hooks/use-toast.ts +0 -194
- package/src/hooks/useClickOutside.tsx +0 -26
- package/src/lib/.gitkeep +0 -0
- package/src/lib/api.ts +0 -186
- package/src/lib/beads-parser.ts +0 -252
- package/src/lib/cli.ts +0 -193
- package/src/lib/db.ts +0 -145
- package/src/lib/design-doc.ts +0 -74
- package/src/lib/epic-parser.ts +0 -242
- package/src/lib/git.ts +0 -102
- package/src/lib/utils.ts +0 -12
- package/src/types/index.ts +0 -107
- package/tailwind.config.ts +0 -85
- package/tsconfig.json +0 -26
- /package/{npm/bin → bin}/cli.js +0 -0
- /package/{npm/scripts → scripts}/postinstall.js +0 -0
package/.designs/epic-support.md
DELETED
|
@@ -1,282 +0,0 @@
|
|
|
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/.env.local.example
DELETED
package/.eslintrc.json
DELETED
package/.gitattributes
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
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 }}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
# Beads Kanban UI
|
|
2
|
-
|
|
3
|
-
**See all your tasks at a glance. Drag, organize, and track progress across projects—no CLI required.**
|
|
4
|
-
|
|
5
|
-
A beautiful visual Kanban board for the [Beads CLI](https://github.com/steveyegge/beads) task tracker. Beads stores tasks as git-native files (`.beads/issues.jsonl`), and this UI gives you the dashboard and board you've been missing.
|
|
6
|
-
|
|
7
|
-
> **Works great with [Beads Orchestration](https://github.com/AvivK5498/Claude-Code-Beads-Orchestration)** — A multi-agent orchestration framework for Claude Code that uses beads for git-native task tracking with mandatory code review gates.
|
|
8
|
-
|
|
9
|
-
## See It in Action
|
|
10
|
-
|
|
11
|
-
**Dashboard** — All your projects in one place with status at a glance:
|
|
12
|
-

|
|
13
|
-
|
|
14
|
-
**Kanban Board** — Organize tasks across Open → In Progress → In Review → Closed:
|
|
15
|
-

|
|
16
|
-
|
|
17
|
-
**Bead Details** — Dive into any task with full context and subtasks:
|
|
18
|
-

|
|
19
|
-
|
|
20
|
-
## What You Get
|
|
21
|
-
|
|
22
|
-
- **Multi-project dashboard** — Manage all your beads projects in one place with status donut charts
|
|
23
|
-
- **Kanban board** — Drag-and-drop columns: Open → In Progress → In Review → Closed
|
|
24
|
-
- **Epic support** — Group related tasks, track progress with bars, view all subtasks
|
|
25
|
-
- **Real-time sync** — File watcher auto-updates when beads files change on disk
|
|
26
|
-
- **Git integration** — See branch status for each task at a glance
|
|
27
|
-
- **Search & filter** — Quick filters for status, priority, owner, and tags
|
|
28
|
-
- **Project tagging** — Organize with colored tags and filter by them
|
|
29
|
-
|
|
30
|
-
## Quick Start (3 steps)
|
|
31
|
-
|
|
32
|
-
### 1. Prerequisites
|
|
33
|
-
```bash
|
|
34
|
-
# Install beads CLI
|
|
35
|
-
brew install steveyegge/beads/bd
|
|
36
|
-
|
|
37
|
-
# You'll also need Node.js 18+ and Rust
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 2. Install and Run
|
|
41
|
-
```bash
|
|
42
|
-
git clone https://github.com/AvivK5498/beads-kanban-ui
|
|
43
|
-
cd beads-kanban-ui
|
|
44
|
-
npm install
|
|
45
|
-
npm run dev:full
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 3. Open in Browser
|
|
49
|
-
Navigate to **`http://localhost:3007`** and add your beads projects.
|
|
50
|
-
|
|
51
|
-
That's it! The app watches for file changes and syncs in real-time.
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## Detailed Setup
|
|
56
|
-
|
|
57
|
-
### Development Mode
|
|
58
|
-
|
|
59
|
-
Run both frontend and backend together:
|
|
60
|
-
```bash
|
|
61
|
-
npm run dev:full
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Or run separately:
|
|
65
|
-
```bash
|
|
66
|
-
# Terminal 1: Frontend (http://localhost:3007)
|
|
67
|
-
npm run dev
|
|
68
|
-
|
|
69
|
-
# Terminal 2: Backend (http://localhost:3008)
|
|
70
|
-
npm run server:dev
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
The Rust backend builds automatically on first run. If you need to rebuild it:
|
|
74
|
-
```bash
|
|
75
|
-
cd server && cargo build --release && cd ..
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Production Build
|
|
79
|
-
|
|
80
|
-
For a single binary deployment:
|
|
81
|
-
```bash
|
|
82
|
-
npm run build
|
|
83
|
-
npm run server:build
|
|
84
|
-
./server/target/release/beads-server
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
The production server embeds the frontend and serves everything from a single binary on port 3008.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## How It Works
|
|
92
|
-
|
|
93
|
-
### Dashboard
|
|
94
|
-
1. Click **+ Add Project** and select a directory with a `.beads/` folder
|
|
95
|
-
2. See all projects with status donuts showing task distribution
|
|
96
|
-
3. Click any project to view its Kanban board
|
|
97
|
-
|
|
98
|
-
### Kanban Board
|
|
99
|
-
1. Tasks are organized by status: Open, In Progress, In Review, Closed
|
|
100
|
-
2. Drag cards between columns to update status
|
|
101
|
-
3. Click any task to see full details, comments, and related subtasks (for epics)
|
|
102
|
-
|
|
103
|
-
### Features in Detail
|
|
104
|
-
|
|
105
|
-
**Search & Filter**
|
|
106
|
-
- Quick filters for status, priority, and assigned owner
|
|
107
|
-
- Project tags for organization
|
|
108
|
-
|
|
109
|
-
**Real-time Sync**
|
|
110
|
-
- The app watches `.beads/issues.jsonl` and updates automatically
|
|
111
|
-
- No refresh needed—changes appear instantly
|
|
112
|
-
|
|
113
|
-
**Git Integration**
|
|
114
|
-
- Each task shows its git branch status
|
|
115
|
-
- Useful for tracking which branch a task lives on
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## Architecture
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
┌─────────────────────────────────────────────────────────┐
|
|
123
|
-
│ Beads Kanban UI │
|
|
124
|
-
├─────────────────────────────────────────────────────────┤
|
|
125
|
-
│ Frontend (Next.js 14) │ Backend (Rust/Axum) │
|
|
126
|
-
│ ───────────────────── │ ────────────────────│
|
|
127
|
-
│ • React 18 │ • SQLite (projects) │
|
|
128
|
-
│ • shadcn/ui components │ • beads CLI bridge │
|
|
129
|
-
│ • Tailwind CSS │ • File watcher │
|
|
130
|
-
│ • TypeScript │ • Git integration │
|
|
131
|
-
└─────────────────────────────────────────────────────────┘
|
|
132
|
-
│
|
|
133
|
-
▼
|
|
134
|
-
┌─────────────────────────┐
|
|
135
|
-
│ .beads/ directory │
|
|
136
|
-
│ (issues.jsonl, etc.) │
|
|
137
|
-
└─────────────────────────┘
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Tech Stack
|
|
141
|
-
- **Frontend**: Next.js 14, React 18, Tailwind CSS, shadcn/ui
|
|
142
|
-
- **Backend**: Rust with Axum framework
|
|
143
|
-
- **Database**: SQLite for project metadata
|
|
144
|
-
- **File Sync**: Real-time watcher for `.beads/` changes
|
|
145
|
-
|
|
146
|
-
### Project Structure
|
|
147
|
-
```
|
|
148
|
-
beads-kanban-ui/
|
|
149
|
-
├── src/
|
|
150
|
-
│ ├── app/ # Next.js pages and routes
|
|
151
|
-
│ │ ├── page.tsx # Projects dashboard
|
|
152
|
-
│ │ ├── project/ # Kanban board view
|
|
153
|
-
│ │ └── settings/ # Settings page
|
|
154
|
-
│ ├── components/ # React components
|
|
155
|
-
│ │ ├── ui/ # shadcn/ui components
|
|
156
|
-
│ │ ├── kanban-column.tsx
|
|
157
|
-
│ │ ├── bead-card.tsx
|
|
158
|
-
│ │ └── bead-detail.tsx
|
|
159
|
-
│ ├── hooks/ # Custom React hooks
|
|
160
|
-
│ ├── lib/ # Utilities and API client
|
|
161
|
-
│ └── types/ # TypeScript type definitions
|
|
162
|
-
├── server/
|
|
163
|
-
│ └── src/
|
|
164
|
-
│ ├── main.rs # Axum server entry point
|
|
165
|
-
│ ├── db.rs # SQLite database layer
|
|
166
|
-
│ └── routes/ # API route handlers
|
|
167
|
-
└── package.json
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## API Endpoints
|
|
173
|
-
|
|
174
|
-
| Endpoint | Method | Description |
|
|
175
|
-
|----------|--------|-------------|
|
|
176
|
-
| `/api/health` | GET | Server health check |
|
|
177
|
-
| `/api/projects` | GET/POST | List or create projects |
|
|
178
|
-
| `/api/projects/:id` | GET/PUT/DELETE | Manage individual projects |
|
|
179
|
-
| `/api/beads?path=` | GET | Read beads from a project path |
|
|
180
|
-
| `/api/beads/comment` | POST | Add comment to a bead |
|
|
181
|
-
| `/api/bd/command` | POST | Execute beads CLI commands |
|
|
182
|
-
| `/api/git/branch-status` | GET | Get git branch status for a bead |
|
|
183
|
-
| `/api/fs/list` | GET | List directory contents |
|
|
184
|
-
| `/api/fs/exists` | GET | Check if a path exists |
|
|
185
|
-
| `/api/watch/beads` | GET | Server-sent events for file changes |
|
|
186
|
-
|
|
187
|
-
### Environment Variables
|
|
188
|
-
|
|
189
|
-
| Variable | Default | Description |
|
|
190
|
-
|----------|---------|-------------|
|
|
191
|
-
| `PORT` | `3008` | Backend server port |
|
|
192
|
-
| `NEXT_PUBLIC_BACKEND_URL` | `http://localhost:3008` | Backend URL for frontend API calls |
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## Development Commands
|
|
197
|
-
|
|
198
|
-
```bash
|
|
199
|
-
# Run both frontend and backend
|
|
200
|
-
npm run dev:full
|
|
201
|
-
|
|
202
|
-
# Run frontend only
|
|
203
|
-
npm run dev
|
|
204
|
-
|
|
205
|
-
# Run backend only
|
|
206
|
-
npm run server:dev
|
|
207
|
-
|
|
208
|
-
# Build for production
|
|
209
|
-
npm run build
|
|
210
|
-
npm run server:build
|
|
211
|
-
|
|
212
|
-
# Linting
|
|
213
|
-
npm run lint
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Related Projects
|
|
219
|
-
|
|
220
|
-
- **[Beads CLI](https://github.com/steveyegge/beads)** — Git-native issue tracker (the core tool this UI wraps)
|
|
221
|
-
- **[Beads Orchestration](https://github.com/AvivK5498/Claude-Code-Beads-Orchestration)** — Multi-agent orchestration framework for Claude Code using beads
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## License
|
|
226
|
-
|
|
227
|
-
MIT
|