agkan 2.0.0 → 2.1.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.
- package/README.ja.md +17 -17
- package/README.md +17 -17
- package/dist/board/server.d.ts +2 -1
- package/dist/board/server.d.ts.map +1 -1
- package/dist/board/server.js +135 -24
- package/dist/board/server.js.map +1 -1
- package/dist/cli/commands/task/add-helpers.d.ts.map +1 -1
- package/dist/cli/commands/task/add-helpers.js +1 -0
- package/dist/cli/commands/task/add-helpers.js.map +1 -1
- package/dist/cli/commands/task/add.d.ts.map +1 -1
- package/dist/cli/commands/task/add.js +11 -0
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/get.d.ts.map +1 -1
- package/dist/cli/commands/task/get.js +9 -0
- package/dist/cli/commands/task/get.js.map +1 -1
- package/dist/cli/commands/task/purge.d.ts +6 -0
- package/dist/cli/commands/task/purge.d.ts.map +1 -0
- package/dist/cli/commands/task/purge.js +138 -0
- package/dist/cli/commands/task/purge.js.map +1 -0
- package/dist/cli/commands/task/update.d.ts.map +1 -1
- package/dist/cli/commands/task/update.js +26 -1
- package/dist/cli/commands/task/update.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +28 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/models/Task.d.ts +4 -0
- package/dist/models/Task.d.ts.map +1 -1
- package/dist/services/TaskService.d.ts +9 -0
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +35 -3
- package/dist/services/TaskService.js.map +1 -1
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -199,34 +199,34 @@ agkan task delete 1
|
|
|
199
199
|
|
|
200
200
|
タグを作成:
|
|
201
201
|
```bash
|
|
202
|
-
agkan
|
|
202
|
+
agkan tag add "frontend"
|
|
203
203
|
```
|
|
204
204
|
|
|
205
205
|
タグ一覧を表示:
|
|
206
206
|
```bash
|
|
207
|
-
agkan
|
|
207
|
+
agkan tag list
|
|
208
208
|
```
|
|
209
209
|
|
|
210
210
|
タグを削除:
|
|
211
211
|
```bash
|
|
212
|
-
agkan
|
|
212
|
+
agkan tag delete "frontend"
|
|
213
213
|
```
|
|
214
214
|
|
|
215
215
|
### タスクへのタグ付け
|
|
216
216
|
|
|
217
217
|
タスクにタグを付与:
|
|
218
218
|
```bash
|
|
219
|
-
agkan
|
|
219
|
+
agkan tag attach 1 "frontend"
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
タスクからタグを削除:
|
|
223
223
|
```bash
|
|
224
|
-
agkan
|
|
224
|
+
agkan tag detach 1 "frontend"
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
タスクに付けられたタグを表示:
|
|
228
228
|
```bash
|
|
229
|
-
agkan
|
|
229
|
+
agkan tag show 1
|
|
230
230
|
```
|
|
231
231
|
|
|
232
232
|
### メタデータの管理
|
|
@@ -551,7 +551,7 @@ agkan task count --status in_progress --json
|
|
|
551
551
|
|
|
552
552
|
JSON出力フォーマット:
|
|
553
553
|
```bash
|
|
554
|
-
agkan
|
|
554
|
+
agkan tag list --json
|
|
555
555
|
```
|
|
556
556
|
|
|
557
557
|
```json
|
|
@@ -576,7 +576,7 @@ agkan task tag list --json
|
|
|
576
576
|
|
|
577
577
|
JSON出力フォーマット:
|
|
578
578
|
```bash
|
|
579
|
-
agkan
|
|
579
|
+
agkan tag show 1 --json
|
|
580
580
|
```
|
|
581
581
|
|
|
582
582
|
```json
|
|
@@ -693,21 +693,21 @@ agkan task block remove 1 2
|
|
|
693
693
|
|
|
694
694
|
```bash
|
|
695
695
|
# タグを作成
|
|
696
|
-
agkan
|
|
697
|
-
agkan
|
|
698
|
-
agkan
|
|
696
|
+
agkan tag add "frontend"
|
|
697
|
+
agkan tag add "backend"
|
|
698
|
+
agkan tag add "urgent"
|
|
699
699
|
|
|
700
700
|
# タスクを作成してタグを付与
|
|
701
701
|
agkan task add "ログイン画面の実装"
|
|
702
702
|
# 出力: Task created with ID: 1
|
|
703
703
|
|
|
704
|
-
agkan
|
|
705
|
-
agkan
|
|
704
|
+
agkan tag attach 1 "frontend"
|
|
705
|
+
agkan tag attach 1 "urgent"
|
|
706
706
|
|
|
707
707
|
agkan task add "API開発"
|
|
708
708
|
# 出力: Task created with ID: 2
|
|
709
709
|
|
|
710
|
-
agkan
|
|
710
|
+
agkan tag attach 2 "backend"
|
|
711
711
|
|
|
712
712
|
# タグでフィルタリング
|
|
713
713
|
agkan task list --tag "frontend"
|
|
@@ -715,17 +715,17 @@ agkan task list --tag "frontend"
|
|
|
715
715
|
# 1 [backlog] ログイン画面の実装 (tags: frontend, urgent)
|
|
716
716
|
|
|
717
717
|
# タスクのタグを確認
|
|
718
|
-
agkan
|
|
718
|
+
agkan tag show 1
|
|
719
719
|
# 出力:
|
|
720
720
|
# Tags for task 1:
|
|
721
721
|
# - frontend
|
|
722
722
|
# - urgent
|
|
723
723
|
|
|
724
724
|
# タグを削除
|
|
725
|
-
agkan
|
|
725
|
+
agkan tag detach 1 "urgent"
|
|
726
726
|
|
|
727
727
|
# タグ自体を削除(関連するすべてのタスクから削除される)
|
|
728
|
-
agkan
|
|
728
|
+
agkan tag delete "urgent"
|
|
729
729
|
```
|
|
730
730
|
|
|
731
731
|
## タスクステータス
|
package/README.md
CHANGED
|
@@ -358,22 +358,22 @@ agkan task delete 1
|
|
|
358
358
|
|
|
359
359
|
Create a tag:
|
|
360
360
|
```bash
|
|
361
|
-
agkan
|
|
361
|
+
agkan tag add "frontend"
|
|
362
362
|
```
|
|
363
363
|
|
|
364
364
|
List all tags:
|
|
365
365
|
```bash
|
|
366
|
-
agkan
|
|
366
|
+
agkan tag list
|
|
367
367
|
```
|
|
368
368
|
|
|
369
369
|
Delete a tag:
|
|
370
370
|
```bash
|
|
371
|
-
agkan
|
|
371
|
+
agkan tag delete "frontend"
|
|
372
372
|
```
|
|
373
373
|
|
|
374
374
|
JSON output format for tag list:
|
|
375
375
|
```bash
|
|
376
|
-
agkan
|
|
376
|
+
agkan tag list --json
|
|
377
377
|
```
|
|
378
378
|
|
|
379
379
|
```json
|
|
@@ -400,22 +400,22 @@ agkan task tag list --json
|
|
|
400
400
|
|
|
401
401
|
Attach a tag to a task:
|
|
402
402
|
```bash
|
|
403
|
-
agkan
|
|
403
|
+
agkan tag attach 1 "frontend"
|
|
404
404
|
```
|
|
405
405
|
|
|
406
406
|
Remove a tag from a task:
|
|
407
407
|
```bash
|
|
408
|
-
agkan
|
|
408
|
+
agkan tag detach 1 "frontend"
|
|
409
409
|
```
|
|
410
410
|
|
|
411
411
|
Display tags on a task:
|
|
412
412
|
```bash
|
|
413
|
-
agkan
|
|
413
|
+
agkan tag show 1
|
|
414
414
|
```
|
|
415
415
|
|
|
416
416
|
JSON output format for tag show:
|
|
417
417
|
```bash
|
|
418
|
-
agkan
|
|
418
|
+
agkan tag show 1 --json
|
|
419
419
|
```
|
|
420
420
|
|
|
421
421
|
```json
|
|
@@ -708,21 +708,21 @@ Example of classifying tasks with tags:
|
|
|
708
708
|
|
|
709
709
|
```bash
|
|
710
710
|
# Create tags
|
|
711
|
-
agkan
|
|
712
|
-
agkan
|
|
713
|
-
agkan
|
|
711
|
+
agkan tag add "frontend"
|
|
712
|
+
agkan tag add "backend"
|
|
713
|
+
agkan tag add "urgent"
|
|
714
714
|
|
|
715
715
|
# Create tasks and attach tags
|
|
716
716
|
agkan task add "Implement login screen"
|
|
717
717
|
# Output: Task created with ID: 1
|
|
718
718
|
|
|
719
|
-
agkan
|
|
720
|
-
agkan
|
|
719
|
+
agkan tag attach 1 "frontend"
|
|
720
|
+
agkan tag attach 1 "urgent"
|
|
721
721
|
|
|
722
722
|
agkan task add "API development"
|
|
723
723
|
# Output: Task created with ID: 2
|
|
724
724
|
|
|
725
|
-
agkan
|
|
725
|
+
agkan tag attach 2 "backend"
|
|
726
726
|
|
|
727
727
|
# Filter by tag
|
|
728
728
|
agkan task list --tag "frontend"
|
|
@@ -730,17 +730,17 @@ agkan task list --tag "frontend"
|
|
|
730
730
|
# 1 [backlog] Implement login screen (tags: frontend, urgent)
|
|
731
731
|
|
|
732
732
|
# Display task tags
|
|
733
|
-
agkan
|
|
733
|
+
agkan tag show 1
|
|
734
734
|
# Output:
|
|
735
735
|
# Tags for task 1:
|
|
736
736
|
# - frontend
|
|
737
737
|
# - urgent
|
|
738
738
|
|
|
739
739
|
# Remove a tag
|
|
740
|
-
agkan
|
|
740
|
+
agkan tag detach 1 "urgent"
|
|
741
741
|
|
|
742
742
|
# Delete a tag (removes from all associated tasks)
|
|
743
|
-
agkan
|
|
743
|
+
agkan tag delete "urgent"
|
|
744
744
|
```
|
|
745
745
|
|
|
746
746
|
## Task Statuses
|
package/dist/board/server.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Hono } from 'hono';
|
|
|
2
2
|
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;
|
|
6
7
|
export declare function startBoardServer(port: number): void;
|
|
7
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;
|
|
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;AAK9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA+hBtD,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,CA0IN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD"}
|
package/dist/board/server.js
CHANGED
|
@@ -8,6 +8,7 @@ const TaskService_1 = require("../services/TaskService");
|
|
|
8
8
|
const TaskTagService_1 = require("../services/TaskTagService");
|
|
9
9
|
const MetadataService_1 = require("../services/MetadataService");
|
|
10
10
|
const models_1 = require("../models");
|
|
11
|
+
const connection_1 = require("../db/connection");
|
|
11
12
|
const STATUSES = ['icebox', 'backlog', 'ready', 'in_progress', 'review', 'done', 'closed'];
|
|
12
13
|
const STATUS_LABELS = {
|
|
13
14
|
icebox: 'Icebox',
|
|
@@ -142,6 +143,15 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
142
143
|
.detail-meta-table td { padding: 4px 0; font-size: 12px; }
|
|
143
144
|
.detail-meta-table td:first-child { color: #64748b; width: 100px; }
|
|
144
145
|
.detail-meta-table td:last-child { color: #1e293b; }
|
|
146
|
+
.detail-panel-footer { padding: 12px 20px; border-top: 1px solid #e2e8f0; display: flex; justify-content: flex-end; }
|
|
147
|
+
.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; }
|
|
148
|
+
.detail-panel-footer button:hover { background: #2563eb; border-color: #2563eb; }
|
|
149
|
+
.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; }
|
|
150
|
+
.detail-edit-input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
151
|
+
.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; }
|
|
152
|
+
.detail-edit-textarea:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
153
|
+
.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; }
|
|
154
|
+
.detail-edit-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
145
155
|
</style>
|
|
146
156
|
</head>
|
|
147
157
|
<body>
|
|
@@ -175,6 +185,9 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
175
185
|
<button class="detail-panel-close" id="detail-panel-close" title="Close">×</button>
|
|
176
186
|
</div>
|
|
177
187
|
<div class="detail-panel-body" id="detail-panel-body"></div>
|
|
188
|
+
<div class="detail-panel-footer">
|
|
189
|
+
<button id="detail-save-btn">Save</button>
|
|
190
|
+
</div>
|
|
178
191
|
</div>
|
|
179
192
|
<div class="toast" id="toast">Failed to update task</div>
|
|
180
193
|
<script>
|
|
@@ -276,7 +289,7 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
276
289
|
});
|
|
277
290
|
|
|
278
291
|
addTitle.addEventListener('keydown', e => {
|
|
279
|
-
if (e.key === 'Enter') { e.preventDefault(); document.getElementById('add-submit').click(); }
|
|
292
|
+
if (e.key === 'Enter' && !e.isComposing) { e.preventDefault(); document.getElementById('add-submit').click(); }
|
|
280
293
|
});
|
|
281
294
|
|
|
282
295
|
document.getElementById('add-submit').addEventListener('click', async () => {
|
|
@@ -345,14 +358,19 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
345
358
|
const detailPanel = document.getElementById('detail-panel');
|
|
346
359
|
const detailPanelTitle = document.getElementById('detail-panel-title');
|
|
347
360
|
const detailPanelBody = document.getElementById('detail-panel-body');
|
|
361
|
+
let detailTaskId = null;
|
|
348
362
|
|
|
349
363
|
function closeDetailPanel() {
|
|
350
364
|
detailPanel.classList.remove('open');
|
|
365
|
+
detailTaskId = null;
|
|
351
366
|
}
|
|
352
367
|
|
|
353
368
|
document.getElementById('detail-panel-close').addEventListener('click', closeDetailPanel);
|
|
354
369
|
|
|
355
370
|
const statusColors = ${JSON.stringify(STATUS_COLORS)};
|
|
371
|
+
const allStatuses = ${JSON.stringify(STATUSES)};
|
|
372
|
+
const statusLabels = ${JSON.stringify(STATUS_LABELS)};
|
|
373
|
+
const allPriorities = ${JSON.stringify(models_1.PRIORITIES)};
|
|
356
374
|
|
|
357
375
|
function renderDetailPanel(data) {
|
|
358
376
|
const task = data.task;
|
|
@@ -360,36 +378,47 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
360
378
|
const metadata = data.metadata || [];
|
|
361
379
|
const priority = metadata.find(m => m.key === 'priority');
|
|
362
380
|
|
|
381
|
+
detailTaskId = task.id;
|
|
363
382
|
detailPanelTitle.textContent = '#' + task.id + ' ' + task.title;
|
|
364
383
|
|
|
365
384
|
let html = '';
|
|
366
385
|
|
|
367
|
-
//
|
|
368
|
-
|
|
386
|
+
// Title (editable)
|
|
387
|
+
html += '<div class="detail-field">';
|
|
388
|
+
html += '<div class="detail-field-label">Title</div>';
|
|
389
|
+
html += '<input id="detail-edit-title" class="detail-edit-input" type="text" value="' + escapeHtmlClient(task.title) + '">';
|
|
390
|
+
html += '</div>';
|
|
391
|
+
|
|
392
|
+
// Status (editable)
|
|
369
393
|
html += '<div class="detail-field">';
|
|
370
394
|
html += '<div class="detail-field-label">Status</div>';
|
|
371
|
-
html += '<
|
|
395
|
+
html += '<select id="detail-edit-status" class="detail-edit-select">';
|
|
396
|
+
allStatuses.forEach(s => {
|
|
397
|
+
const selected = s === task.status ? ' selected' : '';
|
|
398
|
+
html += '<option value="' + s + '"' + selected + '>' + statusLabels[s] + '</option>';
|
|
399
|
+
});
|
|
400
|
+
html += '</select>';
|
|
372
401
|
html += '</div>';
|
|
373
402
|
|
|
374
|
-
// Priority
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
403
|
+
// Priority (editable)
|
|
404
|
+
html += '<div class="detail-field">';
|
|
405
|
+
html += '<div class="detail-field-label">Priority</div>';
|
|
406
|
+
html += '<select id="detail-edit-priority" class="detail-edit-select">';
|
|
407
|
+
html += '<option value="">None</option>';
|
|
408
|
+
allPriorities.forEach(p => {
|
|
409
|
+
const selected = priority && priority.value === p ? ' selected' : '';
|
|
410
|
+
html += '<option value="' + p + '"' + selected + '>' + p.charAt(0).toUpperCase() + p.slice(1) + '</option>';
|
|
411
|
+
});
|
|
412
|
+
html += '</select>';
|
|
413
|
+
html += '</div>';
|
|
381
414
|
|
|
382
|
-
// Body
|
|
415
|
+
// Body (editable)
|
|
383
416
|
html += '<div class="detail-field">';
|
|
384
417
|
html += '<div class="detail-field-label">Description</div>';
|
|
385
|
-
|
|
386
|
-
html += '<div class="detail-field-value">' + escapeHtmlClient(task.body) + '</div>';
|
|
387
|
-
} else {
|
|
388
|
-
html += '<div class="detail-field-value empty">No description</div>';
|
|
389
|
-
}
|
|
418
|
+
html += '<textarea id="detail-edit-body" class="detail-edit-textarea">' + escapeHtmlClient(task.body || '') + '</textarea>';
|
|
390
419
|
html += '</div>';
|
|
391
420
|
|
|
392
|
-
// Tags
|
|
421
|
+
// Tags (read-only)
|
|
393
422
|
if (tags.length > 0) {
|
|
394
423
|
html += '<div class="detail-field">';
|
|
395
424
|
html += '<div class="detail-field-label">Tags</div>';
|
|
@@ -398,7 +427,7 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
398
427
|
html += '</div></div>';
|
|
399
428
|
}
|
|
400
429
|
|
|
401
|
-
// Metadata table
|
|
430
|
+
// Metadata table (read-only, non-priority)
|
|
402
431
|
const otherMeta = metadata.filter(m => m.key !== 'priority');
|
|
403
432
|
if (otherMeta.length > 0) {
|
|
404
433
|
html += '<div class="detail-field">';
|
|
@@ -410,7 +439,7 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
410
439
|
html += '</table></div>';
|
|
411
440
|
}
|
|
412
441
|
|
|
413
|
-
// Timestamps
|
|
442
|
+
// Timestamps (read-only)
|
|
414
443
|
html += '<div class="detail-field">';
|
|
415
444
|
html += '<div class="detail-field-label">Created</div>';
|
|
416
445
|
html += '<div class="detail-field-value">' + escapeHtmlClient(task.created_at) + '</div>';
|
|
@@ -430,6 +459,33 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
430
459
|
return div.innerHTML;
|
|
431
460
|
}
|
|
432
461
|
|
|
462
|
+
document.getElementById('detail-save-btn').addEventListener('click', async () => {
|
|
463
|
+
if (detailTaskId === null) return;
|
|
464
|
+
const titleInput = document.getElementById('detail-edit-title');
|
|
465
|
+
const title = titleInput ? titleInput.value.trim() : '';
|
|
466
|
+
if (!title) { if (titleInput) titleInput.focus(); return; }
|
|
467
|
+
const bodyEl = document.getElementById('detail-edit-body');
|
|
468
|
+
const statusEl = document.getElementById('detail-edit-status');
|
|
469
|
+
const priorityEl = document.getElementById('detail-edit-priority');
|
|
470
|
+
|
|
471
|
+
try {
|
|
472
|
+
const res = await fetch('/api/tasks/' + detailTaskId, {
|
|
473
|
+
method: 'PATCH',
|
|
474
|
+
headers: { 'Content-Type': 'application/json' },
|
|
475
|
+
body: JSON.stringify({
|
|
476
|
+
title,
|
|
477
|
+
body: bodyEl ? (bodyEl.value.trim() || null) : null,
|
|
478
|
+
status: statusEl ? statusEl.value : undefined,
|
|
479
|
+
priority: priorityEl ? (priorityEl.value || null) : null
|
|
480
|
+
})
|
|
481
|
+
});
|
|
482
|
+
if (!res.ok) throw new Error('Server error');
|
|
483
|
+
location.reload();
|
|
484
|
+
} catch {
|
|
485
|
+
showToast('Failed to update task');
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
|
|
433
489
|
document.querySelectorAll('.card').forEach(card => {
|
|
434
490
|
card.addEventListener('click', async e => {
|
|
435
491
|
if (e.defaultPrevented) return;
|
|
@@ -445,6 +501,28 @@ function renderBoard(tasksByStatus, tagMap, metaMap) {
|
|
|
445
501
|
}
|
|
446
502
|
});
|
|
447
503
|
});
|
|
504
|
+
|
|
505
|
+
// Board polling: reload when updated_at changes (skip during drag or detail panel open)
|
|
506
|
+
let lastUpdatedAt = null;
|
|
507
|
+
async function pollBoardUpdates() {
|
|
508
|
+
if (draggedCard !== null) return;
|
|
509
|
+
if (detailPanel.classList.contains('open')) return;
|
|
510
|
+
try {
|
|
511
|
+
const res = await fetch('/api/board/updated-at');
|
|
512
|
+
if (!res.ok) return;
|
|
513
|
+
const data = await res.json();
|
|
514
|
+
const ts = data.updatedAt;
|
|
515
|
+
if (lastUpdatedAt === null) {
|
|
516
|
+
lastUpdatedAt = ts;
|
|
517
|
+
} else if (ts !== lastUpdatedAt) {
|
|
518
|
+
location.reload();
|
|
519
|
+
}
|
|
520
|
+
} catch {
|
|
521
|
+
// Ignore network errors during polling
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
setInterval(pollBoardUpdates, 10000);
|
|
525
|
+
pollBoardUpdates();
|
|
448
526
|
</script>
|
|
449
527
|
</body>
|
|
450
528
|
</html>`;
|
|
@@ -458,11 +536,12 @@ function sortByPriority(tasks, metaMap) {
|
|
|
458
536
|
return oa - ob;
|
|
459
537
|
});
|
|
460
538
|
}
|
|
461
|
-
function createBoardApp(taskService, taskTagService, metadataService) {
|
|
539
|
+
function createBoardApp(taskService, taskTagService, metadataService, db) {
|
|
462
540
|
const app = new hono_1.Hono();
|
|
463
541
|
const ts = taskService ?? new TaskService_1.TaskService();
|
|
464
542
|
const tts = taskTagService ?? new TaskTagService_1.TaskTagService();
|
|
465
543
|
const ms = metadataService ?? new MetadataService_1.MetadataService();
|
|
544
|
+
const database = db ?? (0, connection_1.getDatabase)();
|
|
466
545
|
app.get('/', (c) => {
|
|
467
546
|
const tasks = ts.listTasks({}, 'id', 'asc');
|
|
468
547
|
const tagMap = tts.getAllTaskTags();
|
|
@@ -479,6 +558,17 @@ function createBoardApp(taskService, taskTagService, metadataService) {
|
|
|
479
558
|
}
|
|
480
559
|
return c.html(renderBoard(tasksByStatus, tagMap, metaMap));
|
|
481
560
|
});
|
|
561
|
+
app.get('/api/board/updated-at', (c) => {
|
|
562
|
+
const stmt = database.prepare(`
|
|
563
|
+
SELECT MAX(updated_at) as max_updated_at FROM (
|
|
564
|
+
SELECT updated_at FROM tasks
|
|
565
|
+
UNION ALL
|
|
566
|
+
SELECT updated_at FROM task_metadata
|
|
567
|
+
)
|
|
568
|
+
`);
|
|
569
|
+
const row = stmt.get();
|
|
570
|
+
return c.json({ updatedAt: row.max_updated_at });
|
|
571
|
+
});
|
|
482
572
|
app.get('/api/tasks', (c) => {
|
|
483
573
|
const tasks = ts.listTasks({}, 'id', 'asc');
|
|
484
574
|
return c.json({ tasks });
|
|
@@ -514,13 +604,34 @@ function createBoardApp(taskService, taskTagService, metadataService) {
|
|
|
514
604
|
return c.json({ error: 'Invalid task id' }, 400);
|
|
515
605
|
}
|
|
516
606
|
const body = await c.req.json();
|
|
517
|
-
|
|
518
|
-
|
|
607
|
+
const updateInput = {};
|
|
608
|
+
if (body.status !== undefined) {
|
|
609
|
+
if (!STATUSES.includes(body.status)) {
|
|
610
|
+
return c.json({ error: 'Invalid status' }, 400);
|
|
611
|
+
}
|
|
612
|
+
updateInput.status = body.status;
|
|
613
|
+
}
|
|
614
|
+
if (body.title !== undefined) {
|
|
615
|
+
if (typeof body.title !== 'string' || !body.title.trim()) {
|
|
616
|
+
return c.json({ error: 'Title cannot be empty' }, 400);
|
|
617
|
+
}
|
|
618
|
+
updateInput.title = body.title.trim();
|
|
519
619
|
}
|
|
520
|
-
|
|
620
|
+
if (body.body !== undefined) {
|
|
621
|
+
updateInput.body = body.body ?? '';
|
|
622
|
+
}
|
|
623
|
+
const task = ts.updateTask(id, updateInput);
|
|
521
624
|
if (!task) {
|
|
522
625
|
return c.json({ error: 'Task not found' }, 404);
|
|
523
626
|
}
|
|
627
|
+
if (body.priority !== undefined) {
|
|
628
|
+
if (body.priority && (0, models_1.isPriority)(body.priority)) {
|
|
629
|
+
ms.setMetadata({ task_id: id, key: 'priority', value: body.priority });
|
|
630
|
+
}
|
|
631
|
+
else {
|
|
632
|
+
ms.deleteMetadata(id, 'priority');
|
|
633
|
+
}
|
|
634
|
+
}
|
|
524
635
|
return c.json(task);
|
|
525
636
|
});
|
|
526
637
|
app.delete('/api/tasks/:id', (c) => {
|
package/dist/board/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhF;AAED,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAuBN;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAA;CAAE,CAKzE;
|
|
1
|
+
{"version":3,"file":"add-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhF;AAED,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAuBN;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAA;CAAE,CAKzE;AAiBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,GAAG,IAAI,EACvB,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,EAAE,IAAI,EAAE,GACnB,MAAM,CAQR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,GAAG,IAAI,EACvB,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,EAAE,IAAI,EAAE,GACnB,IAAI,CAwCN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AASH,4CAQC;AAED,sCAOC;AAED,sDA4BC;AAED,8CAUC;
|
|
1
|
+
{"version":3,"file":"add-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoJ1D"}
|
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.setupTaskAddCommand = setupTaskAddCommand;
|
|
10
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
11
|
const services_1 = require("../../../services");
|
|
12
|
+
const Priority_1 = require("../../../models/Priority");
|
|
12
13
|
const error_handler_1 = require("../../utils/error-handler");
|
|
13
14
|
const validators_1 = require("../../utils/validators");
|
|
14
15
|
const input_validators_1 = require("../../../utils/input-validators");
|
|
@@ -26,6 +27,7 @@ function setupTaskAddCommand(program) {
|
|
|
26
27
|
.option('-a, --author <author>', 'Task author')
|
|
27
28
|
.option('--assignees <assignees>', 'Task assignees (comma-separated)')
|
|
28
29
|
.option('-s, --status <status>', 'Task status (backlog, ready, in_progress, review, done, closed)', 'backlog')
|
|
30
|
+
.option('--priority <priority>', 'Task priority (critical, high, medium, low)')
|
|
29
31
|
.option('-p, --parent <id>', 'Parent task ID')
|
|
30
32
|
.option('--file <path>', 'Read body from markdown file')
|
|
31
33
|
.option('--blocked-by <ids>', 'Comma-separated task IDs that block this task')
|
|
@@ -78,6 +80,14 @@ function setupTaskAddCommand(program) {
|
|
|
78
80
|
});
|
|
79
81
|
process.exit(1);
|
|
80
82
|
}
|
|
83
|
+
if (options.priority && !(0, Priority_1.isPriority)(options.priority)) {
|
|
84
|
+
const message = `Invalid priority: ${options.priority}. Valid priorities: critical, high, medium, low`;
|
|
85
|
+
formatter.error(message, () => {
|
|
86
|
+
console.log(chalk_1.default.red(`Invalid priority: ${options.priority}`));
|
|
87
|
+
console.log('Valid priorities: critical, high, medium, low');
|
|
88
|
+
});
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
81
91
|
let parentId = undefined;
|
|
82
92
|
if (options.parent) {
|
|
83
93
|
const parsed = (0, error_handler_1.validateNumberInput)(options.parent);
|
|
@@ -111,6 +121,7 @@ function setupTaskAddCommand(program) {
|
|
|
111
121
|
author: options.author,
|
|
112
122
|
assignees: options.assignees,
|
|
113
123
|
status: options.status,
|
|
124
|
+
priority: options.priority ? options.priority : undefined,
|
|
114
125
|
parent_id: parentId,
|
|
115
126
|
});
|
|
116
127
|
try {
|