bdtui 0.8.0 → 0.8.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/CHANGELOG.md +189 -173
- package/README.md +117 -114
- package/bin/bdtui.js +35 -35
- package/package.json +48 -48
- package/src/app.js +617 -604
- package/src/bd.js +130 -130
- package/src/keys.js +100 -99
- package/src/state.js +218 -218
- package/src/views/detail.js +231 -230
- package/src/views/list.js +99 -99
- package/src/views/modals.js +269 -255
package/README.md
CHANGED
|
@@ -1,114 +1,117 @@
|
|
|
1
|
-
# bdtui
|
|
2
|
-
|
|
3
|
-
Fast blessed-based terminal UI for the [`bd`](https://github.com/gastownhall/beads) beads issue tracker.
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
## Requirements
|
|
8
|
-
|
|
9
|
-
- Node ≥ 20
|
|
10
|
-
- `bd` installed and on `$PATH`
|
|
11
|
-
- A project with a `.beads/` database (created by `bd init`)
|
|
12
|
-
- (Optional) A clipboard helper for the `y` yank key:
|
|
13
|
-
- Linux/Wayland: `wl-clipboard` (`sudo apt install wl-clipboard`)
|
|
14
|
-
- Linux/X11: `xclip` (`sudo apt install xclip`) or `xsel`
|
|
15
|
-
- macOS: `pbcopy` (preinstalled)
|
|
16
|
-
- Windows: `clip.exe` (preinstalled on Windows 10/11)
|
|
17
|
-
|
|
18
|
-
## Install
|
|
19
|
-
|
|
20
|
-
First install `bd`:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
brew install beads # macOS / Linux
|
|
24
|
-
npm install -g @beads/bd # via Node.js
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Then install bdtui:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
npm install -g bdtui
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Usage
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
bdtui # use current directory
|
|
37
|
-
bdtui . # explicit current directory
|
|
38
|
-
bdtui ~/www/myapp # explicit project path
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Layout
|
|
42
|
-
|
|
43
|
-
A top tab bar (the active status filter is highlighted — shown here as `[ready]` — followed by the live `type:` / `epic:` / `search:` and bead-count indicators), a two-pane body with the **Beads** list on the left and the **Detail** view on the right, and a bottom status bar:
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
┌──────────────────────────────────────────────────────────────────────────────────
|
|
47
|
-
│ deferred │ blocked │ [ready] │ in_progress │ closed │ all type: all · 27 beads
|
|
48
|
-
├──────────────────────────────────────────────────────────────────────────────────
|
|
49
|
-
│ Beads (27) │ Detail
|
|
50
|
-
│ be-12 P1 in_prog T Fix login │ be-12 — Fix login bug
|
|
51
|
-
│ be-13 P2 open T Retry │ ══════════════════════════════
|
|
52
|
-
│ be-10 P1 open E Auth epic │ Status: in_progress │ Priority: P1 High
|
|
53
|
-
│ be-11 P2 open T ├ OAuth │ Type: bug │ Owner: alice
|
|
54
|
-
│ be-14 P2 closed B └ CSRF │ Created: 2026-06-01 │ Updated: 2026-06-14
|
|
55
|
-
│ │
|
|
56
|
-
│ list · 40% │ detail · 60%
|
|
57
|
-
├───────────────────────────────────────────────────────────────────────────────────
|
|
58
|
-
│ ● Ready ? help · q quit
|
|
59
|
-
└───────────────────────────────────────────────────────────────────────────────────
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Each list row reads `id · priority · status · type-badge · title`. The detail pane shows the selected bead's fields, its close reason (for closed beads), dependencies, and rendered description.
|
|
63
|
-
|
|
64
|
-
Beads with parent–child dependencies are shown as a tree inside the active filter — child rows nest under their epic with `├` / `└`:
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
be-10 P1 open E Auth epic
|
|
68
|
-
be-11 P2 open T ├ Add OAuth login
|
|
69
|
-
be-12 P2 open T └ Refresh tokens
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Keybindings
|
|
73
|
-
|
|
74
|
-
| Key | Action |
|
|
75
|
-
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
76
|
-
| `j` / `↓` | Move down |
|
|
77
|
-
| `k` / `↑` | Move up |
|
|
78
|
-
| `g` / `Shift+g` | Jump to top / bottom |
|
|
79
|
-
| `Enter` / `l` | Focus detail pane |
|
|
80
|
-
| `h` / `Esc` | Back to list (from detail) |
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
|
|
|
85
|
-
|
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
agent-workflow-beads
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
1
|
+
# bdtui
|
|
2
|
+
|
|
3
|
+
Fast blessed-based terminal UI for the [`bd`](https://github.com/gastownhall/beads) beads issue tracker.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- Node ≥ 20
|
|
10
|
+
- `bd` installed and on `$PATH`
|
|
11
|
+
- A project with a `.beads/` database (created by `bd init`)
|
|
12
|
+
- (Optional) A clipboard helper for the `y` yank key:
|
|
13
|
+
- Linux/Wayland: `wl-clipboard` (`sudo apt install wl-clipboard`)
|
|
14
|
+
- Linux/X11: `xclip` (`sudo apt install xclip`) or `xsel`
|
|
15
|
+
- macOS: `pbcopy` (preinstalled)
|
|
16
|
+
- Windows: `clip.exe` (preinstalled on Windows 10/11)
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
First install `bd`:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
brew install beads # macOS / Linux
|
|
24
|
+
npm install -g @beads/bd # via Node.js
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Then install bdtui:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g bdtui
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
bdtui # use current directory
|
|
37
|
+
bdtui . # explicit current directory
|
|
38
|
+
bdtui ~/www/myapp # explicit project path
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Layout
|
|
42
|
+
|
|
43
|
+
A top tab bar (the active status filter is highlighted — shown here as `[ready]` — followed by the live `type:` / `epic:` / `search:` and bead-count indicators), a two-pane body with the **Beads** list on the left and the **Detail** view on the right, and a bottom status bar:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
┌──────────────────────────────────────────────────────────────────────────────────
|
|
47
|
+
│ deferred │ blocked │ [ready] │ in_progress │ closed │ all type: all · 27 beads
|
|
48
|
+
├──────────────────────────────────────────────────────────────────────────────────
|
|
49
|
+
│ Beads (27) │ Detail
|
|
50
|
+
│ be-12 P1 in_prog T Fix login │ be-12 — Fix login bug
|
|
51
|
+
│ be-13 P2 open T Retry │ ══════════════════════════════
|
|
52
|
+
│ be-10 P1 open E Auth epic │ Status: in_progress │ Priority: P1 High
|
|
53
|
+
│ be-11 P2 open T ├ OAuth │ Type: bug │ Owner: alice
|
|
54
|
+
│ be-14 P2 closed B └ CSRF │ Created: 2026-06-01 │ Updated: 2026-06-14
|
|
55
|
+
│ │
|
|
56
|
+
│ list · 40% │ detail · 60%
|
|
57
|
+
├───────────────────────────────────────────────────────────────────────────────────
|
|
58
|
+
│ ● Ready ? help · q quit
|
|
59
|
+
└───────────────────────────────────────────────────────────────────────────────────
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Each list row reads `id · priority · status · type-badge · title`. The detail pane shows the selected bead's fields, its close reason (for closed beads), dependencies, and rendered description.
|
|
63
|
+
|
|
64
|
+
Beads with parent–child dependencies are shown as a tree inside the active filter — child rows nest under their epic with `├` / `└`:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
be-10 P1 open E Auth epic
|
|
68
|
+
be-11 P2 open T ├ Add OAuth login
|
|
69
|
+
be-12 P2 open T └ Refresh tokens
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Keybindings
|
|
73
|
+
|
|
74
|
+
| Key | Action |
|
|
75
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
76
|
+
| `j` / `↓` | Move down |
|
|
77
|
+
| `k` / `↑` | Move up |
|
|
78
|
+
| `g` / `Shift+g` | Jump to top / bottom |
|
|
79
|
+
| `Enter` / `l` | Focus detail pane |
|
|
80
|
+
| `h` / `Esc` | Back to list (from detail) |
|
|
81
|
+
| `j` / `k` (detail) | Scroll detail pane when focused (`g` / `Shift+g` top / bottom, `Ctrl-d` / `Ctrl-u` half page) |
|
|
82
|
+
| `Tab` / `Shift+Tab` | Next / previous status filter (deferred/blocked/ready/in_progress/closed/all) |
|
|
83
|
+
| `t` | Cycle type filter (all/epic/task/chore/bug) |
|
|
84
|
+
| `e` | Filter by epic (modal picker; `x` clears) |
|
|
85
|
+
| `/` | In-memory title filter (empty submit clears it) |
|
|
86
|
+
| `r` | Reload (keeps active filters) |
|
|
87
|
+
| `Shift+r` | Reset all filters (title / epic / type) and reload |
|
|
88
|
+
| `s` | Change status |
|
|
89
|
+
| `c` | Close with reason |
|
|
90
|
+
| `Shift+c` | Claim (in_progress + assign self) |
|
|
91
|
+
| `o` | Reopen |
|
|
92
|
+
| `p` | Change priority |
|
|
93
|
+
| `h` | Change parent (epic / standalone) |
|
|
94
|
+
| `y` | Yank bead ID to clipboard |
|
|
95
|
+
| `w` | Pick a workflow command and copy it with the selected bead's ID. Tasks list the per-bead executors (`/executor-task`, `/executor-task-worktree`, `/executor-epic-task`, `/executor-epic-task-worktree`, `/executor-rework-in-place`); epics list `/executor-epic-sequential` and `/executor-epic-sequential-worktree`. The picker has two sections: **Claude skills** and **OpenCode skills** (the same commands with an `opencode` argument). See [Agent workflow](#agent-workflow). |
|
|
96
|
+
| `m` | Release mouse capture so you can drag-select & copy detail text with your terminal (toggle) |
|
|
97
|
+
| `?` | Help overlay |
|
|
98
|
+
| `q` / `Ctrl-C` | Quit |
|
|
99
|
+
|
|
100
|
+
## Agent workflow
|
|
101
|
+
|
|
102
|
+
Pressing `w` copies a slash-command for the selected bead, e.g. `/executor-task be-12`. Those `/executor-*` commands are [Claude Code](https://claude.com/claude-code) skills scaffolded by [`agent-workflow-beads`](https://www.npmjs.com/package/agent-workflow-beads) — a planner → executor workflow backed by the same beads database. Install it globally, then bootstrap your repo so the copied commands resolve:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm install -g agent-workflow-beads
|
|
106
|
+
agent-workflow-beads bootstrap /path/to/your-repo myprefix
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The picker's **OpenCode skills** section lists the same commands with a trailing `opencode` (e.g. `/executor-task be-12 opencode`). That variant has Claude delegate the implementation step to a headless [OpenCode](https://opencode.ai) implementor while Claude still plans, tests, reviews, and closes the bead. It needs `opencode` on `PATH` and a repo scaffolded with `agent-workflow-beads bootstrap|update --with-opencode` (agent-workflow-beads ≥ 1.2.0). Append `model=<provider/model>` after pasting to pick the OpenCode model; otherwise OpenCode's default is used.
|
|
110
|
+
|
|
111
|
+
## Author
|
|
112
|
+
|
|
113
|
+
[JSIOVN](https://github.com/jsiovn)
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
MIT
|
package/bin/bdtui.js
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { spawnSync } from 'child_process';
|
|
4
|
-
import { createRequire } from 'module';
|
|
5
|
-
|
|
6
|
-
const require = createRequire(import.meta.url);
|
|
7
|
-
const { version } = require('../package.json');
|
|
8
|
-
|
|
9
|
-
const arg = process.argv[2];
|
|
10
|
-
|
|
11
|
-
if (arg === '-v' || arg === '--version') {
|
|
12
|
-
console.log(version);
|
|
13
|
-
process.exit(0);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const cwd = arg ? path.resolve(arg) : process.cwd();
|
|
17
|
-
process.chdir(cwd);
|
|
18
|
-
|
|
19
|
-
ensureDoltRunning(cwd);
|
|
20
|
-
|
|
21
|
-
const { run } = await import('../src/app.js');
|
|
22
|
-
await run(cwd);
|
|
23
|
-
|
|
24
|
-
function ensureDoltRunning(cwd) {
|
|
25
|
-
const test = spawnSync('bd', ['dolt', 'test'], { cwd, stdio: 'ignore' });
|
|
26
|
-
if (test.status === 0) return;
|
|
27
|
-
// `bd` missing or otherwise unusable — let the TUI surface the real error.
|
|
28
|
-
if (test.error && test.error.code === 'ENOENT') return;
|
|
29
|
-
|
|
30
|
-
process.stderr.write("Dolt server not running — starting via 'bd dolt start'…\n");
|
|
31
|
-
const start = spawnSync('bd', ['dolt', 'start'], { cwd, stdio: 'inherit' });
|
|
32
|
-
if (start.status !== 0) {
|
|
33
|
-
process.stderr.write("Failed to start Dolt server. Run 'bd dolt start' manually.\n");
|
|
34
|
-
process.exit(start.status ?? 1);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { spawnSync } from 'child_process';
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const { version } = require('../package.json');
|
|
8
|
+
|
|
9
|
+
const arg = process.argv[2];
|
|
10
|
+
|
|
11
|
+
if (arg === '-v' || arg === '--version') {
|
|
12
|
+
console.log(version);
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const cwd = arg ? path.resolve(arg) : process.cwd();
|
|
17
|
+
process.chdir(cwd);
|
|
18
|
+
|
|
19
|
+
ensureDoltRunning(cwd);
|
|
20
|
+
|
|
21
|
+
const { run } = await import('../src/app.js');
|
|
22
|
+
await run(cwd);
|
|
23
|
+
|
|
24
|
+
function ensureDoltRunning(cwd) {
|
|
25
|
+
const test = spawnSync('bd', ['dolt', 'test'], { cwd, stdio: 'ignore' });
|
|
26
|
+
if (test.status === 0) return;
|
|
27
|
+
// `bd` missing or otherwise unusable — let the TUI surface the real error.
|
|
28
|
+
if (test.error && test.error.code === 'ENOENT') return;
|
|
29
|
+
|
|
30
|
+
process.stderr.write("Dolt server not running — starting via 'bd dolt start'…\n");
|
|
31
|
+
const start = spawnSync('bd', ['dolt', 'start'], { cwd, stdio: 'inherit' });
|
|
32
|
+
if (start.status !== 0) {
|
|
33
|
+
process.stderr.write("Failed to start Dolt server. Run 'bd dolt start' manually.\n");
|
|
34
|
+
process.exit(start.status ?? 1);
|
|
35
|
+
}
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "bdtui",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"description": "Terminal UI (TUI) for the bd beads issue tracker - browse, filter, and update beads from the CLI with vim keybindings",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"bd",
|
|
7
|
-
"beads",
|
|
8
|
-
"bdtui",
|
|
9
|
-
"issue-tracker",
|
|
10
|
-
"tui",
|
|
11
|
-
"terminal-ui",
|
|
12
|
-
"terminal",
|
|
13
|
-
"cli",
|
|
14
|
-
"bug-tracker",
|
|
15
|
-
"project-management",
|
|
16
|
-
"blessed",
|
|
17
|
-
"vim",
|
|
18
|
-
"dependency-aware",
|
|
19
|
-
"developer-tools",
|
|
20
|
-
"nodejs"
|
|
21
|
-
],
|
|
22
|
-
"type": "module",
|
|
23
|
-
"bin": {
|
|
24
|
-
"bdtui": "bin/bdtui.js"
|
|
25
|
-
},
|
|
26
|
-
"files": [
|
|
27
|
-
"bin",
|
|
28
|
-
"src",
|
|
29
|
-
"README.md",
|
|
30
|
-
"CHANGELOG.md"
|
|
31
|
-
],
|
|
32
|
-
"repository": {
|
|
33
|
-
"type": "git",
|
|
34
|
-
"url": "git+https://github.com/jsiovn/bdtui.git"
|
|
35
|
-
},
|
|
36
|
-
"homepage": "https://github.com/jsiovn/bdtui#readme",
|
|
37
|
-
"bugs": {
|
|
38
|
-
"url": "https://github.com/jsiovn/bdtui/issues"
|
|
39
|
-
},
|
|
40
|
-
"author": "JSIOVN",
|
|
41
|
-
"license": "MIT",
|
|
42
|
-
"engines": {
|
|
43
|
-
"node": ">=20"
|
|
44
|
-
},
|
|
45
|
-
"dependencies": {
|
|
46
|
-
"blessed": "^0.1.81"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "bdtui",
|
|
3
|
+
"version": "0.8.1",
|
|
4
|
+
"description": "Terminal UI (TUI) for the bd beads issue tracker - browse, filter, and update beads from the CLI with vim keybindings",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"bd",
|
|
7
|
+
"beads",
|
|
8
|
+
"bdtui",
|
|
9
|
+
"issue-tracker",
|
|
10
|
+
"tui",
|
|
11
|
+
"terminal-ui",
|
|
12
|
+
"terminal",
|
|
13
|
+
"cli",
|
|
14
|
+
"bug-tracker",
|
|
15
|
+
"project-management",
|
|
16
|
+
"blessed",
|
|
17
|
+
"vim",
|
|
18
|
+
"dependency-aware",
|
|
19
|
+
"developer-tools",
|
|
20
|
+
"nodejs"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"bin": {
|
|
24
|
+
"bdtui": "bin/bdtui.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"bin",
|
|
28
|
+
"src",
|
|
29
|
+
"README.md",
|
|
30
|
+
"CHANGELOG.md"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/jsiovn/bdtui.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/jsiovn/bdtui#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/jsiovn/bdtui/issues"
|
|
39
|
+
},
|
|
40
|
+
"author": "JSIOVN",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=20"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"blessed": "^0.1.81"
|
|
47
|
+
}
|
|
48
|
+
}
|