agkan 3.12.0 → 3.14.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.
Files changed (79) hide show
  1. package/README.ja.md +18 -0
  2. package/README.md +18 -0
  3. package/dist/board/BulkRunService.d.ts.map +1 -1
  4. package/dist/board/BulkRunService.js +4 -1
  5. package/dist/board/BulkRunService.js.map +1 -1
  6. package/dist/board/boardRoutes.d.ts +4 -4
  7. package/dist/board/boardRoutes.d.ts.map +1 -1
  8. package/dist/board/boardRoutes.js +74 -124
  9. package/dist/board/boardRoutes.js.map +1 -1
  10. package/dist/board/boardStyles.d.ts +1 -1
  11. package/dist/board/boardStyles.d.ts.map +1 -1
  12. package/dist/board/boardStyles.js +5 -1
  13. package/dist/board/boardStyles.js.map +1 -1
  14. package/dist/board/client/board.js +2743 -0
  15. package/dist/board/client/main.js +214 -154
  16. package/dist/board/server.d.ts.map +1 -1
  17. package/dist/board/server.js +5 -2
  18. package/dist/board/server.js.map +1 -1
  19. package/dist/cli/commands/block/add.d.ts.map +1 -1
  20. package/dist/cli/commands/block/add.js +2 -0
  21. package/dist/cli/commands/block/add.js.map +1 -1
  22. package/dist/cli/commands/block/remove.d.ts.map +1 -1
  23. package/dist/cli/commands/block/remove.js +2 -0
  24. package/dist/cli/commands/block/remove.js.map +1 -1
  25. package/dist/cli/commands/config/get.d.ts +5 -0
  26. package/dist/cli/commands/config/get.d.ts.map +1 -0
  27. package/dist/cli/commands/config/get.js +97 -0
  28. package/dist/cli/commands/config/get.js.map +1 -0
  29. package/dist/cli/commands/meta/delete.d.ts.map +1 -1
  30. package/dist/cli/commands/meta/delete.js +6 -0
  31. package/dist/cli/commands/meta/delete.js.map +1 -1
  32. package/dist/cli/commands/meta/set.d.ts.map +1 -1
  33. package/dist/cli/commands/meta/set.js +7 -0
  34. package/dist/cli/commands/meta/set.js.map +1 -1
  35. package/dist/cli/commands/tag/attach.d.ts.map +1 -1
  36. package/dist/cli/commands/tag/attach.js +2 -0
  37. package/dist/cli/commands/tag/attach.js.map +1 -1
  38. package/dist/cli/commands/tag/detach.d.ts.map +1 -1
  39. package/dist/cli/commands/tag/detach.js +2 -0
  40. package/dist/cli/commands/tag/detach.js.map +1 -1
  41. package/dist/cli/commands/task/update.d.ts.map +1 -1
  42. package/dist/cli/commands/task/update.js +2 -0
  43. package/dist/cli/commands/task/update.js.map +1 -1
  44. package/dist/cli/index.js +4 -0
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/cli/utils/boardNotify.d.ts +2 -0
  47. package/dist/cli/utils/boardNotify.d.ts.map +1 -0
  48. package/dist/cli/utils/boardNotify.js +16 -0
  49. package/dist/cli/utils/boardNotify.js.map +1 -0
  50. package/dist/cli/utils/constants.d.ts +2 -0
  51. package/dist/cli/utils/constants.d.ts.map +1 -0
  52. package/dist/cli/utils/constants.js +5 -0
  53. package/dist/cli/utils/constants.js.map +1 -0
  54. package/dist/cli/utils/response-formatter.d.ts +19 -0
  55. package/dist/cli/utils/response-formatter.d.ts.map +1 -0
  56. package/dist/cli/utils/response-formatter.js +43 -0
  57. package/dist/cli/utils/response-formatter.js.map +1 -0
  58. package/dist/cli/utils/service-container.d.ts.map +1 -1
  59. package/dist/cli/utils/service-container.js +8 -1
  60. package/dist/cli/utils/service-container.js.map +1 -1
  61. package/dist/hooks/hook-stop.mjs +44 -13
  62. package/dist/models/Attachment.d.ts +25 -0
  63. package/dist/models/Attachment.d.ts.map +1 -0
  64. package/dist/models/Attachment.js +7 -0
  65. package/dist/models/Attachment.js.map +1 -0
  66. package/dist/services/AttachmentService.d.ts +62 -0
  67. package/dist/services/AttachmentService.d.ts.map +1 -0
  68. package/dist/services/AttachmentService.js +95 -0
  69. package/dist/services/AttachmentService.js.map +1 -0
  70. package/dist/services/BoardEventService.d.ts +9 -0
  71. package/dist/services/BoardEventService.d.ts.map +1 -0
  72. package/dist/services/BoardEventService.js +22 -0
  73. package/dist/services/BoardEventService.js.map +1 -0
  74. package/dist/services/TaskService.d.ts +3 -1
  75. package/dist/services/TaskService.d.ts.map +1 -1
  76. package/dist/services/TaskService.js +29 -15
  77. package/dist/services/TaskService.js.map +1 -1
  78. package/dist/terminal/PtySessionService.js +1 -1
  79. package/package.json +30 -20
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Attachment model
3
+ * Type definitions for attachments
4
+ */
5
+ /**
6
+ * Complete attachment type definition
7
+ * Represents an attachment retrieved from the database
8
+ */
9
+ export interface Attachment {
10
+ id: number;
11
+ task_id: number;
12
+ file_name: string;
13
+ file_path: string;
14
+ created_at: string;
15
+ }
16
+ /**
17
+ * Attachment creation input type
18
+ * Excludes id and created_at as they are auto-generated
19
+ */
20
+ export interface CreateAttachmentInput {
21
+ task_id: number;
22
+ file_name: string;
23
+ file_path: string;
24
+ }
25
+ //# sourceMappingURL=Attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../src/models/Attachment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Attachment model
4
+ * Type definitions for attachments
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=Attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attachment.js","sourceRoot":"","sources":["../../src/models/Attachment.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,62 @@
1
+ import { Attachment, CreateAttachmentInput } from '../models';
2
+ import Database from 'better-sqlite3';
3
+ /**
4
+ * Attachment Service
5
+ * Provides management of attachment records
6
+ *
7
+ * @remarks
8
+ * **Future Feature**: This service is fully implemented but CLI commands are not yet available.
9
+ * See docs/planned-features.md for implementation timeline and planned CLI interface.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const service = new AttachmentService();
14
+ * const attachment = service.createAttachment({
15
+ * task_id: 1,
16
+ * file_name: 'design.pdf',
17
+ * file_path: '/path/to/design.pdf'
18
+ * });
19
+ * ```
20
+ */
21
+ export declare class AttachmentService {
22
+ private db;
23
+ constructor(db?: Database.Database);
24
+ /**
25
+ * Create a new attachment record
26
+ *
27
+ * @remarks
28
+ * **Future Feature**: CLI command not yet implemented.
29
+ * Planned command: `agkan task attach add <task-id> <file-path>`
30
+ *
31
+ * @param input - Attachment creation input
32
+ * @returns Created attachment record
33
+ * @throws Will throw if task_id does not exist (foreign key constraint)
34
+ */
35
+ createAttachment(input: CreateAttachmentInput): Attachment;
36
+ /**
37
+ * Get attachments for a specific task
38
+ *
39
+ * @remarks
40
+ * **Future Feature**: CLI command not yet implemented.
41
+ * Planned command: `agkan task attach list <task-id>`
42
+ *
43
+ * @param taskId - Task ID
44
+ * @returns Array of attachments ordered by creation date (newest first)
45
+ */
46
+ getAttachmentsByTaskId(taskId: number): Attachment[];
47
+ /**
48
+ * Delete an attachment record
49
+ *
50
+ * @remarks
51
+ * **Future Feature**: CLI command not yet implemented.
52
+ * Planned command: `agkan task attach delete <attachment-id>`
53
+ *
54
+ * @param id - Attachment ID
55
+ * @returns True if deletion succeeded, false if not found
56
+ *
57
+ * @todo Implement file deletion from filesystem
58
+ * @todo Add --keep-file option to CLI command
59
+ */
60
+ deleteAttachment(id: number): boolean;
61
+ }
62
+ //# sourceMappingURL=AttachmentService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentService.d.ts","sourceRoot":"","sources":["../../src/services/AttachmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ;IAIlC;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU;IAoB1D;;;;;;;;;OASG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAOpD;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAetC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AttachmentService = void 0;
4
+ const connection_1 = require("../db/connection");
5
+ /**
6
+ * Attachment Service
7
+ * Provides management of attachment records
8
+ *
9
+ * @remarks
10
+ * **Future Feature**: This service is fully implemented but CLI commands are not yet available.
11
+ * See docs/planned-features.md for implementation timeline and planned CLI interface.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const service = new AttachmentService();
16
+ * const attachment = service.createAttachment({
17
+ * task_id: 1,
18
+ * file_name: 'design.pdf',
19
+ * file_path: '/path/to/design.pdf'
20
+ * });
21
+ * ```
22
+ */
23
+ class AttachmentService {
24
+ constructor(db) {
25
+ this.db = db || (0, connection_1.getDatabase)();
26
+ }
27
+ /**
28
+ * Create a new attachment record
29
+ *
30
+ * @remarks
31
+ * **Future Feature**: CLI command not yet implemented.
32
+ * Planned command: `agkan task attach add <task-id> <file-path>`
33
+ *
34
+ * @param input - Attachment creation input
35
+ * @returns Created attachment record
36
+ * @throws Will throw if task_id does not exist (foreign key constraint)
37
+ */
38
+ createAttachment(input) {
39
+ const db = this.db;
40
+ const now = new Date().toISOString();
41
+ const stmt = db.prepare(`
42
+ INSERT INTO attachments (task_id, file_name, file_path, created_at)
43
+ VALUES (?, ?, ?, ?)
44
+ `);
45
+ const result = stmt.run(input.task_id, input.file_name, input.file_path, now);
46
+ return {
47
+ id: result.lastInsertRowid,
48
+ task_id: input.task_id,
49
+ file_name: input.file_name,
50
+ file_path: input.file_path,
51
+ created_at: now,
52
+ };
53
+ }
54
+ /**
55
+ * Get attachments for a specific task
56
+ *
57
+ * @remarks
58
+ * **Future Feature**: CLI command not yet implemented.
59
+ * Planned command: `agkan task attach list <task-id>`
60
+ *
61
+ * @param taskId - Task ID
62
+ * @returns Array of attachments ordered by creation date (newest first)
63
+ */
64
+ getAttachmentsByTaskId(taskId) {
65
+ const db = this.db;
66
+ const stmt = db.prepare('SELECT * FROM attachments WHERE task_id = ? ORDER BY created_at DESC');
67
+ return stmt.all(taskId);
68
+ }
69
+ /**
70
+ * Delete an attachment record
71
+ *
72
+ * @remarks
73
+ * **Future Feature**: CLI command not yet implemented.
74
+ * Planned command: `agkan task attach delete <attachment-id>`
75
+ *
76
+ * @param id - Attachment ID
77
+ * @returns True if deletion succeeded, false if not found
78
+ *
79
+ * @todo Implement file deletion from filesystem
80
+ * @todo Add --keep-file option to CLI command
81
+ */
82
+ deleteAttachment(id) {
83
+ const db = this.db;
84
+ const stmt = db.prepare('SELECT * FROM attachments WHERE id = ?');
85
+ const attachment = stmt.get(id);
86
+ if (!attachment) {
87
+ return false;
88
+ }
89
+ const deleteStmt = db.prepare('DELETE FROM attachments WHERE id = ?');
90
+ deleteStmt.run(id);
91
+ return true;
92
+ }
93
+ }
94
+ exports.AttachmentService = AttachmentService;
95
+ //# sourceMappingURL=AttachmentService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentService.js","sourceRoot":"","sources":["../../src/services/AttachmentService.ts"],"names":[],"mappings":";;;AACA,iDAA+C;AAG/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,iBAAiB;IAG5B,YAAY,EAAsB;QAChC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAA,wBAAW,GAAE,CAAC;IAChC,CAAC;IAED;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,KAA4B;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE9E,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,eAAyB;YACpC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,sBAAsB,CAAC,MAAc;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAiB,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAU;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACtE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAnFD,8CAmFC"}
@@ -0,0 +1,9 @@
1
+ type Listener = () => void;
2
+ export declare class BoardEventService {
3
+ private listeners;
4
+ subscribe(fn: Listener): () => void;
5
+ notify(): void;
6
+ listenerCount(): number;
7
+ }
8
+ export {};
9
+ //# sourceMappingURL=BoardEventService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardEventService.d.ts","sourceRoot":"","sources":["../../src/services/BoardEventService.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAkB;IAEnC,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI;IAQnC,MAAM,IAAI,IAAI;IAId,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BoardEventService = void 0;
4
+ class BoardEventService {
5
+ listeners = [];
6
+ subscribe(fn) {
7
+ this.listeners.push(fn);
8
+ return () => {
9
+ const idx = this.listeners.indexOf(fn);
10
+ if (idx !== -1)
11
+ this.listeners.splice(idx, 1);
12
+ };
13
+ }
14
+ notify() {
15
+ this.listeners.forEach((fn) => fn());
16
+ }
17
+ listenerCount() {
18
+ return this.listeners.length;
19
+ }
20
+ }
21
+ exports.BoardEventService = BoardEventService;
22
+ //# sourceMappingURL=BoardEventService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardEventService.js","sourceRoot":"","sources":["../../src/services/BoardEventService.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IACpB,SAAS,GAAe,EAAE,CAAC;IAEnC,SAAS,CAAC,EAAY;QACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAlBD,8CAkBC"}
@@ -1,5 +1,6 @@
1
1
  import { Task, CreateTaskInput, UpdateTaskInput, TaskStatus } from '../models';
2
2
  import { StorageBackend } from '../db/types/repository';
3
+ import { BoardEventService } from './BoardEventService';
3
4
  /** Allowed sort fields for task listing */
4
5
  export declare const ALLOWED_SORT_FIELDS: readonly ["id", "title", "status", "created_at", "updated_at", "priority"];
5
6
  export type SortField = (typeof ALLOWED_SORT_FIELDS)[number];
@@ -10,7 +11,8 @@ export type SortOrder = 'asc' | 'desc';
10
11
  */
11
12
  export declare class TaskService {
12
13
  private backend;
13
- constructor(backend?: StorageBackend);
14
+ private boardEventService?;
15
+ constructor(backend?: StorageBackend, boardEventService?: BoardEventService);
14
16
  /**
15
17
  * Create a new task
16
18
  * If `tagIds` is provided, the task creation and tag attachments are wrapped
@@ -1 +1 @@
1
- {"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,4EAA6E,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE,cAAc;IAIpC;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA2CxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhC;;;;;;OAMG;IACH,SAAS,CACP,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,EACD,IAAI,CAAC,EAAE,SAAS,EAChB,KAAK,CAAC,EAAE,SAAS,GAChB,IAAI,EAAE;IAoBT;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IA4B3D;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ/B;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAclH;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAcpH;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUtC;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE;IAmB1F;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAIvC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAQ1C;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB5C;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAuBzC"}
1
+ {"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,4EAA6E,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAElC,OAAO,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE,iBAAiB;IAK3E;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA8CxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhC;;;;;;OAMG;IACH,SAAS,CACP,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,EACD,IAAI,CAAC,EAAE,SAAS,EAChB,KAAK,CAAC,EAAE,SAAS,GAChB,IAAI,EAAE;IAuBT;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IA8B3D;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU/B;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAclH;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAcpH;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUtC;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE;IAmB1F;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAIvC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAQ1C;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB5C;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAuBzC"}
@@ -13,8 +13,10 @@ exports.ALLOWED_SORT_FIELDS = ['id', 'title', 'status', 'created_at', 'updated_a
13
13
  */
14
14
  class TaskService {
15
15
  backend;
16
- constructor(backend) {
16
+ boardEventService;
17
+ constructor(backend, boardEventService) {
17
18
  this.backend = backend ?? (0, connection_1.getStorageBackend)();
19
+ this.boardEventService = boardEventService;
18
20
  }
19
21
  /**
20
22
  * Create a new task
@@ -39,26 +41,31 @@ class TaskService {
39
41
  }
40
42
  }
41
43
  const { tagIds, ...taskInput } = input;
44
+ let task;
42
45
  if (!tagIds || tagIds.length === 0) {
43
- return this.backend.tasks.create({
46
+ task = this.backend.tasks.create({
44
47
  ...taskInput,
45
48
  status,
46
49
  created_at: now,
47
50
  updated_at: now,
48
51
  });
49
52
  }
50
- return this.backend.transaction(() => {
51
- const task = this.backend.tasks.create({
52
- ...taskInput,
53
- status,
54
- created_at: now,
55
- updated_at: now,
53
+ else {
54
+ task = this.backend.transaction(() => {
55
+ const t = this.backend.tasks.create({
56
+ ...taskInput,
57
+ status,
58
+ created_at: now,
59
+ updated_at: now,
60
+ });
61
+ for (const tagId of tagIds) {
62
+ this.backend.taskTags.create({ task_id: t.id, tag_id: tagId, created_at: now });
63
+ }
64
+ return t;
56
65
  });
57
- for (const tagId of tagIds) {
58
- this.backend.taskTags.create({ task_id: task.id, tag_id: tagId, created_at: now });
59
- }
60
- return task;
61
- });
66
+ }
67
+ this.boardEventService?.notify();
68
+ return task;
62
69
  }
63
70
  /**
64
71
  * Get task by ID
@@ -79,6 +86,7 @@ class TaskService {
79
86
  const sortField = sort && exports.ALLOWED_SORT_FIELDS.includes(sort) ? sort : 'created_at';
80
87
  const sortOrder = order === 'asc' ? 'asc' : 'desc';
81
88
  const { status, author, assignees, tagIds, priority, search, includeArchived } = filters ?? {};
89
+ const searchId = search && /^\d+$/.test(search) ? parseInt(search, 10) : undefined;
82
90
  return this.backend.tasks.findAll({
83
91
  status,
84
92
  author,
@@ -87,6 +95,7 @@ class TaskService {
87
95
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
96
  priority: priority,
89
97
  search,
98
+ searchId,
90
99
  includeArchived,
91
100
  }, { field: sortField, order: sortOrder });
92
101
  }
@@ -117,7 +126,9 @@ class TaskService {
117
126
  }
118
127
  }
119
128
  const now = new Date().toISOString();
120
- return this.backend.tasks.update(id, { ...input, updated_at: now });
129
+ const updated = this.backend.tasks.update(id, { ...input, updated_at: now });
130
+ this.boardEventService?.notify();
131
+ return updated;
121
132
  }
122
133
  /**
123
134
  * Delete task
@@ -129,7 +140,10 @@ class TaskService {
129
140
  if (!task) {
130
141
  return false;
131
142
  }
132
- return this.backend.tasks.delete(id);
143
+ const deleted = this.backend.tasks.delete(id);
144
+ if (deleted)
145
+ this.boardEventService?.notify();
146
+ return deleted;
133
147
  }
134
148
  /**
135
149
  * Get task count by status
@@ -1 +1 @@
1
- {"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":";;;AACA,iDAAqD;AACrD,gEAAuF;AACvF,4DAA2D;AAE3D,sCAA0E;AAG1E,2CAA2C;AAC9B,QAAA,mBAAmB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AAK9G;;;GAGG;AACH,MAAa,WAAW;IACd,OAAO,CAAiB;IACxB,iBAAiB,CAAqB;IAE9C,YAAY,OAAwB,EAAE,iBAAqC;QACzE,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAA,8BAAiB,GAAE,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,KAAsB;QAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;QAEzC,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,IAAA,oCAAiB,EAAC,KAAK,CAAC,CAAC;QAClD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,wBAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,kDAAkD;QAClD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,sBAAa,CAAC,uBAAuB,KAAK,CAAC,SAAS,iBAAiB,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;QAEvC,IAAI,IAAU,CAAC;QACf,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,GAAG,SAAS;gBACZ,MAAM;gBACN,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;gBACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;oBAClC,GAAG,SAAS;oBACZ,MAAM;oBACN,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,GAAG;iBAChB,CAAC,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CACP,OAQC,EACD,IAAgB,EAChB,KAAiB;QAEjB,MAAM,SAAS,GAAc,IAAI,IAAI,2BAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;QAC9F,MAAM,SAAS,GAAc,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAE/F,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnF,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAC/B;YACE,MAAM;YACN,MAAM;YACN,SAAS;YACT,MAAM;YACN,8DAA8D;YAC9D,QAAQ,EAAE,QAAe;YACzB,MAAM;YACN,QAAQ;YACR,eAAe;SAChB,EACD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CACvC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,EAAU,EAAE,KAAsB;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAA,0CAAuB,EAAC,KAAK,CAAC,CAAC;QACxD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,wBAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,IAAA,iCAAgB,EAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC;gBACnG,MAAM,IAAI,sBAAa,CAAC,2BAA2B,KAAK,CAAC,SAAS,mCAAmC,CAAC,CAAC;YACzG,CAAC;YAED,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,MAAM,IAAI,sBAAa,CAAC,uBAAuB,KAAK,CAAC,SAAS,iBAAiB,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAU;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,OAAO;YAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAkB,EAAE,WAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAkB,KAAK;QACvG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAkB,EAAE,WAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAkB,KAAK;QACzG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,OAAe,EAAE,aAAsB,KAAK,EAAE,QAAuB;QAC/E,IAAI,YAAsC,CAAC;QAE3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,gEAAgE;YAChE,MAAM,WAAW,GAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;YAChF,YAAY,GAAG,WAAW,CAAC;QAC7B,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAC/B,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EACnD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CACvC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,MAAc;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAgB;QACjC,MAAM,WAAW,GAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC/C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC3B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,MAAc;QACxB,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAE5B,OAAO,WAAW,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvC,MAAM;YACR,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3B,WAAW,GAAG,UAAU,CAAC;QAC3B,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AA/UD,kCA+UC"}
@@ -61,7 +61,7 @@ function resolveClaudePath() {
61
61
  }
62
62
  const CLAUDE_BIN = resolveClaudePath();
63
63
  const PROMPT_FALLBACK_DELAY_MS = 10000;
64
- const PROMPT_ENTER_DELAY_MS = 100;
64
+ const PROMPT_ENTER_DELAY_MS = 200;
65
65
  const MAX_SNAPSHOT_BYTES = 500_000;
66
66
  const MAX_COMPLETED_SNAPSHOTS = 10;
67
67
  function hasWorkspaceTrustPrompt(text) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agkan",
3
- "version": "3.12.0",
3
+ "version": "3.14.1",
4
4
  "description": "TypeScript-based CLI task management tool with SQLite storage",
5
5
  "main": "dist/cli/index.js",
6
6
  "bin": {
@@ -10,6 +10,26 @@
10
10
  "dist",
11
11
  "bin"
12
12
  ],
13
+ "scripts": {
14
+ "build": "tsc && node scripts/build-client.mjs && node scripts/build-hooks.mjs",
15
+ "build:server": "tsc",
16
+ "build:client": "node scripts/build-client.mjs",
17
+ "dev": "tsc --watch",
18
+ "board": "pnpm run build && node dist/cli/index.js board",
19
+ "start": "node dist/cli/index.js",
20
+ "test": "vitest run",
21
+ "test:all": "pnpm install && pnpm run build && pnpm run type-check && pnpm run lint && vitest run && pnpm run test:e2e",
22
+ "test:errors": "vitest run --reporter=./tests/reporters/error-only.ts",
23
+ "test:e2e": "./test-e2e.sh",
24
+ "lint": "eslint src tests",
25
+ "lint:fix": "eslint src tests --fix",
26
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
27
+ "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
28
+ "type-check": "tsc --noEmit && tsc --noEmit -p src/board/client/tsconfig.json",
29
+ "check": "pnpm run type-check && pnpm run lint && pnpm run format:check",
30
+ "prepublishOnly": "pnpm run check && pnpm run build && vitest run",
31
+ "prepare": "husky || true && chmod +x node_modules/.bin/* node_modules/prettier/bin/*.cjs node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null || true"
32
+ },
13
33
  "repository": {
14
34
  "type": "git",
15
35
  "url": "git+https://github.com/gendosu/agkan.git"
@@ -27,6 +47,7 @@
27
47
  ],
28
48
  "author": "gendosu <gendosu@gmail.com>",
29
49
  "license": "ISC",
50
+ "packageManager": "pnpm@10.33.0",
30
51
  "engines": {
31
52
  "node": ">=20.0.0"
32
53
  },
@@ -40,6 +61,13 @@
40
61
  "node-pty": "1.1.0",
41
62
  "ws": "8.18.3"
42
63
  },
64
+ "pnpm": {
65
+ "onlyBuiltDependencies": [
66
+ "better-sqlite3",
67
+ "esbuild",
68
+ "node-pty"
69
+ ]
70
+ },
43
71
  "devDependencies": {
44
72
  "@types/better-sqlite3": "^7.6.12",
45
73
  "@types/js-yaml": "^4.0.9",
@@ -59,23 +87,5 @@
59
87
  "prettier": "^3.8.1",
60
88
  "typescript": "^5.7.3",
61
89
  "vitest": "^4.0.18"
62
- },
63
- "scripts": {
64
- "build": "tsc && node scripts/build-client.mjs && node scripts/build-hooks.mjs",
65
- "build:server": "tsc",
66
- "build:client": "node scripts/build-client.mjs",
67
- "dev": "tsc --watch",
68
- "board": "pnpm run build && node dist/cli/index.js board",
69
- "start": "node dist/cli/index.js",
70
- "test": "vitest run",
71
- "test:all": "pnpm install && pnpm run build && pnpm run type-check && pnpm run lint && vitest run && pnpm run test:e2e",
72
- "test:errors": "vitest run --reporter=./tests/reporters/error-only.ts",
73
- "test:e2e": "./test-e2e.sh",
74
- "lint": "eslint src tests",
75
- "lint:fix": "eslint src tests --fix",
76
- "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
77
- "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
78
- "type-check": "tsc --noEmit && tsc --noEmit -p src/board/client/tsconfig.json",
79
- "check": "pnpm run type-check && pnpm run lint && pnpm run format:check"
80
90
  }
81
- }
91
+ }