agkan 2.2.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.
@@ -3,6 +3,6 @@ import { TaskService } from '../services/TaskService';
3
3
  import { TaskTagService } from '../services/TaskTagService';
4
4
  import { MetadataService } from '../services/MetadataService';
5
5
  import { StorageProvider } from '../db/types/storage';
6
- export declare function createBoardApp(taskService?: TaskService, taskTagService?: TaskTagService, metadataService?: MetadataService, db?: StorageProvider): Hono;
7
- export declare function startBoardServer(port: number): void;
6
+ export declare function createBoardApp(taskService?: TaskService, taskTagService?: TaskTagService, metadataService?: MetadataService, db?: StorageProvider, boardTitle?: string): Hono;
7
+ export declare function startBoardServer(port: number, boardTitle?: string): void;
8
8
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA2mBtD,wBAAgB,cAAc,CAC5B,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,cAAc,EAC/B,eAAe,CAAC,EAAE,eAAe,EACjC,EAAE,CAAC,EAAE,eAAe,GACnB,IAAI,CAiHN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA+xBtD,wBAAgB,cAAc,CAC5B,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,cAAc,EAC/B,eAAe,CAAC,EAAE,eAAe,EACjC,EAAE,CAAC,EAAE,eAAe,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAWN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxE"}
@@ -52,38 +52,15 @@ function renderCard(task, tags) {
52
52
  ${tagBadges ? `<div class="card-tags">${tagBadges}</div>` : ''}
53
53
  </div>`;
54
54
  }
55
- function renderBoard(tasksByStatus, tagMap) {
56
- const columns = STATUSES.map((status) => {
57
- const tasks = tasksByStatus.get(status) || [];
58
- const color = STATUS_COLORS[status];
59
- const label = STATUS_LABELS[status];
60
- const cards = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
61
- return `
62
- <div class="column" data-status="${status}">
63
- <div class="column-header" style="border-top-color:${color}">
64
- <span class="column-title" style="color:${color}">${label}</span>
65
- <span class="column-header-right">
66
- <span class="column-count">${tasks.length}</span>
67
- <button class="add-btn" data-status="${status}" title="Add task">+</button>
68
- </span>
69
- </div>
70
- <div class="column-body" id="col-${status}">
71
- ${cards}
72
- </div>
73
- </div>`;
74
- }).join('');
75
- return `<!DOCTYPE html>
76
- <html lang="en">
77
- <head>
78
- <meta charset="UTF-8">
79
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
80
- <title>agkan board</title>
81
- <style>
55
+ const BOARD_STYLES = `
82
56
  * { box-sizing: border-box; margin: 0; padding: 0; }
83
57
  body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f1f5f9; color: #1e293b; }
84
- header { background: #1e293b; color: white; padding: 12px 20px; }
58
+ header { background: #1e293b; color: white; padding: 12px 20px; display: flex; align-items: center; justify-content: space-between; }
85
59
  header h1 { font-size: 18px; font-weight: 700; }
86
- .board { display: flex; gap: 12px; padding: 16px; overflow-x: auto; min-height: calc(100vh - 48px); align-items: flex-start; }
60
+ .board-title { font-size: 14px; font-weight: 400; opacity: 0.75; }
61
+ .board-container { display: flex; width: 100%; height: calc(100vh - 48px); gap: 0; }
62
+ .board { display: flex; gap: 12px; padding: 16px; overflow-x: auto; flex: 1; align-items: flex-start; min-width: 0; }
63
+ .board.with-panel { padding-right: 0; }
87
64
  .column { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; width: 240px; flex-shrink: 0; display: flex; flex-direction: column; border-top: 3px solid transparent; }
88
65
  .column-header { padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #e2e8f0; }
89
66
  .column-title { font-size: 13px; font-weight: 700; }
@@ -126,16 +103,16 @@ function renderBoard(tasksByStatus, tagMap) {
126
103
  .modal-actions button.primary:hover { background: #2563eb; }
127
104
  .toast { position: fixed; bottom: 20px; right: 20px; background: #ef4444; color: white; padding: 10px 16px; border-radius: 6px; font-size: 13px; opacity: 0; transition: opacity 0.3s; pointer-events: none; }
128
105
  .toast.show { opacity: 1; }
129
- .detail-panel { position: fixed; top: 0; right: 0; width: 400px; height: 100vh; background: white; box-shadow: -4px 0 16px rgba(0,0,0,0.1); z-index: 1500; transform: translateX(100%); transition: transform 0.25s ease; display: flex; flex-direction: column; min-width: 280px; max-width: 800px; }
106
+ .detail-panel { position: relative; width: 0; height: calc(100vh - 48px); background: white; box-shadow: none; border-left: 0 solid #e2e8f0; display: flex; flex-direction: column; max-width: 800px; overflow: hidden; transition: width 0.25s ease; }
130
107
  .detail-panel-resize-handle { position: absolute; top: 0; left: 0; width: 6px; height: 100%; cursor: col-resize; z-index: 10; background: transparent; }
131
108
  .detail-panel-resize-handle:hover, .detail-panel-resize-handle.dragging { background: rgba(59,130,246,0.3); }
132
- .detail-panel.open { transform: translateX(0); }
133
- .detail-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #e2e8f0; }
134
- .detail-panel-header h2 { font-size: 16px; font-weight: 700; color: #1e293b; margin: 0; }
135
- .detail-panel-close { background: none; border: none; font-size: 20px; color: #64748b; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 4px; }
109
+ .detail-panel.open { width: 400px; min-width: 280px; border-left-width: 1px; }
110
+ .detail-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #e2e8f0; flex-shrink: 0; }
111
+ .detail-panel-header h2 { font-size: 16px; font-weight: 700; color: #1e293b; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
112
+ .detail-panel-close { background: none; border: none; font-size: 20px; color: #64748b; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 4px; flex-shrink: 0; }
136
113
  .detail-panel-close:hover { background: #f1f5f9; color: #1e293b; }
137
- .detail-panel-body { flex: 1; overflow-y: auto; padding: 20px; }
138
- .detail-field { margin-bottom: 16px; }
114
+ .detail-panel-body { flex: 1; overflow-y: auto; padding: 20px; min-width: 0; }
115
+ .detail-field { margin-bottom: 16px; word-wrap: break-word; }
139
116
  .detail-field-label { font-size: 11px; font-weight: 700; text-transform: uppercase; color: #94a3b8; margin-bottom: 4px; letter-spacing: 0.05em; }
140
117
  .detail-field-value { font-size: 13px; color: #1e293b; line-height: 1.5; }
141
118
  .detail-field-value.empty { color: #94a3b8; font-style: italic; }
@@ -145,55 +122,16 @@ function renderBoard(tasksByStatus, tagMap) {
145
122
  .detail-meta-table td { padding: 4px 0; font-size: 12px; }
146
123
  .detail-meta-table td:first-child { color: #64748b; width: 100px; }
147
124
  .detail-meta-table td:last-child { color: #1e293b; }
148
- .detail-panel-footer { padding: 12px 20px; border-top: 1px solid #e2e8f0; display: flex; justify-content: flex-end; }
125
+ .detail-panel-footer { padding: 12px 20px; border-top: 1px solid #e2e8f0; display: flex; justify-content: flex-end; flex-shrink: 0; }
149
126
  .detail-panel-footer button { padding: 7px 18px; border-radius: 6px; font-size: 13px; font-weight: 600; cursor: pointer; border: 1px solid #3b82f6; background: #3b82f6; color: white; }
150
127
  .detail-panel-footer button:hover { background: #2563eb; border-color: #2563eb; }
151
128
  .detail-edit-input { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; background: white; color: #1e293b; }
152
129
  .detail-edit-input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
153
- .detail-edit-textarea { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; min-height: 80px; background: white; color: #1e293b; }
130
+ .detail-edit-textarea { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; min-height: 240px; background: white; color: #1e293b; }
154
131
  .detail-edit-textarea:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
155
132
  .detail-edit-select { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; background: white; color: #1e293b; }
156
- .detail-edit-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
157
- </style>
158
- </head>
159
- <body>
160
- <header><h1>agkan board</h1></header>
161
- <div class="board">${columns}</div>
162
- <div class="modal-overlay" id="add-modal">
163
- <div class="modal">
164
- <h2>Add Task</h2>
165
- <label for="add-title">Title</label>
166
- <input type="text" id="add-title" placeholder="Task title">
167
- <label for="add-body">Description</label>
168
- <textarea id="add-body" placeholder="Optional"></textarea>
169
- <label for="add-priority">Priority</label>
170
- <select id="add-priority">
171
- <option value="">None</option>
172
- ${models_1.PRIORITIES.map((p) => `<option value="${p}">${p.charAt(0).toUpperCase() + p.slice(1)}</option>`).join('\n ')}
173
- </select>
174
- <input type="hidden" id="add-status">
175
- <div class="modal-actions">
176
- <button id="add-cancel">Cancel</button>
177
- <button id="add-submit" class="primary">Add</button>
178
- </div>
179
- </div>
180
- </div>
181
- <div class="context-menu" id="context-menu">
182
- <div class="context-menu-item danger" id="ctx-delete">Delete task</div>
183
- </div>
184
- <div class="detail-panel" id="detail-panel">
185
- <div class="detail-panel-resize-handle" id="detail-panel-resize-handle"></div>
186
- <div class="detail-panel-header">
187
- <h2 id="detail-panel-title">Task Detail</h2>
188
- <button class="detail-panel-close" id="detail-panel-close" title="Close">&times;</button>
189
- </div>
190
- <div class="detail-panel-body" id="detail-panel-body"></div>
191
- <div class="detail-panel-footer">
192
- <button id="detail-save-btn">Save</button>
193
- </div>
194
- </div>
195
- <div class="toast" id="toast">Failed to update task</div>
196
- <script>
133
+ .detail-edit-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }`;
134
+ const BOARD_SCRIPT = `
197
135
  let draggedCard = null;
198
136
  let sourceBody = null;
199
137
 
@@ -357,7 +295,11 @@ function renderBoard(tasksByStatus, tagMap) {
357
295
  }
358
296
  });
359
297
 
360
- // Detail panel
298
+ // Detail panel - create and insert into board-container
299
+ const boardContainer = document.querySelector('.board-container');
300
+ const detailPanelHtml = '<div class="detail-panel" id="detail-panel"><div class="detail-panel-resize-handle" id="detail-panel-resize-handle"></div><div class="detail-panel-header"><h2 id="detail-panel-title">Task Detail</h2><button class="detail-panel-close" id="detail-panel-close" title="Close">&times;</button></div><div class="detail-panel-body" id="detail-panel-body"></div><div class="detail-panel-footer"><button id="detail-save-btn">Save</button></div></div>';
301
+ boardContainer.insertAdjacentHTML('beforeend', detailPanelHtml);
302
+
361
303
  const detailPanel = document.getElementById('detail-panel');
362
304
  const detailPanelTitle = document.getElementById('detail-panel-title');
363
305
  const detailPanelBody = document.getElementById('detail-panel-body');
@@ -365,6 +307,7 @@ function renderBoard(tasksByStatus, tagMap) {
365
307
 
366
308
  function closeDetailPanel() {
367
309
  detailPanel.classList.remove('open');
310
+ detailPanel.style.width = '';
368
311
  detailTaskId = null;
369
312
  }
370
313
 
@@ -374,25 +317,27 @@ function renderBoard(tasksByStatus, tagMap) {
374
317
  const resizeHandle = document.getElementById('detail-panel-resize-handle');
375
318
  const PANEL_MIN_WIDTH = 280;
376
319
  const PANEL_MAX_WIDTH = 800;
320
+ const PANEL_DEFAULT_WIDTH = 400;
377
321
  const PANEL_WIDTH_KEY = 'detailPanelWidth';
378
322
 
379
323
  (function initPanelWidth() {
380
324
  const saved = localStorage.getItem(PANEL_WIDTH_KEY);
381
- if (saved) {
382
- const w = parseInt(saved, 10);
383
- if (w >= PANEL_MIN_WIDTH && w <= PANEL_MAX_WIDTH) {
384
- detailPanel.style.width = w + 'px';
385
- }
386
- }
325
+ const targetWidth = (saved && /^\d+$/.test(saved))
326
+ ? Math.min(PANEL_MAX_WIDTH, Math.max(PANEL_MIN_WIDTH, parseInt(saved, 10)))
327
+ : PANEL_DEFAULT_WIDTH;
328
+ // Store the width for when panel opens (width is 0 when closed)
329
+ detailPanel.dataset.preferredWidth = String(targetWidth);
387
330
  })();
388
331
 
389
332
  resizeHandle.addEventListener('mousedown', function(e) {
390
333
  e.preventDefault();
334
+ if (!detailPanel.classList.contains('open')) return;
391
335
  const startX = e.clientX;
392
336
  const startWidth = detailPanel.offsetWidth;
393
337
  resizeHandle.classList.add('dragging');
394
338
  document.body.style.userSelect = 'none';
395
339
  document.body.style.cursor = 'col-resize';
340
+ detailPanel.style.transition = 'none';
396
341
 
397
342
  function onMouseMove(e) {
398
343
  const delta = startX - e.clientX;
@@ -404,6 +349,7 @@ function renderBoard(tasksByStatus, tagMap) {
404
349
  resizeHandle.classList.remove('dragging');
405
350
  document.body.style.userSelect = '';
406
351
  document.body.style.cursor = '';
352
+ detailPanel.style.transition = '';
407
353
  localStorage.setItem(PANEL_WIDTH_KEY, detailPanel.offsetWidth);
408
354
  document.removeEventListener('mousemove', onMouseMove);
409
355
  document.removeEventListener('mouseup', onMouseUp);
@@ -540,18 +486,69 @@ function renderBoard(tasksByStatus, tagMap) {
540
486
  if (!res.ok) throw new Error('Server error');
541
487
  const data = await res.json();
542
488
  renderDetailPanel(data);
543
- detailPanel.classList.add('open');
489
+ if (!detailPanel.classList.contains('open')) {
490
+ const preferredWidth = detailPanel.dataset.preferredWidth || PANEL_DEFAULT_WIDTH;
491
+ detailPanel.style.width = preferredWidth + 'px';
492
+ detailPanel.classList.add('open');
493
+ }
544
494
  } catch {
545
495
  showToast('Failed to load task details');
546
496
  }
547
497
  });
548
498
  });
549
499
 
550
- // Board polling: reload when updated_at changes (skip during drag or detail panel open)
500
+ // Board polling: reload when updated_at changes (skip during drag)
551
501
  let lastUpdatedAt = null;
502
+ async function refreshBoardCards() {
503
+ try {
504
+ const res = await fetch('/api/board/cards');
505
+ if (!res.ok) return;
506
+ const data = await res.json();
507
+ const columns = data.columns;
508
+ columns.forEach(col => {
509
+ const body = document.getElementById('col-' + col.status);
510
+ if (!body) return;
511
+ body.innerHTML = col.html;
512
+ const colEl = body.closest('.column');
513
+ if (colEl) colEl.querySelector('.column-count').textContent = col.count;
514
+ // Re-attach drag event listeners to new cards
515
+ body.querySelectorAll('.card').forEach(card => {
516
+ card.addEventListener('dragstart', e => {
517
+ draggedCard = card;
518
+ sourceBody = card.parentElement;
519
+ card.classList.add('dragging');
520
+ e.dataTransfer.effectAllowed = 'move';
521
+ });
522
+ card.addEventListener('dragend', () => {
523
+ card.classList.remove('dragging');
524
+ draggedCard = null;
525
+ sourceBody = null;
526
+ });
527
+ card.addEventListener('click', async e => {
528
+ if (e.defaultPrevented) return;
529
+ const taskId = card.dataset.id;
530
+ try {
531
+ const res = await fetch('/api/tasks/' + taskId);
532
+ if (!res.ok) throw new Error('Server error');
533
+ const data = await res.json();
534
+ renderDetailPanel(data);
535
+ if (!detailPanel.classList.contains('open')) {
536
+ const preferredWidth = detailPanel.dataset.preferredWidth || PANEL_DEFAULT_WIDTH;
537
+ detailPanel.style.width = preferredWidth + 'px';
538
+ detailPanel.classList.add('open');
539
+ }
540
+ } catch {
541
+ showToast('Failed to load task details');
542
+ }
543
+ });
544
+ });
545
+ });
546
+ } catch {
547
+ // Ignore network errors during card refresh
548
+ }
549
+ }
552
550
  async function pollBoardUpdates() {
553
551
  if (draggedCard !== null) return;
554
- if (detailPanel.classList.contains('open')) return;
555
552
  try {
556
553
  const res = await fetch('/api/board/updated-at');
557
554
  if (!res.ok) return;
@@ -560,15 +557,81 @@ function renderBoard(tasksByStatus, tagMap) {
560
557
  if (lastUpdatedAt === null) {
561
558
  lastUpdatedAt = ts;
562
559
  } else if (ts !== lastUpdatedAt) {
563
- location.reload();
560
+ lastUpdatedAt = ts;
561
+ if (detailPanel.classList.contains('open')) {
562
+ await refreshBoardCards();
563
+ } else {
564
+ location.reload();
565
+ }
564
566
  }
565
567
  } catch {
566
568
  // Ignore network errors during polling
567
569
  }
568
570
  }
569
571
  setInterval(pollBoardUpdates, 10000);
570
- pollBoardUpdates();
571
- </script>
572
+ pollBoardUpdates();`;
573
+ function renderColumn(status, tasks, tagMap) {
574
+ const color = STATUS_COLORS[status];
575
+ const label = STATUS_LABELS[status];
576
+ const cards = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
577
+ return `
578
+ <div class="column" data-status="${status}">
579
+ <div class="column-header" style="border-top-color:${color}">
580
+ <span class="column-title" style="color:${color}">${label}</span>
581
+ <span class="column-header-right">
582
+ <span class="column-count">${tasks.length}</span>
583
+ <button class="add-btn" data-status="${status}" title="Add task">+</button>
584
+ </span>
585
+ </div>
586
+ <div class="column-body" id="col-${status}">
587
+ ${cards}
588
+ </div>
589
+ </div>`;
590
+ }
591
+ const BOARD_PRIORITY_OPTIONS = models_1.PRIORITIES.map((p) => `<option value="${p}">${p.charAt(0).toUpperCase() + p.slice(1)}</option>`).join('\n ');
592
+ const BOARD_BODY_STATIC = `
593
+ <div class="modal-overlay" id="add-modal">
594
+ <div class="modal">
595
+ <h2>Add Task</h2>
596
+ <label for="add-title">Title</label>
597
+ <input type="text" id="add-title" placeholder="Task title">
598
+ <label for="add-body">Description</label>
599
+ <textarea id="add-body" placeholder="Optional"></textarea>
600
+ <label for="add-priority">Priority</label>
601
+ <select id="add-priority">
602
+ <option value="">None</option>
603
+ ${BOARD_PRIORITY_OPTIONS}
604
+ </select>
605
+ <input type="hidden" id="add-status">
606
+ <div class="modal-actions">
607
+ <button id="add-cancel">Cancel</button>
608
+ <button id="add-submit" class="primary">Add</button>
609
+ </div>
610
+ </div>
611
+ </div>
612
+ <div class="context-menu" id="context-menu">
613
+ <div class="context-menu-item danger" id="ctx-delete">Delete task</div>
614
+ </div>
615
+ <div class="toast" id="toast">Failed to update task</div>
616
+ <script>${BOARD_SCRIPT}
617
+ </script>`;
618
+ function renderBoard(tasksByStatus, tagMap, boardTitle) {
619
+ const columns = STATUSES.map((status) => renderColumn(status, tasksByStatus.get(status) || [], tagMap)).join('');
620
+ const titleHtml = boardTitle ? `<span class="board-title">${escapeHtml(boardTitle)}</span>` : '';
621
+ return `<!DOCTYPE html>
622
+ <html lang="en">
623
+ <head>
624
+ <meta charset="UTF-8">
625
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
626
+ <title>agkan board</title>
627
+ <style>${BOARD_STYLES}
628
+ </style>
629
+ </head>
630
+ <body>
631
+ <header><h1>agkan board</h1>${titleHtml}</header>
632
+ <div class="board-container">
633
+ <div class="board">${columns}</div>${BOARD_BODY_STATIC}
634
+ </div>
572
635
  </body>
573
636
  </html>`;
574
637
  }
@@ -601,48 +664,38 @@ function buildTaskUpdateInput(body) {
601
664
  }
602
665
  return { input };
603
666
  }
604
- function createBoardApp(taskService, taskTagService, metadataService, db) {
605
- const app = new hono_1.Hono();
606
- const ts = taskService ?? new TaskService_1.TaskService();
607
- const tts = taskTagService ?? new TaskTagService_1.TaskTagService();
608
- const ms = metadataService ?? new MetadataService_1.MetadataService();
609
- const database = db ?? (0, connection_1.getDatabase)();
610
- app.get('/', (c) => {
611
- const tasks = ts.listTasks({}, 'id', 'asc');
612
- const tagMap = tts.getAllTaskTags();
613
- const tasksByStatus = new Map();
614
- for (const status of STATUSES) {
615
- tasksByStatus.set(status, []);
616
- }
617
- for (const task of tasks) {
618
- tasksByStatus.get(task.status)?.push(task);
619
- }
620
- for (const [status, statusTasks] of tasksByStatus) {
621
- tasksByStatus.set(status, sortByPriority(statusTasks));
622
- }
623
- return c.html(renderBoard(tasksByStatus, tagMap));
624
- });
625
- app.get('/api/board/updated-at', (c) => {
626
- const stmtBase = database.prepare(`
627
- SELECT MAX(updated_at) as max_updated_at FROM (
628
- SELECT updated_at FROM tasks
629
- UNION ALL
630
- SELECT updated_at FROM task_metadata
631
- )
632
- `);
633
- const baseRow = stmtBase.get();
634
- const stmtTags = database.prepare(`
635
- SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_tags
636
- `);
637
- const tagsRow = stmtTags.get();
638
- const fingerprint = `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}`;
639
- const updatedAt = baseRow.max_updated_at === null && tagsRow.max_created_at === null ? null : fingerprint;
640
- return c.json({ updatedAt });
641
- });
642
- app.get('/api/tasks', (c) => {
643
- const tasks = ts.listTasks({}, 'id', 'asc');
644
- return c.json({ tasks });
645
- });
667
+ function buildTasksByStatus(tasks) {
668
+ const tasksByStatus = new Map();
669
+ for (const status of STATUSES) {
670
+ tasksByStatus.set(status, []);
671
+ }
672
+ for (const task of tasks) {
673
+ tasksByStatus.get(task.status)?.push(task);
674
+ }
675
+ for (const [status, statusTasks] of tasksByStatus) {
676
+ tasksByStatus.set(status, sortByPriority(statusTasks));
677
+ }
678
+ return tasksByStatus;
679
+ }
680
+ function getBoardUpdatedAt(database) {
681
+ const baseRow = database
682
+ .prepare(`
683
+ SELECT MAX(updated_at) as max_updated_at FROM (
684
+ SELECT updated_at FROM tasks UNION ALL SELECT updated_at FROM task_metadata
685
+ )
686
+ `)
687
+ .get();
688
+ const tagsRow = database
689
+ .prepare(`
690
+ SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_tags
691
+ `)
692
+ .get();
693
+ if (baseRow.max_updated_at === null && tagsRow.max_created_at === null)
694
+ return null;
695
+ return `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}`;
696
+ }
697
+ function registerTaskApiRoutes(app, { ts, tts, ms }) {
698
+ app.get('/api/tasks', (c) => c.json({ tasks: ts.listTasks({}, 'id', 'asc') }));
646
699
  app.post('/api/tasks', async (c) => {
647
700
  const body = await c.req.json();
648
701
  if (!body.title || typeof body.title !== 'string' || !body.title.trim()) {
@@ -650,54 +703,74 @@ function createBoardApp(taskService, taskTagService, metadataService, db) {
650
703
  }
651
704
  const status = body.status && STATUSES.includes(body.status) ? body.status : 'backlog';
652
705
  const priority = body.priority && (0, models_1.isPriority)(body.priority) ? body.priority : undefined;
653
- const task = ts.createTask({ title: body.title.trim(), body: body.body || undefined, status, priority });
654
- return c.json(task, 201);
706
+ return c.json(ts.createTask({ title: body.title.trim(), body: body.body || undefined, status, priority }), 201);
655
707
  });
656
708
  app.get('/api/tasks/:id', (c) => {
657
709
  const id = Number(c.req.param('id'));
658
- if (isNaN(id)) {
710
+ if (isNaN(id))
659
711
  return c.json({ error: 'Invalid task id' }, 400);
660
- }
661
712
  const task = ts.getTask(id);
662
- if (!task) {
713
+ if (!task)
663
714
  return c.json({ error: 'Task not found' }, 404);
664
- }
665
- const tags = tts.getTagsForTask(id);
666
- const metadata = ms.listMetadata(id);
667
- return c.json({ task, tags, metadata });
715
+ return c.json({ task, tags: tts.getTagsForTask(id), metadata: ms.listMetadata(id) });
668
716
  });
669
717
  app.patch('/api/tasks/:id', async (c) => {
670
718
  const id = Number(c.req.param('id'));
671
- if (isNaN(id)) {
719
+ if (isNaN(id))
672
720
  return c.json({ error: 'Invalid task id' }, 400);
673
- }
674
- const body = await c.req.json();
675
- const { input, error } = buildTaskUpdateInput(body);
676
- if (error) {
721
+ const { input, error } = buildTaskUpdateInput(await c.req.json());
722
+ if (error)
677
723
  return c.json({ error }, 400);
678
- }
679
724
  const task = ts.updateTask(id, input);
680
- if (!task) {
725
+ if (!task)
681
726
  return c.json({ error: 'Task not found' }, 404);
682
- }
683
727
  return c.json(task);
684
728
  });
685
729
  app.delete('/api/tasks/:id', (c) => {
686
730
  const id = Number(c.req.param('id'));
687
- if (isNaN(id)) {
731
+ if (isNaN(id))
688
732
  return c.json({ error: 'Invalid task id' }, 400);
689
- }
690
- const task = ts.getTask(id);
691
- if (!task) {
733
+ if (!ts.getTask(id))
692
734
  return c.json({ error: 'Task not found' }, 404);
693
- }
694
735
  ts.deleteTask(id);
695
736
  return c.json({ success: true });
696
737
  });
738
+ }
739
+ function buildBoardCardsPayload(tasksByStatus, tagMap) {
740
+ return STATUSES.map((status) => {
741
+ const tasks = tasksByStatus.get(status) || [];
742
+ const html = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
743
+ return { status, html, count: tasks.length };
744
+ });
745
+ }
746
+ function registerBoardRoutes(app, services) {
747
+ const { ts, tts, database, boardTitle } = services;
748
+ app.get('/', (c) => {
749
+ const tasksByStatus = buildTasksByStatus(ts.listTasks({}, 'id', 'asc'));
750
+ return c.html(renderBoard(tasksByStatus, tts.getAllTaskTags(), boardTitle));
751
+ });
752
+ app.get('/api/board/updated-at', (c) => c.json({ updatedAt: getBoardUpdatedAt(database) }));
753
+ app.get('/api/board/cards', (c) => {
754
+ const tasksByStatus = buildTasksByStatus(ts.listTasks({}, 'id', 'asc'));
755
+ const columns = buildBoardCardsPayload(tasksByStatus, tts.getAllTaskTags());
756
+ return c.json({ columns });
757
+ });
758
+ registerTaskApiRoutes(app, services);
759
+ }
760
+ function createBoardApp(taskService, taskTagService, metadataService, db, boardTitle) {
761
+ const app = new hono_1.Hono();
762
+ const services = {
763
+ ts: taskService ?? new TaskService_1.TaskService(),
764
+ tts: taskTagService ?? new TaskTagService_1.TaskTagService(),
765
+ ms: metadataService ?? new MetadataService_1.MetadataService(),
766
+ database: db ?? (0, connection_1.getDatabase)(),
767
+ boardTitle,
768
+ };
769
+ registerBoardRoutes(app, services);
697
770
  return app;
698
771
  }
699
- function startBoardServer(port) {
700
- const app = createBoardApp();
772
+ function startBoardServer(port, boardTitle) {
773
+ const app = createBoardApp(undefined, undefined, undefined, undefined, boardTitle);
701
774
  (0, node_server_1.serve)({ fetch: app.fetch, port }, () => {
702
775
  console.log(`Board running at http://localhost:${port}`);
703
776
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkBxD"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBxD"}
@@ -8,6 +8,7 @@ function setupBoardCommand(program) {
8
8
  .command('board')
9
9
  .description('Start a local Kanban board viewer at localhost')
10
10
  .option('-p, --port <number>', 'Port to listen on', '8080')
11
+ .option('-t, --title <text>', 'Board title to display in the header')
11
12
  .action((options) => {
12
13
  try {
13
14
  const port = parseInt(options.port, 10);
@@ -16,7 +17,7 @@ function setupBoardCommand(program) {
16
17
  process.exit(1);
17
18
  return;
18
19
  }
19
- (0, server_1.startBoardServer)(port);
20
+ (0, server_1.startBoardServer)(port, options.title);
20
21
  }
21
22
  catch (error) {
22
23
  (0, error_handler_1.handleError)(error, {});
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;AAIA,8CAkBC;AArBD,+CAAsD;AACtD,0DAAqD;AAErD,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,CAAC;SAC1D,MAAM,CAAC,CAAC,OAAyB,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAA,yBAAgB,EAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,2BAAW,EAAC,KAAc,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;AAIA,8CAmBC;AAtBD,+CAAsD;AACtD,0DAAqD;AAErD,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,CAAC;SAC1D,MAAM,CAAC,oBAAoB,EAAE,sCAAsC,CAAC;SACpE,MAAM,CAAC,CAAC,OAAyC,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAA,yBAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,2BAAW,EAAC,KAAc,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agkan",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "TypeScript-based CLI task management tool with SQLite storage",
5
5
  "main": "dist/cli/index.js",
6
6
  "bin": {