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.
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/dist/api/clickup-client.d.ts +66 -0
- package/dist/api/clickup-client.d.ts.map +1 -0
- package/dist/api/clickup-client.js +154 -0
- package/dist/api/clickup-client.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +250 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config.d.ts +3 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +58 -0
- package/dist/config/config.js.map +1 -0
- package/dist/discovery/environment-scanner.d.ts +10 -0
- package/dist/discovery/environment-scanner.d.ts.map +1 -0
- package/dist/discovery/environment-scanner.js +185 -0
- package/dist/discovery/environment-scanner.js.map +1 -0
- package/dist/generators/markdown-generator.d.ts +8 -0
- package/dist/generators/markdown-generator.d.ts.map +1 -0
- package/dist/generators/markdown-generator.js +88 -0
- package/dist/generators/markdown-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +23 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +216 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +450 -0
- package/dist/server.js.map +1 -0
- package/dist/types/index.d.ts +189 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|