@citadel-labs/beads-ui 2.1.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.claude/worktrees/agent-a7b97047/LICENSE +21 -0
  2. package/.claude/worktrees/agent-a7b97047/README.md +63 -0
  3. package/.claude/worktrees/agent-a7b97047/bin/beads-board.js +183 -0
  4. package/.claude/worktrees/agent-a7b97047/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  5. package/.claude/worktrees/agent-a7b97047/package-lock.json +1752 -0
  6. package/.claude/worktrees/agent-a7b97047/package.json +43 -0
  7. package/.claude/worktrees/agent-a7b97047/server/__tests__/api.test.js +206 -0
  8. package/.claude/worktrees/agent-a7b97047/server/dist/assets/angular-html-DA-rfuFy.js +1 -0
  9. package/.claude/worktrees/agent-a7b97047/server/dist/assets/angular-ts-BrjP3tb8.js +1 -0
  10. package/.claude/worktrees/agent-a7b97047/server/dist/assets/c-BIGW1oBm.js +1 -0
  11. package/.claude/worktrees/agent-a7b97047/server/dist/assets/cpp-BRuaLJcg.js +1 -0
  12. package/.claude/worktrees/agent-a7b97047/server/dist/assets/csharp-COcwbKMJ.js +1 -0
  13. package/.claude/worktrees/agent-a7b97047/server/dist/assets/css-CLj8gQPS.js +1 -0
  14. package/.claude/worktrees/agent-a7b97047/server/dist/assets/dockerfile-BcOcwvcX.js +1 -0
  15. package/.claude/worktrees/agent-a7b97047/server/dist/assets/dotenv-Da5cRb03.js +1 -0
  16. package/.claude/worktrees/agent-a7b97047/server/dist/assets/github-dark-DHJKELXO.js +1 -0
  17. package/.claude/worktrees/agent-a7b97047/server/dist/assets/go-C27-OAKa.js +1 -0
  18. package/.claude/worktrees/agent-a7b97047/server/dist/assets/graphql-ChdNCCLP.js +1 -0
  19. package/.claude/worktrees/agent-a7b97047/server/dist/assets/html-derivative-C6UeqQa8.js +1 -0
  20. package/.claude/worktrees/agent-a7b97047/server/dist/assets/html-pp8916En.js +1 -0
  21. package/.claude/worktrees/agent-a7b97047/server/dist/assets/http-l_GQhCeT.js +1 -0
  22. package/.claude/worktrees/agent-a7b97047/server/dist/assets/index-BBBYE21N.css +1 -0
  23. package/.claude/worktrees/agent-a7b97047/server/dist/assets/index-cZFE6wf9.js +231 -0
  24. package/.claude/worktrees/agent-a7b97047/server/dist/assets/ini-BEwlwnbL.js +1 -0
  25. package/.claude/worktrees/agent-a7b97047/server/dist/assets/java-CylS5w8V.js +1 -0
  26. package/.claude/worktrees/agent-a7b97047/server/dist/assets/javascript-wDzz0qaB.js +1 -0
  27. package/.claude/worktrees/agent-a7b97047/server/dist/assets/json-Cp-IABpG.js +1 -0
  28. package/.claude/worktrees/agent-a7b97047/server/dist/assets/jsonc-Des-eS-w.js +1 -0
  29. package/.claude/worktrees/agent-a7b97047/server/dist/assets/jsonl-DcaNXYhu.js +1 -0
  30. package/.claude/worktrees/agent-a7b97047/server/dist/assets/jsx-g9-lgVsj.js +1 -0
  31. package/.claude/worktrees/agent-a7b97047/server/dist/assets/kotlin-BdnUsdx6.js +1 -0
  32. package/.claude/worktrees/agent-a7b97047/server/dist/assets/kusto-wEQ09or8.js +1 -0
  33. package/.claude/worktrees/agent-a7b97047/server/dist/assets/latex-DdMFrP5M.js +1 -0
  34. package/.claude/worktrees/agent-a7b97047/server/dist/assets/markdown-Cvjx9yec.js +1 -0
  35. package/.claude/worktrees/agent-a7b97047/server/dist/assets/mdc-Dz5ISc6g.js +1 -0
  36. package/.claude/worktrees/agent-a7b97047/server/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  37. package/.claude/worktrees/agent-a7b97047/server/dist/assets/mermaid-mWjccvbQ.js +1 -0
  38. package/.claude/worktrees/agent-a7b97047/server/dist/assets/php-R6g_5hLQ.js +1 -0
  39. package/.claude/worktrees/agent-a7b97047/server/dist/assets/powershell-Dpen1YoG.js +1 -0
  40. package/.claude/worktrees/agent-a7b97047/server/dist/assets/python-B6aJPvgy.js +1 -0
  41. package/.claude/worktrees/agent-a7b97047/server/dist/assets/ruby-AcS3PBV-.js +1 -0
  42. package/.claude/worktrees/agent-a7b97047/server/dist/assets/rust-B1yitclQ.js +1 -0
  43. package/.claude/worktrees/agent-a7b97047/server/dist/assets/sass-Cj5Yp3dK.js +1 -0
  44. package/.claude/worktrees/agent-a7b97047/server/dist/assets/scss-D5BDwBP9.js +1 -0
  45. package/.claude/worktrees/agent-a7b97047/server/dist/assets/shellscript-DfDnw5Jg.js +1 -0
  46. package/.claude/worktrees/agent-a7b97047/server/dist/assets/sql-BLtJtn59.js +1 -0
  47. package/.claude/worktrees/agent-a7b97047/server/dist/assets/svelte-DR4MIrkg.js +1 -0
  48. package/.claude/worktrees/agent-a7b97047/server/dist/assets/swift-D82vCrfD.js +1 -0
  49. package/.claude/worktrees/agent-a7b97047/server/dist/assets/toml-vGWfd6FD.js +1 -0
  50. package/.claude/worktrees/agent-a7b97047/server/dist/assets/tsx-COt5Ahok.js +1 -0
  51. package/.claude/worktrees/agent-a7b97047/server/dist/assets/typescript-BPQ3VLAy.js +1 -0
  52. package/.claude/worktrees/agent-a7b97047/server/dist/assets/vue-CJgBXYWu.js +1 -0
  53. package/.claude/worktrees/agent-a7b97047/server/dist/assets/xml-sdJ4AIDG.js +1 -0
  54. package/.claude/worktrees/agent-a7b97047/server/dist/assets/yaml-Buea-lGh.js +1 -0
  55. package/.claude/worktrees/agent-a7b97047/server/dist/assets/zig-VOosw3JB.js +1 -0
  56. package/.claude/worktrees/agent-a7b97047/server/dist/favicon.svg +103 -0
  57. package/.claude/worktrees/agent-a7b97047/server/dist/index.html +14 -0
  58. package/.claude/worktrees/agent-a7b97047/server/dist/vite.svg +1 -0
  59. package/.claude/worktrees/agent-a7b97047/server/handlers.js +357 -0
  60. package/.claude/worktrees/agent-a7b97047/server/index.js +88 -0
  61. package/.claude/worktrees/agent-a7b97047/server/terminal.js +103 -0
  62. package/.claude/worktrees/agent-a7b97047/vitest.config.mjs +8 -0
  63. package/.claude/worktrees/agent-a952bde8/LICENSE +21 -0
  64. package/.claude/worktrees/agent-a952bde8/README.md +63 -0
  65. package/.claude/worktrees/agent-a952bde8/bin/beads-board.js +183 -0
  66. package/.claude/worktrees/agent-a952bde8/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  67. package/.claude/worktrees/agent-a952bde8/package-lock.json +1752 -0
  68. package/.claude/worktrees/agent-a952bde8/package.json +43 -0
  69. package/.claude/worktrees/agent-a952bde8/server/__tests__/api.test.js +122 -0
  70. package/.claude/worktrees/agent-a952bde8/server/dist/assets/index-BsWRmNbj.js +79 -0
  71. package/.claude/worktrees/agent-a952bde8/server/dist/assets/index-C7JKZkTD.css +1 -0
  72. package/.claude/worktrees/agent-a952bde8/server/dist/favicon.svg +103 -0
  73. package/.claude/worktrees/agent-a952bde8/server/dist/index.html +14 -0
  74. package/.claude/worktrees/agent-a952bde8/server/dist/vite.svg +1 -0
  75. package/.claude/worktrees/agent-a952bde8/server/handlers.js +269 -0
  76. package/.claude/worktrees/agent-a952bde8/server/index.js +88 -0
  77. package/.claude/worktrees/agent-a952bde8/server/terminal.js +103 -0
  78. package/.claude/worktrees/agent-a952bde8/vitest.config.mjs +8 -0
  79. package/README.md +2 -1
  80. package/coverage/base.css +224 -0
  81. package/coverage/block-navigation.js +87 -0
  82. package/coverage/clover.xml +153 -0
  83. package/coverage/coverage-final.json +2 -0
  84. package/coverage/favicon.png +0 -0
  85. package/coverage/handlers.js.html +892 -0
  86. package/coverage/index.html +116 -0
  87. package/coverage/prettify.css +1 -0
  88. package/coverage/prettify.js +2 -0
  89. package/coverage/sort-arrow-sprite.png +0 -0
  90. package/coverage/sorter.js +210 -0
  91. package/package.json +43 -34
  92. package/server/__tests__/api.test.js +261 -0
  93. package/server/dist/assets/angular-html-DA-rfuFy.js +1 -0
  94. package/server/dist/assets/angular-ts-BrjP3tb8.js +1 -0
  95. package/server/dist/assets/c-BIGW1oBm.js +1 -0
  96. package/server/dist/assets/cpp-BRuaLJcg.js +1 -0
  97. package/server/dist/assets/csharp-COcwbKMJ.js +1 -0
  98. package/server/dist/assets/css-CLj8gQPS.js +1 -0
  99. package/server/dist/assets/dockerfile-BcOcwvcX.js +1 -0
  100. package/server/dist/assets/dotenv-Da5cRb03.js +1 -0
  101. package/server/dist/assets/github-dark-DHJKELXO.js +1 -0
  102. package/server/dist/assets/go-C27-OAKa.js +1 -0
  103. package/server/dist/assets/graphql-ChdNCCLP.js +1 -0
  104. package/server/dist/assets/html-derivative-C6UeqQa8.js +1 -0
  105. package/server/dist/assets/html-pp8916En.js +1 -0
  106. package/server/dist/assets/http-l_GQhCeT.js +1 -0
  107. package/server/dist/assets/index-DOFQi_E1.js +231 -0
  108. package/server/dist/assets/index-DeppoR8O.css +1 -0
  109. package/server/dist/assets/ini-BEwlwnbL.js +1 -0
  110. package/server/dist/assets/java-CylS5w8V.js +1 -0
  111. package/server/dist/assets/javascript-wDzz0qaB.js +1 -0
  112. package/server/dist/assets/json-Cp-IABpG.js +1 -0
  113. package/server/dist/assets/jsonc-Des-eS-w.js +1 -0
  114. package/server/dist/assets/jsonl-DcaNXYhu.js +1 -0
  115. package/server/dist/assets/jsx-g9-lgVsj.js +1 -0
  116. package/server/dist/assets/kotlin-BdnUsdx6.js +1 -0
  117. package/server/dist/assets/kusto-wEQ09or8.js +1 -0
  118. package/server/dist/assets/latex-DdMFrP5M.js +1 -0
  119. package/server/dist/assets/markdown-Cvjx9yec.js +1 -0
  120. package/server/dist/assets/mdc-Dz5ISc6g.js +1 -0
  121. package/server/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  122. package/server/dist/assets/mermaid-mWjccvbQ.js +1 -0
  123. package/server/dist/assets/php-R6g_5hLQ.js +1 -0
  124. package/server/dist/assets/powershell-Dpen1YoG.js +1 -0
  125. package/server/dist/assets/python-B6aJPvgy.js +1 -0
  126. package/server/dist/assets/ruby-AcS3PBV-.js +1 -0
  127. package/server/dist/assets/rust-B1yitclQ.js +1 -0
  128. package/server/dist/assets/sass-Cj5Yp3dK.js +1 -0
  129. package/server/dist/assets/scss-D5BDwBP9.js +1 -0
  130. package/server/dist/assets/shellscript-DfDnw5Jg.js +1 -0
  131. package/server/dist/assets/sql-BLtJtn59.js +1 -0
  132. package/server/dist/assets/svelte-DR4MIrkg.js +1 -0
  133. package/server/dist/assets/swift-D82vCrfD.js +1 -0
  134. package/server/dist/assets/toml-vGWfd6FD.js +1 -0
  135. package/server/dist/assets/tsx-COt5Ahok.js +1 -0
  136. package/server/dist/assets/typescript-BPQ3VLAy.js +1 -0
  137. package/server/dist/assets/vue-CJgBXYWu.js +1 -0
  138. package/server/dist/assets/xml-sdJ4AIDG.js +1 -0
  139. package/server/dist/assets/yaml-Buea-lGh.js +1 -0
  140. package/server/dist/assets/zig-VOosw3JB.js +1 -0
  141. package/server/dist/index.html +2 -2
  142. package/server/handlers.js +356 -0
  143. package/server/index.js +2 -242
  144. package/server/terminal.js +2 -4
  145. package/vitest.config.mjs +8 -0
  146. package/server/dist/assets/index-BNjM8bEC.css +0 -1
  147. package/server/dist/assets/index-BU8XOdEX.js +0 -75
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('node:path');
4
+ const fs = require('node:fs');
5
+ const { spawn } = require('node:child_process');
6
+
7
+ const SERVER_SCRIPT = path.join(__dirname, '..', 'server', 'index.js');
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // Argument parsing
11
+ // ---------------------------------------------------------------------------
12
+
13
+ const rawArgs = process.argv.slice(2);
14
+
15
+ // Extract subcommand (start, stop, status) — default to "start"
16
+ const SUBCOMMANDS = ['start', 'stop', 'status'];
17
+ let subcommand = 'start';
18
+ const args = [];
19
+ for (const arg of rawArgs) {
20
+ if (SUBCOMMANDS.includes(arg) && args.length === 0 && subcommand === 'start') {
21
+ subcommand = arg;
22
+ } else {
23
+ args.push(arg);
24
+ }
25
+ }
26
+
27
+ // --help
28
+ if (args.includes('--help') || args.includes('-h')) {
29
+ console.log(`bdui — Kanban dashboard and git log viewer for Beads
30
+
31
+ Usage:
32
+ bdui [project-dir] [options] Start the dashboard (default)
33
+ bdui start [project-dir] [options] Start the dashboard
34
+ bdui stop [project-dir] Stop a running dashboard
35
+ bdui status [project-dir] Show running dashboard info
36
+
37
+ Options:
38
+ --port <port> Port to listen on (default: 8377)
39
+ --foreground Run in foreground (don't daemonize)
40
+ --help, -h Show this help message
41
+ --version, -v Show version number
42
+
43
+ Examples:
44
+ bdui # Start dashboard for current directory
45
+ bdui /path/to/project # Specify project directory
46
+ bdui --port 9000 # Custom port
47
+ bdui stop # Stop the running dashboard
48
+ bdui status # Check if dashboard is running`);
49
+ process.exit(0);
50
+ }
51
+
52
+ // --version
53
+ if (args.includes('--version') || args.includes('-v')) {
54
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
55
+ console.log(pkg.version);
56
+ process.exit(0);
57
+ }
58
+
59
+ // --foreground
60
+ const foreground = args.includes('--foreground');
61
+ const filteredArgs = args.filter(a => a !== '--foreground');
62
+
63
+ // --port
64
+ let customPort = null;
65
+ const portIdx = filteredArgs.indexOf('--port');
66
+ if (portIdx !== -1) {
67
+ customPort = filteredArgs[portIdx + 1];
68
+ if (!customPort || isNaN(parseInt(customPort, 10))) {
69
+ console.error('Error: --port requires a numeric value');
70
+ process.exit(1);
71
+ }
72
+ filteredArgs.splice(portIdx, 2);
73
+ }
74
+
75
+ // Remaining arg is the project directory
76
+ const projectDir = filteredArgs[0] ? path.resolve(filteredArgs[0]) : process.cwd();
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Validation
80
+ // ---------------------------------------------------------------------------
81
+
82
+ if (!fs.existsSync(projectDir)) {
83
+ console.error(`Error: directory not found: ${projectDir}`);
84
+ process.exit(1);
85
+ }
86
+
87
+ if (!fs.existsSync(path.join(projectDir, '.beads'))) {
88
+ console.error(`Error: no .beads/ directory found in ${projectDir}`);
89
+ console.error('This project does not appear to use Beads issue tracking.');
90
+ console.error('See https://github.com/steveyegge/beads to get started.');
91
+ process.exit(1);
92
+ }
93
+
94
+ // ---------------------------------------------------------------------------
95
+ // Pidfile helpers
96
+ // ---------------------------------------------------------------------------
97
+
98
+ const PIDFILE = path.join(projectDir, '.beads-board.pid');
99
+
100
+ function getRunningInstance() {
101
+ try {
102
+ const data = JSON.parse(fs.readFileSync(PIDFILE, 'utf8'));
103
+ process.kill(data.pid, 0); // throws if not running
104
+ return data;
105
+ } catch {
106
+ // Clean up stale pidfile
107
+ try { fs.unlinkSync(PIDFILE); } catch {}
108
+ return null;
109
+ }
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Subcommands
114
+ // ---------------------------------------------------------------------------
115
+
116
+ if (subcommand === 'status') {
117
+ const instance = getRunningInstance();
118
+ if (instance) {
119
+ console.log(`beads-board running at http://localhost:${instance.port} (pid ${instance.pid})`);
120
+ } else {
121
+ console.log('beads-board is not running');
122
+ process.exit(1);
123
+ }
124
+ process.exit(0);
125
+ }
126
+
127
+ if (subcommand === 'stop') {
128
+ const instance = getRunningInstance();
129
+ if (!instance) {
130
+ console.log('beads-board is not running');
131
+ process.exit(0);
132
+ }
133
+ try {
134
+ process.kill(instance.pid, 'SIGTERM');
135
+ console.log(`beads-board stopped (was http://localhost:${instance.port}, pid ${instance.pid})`);
136
+ } catch (err) {
137
+ console.error(`Failed to stop beads-board (pid ${instance.pid}): ${err.message}`);
138
+ process.exit(1);
139
+ }
140
+ process.exit(0);
141
+ }
142
+
143
+ // subcommand === 'start'
144
+ const existing = getRunningInstance();
145
+ if (existing) {
146
+ console.log(`beads-board already running at http://localhost:${existing.port} (pid ${existing.pid})`);
147
+ process.exit(0);
148
+ }
149
+
150
+ if (foreground) {
151
+ // Run server in foreground (debugging)
152
+ if (customPort) process.env.PORT = customPort;
153
+ process.argv = [process.argv[0], __filename, projectDir];
154
+ require(SERVER_SCRIPT);
155
+ } else {
156
+ // Spawn detached server process
157
+ const env = { ...process.env };
158
+ if (customPort) env.PORT = customPort;
159
+
160
+ const child = spawn(process.execPath, [SERVER_SCRIPT, projectDir], {
161
+ detached: true,
162
+ stdio: 'ignore',
163
+ env,
164
+ windowsHide: true,
165
+ });
166
+ child.unref();
167
+
168
+ // Wait for pidfile to confirm startup (poll up to 3s)
169
+ const start = Date.now();
170
+ const poll = setInterval(() => {
171
+ const instance = getRunningInstance();
172
+ if (instance) {
173
+ clearInterval(poll);
174
+ console.log(`beads-board running at http://localhost:${instance.port}`);
175
+ process.exit(0);
176
+ }
177
+ if (Date.now() - start > 3000) {
178
+ clearInterval(poll);
179
+ console.error('Error: server failed to start within 3 seconds');
180
+ process.exit(1);
181
+ }
182
+ }, 100);
183
+ }
@@ -0,0 +1 @@
1
+ {"version":"4.0.18","results":[[":server/__tests__/api.test.js",{"duration":41.729600000000005,"failed":false}]]}