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/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
- ![bdtui screenshot](https://raw.githubusercontent.com/jsiovn/bdtui/master/docs/images/bdtui-jul-03.png)
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
- | `Tab` / `Shift+Tab` | Next / previous status filter (deferred/blocked/ready/in_progress/closed/all) |
82
- | `t` | Cycle type filter (all/epic/task/chore/bug) |
83
- | `e` | Filter by epic (modal picker; `x` clears) |
84
- | `/` | In-memory title filter (empty submit clears it) |
85
- | `r` | Reload (keeps active filters) |
86
- | `Shift+r` | Reset all filters (title / epic / type) and reload |
87
- | `s` | Change status |
88
- | `c` | Close with reason |
89
- | `Shift+c` | Claim (in_progress + assign self) |
90
- | `o` | Reopen |
91
- | `p` | Change priority |
92
- | `h` | Change parent (epic / standalone) |
93
- | `y` | Yank bead ID to clipboard |
94
- | `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`. See [Agent workflow](#agent-workflow). |
95
- | `m` | Release mouse capture so you can drag-select & copy detail text with your terminal (toggle) |
96
- | `?` | Help overlay |
97
- | `q` / `Ctrl-C` | Quit |
98
-
99
- ## Agent workflow
100
-
101
- 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) / Codex 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:
102
-
103
- ```bash
104
- npm install -g agent-workflow-beads
105
- agent-workflow-beads bootstrap /path/to/your-repo myprefix
106
- ```
107
-
108
- ## Author
109
-
110
- [JSIOVN](https://github.com/jsiovn)
111
-
112
- ## License
113
-
114
- MIT
1
+ # bdtui
2
+
3
+ Fast blessed-based terminal UI for the [`bd`](https://github.com/gastownhall/beads) beads issue tracker.
4
+
5
+ ![bdtui screenshot](https://raw.githubusercontent.com/jsiovn/bdtui/master/docs/images/bdtui-jul-03.png)
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.0",
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
+ }