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,69 @@
1
+ "use strict";
2
+ /**
3
+ * Meta 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.setupMetaListCommand = setupMetaListCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const error_handler_1 = require("../../utils/error-handler");
13
+ const output_formatter_1 = require("../../utils/output-formatter");
14
+ function setupMetaListCommand(program) {
15
+ // Find or create task command
16
+ let taskCommand = program.commands.find((cmd) => cmd.name() === 'task');
17
+ if (!taskCommand) {
18
+ taskCommand = program.command('task').description('Task management commands');
19
+ }
20
+ // Find or create meta command group
21
+ let metaCommand = taskCommand.commands.find((cmd) => cmd.name() === 'meta');
22
+ if (!metaCommand) {
23
+ metaCommand = taskCommand.command('meta').description('Task metadata commands');
24
+ }
25
+ metaCommand
26
+ .command('list')
27
+ .argument('<task-id>', 'Task ID')
28
+ .description('List all metadata for a task')
29
+ .option('--json', 'Output in JSON format')
30
+ .action(async (taskId, options) => {
31
+ const formatter = (0, output_formatter_1.createFormatter)(options);
32
+ try {
33
+ const taskService = new services_1.TaskService();
34
+ const metadataService = new services_1.MetadataService();
35
+ // Validate task ID
36
+ const parsedTaskId = (0, error_handler_1.validateIdInput)(taskId, 'Task', options);
37
+ // Check if task exists
38
+ const task = taskService.getTask(parsedTaskId);
39
+ if (!task) {
40
+ formatter.error(`Task with ID ${taskId} not found`, () => {
41
+ console.log(chalk_1.default.red(`\nError: Task with ID ${taskId} not found\n`));
42
+ });
43
+ process.exit(1);
44
+ }
45
+ // List metadata
46
+ const metadataList = metadataService.listMetadata(parsedTaskId);
47
+ formatter.output(() => ({ success: true, data: metadataList }), () => {
48
+ if (metadataList.length === 0) {
49
+ console.log(chalk_1.default.yellow(`\nNo metadata found for task #${parsedTaskId}\n`));
50
+ }
51
+ else {
52
+ console.log(chalk_1.default.green(`\n✓ Metadata for task #${parsedTaskId}\n`));
53
+ metadataList.forEach((meta) => {
54
+ console.log(`[${meta.key}] ${meta.value}`);
55
+ });
56
+ console.log();
57
+ }
58
+ });
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error ? error.message : 'Unknown error';
62
+ formatter.error(message, () => {
63
+ console.log(chalk_1.default.red(`\nError: ${message}\n`));
64
+ });
65
+ process.exit(1);
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/cli/commands/meta/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Meta set command handler
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupMetaSetCommand(program: Command): void;
6
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/meta/set.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF1D"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Meta set 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.setupMetaSetCommand = setupMetaSetCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const services_1 = require("../../../services");
12
+ const error_handler_1 = require("../../utils/error-handler");
13
+ const output_formatter_1 = require("../../utils/output-formatter");
14
+ function setupMetaSetCommand(program) {
15
+ // Find or create task command
16
+ let taskCommand = program.commands.find((cmd) => cmd.name() === 'task');
17
+ if (!taskCommand) {
18
+ taskCommand = program.command('task').description('Task management commands');
19
+ }
20
+ // Find or create meta command group
21
+ let metaCommand = taskCommand.commands.find((cmd) => cmd.name() === 'meta');
22
+ if (!metaCommand) {
23
+ metaCommand = taskCommand.command('meta').description('Task metadata commands');
24
+ }
25
+ metaCommand
26
+ .command('set')
27
+ .argument('<task-id>', 'Task ID')
28
+ .argument('<key>', 'Metadata key')
29
+ .argument('<value>', 'Metadata value')
30
+ .description('Set metadata for a task')
31
+ .option('--json', 'Output in JSON format')
32
+ .action(async (taskId, key, value, options) => {
33
+ const formatter = (0, output_formatter_1.createFormatter)(options);
34
+ try {
35
+ const taskService = new services_1.TaskService();
36
+ const metadataService = new services_1.MetadataService();
37
+ // Validate task ID
38
+ const parsedTaskId = (0, error_handler_1.validateIdInput)(taskId, 'Task', options);
39
+ // Check if task exists
40
+ const task = taskService.getTask(parsedTaskId);
41
+ if (!task) {
42
+ formatter.error(`Task with ID ${taskId} not found`, () => {
43
+ console.log(chalk_1.default.red(`\nError: Task with ID ${taskId} not found\n`));
44
+ });
45
+ process.exit(1);
46
+ }
47
+ // Validate key length (max 50 characters)
48
+ if (key.length > 50) {
49
+ const error = 'Metadata key must not exceed 50 characters';
50
+ formatter.error(error, () => {
51
+ console.log(chalk_1.default.red(`\nError: ${error}\n`));
52
+ });
53
+ process.exit(1);
54
+ }
55
+ // Validate value length (max 500 characters)
56
+ if (value.length > 500) {
57
+ const error = 'Metadata value must not exceed 500 characters';
58
+ formatter.error(error, () => {
59
+ console.log(chalk_1.default.red(`\nError: ${error}\n`));
60
+ });
61
+ process.exit(1);
62
+ }
63
+ // Set metadata
64
+ const metadata = metadataService.setMetadata({
65
+ task_id: parsedTaskId,
66
+ key,
67
+ value,
68
+ });
69
+ formatter.output(() => ({ success: true, data: metadata }), () => {
70
+ console.log(chalk_1.default.green(`\n✓ Metadata set successfully\n`));
71
+ console.log(`Key: ${metadata.key}`);
72
+ console.log(`Value: ${metadata.value}`);
73
+ console.log(`Updated: ${metadata.updated_at}\n`);
74
+ });
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : 'Unknown error';
78
+ formatter.error(message, () => {
79
+ console.log(chalk_1.default.red(`\nError: ${message}\n`));
80
+ });
81
+ process.exit(1);
82
+ }
83
+ });
84
+ }
85
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../../src/cli/commands/meta/set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag add command handler (renamed from "tag create")
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagAddCommand(program: Command): void;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuFzD"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * Tag add command handler (renamed from "tag create")
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.setupTagAddCommand = setupTagAddCommand;
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
+ const input_validators_1 = require("../../../utils/input-validators");
15
+ function setupTagAddCommand(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('add')
23
+ .argument('<name>', 'Tag name')
24
+ .description('Create a new tag')
25
+ .option('--json', 'Output in JSON format')
26
+ .action(async (name, options) => {
27
+ const formatter = (0, output_formatter_1.createFormatter)(options);
28
+ try {
29
+ const tagService = new services_1.TagService();
30
+ // Verify tag name is not empty
31
+ if (!name || name.trim() === '') {
32
+ formatter.error('Tag name cannot be empty', () => {
33
+ console.log(chalk_1.default.red('\nError: Tag name cannot be empty\n'));
34
+ });
35
+ process.exit(1);
36
+ }
37
+ // Validate tag input fields
38
+ const validationErrors = (0, input_validators_1.validateTagInput)({ name });
39
+ if (validationErrors.length > 0) {
40
+ const errorMessage = validationErrors.map((e) => e.message).join(', ');
41
+ formatter.error(errorMessage, () => {
42
+ console.log(chalk_1.default.red(`\nError: ${errorMessage}\n`));
43
+ });
44
+ process.exit(1);
45
+ return;
46
+ }
47
+ // Create tag
48
+ try {
49
+ const tag = tagService.createTag({ name: name.trim() });
50
+ formatter.output(() => ({
51
+ success: true,
52
+ id: tag.id,
53
+ name: tag.name,
54
+ created_at: tag.created_at,
55
+ }), () => {
56
+ console.log(chalk_1.default.green('\n✓ Tag created successfully\n'));
57
+ console.log(`${chalk_1.default.bold('ID:')} ${chalk_1.default.cyan(tag.id)}`);
58
+ console.log(`${chalk_1.default.bold('Name:')} ${tag.name}`);
59
+ console.log(`${chalk_1.default.bold('Created:')} ${(0, format_1.formatDate)(tag.created_at)}`);
60
+ console.log();
61
+ });
62
+ }
63
+ catch (error) {
64
+ if (error instanceof Error) {
65
+ if (error.message.includes('already exists') || error.message.includes('UNIQUE constraint')) {
66
+ formatter.error(`Tag "${name}" already exists`, () => {
67
+ console.log(chalk_1.default.red(`\n✗ Error: Tag "${name}" already exists\n`));
68
+ });
69
+ }
70
+ else {
71
+ formatter.error(error.message, () => {
72
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
73
+ });
74
+ }
75
+ }
76
+ else {
77
+ formatter.error('An unknown error occurred', () => {
78
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
79
+ });
80
+ }
81
+ process.exit(1);
82
+ }
83
+ }
84
+ catch (error) {
85
+ if (error instanceof Error) {
86
+ formatter.error(error.message, () => {
87
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
88
+ });
89
+ }
90
+ else {
91
+ formatter.error('An unknown error occurred', () => {
92
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
93
+ });
94
+ }
95
+ process.exit(1);
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag attach command handler (renamed from "task tag add")
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagAttachCommand(program: Command): void;
6
+ //# sourceMappingURL=attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/attach.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2G5D"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Tag attach command handler (renamed from "task tag add")
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.setupTagAttachCommand = setupTagAttachCommand;
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 setupTagAttachCommand(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('attach')
22
+ .argument('<task-id>', 'Task ID')
23
+ .argument('<tag-id-or-name>', 'Tag ID or name')
24
+ .description('Attach a tag to 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
+ // Add tag to task
64
+ try {
65
+ taskTagService.addTagToTask({ task_id: parsedTaskId, tag_id: tag.id });
66
+ formatter.output(() => ({
67
+ success: true,
68
+ task: {
69
+ id: task.id,
70
+ title: task.title,
71
+ },
72
+ tag: {
73
+ id: tag.id,
74
+ name: tag.name,
75
+ },
76
+ }), () => {
77
+ console.log(chalk_1.default.green('\n✓ Tag attached successfully\n'));
78
+ console.log(`${chalk_1.default.bold('Task:')} ${chalk_1.default.cyan(`[${task.id}]`)} ${task.title}`);
79
+ console.log(`${chalk_1.default.bold('Tag:')} ${chalk_1.default.cyan(`[${tag.id}]`)} ${tag.name}`);
80
+ console.log();
81
+ });
82
+ }
83
+ catch (error) {
84
+ if (error instanceof Error) {
85
+ if (error.message.includes('already has') || error.message.includes('UNIQUE constraint')) {
86
+ formatter.error('This task already has this tag attached', () => {
87
+ console.log(chalk_1.default.red('\n✗ Error: This task already has this tag attached\n'));
88
+ });
89
+ }
90
+ else {
91
+ formatter.error(error.message, () => {
92
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
93
+ });
94
+ }
95
+ }
96
+ else {
97
+ formatter.error('An unknown error occurred', () => {
98
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
99
+ });
100
+ }
101
+ process.exit(1);
102
+ }
103
+ }
104
+ catch (error) {
105
+ if (error instanceof Error) {
106
+ formatter.error(error.message, () => {
107
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
108
+ });
109
+ }
110
+ else {
111
+ formatter.error('An unknown error occurred', () => {
112
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
113
+ });
114
+ }
115
+ process.exit(1);
116
+ }
117
+ });
118
+ }
119
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/attach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag delete command handler
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagDeleteCommand(program: Command): void;
6
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF5D"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Tag delete 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.setupTagDeleteCommand = setupTagDeleteCommand;
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 setupTagDeleteCommand(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('delete')
22
+ .argument('<id-or-name>', 'Tag ID or name')
23
+ .description('Delete a tag')
24
+ .option('--json', 'Output in JSON format')
25
+ .action(async (id, options) => {
26
+ const formatter = (0, output_formatter_1.createFormatter)(options);
27
+ try {
28
+ const tagService = new services_1.TagService();
29
+ // Resolve tag by ID or name
30
+ const parsedTagId = (0, error_handler_1.validateNumberInput)(id);
31
+ let tag = null;
32
+ if (parsedTagId !== null) {
33
+ tag = tagService.getTag(parsedTagId);
34
+ if (!tag) {
35
+ formatter.error(`Tag with ID ${id} not found`, () => {
36
+ console.log(chalk_1.default.red(`\nError: Tag with ID ${id} not found\n`));
37
+ });
38
+ process.exit(1);
39
+ }
40
+ }
41
+ else {
42
+ tag = tagService.getTagByName(id);
43
+ if (!tag) {
44
+ formatter.error(`Tag with name "${id}" not found`, () => {
45
+ console.log(chalk_1.default.red(`\nError: Tag with name "${id}" not found\n`));
46
+ });
47
+ process.exit(1);
48
+ }
49
+ }
50
+ // Delete tag
51
+ try {
52
+ tagService.deleteTag(tag.id);
53
+ formatter.output(() => ({
54
+ success: true,
55
+ id: tag.id,
56
+ name: tag.name,
57
+ }), () => {
58
+ console.log(chalk_1.default.green('\n✓ Tag deleted successfully\n'));
59
+ console.log(`${chalk_1.default.bold('ID:')} ${chalk_1.default.cyan(tag.id)}`);
60
+ console.log(`${chalk_1.default.bold('Name:')} ${tag.name}`);
61
+ console.log();
62
+ });
63
+ }
64
+ catch (error) {
65
+ if (error instanceof Error) {
66
+ formatter.error(error.message, () => {
67
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
68
+ });
69
+ }
70
+ else {
71
+ formatter.error('An unknown error occurred', () => {
72
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
73
+ });
74
+ }
75
+ process.exit(1);
76
+ }
77
+ }
78
+ catch (error) {
79
+ if (error instanceof Error) {
80
+ formatter.error(error.message, () => {
81
+ console.log(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
82
+ });
83
+ }
84
+ else {
85
+ formatter.error('An unknown error occurred', () => {
86
+ console.log(chalk_1.default.red('\n✗ An unknown error occurred\n'));
87
+ });
88
+ }
89
+ process.exit(1);
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/cli/commands/tag/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tag detach command handler (renamed from "task tag remove")
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupTagDetachCommand(program: Command): void;
6
+ //# sourceMappingURL=detach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detach.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/tag/detach.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4G5D"}