agkan 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.ja.md +1127 -0
  2. package/README.md +1140 -0
  3. package/bin/agkan +2 -0
  4. package/dist/cli/commands/block/add.d.ts +6 -0
  5. package/dist/cli/commands/block/add.d.ts.map +1 -0
  6. package/dist/cli/commands/block/add.js +135 -0
  7. package/dist/cli/commands/block/add.js.map +1 -0
  8. package/dist/cli/commands/block/list.d.ts +6 -0
  9. package/dist/cli/commands/block/list.d.ts.map +1 -0
  10. package/dist/cli/commands/block/list.js +120 -0
  11. package/dist/cli/commands/block/list.js.map +1 -0
  12. package/dist/cli/commands/block/remove.d.ts +6 -0
  13. package/dist/cli/commands/block/remove.d.ts.map +1 -0
  14. package/dist/cli/commands/block/remove.js +117 -0
  15. package/dist/cli/commands/block/remove.js.map +1 -0
  16. package/dist/cli/commands/meta/delete.d.ts +6 -0
  17. package/dist/cli/commands/meta/delete.d.ts.map +1 -0
  18. package/dist/cli/commands/meta/delete.js +67 -0
  19. package/dist/cli/commands/meta/delete.js.map +1 -0
  20. package/dist/cli/commands/meta/get.d.ts +6 -0
  21. package/dist/cli/commands/meta/get.d.ts.map +1 -0
  22. package/dist/cli/commands/meta/get.js +71 -0
  23. package/dist/cli/commands/meta/get.js.map +1 -0
  24. package/dist/cli/commands/meta/list.d.ts +6 -0
  25. package/dist/cli/commands/meta/list.d.ts.map +1 -0
  26. package/dist/cli/commands/meta/list.js +69 -0
  27. package/dist/cli/commands/meta/list.js.map +1 -0
  28. package/dist/cli/commands/meta/set.d.ts +6 -0
  29. package/dist/cli/commands/meta/set.d.ts.map +1 -0
  30. package/dist/cli/commands/meta/set.js +85 -0
  31. package/dist/cli/commands/meta/set.js.map +1 -0
  32. package/dist/cli/commands/tag/add.d.ts +6 -0
  33. package/dist/cli/commands/tag/add.d.ts.map +1 -0
  34. package/dist/cli/commands/tag/add.js +99 -0
  35. package/dist/cli/commands/tag/add.js.map +1 -0
  36. package/dist/cli/commands/tag/attach.d.ts +6 -0
  37. package/dist/cli/commands/tag/attach.d.ts.map +1 -0
  38. package/dist/cli/commands/tag/attach.js +119 -0
  39. package/dist/cli/commands/tag/attach.js.map +1 -0
  40. package/dist/cli/commands/tag/delete.d.ts +6 -0
  41. package/dist/cli/commands/tag/delete.d.ts.map +1 -0
  42. package/dist/cli/commands/tag/delete.js +93 -0
  43. package/dist/cli/commands/tag/delete.js.map +1 -0
  44. package/dist/cli/commands/tag/detach.d.ts +6 -0
  45. package/dist/cli/commands/tag/detach.d.ts.map +1 -0
  46. package/dist/cli/commands/tag/detach.js +118 -0
  47. package/dist/cli/commands/tag/detach.js.map +1 -0
  48. package/dist/cli/commands/tag/list.d.ts +6 -0
  49. package/dist/cli/commands/tag/list.d.ts.map +1 -0
  50. package/dist/cli/commands/tag/list.js +80 -0
  51. package/dist/cli/commands/tag/list.js.map +1 -0
  52. package/dist/cli/commands/tag/show.d.ts +6 -0
  53. package/dist/cli/commands/tag/show.d.ts.map +1 -0
  54. package/dist/cli/commands/tag/show.js +88 -0
  55. package/dist/cli/commands/tag/show.js.map +1 -0
  56. package/dist/cli/commands/task/add-helpers.d.ts +17 -0
  57. package/dist/cli/commands/task/add-helpers.d.ts.map +1 -0
  58. package/dist/cli/commands/task/add-helpers.js +122 -0
  59. package/dist/cli/commands/task/add-helpers.js.map +1 -0
  60. package/dist/cli/commands/task/add.d.ts +6 -0
  61. package/dist/cli/commands/task/add.d.ts.map +1 -0
  62. package/dist/cli/commands/task/add.js +140 -0
  63. package/dist/cli/commands/task/add.js.map +1 -0
  64. package/dist/cli/commands/task/count.d.ts +6 -0
  65. package/dist/cli/commands/task/count.d.ts.map +1 -0
  66. package/dist/cli/commands/task/count.js +97 -0
  67. package/dist/cli/commands/task/count.js.map +1 -0
  68. package/dist/cli/commands/task/delete.d.ts +6 -0
  69. package/dist/cli/commands/task/delete.d.ts.map +1 -0
  70. package/dist/cli/commands/task/delete.js +59 -0
  71. package/dist/cli/commands/task/delete.js.map +1 -0
  72. package/dist/cli/commands/task/find.d.ts +7 -0
  73. package/dist/cli/commands/task/find.d.ts.map +1 -0
  74. package/dist/cli/commands/task/find.js +118 -0
  75. package/dist/cli/commands/task/find.js.map +1 -0
  76. package/dist/cli/commands/task/get.d.ts +6 -0
  77. package/dist/cli/commands/task/get.d.ts.map +1 -0
  78. package/dist/cli/commands/task/get.js +196 -0
  79. package/dist/cli/commands/task/get.js.map +1 -0
  80. package/dist/cli/commands/task/list.d.ts +6 -0
  81. package/dist/cli/commands/task/list.d.ts.map +1 -0
  82. package/dist/cli/commands/task/list.js +301 -0
  83. package/dist/cli/commands/task/list.js.map +1 -0
  84. package/dist/cli/commands/task/update-parent.d.ts +6 -0
  85. package/dist/cli/commands/task/update-parent.d.ts.map +1 -0
  86. package/dist/cli/commands/task/update-parent.js +123 -0
  87. package/dist/cli/commands/task/update-parent.js.map +1 -0
  88. package/dist/cli/commands/task/update.d.ts +6 -0
  89. package/dist/cli/commands/task/update.d.ts.map +1 -0
  90. package/dist/cli/commands/task/update.js +96 -0
  91. package/dist/cli/commands/task/update.js.map +1 -0
  92. package/dist/cli/index.d.ts +3 -0
  93. package/dist/cli/index.d.ts.map +1 -0
  94. package/dist/cli/index.js +68 -0
  95. package/dist/cli/index.js.map +1 -0
  96. package/dist/cli/utils/array-utils.d.ts +15 -0
  97. package/dist/cli/utils/array-utils.d.ts.map +1 -0
  98. package/dist/cli/utils/array-utils.js +20 -0
  99. package/dist/cli/utils/array-utils.js.map +1 -0
  100. package/dist/cli/utils/error-handler.d.ts +35 -0
  101. package/dist/cli/utils/error-handler.d.ts.map +1 -0
  102. package/dist/cli/utils/error-handler.js +84 -0
  103. package/dist/cli/utils/error-handler.js.map +1 -0
  104. package/dist/cli/utils/output-formatter.d.ts +34 -0
  105. package/dist/cli/utils/output-formatter.d.ts.map +1 -0
  106. package/dist/cli/utils/output-formatter.js +44 -0
  107. package/dist/cli/utils/output-formatter.js.map +1 -0
  108. package/dist/cli/utils/response-formatter.d.ts +19 -0
  109. package/dist/cli/utils/response-formatter.d.ts.map +1 -0
  110. package/dist/cli/utils/response-formatter.js +43 -0
  111. package/dist/cli/utils/response-formatter.js.map +1 -0
  112. package/dist/cli/utils/validators.d.ts +23 -0
  113. package/dist/cli/utils/validators.d.ts.map +1 -0
  114. package/dist/cli/utils/validators.js +47 -0
  115. package/dist/cli/utils/validators.js.map +1 -0
  116. package/dist/db/config.d.ts +27 -0
  117. package/dist/db/config.d.ts.map +1 -0
  118. package/dist/db/config.js +116 -0
  119. package/dist/db/config.js.map +1 -0
  120. package/dist/db/connection.d.ts +24 -0
  121. package/dist/db/connection.d.ts.map +1 -0
  122. package/dist/db/connection.js +62 -0
  123. package/dist/db/connection.js.map +1 -0
  124. package/dist/db/reset.d.ts +8 -0
  125. package/dist/db/reset.d.ts.map +1 -0
  126. package/dist/db/reset.js +33 -0
  127. package/dist/db/reset.js.map +1 -0
  128. package/dist/db/schema.d.ts +6 -0
  129. package/dist/db/schema.d.ts.map +1 -0
  130. package/dist/db/schema.js +134 -0
  131. package/dist/db/schema.js.map +1 -0
  132. package/dist/models/Attachment.d.ts +25 -0
  133. package/dist/models/Attachment.d.ts.map +1 -0
  134. package/dist/models/Attachment.js +7 -0
  135. package/dist/models/Attachment.js.map +1 -0
  136. package/dist/models/Tag.d.ts +24 -0
  137. package/dist/models/Tag.d.ts.map +1 -0
  138. package/dist/models/Tag.js +3 -0
  139. package/dist/models/Tag.js.map +1 -0
  140. package/dist/models/Task.d.ts +55 -0
  141. package/dist/models/Task.d.ts.map +1 -0
  142. package/dist/models/Task.js +7 -0
  143. package/dist/models/Task.js.map +1 -0
  144. package/dist/models/TaskBlock.d.ts +11 -0
  145. package/dist/models/TaskBlock.d.ts.map +1 -0
  146. package/dist/models/TaskBlock.js +3 -0
  147. package/dist/models/TaskBlock.js.map +1 -0
  148. package/dist/models/TaskMetadata.d.ts +30 -0
  149. package/dist/models/TaskMetadata.d.ts.map +1 -0
  150. package/dist/models/TaskMetadata.js +3 -0
  151. package/dist/models/TaskMetadata.js.map +1 -0
  152. package/dist/models/TaskTag.d.ts +11 -0
  153. package/dist/models/TaskTag.d.ts.map +1 -0
  154. package/dist/models/TaskTag.js +3 -0
  155. package/dist/models/TaskTag.js.map +1 -0
  156. package/dist/models/index.d.ts +10 -0
  157. package/dist/models/index.d.ts.map +1 -0
  158. package/dist/models/index.js +7 -0
  159. package/dist/models/index.js.map +1 -0
  160. package/dist/services/AttachmentService.d.ts +62 -0
  161. package/dist/services/AttachmentService.d.ts.map +1 -0
  162. package/dist/services/AttachmentService.js +95 -0
  163. package/dist/services/AttachmentService.js.map +1 -0
  164. package/dist/services/FileService.d.ts +31 -0
  165. package/dist/services/FileService.d.ts.map +1 -0
  166. package/dist/services/FileService.js +77 -0
  167. package/dist/services/FileService.js.map +1 -0
  168. package/dist/services/MetadataService.d.ts +49 -0
  169. package/dist/services/MetadataService.d.ts.map +1 -0
  170. package/dist/services/MetadataService.js +126 -0
  171. package/dist/services/MetadataService.js.map +1 -0
  172. package/dist/services/TagService.d.ts +49 -0
  173. package/dist/services/TagService.d.ts.map +1 -0
  174. package/dist/services/TagService.js +127 -0
  175. package/dist/services/TagService.js.map +1 -0
  176. package/dist/services/TaskBlockService.d.ts +49 -0
  177. package/dist/services/TaskBlockService.d.ts.map +1 -0
  178. package/dist/services/TaskBlockService.js +118 -0
  179. package/dist/services/TaskBlockService.js.map +1 -0
  180. package/dist/services/TaskService.d.ts +89 -0
  181. package/dist/services/TaskService.d.ts.map +1 -0
  182. package/dist/services/TaskService.js +285 -0
  183. package/dist/services/TaskService.js.map +1 -0
  184. package/dist/services/TaskTagService.d.ts +66 -0
  185. package/dist/services/TaskTagService.d.ts.map +1 -0
  186. package/dist/services/TaskTagService.js +171 -0
  187. package/dist/services/TaskTagService.js.map +1 -0
  188. package/dist/services/index.d.ts +11 -0
  189. package/dist/services/index.d.ts.map +1 -0
  190. package/dist/services/index.js +20 -0
  191. package/dist/services/index.js.map +1 -0
  192. package/dist/utils/cycle-detector.d.ts +14 -0
  193. package/dist/utils/cycle-detector.d.ts.map +1 -0
  194. package/dist/utils/cycle-detector.js +32 -0
  195. package/dist/utils/cycle-detector.js.map +1 -0
  196. package/dist/utils/format.d.ts +13 -0
  197. package/dist/utils/format.d.ts.map +1 -0
  198. package/dist/utils/format.js +29 -0
  199. package/dist/utils/format.js.map +1 -0
  200. package/dist/utils/input-validators.d.ts +32 -0
  201. package/dist/utils/input-validators.d.ts.map +1 -0
  202. package/dist/utils/input-validators.js +108 -0
  203. package/dist/utils/input-validators.js.map +1 -0
  204. package/dist/utils/security.d.ts +11 -0
  205. package/dist/utils/security.d.ts.map +1 -0
  206. package/dist/utils/security.js +29 -0
  207. package/dist/utils/security.js.map +1 -0
  208. package/package.json +70 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Tag detach command handler (renamed from "task tag remove")
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupTagDetachCommand = setupTagDetachCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const output_formatter_1 = require("../../utils/output-formatter");
13
+ const error_handler_1 = require("../../utils/error-handler");
14
+ function setupTagDetachCommand(program) {
15
+ // Find the tag command group
16
+ const tagCommand = program.commands.find((cmd) => cmd.name() === 'tag');
17
+ if (!tagCommand) {
18
+ throw new Error('Tag command not found');
19
+ }
20
+ tagCommand
21
+ .command('detach')
22
+ .argument('<task-id>', 'Task ID')
23
+ .argument('<tag-id-or-name>', 'Tag ID or name')
24
+ .description('Detach a tag from a task')
25
+ .option('--json', 'Output in JSON format')
26
+ .action(async (taskId, tagId, options) => {
27
+ const formatter = (0, output_formatter_1.createFormatter)(options);
28
+ try {
29
+ const taskService = new services_1.TaskService();
30
+ const tagService = new services_1.TagService();
31
+ const taskTagService = new services_1.TaskTagService();
32
+ // Validate task ID
33
+ const parsedTaskId = (0, error_handler_1.validateIdInput)(taskId, 'Task', options);
34
+ // Check if task exists
35
+ const task = taskService.getTask(parsedTaskId);
36
+ if (!task) {
37
+ formatter.error(`Task with ID ${taskId} not found`, () => {
38
+ console.log(chalk_1.default.red(`\nError: Task with ID ${taskId} not found\n`));
39
+ });
40
+ process.exit(1);
41
+ }
42
+ // Resolve tag by ID or name
43
+ const parsedTagId = (0, error_handler_1.validateNumberInput)(tagId);
44
+ let tag = null;
45
+ if (parsedTagId !== null) {
46
+ tag = tagService.getTag(parsedTagId);
47
+ if (!tag) {
48
+ formatter.error(`Tag with ID ${tagId} not found`, () => {
49
+ console.log(chalk_1.default.red(`\nError: Tag with ID ${tagId} not found\n`));
50
+ });
51
+ process.exit(1);
52
+ }
53
+ }
54
+ else {
55
+ tag = tagService.getTagByName(tagId);
56
+ if (!tag) {
57
+ formatter.error(`Tag with name "${tagId}" not found`, () => {
58
+ console.log(chalk_1.default.red(`\nError: Tag with name "${tagId}" not found\n`));
59
+ });
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // Remove tag from task
64
+ try {
65
+ const result = taskTagService.removeTagFromTask(parsedTaskId, tag.id);
66
+ if (!result) {
67
+ formatter.error('This tag is not attached to the task', () => {
68
+ console.log(chalk_1.default.red('\n✗ Error: This tag is not attached to the task\n'));
69
+ });
70
+ process.exit(1);
71
+ }
72
+ formatter.output(() => ({
73
+ success: true,
74
+ task: {
75
+ id: task.id,
76
+ title: task.title,
77
+ },
78
+ tag: {
79
+ id: tag.id,
80
+ name: tag.name,
81
+ },
82
+ }), () => {
83
+ console.log(chalk_1.default.green('\n✓ Tag detached successfully\n'));
84
+ console.log(`${chalk_1.default.bold('Task:')} ${chalk_1.default.cyan(`[${task.id}]`)} ${task.title}`);
85
+ console.log(`${chalk_1.default.bold('Tag:')} ${chalk_1.default.cyan(`[${tag.id}]`)} ${tag.name}`);
86
+ console.log();
87
+ });
88
+ }
89
+ catch (error) {
90
+ if (error instanceof Error) {
91
+ formatter.error(error.message, () => {
92
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
93
+ });
94
+ }
95
+ else {
96
+ formatter.error('An unknown error occurred', () => {
97
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
98
+ });
99
+ }
100
+ process.exit(1);
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (error instanceof Error) {
105
+ formatter.error(error.message, () => {
106
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
107
+ });
108
+ }
109
+ else {
110
+ formatter.error('An unknown error occurred', () => {
111
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
112
+ });
113
+ }
114
+ process.exit(1);
115
+ }
116
+ });
117
+ }
118
+ //# sourceMappingURL=detach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detach.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/detach.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AASH,sDA4GC;AAlHD,kDAA0B;AAC1B,gDAA4E;AAE5E,mEAA+D;AAC/D,6DAAiF;AAEjF,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,6BAA6B;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;IACxE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;SAChC,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC9C,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,SAAS,GAAG,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,sBAAW,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,qBAAU,EAAE,CAAC;YACpC,MAAM,cAAc,GAAG,IAAI,yBAAc,EAAE,CAAC;YAE5C,mBAAmB;YACnB,MAAM,YAAY,GAAG,IAAA,+BAAe,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAE9D,uBAAuB;YACvB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS,CAAC,KAAK,CAAC,gBAAgB,MAAM,YAAY,EAAE,GAAG,EAAE;oBACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,MAAM,cAAc,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,4BAA4B;YAC5B,MAAM,WAAW,GAAG,IAAA,mCAAmB,EAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,GAAG,GAAe,IAAI,CAAC;YAC3B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACrC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,SAAS,CAAC,KAAK,CAAC,eAAe,KAAK,YAAY,EAAE,GAAG,EAAE;wBACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,KAAK,cAAc,CAAC,CAAC,CAAC;oBACtE,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,SAAS,CAAC,KAAK,CAAC,kBAAkB,KAAK,aAAa,EAAE,GAAG,EAAE;wBACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,KAAK,eAAe,CAAC,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,iBAAiB,CAAC,YAAY,EAAE,GAAI,CAAC,EAAE,CAAC,CAAC;gBAEvE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,SAAS,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,EAAE;wBAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;oBAC9E,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,SAAS,CAAC,MAAM,CACd,GAAG,EAAE,CAAC,CAAC;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;qBAClB;oBACD,GAAG,EAAE;wBACH,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,IAAI,EAAE,GAAG,CAAC,IAAI;qBACf;iBACF,CAAC,EACF,GAAG,EAAE;oBACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;oBAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;oBAClF,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;oBAC3B,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;wBAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;oBAC1D,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,EAAE;wBAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;oBAC5D,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;oBAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,EAAE;oBAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag list command handler
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagListCommand(program: Command): void;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2E1D"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Tag list command handler
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupTagListCommand = setupTagListCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const format_1 = require("../../../utils/format");
13
+ const output_formatter_1 = require("../../utils/output-formatter");
14
+ function setupTagListCommand(program) {
15
+ // Find the tag command group
16
+ const tagCommand = program.commands.find((cmd) => cmd.name() === 'tag');
17
+ if (!tagCommand) {
18
+ throw new Error('Tag command not found');
19
+ }
20
+ tagCommand
21
+ .command('list')
22
+ .description('List all tags')
23
+ .option('--json', 'Output in JSON format')
24
+ .action(async (options) => {
25
+ const formatter = (0, output_formatter_1.createFormatter)(options);
26
+ try {
27
+ const tagService = new services_1.TagService();
28
+ const taskTagService = new services_1.TaskTagService();
29
+ const tags = tagService.listTags();
30
+ formatter.output(() => {
31
+ const tagsWithCount = tags.map((tag) => {
32
+ const taskIds = taskTagService.getTaskIdsForTag(tag.id);
33
+ return {
34
+ id: tag.id,
35
+ name: tag.name,
36
+ created_at: tag.created_at,
37
+ taskCount: taskIds.length,
38
+ };
39
+ });
40
+ return {
41
+ totalCount: tags.length,
42
+ tags: tagsWithCount,
43
+ };
44
+ }, () => {
45
+ // Normal output
46
+ if (tags.length === 0) {
47
+ console.log(chalk_1.default.yellow('\nNo tags found\n'));
48
+ return;
49
+ }
50
+ console.log(chalk_1.default.bold(`\nFound ${tags.length} tag(s):\n`));
51
+ console.log(chalk_1.default.bold('═'.repeat(80)));
52
+ tags.forEach((tag, index) => {
53
+ const taskIds = taskTagService.getTaskIdsForTag(tag.id);
54
+ const taskCount = taskIds.length;
55
+ console.log(`\n${chalk_1.default.cyan(`[${tag.id}]`)} ${chalk_1.default.bold(tag.name)}`);
56
+ console.log(` ${chalk_1.default.bold('Tasks:')} ${taskCount}`);
57
+ console.log(` ${chalk_1.default.bold('Created:')} ${(0, format_1.formatDate)(tag.created_at)}`);
58
+ if (index < tags.length - 1) {
59
+ console.log(chalk_1.default.gray(' ' + '─'.repeat(76)));
60
+ }
61
+ });
62
+ console.log('\n');
63
+ });
64
+ }
65
+ catch (error) {
66
+ if (error instanceof Error) {
67
+ formatter.error(error.message, () => {
68
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
69
+ });
70
+ }
71
+ else {
72
+ formatter.error('An unknown error occurred', () => {
73
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
74
+ });
75
+ }
76
+ process.exit(1);
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag show command handler (renamed from "task tag list")
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagShowCommand(program: Command): void;
6
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/show.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF1D"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Tag show command handler (renamed from "task tag list")
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupTagShowCommand = setupTagShowCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const format_1 = require("../../../utils/format");
13
+ const error_handler_1 = require("../../utils/error-handler");
14
+ const output_formatter_1 = require("../../utils/output-formatter");
15
+ function setupTagShowCommand(program) {
16
+ // Find the tag command group
17
+ const tagCommand = program.commands.find((cmd) => cmd.name() === 'tag');
18
+ if (!tagCommand) {
19
+ throw new Error('Tag command not found');
20
+ }
21
+ tagCommand
22
+ .command('show')
23
+ .argument('<task-id>', 'Task ID')
24
+ .option('--json', 'Output in JSON format')
25
+ .description('Show all tags attached to a task')
26
+ .action(async (taskId, options) => {
27
+ const formatter = (0, output_formatter_1.createFormatter)(options);
28
+ try {
29
+ const taskService = new services_1.TaskService();
30
+ const taskTagService = new services_1.TaskTagService();
31
+ // Validate ID
32
+ const parsedTaskId = (0, error_handler_1.validateIdInput)(taskId, 'Task', options);
33
+ // Check if task exists
34
+ const task = taskService.getTask(parsedTaskId);
35
+ if (!task) {
36
+ formatter.error(`Task with ID ${taskId} not found`, () => {
37
+ console.log(chalk_1.default.red(`\nError: Task with ID ${taskId} not found\n`));
38
+ });
39
+ process.exit(1);
40
+ }
41
+ // Get task tags
42
+ const tags = taskTagService.getTagsForTask(parsedTaskId);
43
+ formatter.output(() => ({
44
+ task: {
45
+ id: task.id,
46
+ title: task.title,
47
+ status: task.status,
48
+ },
49
+ tags: tags.map((tag) => ({
50
+ id: tag.id,
51
+ name: tag.name,
52
+ })),
53
+ }), () => {
54
+ // Standard output
55
+ const statusColor = (0, format_1.getStatusColor)(task.status);
56
+ console.log(chalk_1.default.bold(`\nTags for Task #${task.id}`));
57
+ console.log(chalk_1.default.bold('═'.repeat(80)));
58
+ console.log(`${chalk_1.default.bold('Title:')} ${task.title}`);
59
+ console.log(`${chalk_1.default.bold('Status:')} ${chalk_1.default[statusColor](task.status)}`);
60
+ console.log();
61
+ if (tags.length > 0) {
62
+ console.log(chalk_1.default.bold(`Tags: ${tags.length} tag(s)`));
63
+ tags.forEach((tag) => {
64
+ console.log(` ${chalk_1.default.cyan('•')} ${chalk_1.default.cyan(`[${tag.id}]`)} ${tag.name}`);
65
+ });
66
+ }
67
+ else {
68
+ console.log(chalk_1.default.yellow('No tags attached'));
69
+ }
70
+ console.log();
71
+ });
72
+ }
73
+ catch (error) {
74
+ if (error instanceof Error) {
75
+ formatter.error(error.message, () => {
76
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
77
+ });
78
+ }
79
+ else {
80
+ formatter.error('An unknown error occurred', () => {
81
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
82
+ });
83
+ }
84
+ process.exit(1);
85
+ }
86
+ });
87
+ }
88
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Helper functions for task add command
3
+ * Separated concerns: file reading, block ID parsing, relationship setup, output formatting
4
+ */
5
+ import { TaskBlockService, TaskService } from '../../../services';
6
+ import { Task } from '../../../models';
7
+ export declare function readBodyFromFile(filePath: string): string;
8
+ export declare function parseBlockIds(value: string | undefined, label: string): number[];
9
+ export declare function addBlockRelationships(taskBlockService: TaskBlockService, taskId: number, blockedByIds: number[], blocksIds: number[]): void;
10
+ export declare function fetchRelatedTasks(taskService: TaskService, task: Task, blockedByIds: number[], blocksIds: number[]): {
11
+ parentTask: Task | null;
12
+ blockerTasks: Task[];
13
+ blockedTasks: Task[];
14
+ };
15
+ export declare function buildTaskJsonData(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[]): object;
16
+ export declare function printTaskCreated(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[]): void;
17
+ //# sourceMappingURL=add-helpers.d.ts.map
@@ -0,0 +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;AAeD,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,CAqCN"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /**
3
+ * Helper functions for task add command
4
+ * Separated concerns: file reading, block ID parsing, relationship setup, output formatting
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.readBodyFromFile = readBodyFromFile;
11
+ exports.parseBlockIds = parseBlockIds;
12
+ exports.addBlockRelationships = addBlockRelationships;
13
+ exports.fetchRelatedTasks = fetchRelatedTasks;
14
+ exports.buildTaskJsonData = buildTaskJsonData;
15
+ exports.printTaskCreated = printTaskCreated;
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const services_1 = require("../../../services");
18
+ const error_handler_1 = require("../../utils/error-handler");
19
+ const format_1 = require("../../../utils/format");
20
+ const array_utils_1 = require("../../utils/array-utils");
21
+ function readBodyFromFile(filePath) {
22
+ const fileService = new services_1.FileService();
23
+ try {
24
+ return fileService.readMarkdownFile(filePath);
25
+ }
26
+ catch (error) {
27
+ const msg = error instanceof Error ? `Error reading file: ${error.message}` : 'Error reading file';
28
+ throw new Error(msg);
29
+ }
30
+ }
31
+ function parseBlockIds(value, label) {
32
+ if (!value)
33
+ return [];
34
+ const ids = (0, error_handler_1.parseNumericArray)(value);
35
+ if (ids.length === 0 && value.trim() !== '') {
36
+ throw new Error(`Invalid ${label} IDs. IDs must be numbers.`);
37
+ }
38
+ return ids;
39
+ }
40
+ function addBlockRelationships(taskBlockService, taskId, blockedByIds, blocksIds) {
41
+ for (const blockerId of blockedByIds) {
42
+ try {
43
+ taskBlockService.addBlock({ blocker_task_id: blockerId, blocked_task_id: taskId });
44
+ }
45
+ catch (error) {
46
+ const msg = error instanceof Error
47
+ ? `Error adding blocked-by relationship with task #${blockerId}: ${error.message}`
48
+ : `Error adding blocked-by relationship with task #${blockerId}`;
49
+ throw new Error(msg);
50
+ }
51
+ }
52
+ for (const blockedId of blocksIds) {
53
+ try {
54
+ taskBlockService.addBlock({ blocker_task_id: taskId, blocked_task_id: blockedId });
55
+ }
56
+ catch (error) {
57
+ const msg = error instanceof Error
58
+ ? `Error adding blocks relationship with task #${blockedId}: ${error.message}`
59
+ : `Error adding blocks relationship with task #${blockedId}`;
60
+ throw new Error(msg);
61
+ }
62
+ }
63
+ }
64
+ function fetchRelatedTasks(taskService, task, blockedByIds, blocksIds) {
65
+ const parentTask = task.parent_id ? taskService.getTask(task.parent_id) : null;
66
+ const blockerTasks = blockedByIds.map((id) => taskService.getTask(id)).filter(array_utils_1.filterNonNull);
67
+ const blockedTasks = blocksIds.map((id) => taskService.getTask(id)).filter(array_utils_1.filterNonNull);
68
+ return { parentTask, blockerTasks, blockedTasks };
69
+ }
70
+ function taskToJson(task) {
71
+ return {
72
+ id: task.id,
73
+ title: task.title,
74
+ body: task.body,
75
+ author: task.author,
76
+ status: task.status,
77
+ parent_id: task.parent_id,
78
+ created_at: task.created_at,
79
+ updated_at: task.updated_at,
80
+ };
81
+ }
82
+ function buildTaskJsonData(task, parentTask, blockerTasks, blockedTasks) {
83
+ return {
84
+ success: true,
85
+ task: taskToJson(task),
86
+ parent: parentTask ? taskToJson(parentTask) : null,
87
+ blockedBy: blockerTasks.map(taskToJson),
88
+ blocking: blockedTasks.map(taskToJson),
89
+ };
90
+ }
91
+ function printTaskCreated(task, parentTask, blockerTasks, blockedTasks) {
92
+ console.log(chalk_1.default.green('\n✓ Task created successfully\n'));
93
+ console.log(`${chalk_1.default.bold('ID:')} ${task.id}`);
94
+ console.log(`${chalk_1.default.bold('Title:')} ${task.title}`);
95
+ const statusColor = (0, format_1.getStatusColor)(task.status);
96
+ console.log(`${chalk_1.default.bold('Status:')} ${chalk_1.default[statusColor](task.status)}`);
97
+ if (task.author) {
98
+ console.log(`${chalk_1.default.bold('Author:')} ${task.author}`);
99
+ }
100
+ if (task.parent_id && parentTask) {
101
+ console.log(`${chalk_1.default.bold('Parent:')} #${parentTask.id} - ${parentTask.title}`);
102
+ }
103
+ console.log(`${chalk_1.default.bold('Created:')} ${(0, format_1.formatDate)(task.created_at)}`);
104
+ if (blockerTasks.length > 0) {
105
+ console.log(`${chalk_1.default.bold('Blocked By:')} ${blockerTasks.length} task(s)`);
106
+ blockerTasks.forEach((blocker) => {
107
+ const blockerStatusColor = (0, format_1.getStatusColor)(blocker.status);
108
+ console.log(` ${chalk_1.default.red('•')} ${chalk_1.default.cyan(`[${blocker.id}]`)} ${blocker.title} ` +
109
+ `${chalk_1.default[blockerStatusColor](`(${blocker.status})`)}`);
110
+ });
111
+ }
112
+ if (blockedTasks.length > 0) {
113
+ console.log(`${chalk_1.default.bold('Blocking:')} ${blockedTasks.length} task(s)`);
114
+ blockedTasks.forEach((blocked) => {
115
+ const blockedStatusColor = (0, format_1.getStatusColor)(blocked.status);
116
+ console.log(` ${chalk_1.default.yellow('•')} ${chalk_1.default.cyan(`[${blocked.id}]`)} ${blocked.title} ` +
117
+ `${chalk_1.default[blockedStatusColor](`(${blocked.status})`)}`);
118
+ });
119
+ }
120
+ console.log();
121
+ }
122
+ //# sourceMappingURL=add-helpers.js.map
@@ -0,0 +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;AAeD,8CAaC;AAED,4CA0CC;AA1ID,kDAA0B;AAC1B,gDAA+E;AAE/E,6DAA8D;AAC9D,kDAAmE;AACnE,yDAAwD;AAExD,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,WAAW,GAAG,IAAI,sBAAW,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACnG,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,KAAyB,EAAE,KAAa;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,IAAA,iCAAiB,EAAC,KAAK,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,4BAA4B,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,qBAAqB,CACnC,gBAAkC,EAClC,MAAc,EACd,YAAsB,EACtB,SAAmB;IAEnB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,gBAAgB,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GACP,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,mDAAmD,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE;gBAClF,CAAC,CAAC,mDAAmD,SAAS,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,gBAAgB,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GACP,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,+CAA+C,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE;gBAC9E,CAAC,CAAC,+CAA+C,SAAS,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAC/B,WAAwB,EACxB,IAAU,EACV,YAAsB,EACtB,SAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,2BAAa,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,2BAAa,CAAC,CAAC;IAC1F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAC/B,IAAU,EACV,UAAuB,EACvB,YAAoB,EACpB,YAAoB;IAEpB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QAClD,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QACvC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAC9B,IAAU,EACV,UAAuB,EACvB,YAAoB,EACpB,YAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,eAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAA,mBAAU,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAExE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;QAC3E,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,MAAM,kBAAkB,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG;gBACtE,GAAG,eAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CACxD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;QACzE,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,MAAM,kBAAkB,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,KAAK,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG;gBACzE,GAAG,eAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CACxD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Task add command handler
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTaskAddCommand(program: Command): void;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +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;AAiBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsI1D"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * Task add command handler
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupTaskAddCommand = setupTaskAddCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const error_handler_1 = require("../../utils/error-handler");
13
+ const validators_1 = require("../../utils/validators");
14
+ const input_validators_1 = require("../../../utils/input-validators");
15
+ const output_formatter_1 = require("../../utils/output-formatter");
16
+ const add_helpers_1 = require("./add-helpers");
17
+ function setupTaskAddCommand(program) {
18
+ const taskCommand = program.commands.find((cmd) => cmd.name() === 'task');
19
+ if (!taskCommand) {
20
+ throw new Error('Task command not found');
21
+ }
22
+ taskCommand
23
+ .command('add')
24
+ .argument('[title]', 'Task title')
25
+ .argument('[body]', 'Task body')
26
+ .option('-a, --author <author>', 'Task author')
27
+ .option('-s, --status <status>', 'Task status (backlog, ready, in_progress, review, done, closed)', 'backlog')
28
+ .option('-p, --parent <id>', 'Parent task ID')
29
+ .option('--file <path>', 'Read body from markdown file')
30
+ .option('--blocked-by <ids>', 'Comma-separated task IDs that block this task')
31
+ .option('--blocks <ids>', 'Comma-separated task IDs that this task blocks')
32
+ .option('--json', 'Output in JSON format')
33
+ .description('Add a new task')
34
+ .action(async (title, body, options) => {
35
+ const formatter = (0, output_formatter_1.createFormatter)(options);
36
+ try {
37
+ if (!title) {
38
+ formatter.error('Task title is required', () => {
39
+ console.log(chalk_1.default.red('Error: Task title is required'));
40
+ });
41
+ process.exit(1);
42
+ }
43
+ let taskBody = body;
44
+ if (options.file) {
45
+ try {
46
+ taskBody = (0, add_helpers_1.readBodyFromFile)(options.file);
47
+ }
48
+ catch (error) {
49
+ const msg = error instanceof Error ? error.message : 'Error reading file';
50
+ formatter.error(msg, () => {
51
+ console.log(chalk_1.default.red(msg));
52
+ });
53
+ process.exit(1);
54
+ return;
55
+ }
56
+ }
57
+ const validationErrors = (0, input_validators_1.validateTaskInput)({
58
+ title,
59
+ body: taskBody,
60
+ author: options.author,
61
+ status: options.status,
62
+ });
63
+ if (validationErrors.length > 0) {
64
+ const errorMessage = validationErrors.map((e) => e.message).join(', ');
65
+ formatter.error(errorMessage, () => {
66
+ console.log(chalk_1.default.red(`\nError: ${errorMessage}\n`));
67
+ });
68
+ process.exit(1);
69
+ return;
70
+ }
71
+ if (!(0, validators_1.validateTaskStatus)(options.status)) {
72
+ const message = `Invalid status: ${options.status}. Valid statuses: backlog, ready, in_progress, review, done, closed`;
73
+ formatter.error(message, () => {
74
+ console.log(chalk_1.default.red(`Invalid status: ${options.status}`));
75
+ console.log('Valid statuses: backlog, ready, in_progress, review, done, closed');
76
+ });
77
+ process.exit(1);
78
+ }
79
+ let parentId = undefined;
80
+ if (options.parent) {
81
+ const parsed = (0, error_handler_1.validateNumberInput)(options.parent);
82
+ if (parsed === null) {
83
+ formatter.error('Parent ID must be a number', () => {
84
+ console.log(chalk_1.default.red('\nError: Parent ID must be a number\n'));
85
+ });
86
+ process.exit(1);
87
+ return;
88
+ }
89
+ parentId = parsed;
90
+ }
91
+ let blockedByIds = [];
92
+ let blocksIds = [];
93
+ try {
94
+ blockedByIds = (0, add_helpers_1.parseBlockIds)(options.blockedBy, 'blocked-by');
95
+ blocksIds = (0, add_helpers_1.parseBlockIds)(options.blocks, 'blocks');
96
+ }
97
+ catch (error) {
98
+ const msg = error instanceof Error ? error.message : 'Invalid block IDs';
99
+ formatter.error(msg, () => {
100
+ console.log(chalk_1.default.red(`\nError: ${msg}\n`));
101
+ });
102
+ process.exit(1);
103
+ return;
104
+ }
105
+ const taskService = new services_1.TaskService();
106
+ const task = taskService.createTask({
107
+ title,
108
+ body: taskBody,
109
+ author: options.author,
110
+ status: options.status,
111
+ parent_id: parentId,
112
+ });
113
+ try {
114
+ (0, add_helpers_1.addBlockRelationships)(new services_1.TaskBlockService(), task.id, blockedByIds, blocksIds);
115
+ }
116
+ catch (error) {
117
+ const msg = error instanceof Error ? error.message : 'Error adding block relationships';
118
+ formatter.error(msg, () => {
119
+ console.log(chalk_1.default.red(`\n✗ ${msg}\n`));
120
+ });
121
+ process.exit(1);
122
+ return;
123
+ }
124
+ const { parentTask, blockerTasks, blockedTasks } = (0, add_helpers_1.fetchRelatedTasks)(taskService, task, blockedByIds, blocksIds);
125
+ formatter.output(() => (0, add_helpers_1.buildTaskJsonData)(task, parentTask, blockerTasks, blockedTasks), () => (0, add_helpers_1.printTaskCreated)(task, parentTask, blockerTasks, blockedTasks));
126
+ }
127
+ catch (error) {
128
+ if (error instanceof Error) {
129
+ (0, error_handler_1.handleError)(error, options);
130
+ }
131
+ else {
132
+ formatter.error('An unknown error occurred', () => {
133
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
134
+ });
135
+ }
136
+ process.exit(1);
137
+ }
138
+ });
139
+ }
140
+ //# sourceMappingURL=add.js.map