clickup-markdown-mcp 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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/api/clickup-client.d.ts +66 -0
  4. package/dist/api/clickup-client.d.ts.map +1 -0
  5. package/dist/api/clickup-client.js +154 -0
  6. package/dist/api/clickup-client.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +250 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config/config.d.ts +3 -0
  12. package/dist/config/config.d.ts.map +1 -0
  13. package/dist/config/config.js +58 -0
  14. package/dist/config/config.js.map +1 -0
  15. package/dist/discovery/environment-scanner.d.ts +10 -0
  16. package/dist/discovery/environment-scanner.d.ts.map +1 -0
  17. package/dist/discovery/environment-scanner.js +185 -0
  18. package/dist/discovery/environment-scanner.js.map +1 -0
  19. package/dist/generators/markdown-generator.d.ts +8 -0
  20. package/dist/generators/markdown-generator.d.ts.map +1 -0
  21. package/dist/generators/markdown-generator.js +88 -0
  22. package/dist/generators/markdown-generator.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +19 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/parsers/markdown-parser.d.ts +23 -0
  28. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  29. package/dist/parsers/markdown-parser.js +216 -0
  30. package/dist/parsers/markdown-parser.js.map +1 -0
  31. package/dist/server.d.ts +3 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +450 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/types/index.d.ts +189 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +6 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/package.json +48 -0
package/dist/cli.js ADDED
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // ============================================================
4
+ // ClickUp MCP Server — CLI Standalone
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const fs_1 = require("fs");
9
+ const clickup_client_js_1 = require("./api/clickup-client.js");
10
+ const environment_scanner_js_1 = require("./discovery/environment-scanner.js");
11
+ const markdown_parser_js_1 = require("./parsers/markdown-parser.js");
12
+ const markdown_generator_js_1 = require("./generators/markdown-generator.js");
13
+ const config_js_1 = require("./config/config.js");
14
+ const config = (0, config_js_1.loadConfig)();
15
+ const client = new clickup_client_js_1.ClickUpClient(config.apiToken);
16
+ const scanner = new environment_scanner_js_1.EnvironmentScanner(client);
17
+ const generator = new markdown_generator_js_1.MarkdownGenerator(client);
18
+ const program = new commander_1.Command();
19
+ program
20
+ .name('clickup-mcp-cli')
21
+ .description('ClickUp MCP CLI — Create, export, and manage tasks from Markdown')
22
+ .version('1.0.0');
23
+ // --- Discover ---
24
+ program
25
+ .command('discover')
26
+ .description('Scan a ClickUp list to discover statuses, custom fields, and patterns')
27
+ .requiredOption('-l, --list <id>', 'List ID to scan')
28
+ .action(async (opts) => {
29
+ try {
30
+ const env = await scanner.scan(opts.list);
31
+ console.log(JSON.stringify(env, null, 2));
32
+ }
33
+ catch (e) {
34
+ console.error('Error:', e instanceof Error ? e.message : e);
35
+ process.exit(1);
36
+ }
37
+ });
38
+ // --- Guide ---
39
+ program
40
+ .command('guide')
41
+ .description('Generate the AI tutorial/guide for tasks.md format')
42
+ .option('-l, --list <id>', 'List ID for environment-specific guide')
43
+ .action(async (opts) => {
44
+ try {
45
+ if (opts.list) {
46
+ const env = await scanner.scan(opts.list);
47
+ console.log(scanner.generateGuide(env));
48
+ }
49
+ else {
50
+ const env = {
51
+ list: { id: '', name: '(not specified)' },
52
+ statuses: [],
53
+ custom_fields: [],
54
+ members: [],
55
+ detected_patterns: {
56
+ naming: 'Sprint N - Title / [TAG] Subtask title',
57
+ hierarchy: 'Task pai → Sprint → Subtask',
58
+ time_tracking: 'Track time on subtasks',
59
+ },
60
+ };
61
+ console.log(scanner.generateGuide(env));
62
+ }
63
+ }
64
+ catch (e) {
65
+ console.error('Error:', e instanceof Error ? e.message : e);
66
+ process.exit(1);
67
+ }
68
+ });
69
+ // --- Validate ---
70
+ program
71
+ .command('validate')
72
+ .description('Validate a tasks.md file before importing')
73
+ .argument('<file>', 'Path to tasks.md file')
74
+ .action(async (file) => {
75
+ try {
76
+ const content = (0, fs_1.readFileSync)(file, 'utf-8');
77
+ const result = (0, markdown_parser_js_1.validateTasksMd)(content);
78
+ console.log(JSON.stringify(result, null, 2));
79
+ if (!result.valid)
80
+ process.exit(1);
81
+ }
82
+ catch (e) {
83
+ console.error('Error:', e instanceof Error ? e.message : e);
84
+ process.exit(1);
85
+ }
86
+ });
87
+ // --- Import ---
88
+ program
89
+ .command('import')
90
+ .description('Import tasks from a tasks.md file into ClickUp')
91
+ .argument('<file>', 'Path to tasks.md file')
92
+ .requiredOption('-p, --parent <id>', 'Parent task ID')
93
+ .requiredOption('-l, --list <id>', 'List ID')
94
+ .option('-a, --assignees <ids>', 'Comma-separated user IDs', '')
95
+ .option('-f, --field <id:value>', 'Custom field (can be used multiple times)', (val, prev) => {
96
+ prev.push(val);
97
+ return prev;
98
+ }, [])
99
+ .option('--from-sprint <n>', 'Start from sprint number', '1')
100
+ .option('--close', 'Mark all tasks as closed after creation', false)
101
+ .action(async (file, opts) => {
102
+ try {
103
+ const content = (0, fs_1.readFileSync)(file, 'utf-8');
104
+ const parsed = (0, markdown_parser_js_1.parseTasksMd)(content);
105
+ const assignees = opts.assignees
106
+ ? opts.assignees.split(',').map(Number).filter(Boolean)
107
+ : config.defaultAssignees || [];
108
+ const customFields = opts.field.map((f) => {
109
+ const [id, value] = f.split(':');
110
+ return { id, value };
111
+ });
112
+ console.log(`Importing ${parsed.sprints.length} sprints...`);
113
+ // Get closed status if needed
114
+ let closedStatus;
115
+ if (opts.close) {
116
+ const list = await client.getList(opts.list);
117
+ const closed = list.statuses?.find((s) => s.type === 'closed');
118
+ if (closed)
119
+ closedStatus = closed.status;
120
+ }
121
+ const fromSprint = parseInt(opts.fromSprint, 10);
122
+ const sprintsToImport = parsed.sprints.filter((s) => s.number >= fromSprint);
123
+ let totalSprints = 0;
124
+ let totalSubtasks = 0;
125
+ let totalTime = 0;
126
+ for (const sprint of sprintsToImport) {
127
+ const sprintTask = await client.createTask(opts.list, {
128
+ name: `Sprint ${sprint.number} - ${sprint.name}`,
129
+ parent: opts.parent,
130
+ assignees,
131
+ custom_fields: customFields,
132
+ });
133
+ totalSprints++;
134
+ console.log(` ✅ Sprint ${sprint.number}: ${sprint.name} (${sprintTask.id})`);
135
+ let subtaskIndex = 0;
136
+ for (const sub of sprint.subtasks) {
137
+ const subTask = await client.createTask(opts.list, {
138
+ name: sub.title,
139
+ description: sub.description,
140
+ parent: sprintTask.id,
141
+ assignees,
142
+ custom_fields: customFields,
143
+ });
144
+ totalSubtasks++;
145
+ if (sub.timeReal > 0) {
146
+ const baseStart = 1774563600000 + (subtaskIndex * 7200000);
147
+ await client.addTimeEntry(subTask.id, {
148
+ duration: sub.timeReal,
149
+ start: baseStart,
150
+ end: baseStart + sub.timeReal,
151
+ });
152
+ totalTime += sub.timeReal;
153
+ }
154
+ if (closedStatus) {
155
+ await client.updateTask(subTask.id, { status: closedStatus });
156
+ }
157
+ console.log(` ✅ ${sub.title} (${Math.round(sub.timeReal / 60000)}min)`);
158
+ subtaskIndex++;
159
+ }
160
+ if (closedStatus) {
161
+ await client.updateTask(sprintTask.id, { status: closedStatus });
162
+ }
163
+ }
164
+ console.log(`\n🎉 Done! ${totalSprints} sprints, ${totalSubtasks} subtasks, ${Math.round(totalTime / 60000)} minutes tracked`);
165
+ }
166
+ catch (e) {
167
+ console.error('Error:', e instanceof Error ? e.message : e);
168
+ process.exit(1);
169
+ }
170
+ });
171
+ // --- Export ---
172
+ program
173
+ .command('export')
174
+ .description('Export tasks from ClickUp to tasks.md format')
175
+ .requiredOption('-t, --task <id>', 'Parent task ID to export')
176
+ .option('-o, --output <file>', 'Output file path (default: stdout)')
177
+ .action(async (opts) => {
178
+ try {
179
+ const md = await generator.exportToMd(opts.task);
180
+ if (opts.output) {
181
+ (0, fs_1.writeFileSync)(opts.output, md, 'utf-8');
182
+ console.log(`✅ Exported to ${opts.output}`);
183
+ }
184
+ else {
185
+ console.log(md);
186
+ }
187
+ }
188
+ catch (e) {
189
+ console.error('Error:', e instanceof Error ? e.message : e);
190
+ process.exit(1);
191
+ }
192
+ });
193
+ // --- Close ---
194
+ program
195
+ .command('close')
196
+ .description('Mark a task and all its subtasks as closed/concluded')
197
+ .requiredOption('-t, --task <id>', 'Task ID to close')
198
+ .option('-r, --recursive', 'Also close all subtasks recursively', false)
199
+ .action(async (opts) => {
200
+ try {
201
+ let taskIds;
202
+ if (opts.recursive) {
203
+ console.log('Collecting all subtasks...');
204
+ taskIds = await client.getSubtasksRecursive(opts.task);
205
+ }
206
+ else {
207
+ taskIds = [opts.task];
208
+ }
209
+ // Get closed status
210
+ const task = await client.getTask(opts.task);
211
+ const list = await client.getList(task.list.id);
212
+ const closed = list.statuses?.find((s) => s.type === 'closed');
213
+ if (!closed) {
214
+ console.error('No closed status found for this list');
215
+ process.exit(1);
216
+ }
217
+ console.log(`Closing ${taskIds.length} tasks...`);
218
+ const result = await client.bulkUpdateStatus(taskIds, closed.status);
219
+ console.log(`✅ ${result.updated} closed, ${result.errors} errors`);
220
+ }
221
+ catch (e) {
222
+ console.error('Error:', e instanceof Error ? e.message : e);
223
+ process.exit(1);
224
+ }
225
+ });
226
+ // --- Fields ---
227
+ program
228
+ .command('fields')
229
+ .description('List custom fields for a list')
230
+ .requiredOption('-l, --list <id>', 'List ID')
231
+ .action(async (opts) => {
232
+ try {
233
+ const list = await client.getList(opts.list);
234
+ for (const cf of list.custom_fields || []) {
235
+ console.log(`\n📋 ${cf.name} (${cf.type})${cf.required ? ' [REQUIRED]' : ''}`);
236
+ console.log(` ID: ${cf.id}`);
237
+ if (cf.type_config?.options) {
238
+ for (const opt of cf.type_config.options) {
239
+ console.log(` - "${opt.name}" (${opt.id})`);
240
+ }
241
+ }
242
+ }
243
+ }
244
+ catch (e) {
245
+ console.error('Error:', e instanceof Error ? e.message : e);
246
+ process.exit(1);
247
+ }
248
+ });
249
+ program.parse();
250
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ClickUpMcpConfig } from '../types/index.js';
2
+ export declare function loadConfig(): ClickUpMcpConfig;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,wBAAgB,UAAU,IAAI,gBAAgB,CAiC7C"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ClickUp MCP Server — Configuration Manager
4
+ // ============================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadConfig = loadConfig;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const CONFIG_FILE_NAME = '.clickup-mcp.json';
10
+ function findConfigFile() {
11
+ const paths = [
12
+ (0, path_1.join)(process.cwd(), CONFIG_FILE_NAME),
13
+ (0, path_1.join)(process.env.HOME || process.env.USERPROFILE || '', CONFIG_FILE_NAME),
14
+ ];
15
+ for (const p of paths) {
16
+ if ((0, fs_1.existsSync)(p))
17
+ return p;
18
+ }
19
+ return null;
20
+ }
21
+ function loadFileConfig() {
22
+ const configPath = findConfigFile();
23
+ if (!configPath)
24
+ return {};
25
+ try {
26
+ const raw = (0, fs_1.readFileSync)(configPath, 'utf-8');
27
+ return JSON.parse(raw);
28
+ }
29
+ catch {
30
+ return {};
31
+ }
32
+ }
33
+ function loadConfig() {
34
+ const fileConfig = loadFileConfig();
35
+ const apiToken = process.env.CLICKUP_API_TOKEN ||
36
+ fileConfig.apiToken ||
37
+ '';
38
+ const defaultListId = process.env.CLICKUP_DEFAULT_LIST_ID ||
39
+ fileConfig.defaultListId;
40
+ const defaultAssignees = (() => {
41
+ const env = process.env.CLICKUP_DEFAULT_ASSIGNEES;
42
+ if (env)
43
+ return env.split(',').map(Number).filter(Boolean);
44
+ return fileConfig.defaultAssignees;
45
+ })();
46
+ const requiredCustomFields = fileConfig.requiredCustomFields;
47
+ if (!apiToken) {
48
+ console.error('[clickup-mcp] Warning: No API token configured.\n' +
49
+ 'Set CLICKUP_API_TOKEN env var or create a .clickup-mcp.json file.');
50
+ }
51
+ return {
52
+ apiToken,
53
+ defaultListId,
54
+ defaultAssignees,
55
+ requiredCustomFields,
56
+ };
57
+ }
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,6CAA6C;AAC7C,+DAA+D;;AA8B/D,gCAiCC;AA5DD,2BAA8C;AAC9C,+BAA4B;AAE5B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,SAAS,cAAc;IACrB,MAAM,KAAK,GAAG;QACZ,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;QACrC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,gBAAgB,CAAC;KAC1E,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAA,eAAU,EAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,UAAU,CAAC,QAAQ;QACnB,EAAE,CAAC;IAEL,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACnC,UAAU,CAAC,aAAa,CAAC;IAE3B,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAClD,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,gBAAgB,CAAC;IACrC,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,mDAAmD;YACnD,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,aAAa;QACb,gBAAgB;QAChB,oBAAoB;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ClickUpClient } from '../api/clickup-client.js';
2
+ import type { EnvironmentInfo } from '../types/index.js';
3
+ export declare class EnvironmentScanner {
4
+ private client;
5
+ constructor(client: ClickUpClient);
6
+ scan(listId: string): Promise<EnvironmentInfo>;
7
+ private detectPatterns;
8
+ generateGuide(env: EnvironmentInfo): string;
9
+ }
10
+ //# sourceMappingURL=environment-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-scanner.d.ts","sourceRoot":"","sources":["../../src/discovery/environment-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAI3B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YA+CtC,cAAc;IAkD5B,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;CA+F5C"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ClickUp MCP Server — Environment Scanner (Auto-Discovery)
4
+ // ============================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EnvironmentScanner = void 0;
7
+ class EnvironmentScanner {
8
+ client;
9
+ constructor(client) {
10
+ this.client = client;
11
+ }
12
+ async scan(listId) {
13
+ // 1. Get list details (statuses + custom fields)
14
+ const list = await this.client.getList(listId);
15
+ // 2. Get workspace members
16
+ const workspaces = await this.client.listWorkspaces();
17
+ const members = workspaces.length > 0
18
+ ? workspaces[0].members.map((m) => ({
19
+ id: m.id,
20
+ name: m.username,
21
+ email: m.email,
22
+ }))
23
+ : [];
24
+ // 3. Map statuses with exact encoding
25
+ const statuses = (list.statuses || []).map((s) => ({
26
+ name: s.status,
27
+ type: s.type,
28
+ encoded_name: s.status, // preserve exact encoding (important for special chars)
29
+ }));
30
+ // 4. Map custom fields
31
+ const custom_fields = (list.custom_fields || []).map((cf) => ({
32
+ id: cf.id,
33
+ name: cf.name,
34
+ type: cf.type,
35
+ required: cf.required || false,
36
+ options: cf.type_config?.options?.map((o) => ({
37
+ id: o.id,
38
+ name: o.name,
39
+ color: o.color,
40
+ orderindex: o.orderindex,
41
+ })),
42
+ }));
43
+ // 5. Detect patterns from existing tasks
44
+ const detected_patterns = await this.detectPatterns(listId);
45
+ return {
46
+ list: { id: list.id, name: list.name },
47
+ statuses,
48
+ custom_fields,
49
+ members,
50
+ detected_patterns,
51
+ };
52
+ }
53
+ async detectPatterns(listId) {
54
+ try {
55
+ const tasks = await this.client.searchTasks(listId, {
56
+ include_subtasks: true,
57
+ });
58
+ if (!tasks || tasks.length === 0) {
59
+ return {
60
+ naming: 'No existing tasks found — use Sprint N - Title for sprints and [TAG] Title for subtasks',
61
+ hierarchy: 'Task pai → Sprint → Subtask (3 levels)',
62
+ time_tracking: 'Track time on subtasks (leaf tasks)',
63
+ };
64
+ }
65
+ // Analyze naming patterns
66
+ const sprintPattern = tasks.some((t) => /sprint\s+\d+/i.test(t.name));
67
+ const tagPattern = tasks.some((t) => /\[.+\]/.test(t.name));
68
+ const hasSubtasks = tasks.some((t) => t.subtasks && t.subtasks.length > 0);
69
+ const naming = [
70
+ sprintPattern ? 'Sprint N - Titulo' : null,
71
+ tagPattern ? '[TAG][TAG] Titulo da subtask' : null,
72
+ ]
73
+ .filter(Boolean)
74
+ .join(' / ') || 'Free-form naming';
75
+ return {
76
+ naming,
77
+ hierarchy: hasSubtasks
78
+ ? 'Task pai → Sprint → Subtask (3 levels detected)'
79
+ : 'Flat task list (no hierarchy detected)',
80
+ time_tracking: 'Track time on leaf-level subtasks',
81
+ };
82
+ }
83
+ catch {
84
+ return {
85
+ naming: 'Sprint N - Title / [TAG] Subtask title',
86
+ hierarchy: 'Task pai → Sprint → Subtask',
87
+ time_tracking: 'Track time on subtasks',
88
+ };
89
+ }
90
+ }
91
+ generateGuide(env) {
92
+ const requiredFields = env.custom_fields
93
+ .filter((f) => f.required)
94
+ .map((f) => {
95
+ const optionsStr = f.options
96
+ ? f.options.map((o) => ` - "${o.name}" (id: ${o.id})`).join('\n')
97
+ : ' (no options)';
98
+ return `- **${f.name}** (${f.type}, REQUIRED)\n${optionsStr}`;
99
+ })
100
+ .join('\n\n');
101
+ const statusList = env.statuses
102
+ .map((s) => `- "${s.name}" (${s.type})`)
103
+ .join('\n');
104
+ const memberList = env.members
105
+ .map((m) => `- ${m.name} (id: ${m.id}, ${m.email})`)
106
+ .join('\n');
107
+ return `# Guia de Geração de tasks.md para ClickUp
108
+
109
+ ## Ambiente detectado
110
+ - **Lista**: ${env.list.name} (id: ${env.list.id})
111
+ - **Padrão de nomes**: ${env.detected_patterns.naming}
112
+ - **Hierarquia**: ${env.detected_patterns.hierarchy}
113
+ - **Time tracking**: ${env.detected_patterns.time_tracking}
114
+
115
+ ## Formato obrigatório do tasks.md
116
+
117
+ Cada bloco de sprint deve seguir esta estrutura exata:
118
+
119
+ \`\`\`markdown
120
+ **Sprint N - Nome descritivo da sprint**
121
+
122
+ | Subtask | Descricao | Tempo estimado | Tempo real gasto |
123
+ | --- | --- | --- | --- |
124
+ | \\\`[TAG1][TAG2]\\\` Titulo curto | Frase descritiva do que foi feito. | 20 min | 15 min |
125
+ \`\`\`
126
+
127
+ ## Regras de formatação
128
+ - Tags são em CAPS entre colchetes: [BACK], [FRONT], [DB], [INFRA], [QA], [DOCS], [RESEARCH], [ANALYSIS], [PLANNING], etc.
129
+ - Descrição é uma frase objetiva no passado (ex: "Criamos...", "Reescrevemos...", "Validamos...")
130
+ - Tempo aceita formatos: "5 min", "15 min", "20 min", "1h", "1h30", "45 min"
131
+ - Cada sprint pode ter 1 a N subtasks
132
+ - Opcionalmente, antes das sprints pode haver um bloco Task Master:
133
+
134
+ \`\`\`markdown
135
+ **Task Master**
136
+
137
+ | Titulo | Descricao | Tempo estimado | Tempo real gasto |
138
+ | --- | --- | --- | --- |
139
+ | Titulo do pacote | Descricao geral do que foi feito. | 5h a 6h | ~5h |
140
+ \`\`\`
141
+
142
+ ## Statuses disponíveis
143
+ ${statusList}
144
+
145
+ ## Campos customizados
146
+ ${requiredFields || '(nenhum campo obrigatório detectado)'}
147
+
148
+ ## Membros do workspace
149
+ ${memberList || '(nenhum membro encontrado)'}
150
+
151
+ ## Fluxo recomendado para a IA
152
+ 1. Durante a sessão de trabalho, registre mentalmente as tarefas executadas
153
+ 2. Ao final, gere o tasks.md seguindo o formato acima
154
+ 3. Use \`validate_md\` para verificar o formato
155
+ 4. Use \`import_from_md\` para criar tudo no ClickUp
156
+ 5. Use \`bulk_update_status\` para marcar como concluído se necessário
157
+
158
+ ## Exemplo completo
159
+
160
+ **Task Master**
161
+
162
+ | Titulo | Descricao | Tempo estimado | Tempo real gasto |
163
+ | --- | --- | --- | --- |
164
+ | Implementacao da feature X | Criamos o modulo X com backend, frontend e testes. | 2h a 3h | ~2h30 |
165
+
166
+ **Sprint 1 - Setup e infraestrutura**
167
+
168
+ | Subtask | Descricao | Tempo estimado | Tempo real gasto |
169
+ | --- | --- | --- | --- |
170
+ | \\\`[INFRA][DB]\\\` Criacao das tabelas | Criamos as migrations para as novas tabelas do modulo X. | 30 min | 25 min |
171
+ | \\\`[BACK][API]\\\` Rotas REST | Implementamos GET/POST/PUT/DELETE para o recurso X. | 45 min | 40 min |
172
+ | \\\`[QA]\\\` Testes e validacao | Rodamos build e testes unitarios do backend. | 15 min | 10 min |
173
+
174
+ **Sprint 2 - Frontend**
175
+
176
+ | Subtask | Descricao | Tempo estimado | Tempo real gasto |
177
+ | --- | --- | --- | --- |
178
+ | \\\`[FRONT][UI]\\\` Pagina principal | Criamos a pagina de listagem com filtros e paginacao. | 40 min | 35 min |
179
+ | \\\`[FRONT][FORM]\\\` Formulario de criacao | Implementamos o formulario com validacao Zod. | 30 min | 25 min |
180
+ | \\\`[QA][FRONT]\\\` Build frontend | Validamos o build do frontend com a nova pagina. | 10 min | 10 min |
181
+ `;
182
+ }
183
+ }
184
+ exports.EnvironmentScanner = EnvironmentScanner;
185
+ //# sourceMappingURL=environment-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-scanner.js","sourceRoot":"","sources":["../../src/discovery/environment-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ClickUpClient } from '../api/clickup-client.js';
2
+ export declare class MarkdownGenerator {
3
+ private client;
4
+ constructor(client: ClickUpClient);
5
+ exportToMd(parentTaskId: string): Promise<string>;
6
+ private wrapTagsInBackticks;
7
+ }
8
+ //# sourceMappingURL=markdown-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-generator.d.ts","sourceRoot":"","sources":["../../src/generators/markdown-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAYzD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAI3B,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoEvD,OAAO,CAAC,mBAAmB;CAQ5B"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ClickUp MCP Server — Markdown Generator
4
+ // Exports ClickUp tasks to tasks.md format
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MarkdownGenerator = void 0;
8
+ function formatTime(ms) {
9
+ if (ms === 0)
10
+ return '0 min';
11
+ const totalMinutes = Math.round(ms / 60000);
12
+ if (totalMinutes < 60)
13
+ return `${totalMinutes} min`;
14
+ const hours = Math.floor(totalMinutes / 60);
15
+ const mins = totalMinutes % 60;
16
+ if (mins === 0)
17
+ return `${hours}h`;
18
+ return `${hours}h${mins}`;
19
+ }
20
+ class MarkdownGenerator {
21
+ client;
22
+ constructor(client) {
23
+ this.client = client;
24
+ }
25
+ async exportToMd(parentTaskId) {
26
+ const parentTask = await this.client.getTask(parentTaskId, true);
27
+ const lines = [];
28
+ lines.push(`Tempos abaixo sao **aproximados**, baseados no trabalho real das sessoes.`);
29
+ lines.push('');
30
+ if (!parentTask.subtasks || parentTask.subtasks.length === 0) {
31
+ lines.push('(Nenhuma sprint encontrada)');
32
+ return lines.join('\n');
33
+ }
34
+ // Calculate total time
35
+ let totalTimeReal = 0;
36
+ for (const sprint of parentTask.subtasks) {
37
+ // Get full sprint with subtasks
38
+ const fullSprint = await this.client.getTask(sprint.id, true);
39
+ lines.push(`**${fullSprint.name}**`);
40
+ lines.push('');
41
+ if (!fullSprint.subtasks || fullSprint.subtasks.length === 0) {
42
+ lines.push('(Nenhuma subtask)');
43
+ lines.push('');
44
+ continue;
45
+ }
46
+ lines.push('| Subtask | Descricao | Tempo estimado | Tempo real gasto |');
47
+ lines.push('| --- | --- | --- | --- |');
48
+ for (const subtask of fullSprint.subtasks) {
49
+ // Get time entries for the subtask
50
+ let timeReal = 0;
51
+ try {
52
+ const entries = await this.client.getTimeEntries(subtask.id);
53
+ timeReal = entries.reduce((sum, e) => sum + (typeof e.time === 'number' ? e.time : 0), 0);
54
+ }
55
+ catch {
56
+ timeReal = subtask.time_spent || 0;
57
+ }
58
+ totalTimeReal += timeReal;
59
+ const title = subtask.name.includes('`')
60
+ ? subtask.name
61
+ : this.wrapTagsInBackticks(subtask.name);
62
+ const desc = subtask.text_content || subtask.description || '';
63
+ const timeStr = formatTime(timeReal);
64
+ lines.push(`| ${title} | ${desc} | ${timeStr} | ${timeStr} |`);
65
+ }
66
+ lines.push('');
67
+ }
68
+ // Summary
69
+ lines.push('**Resumo**');
70
+ lines.push('');
71
+ lines.push('| Item | Valor |');
72
+ lines.push('| --- | --- |');
73
+ lines.push(`| Sprints | ${parentTask.subtasks.length} |`);
74
+ lines.push(`| Tempo real total | ${formatTime(totalTimeReal)} |`);
75
+ lines.push('');
76
+ return lines.join('\n');
77
+ }
78
+ wrapTagsInBackticks(name) {
79
+ // If name starts with [TAG], wrap the tags in backticks
80
+ const match = name.match(/^(\[.+?\](?:\s*\[.+?\])*)\s*(.*)/);
81
+ if (match) {
82
+ return `\`${match[1].toLowerCase()}\` ${match[2]}`;
83
+ }
84
+ return name;
85
+ }
86
+ }
87
+ exports.MarkdownGenerator = MarkdownGenerator;
88
+ //# sourceMappingURL=markdown-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-generator.js","sourceRoot":"","sources":["../../src/generators/markdown-generator.ts"],"names":[],"mappings":"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"}