@k-system/tickr-mcp 0.3.0 → 0.5.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/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +524 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/index.js +8 -172
- package/dist/server.d.ts +2 -0
- package/dist/server.js +192 -0
- package/dist/tools/add-release-ticket.d.ts +4 -0
- package/dist/tools/add-release-ticket.js +27 -0
- package/dist/tools/create-release.d.ts +4 -0
- package/dist/tools/create-release.js +34 -0
- package/dist/tools/generate-release-notes.d.ts +4 -0
- package/dist/tools/generate-release-notes.js +66 -0
- package/dist/tools/get-release.d.ts +4 -0
- package/dist/tools/get-release.js +42 -0
- package/dist/tools/list-releases.d.ts +4 -0
- package/dist/tools/list-releases.js +38 -0
- package/dist/tools/publish-release.d.ts +4 -0
- package/dist/tools/publish-release.js +26 -0
- package/dist/tools/remove-release-ticket.d.ts +4 -0
- package/dist/tools/remove-release-ticket.js +27 -0
- package/dist/tools/update-release.d.ts +4 -0
- package/dist/tools/update-release.js +36 -0
- package/package.json +6 -3
package/dist/index.js
CHANGED
|
@@ -1,175 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import { ApiClient } from "./api-client.js";
|
|
6
|
-
// Tools
|
|
7
|
-
import { registerCreateTicket } from "./tools/create-ticket.js";
|
|
8
|
-
import { registerListTickets } from "./tools/list-tickets.js";
|
|
9
|
-
import { registerGetTicket } from "./tools/get-ticket.js";
|
|
10
|
-
import { registerUpdateTicket } from "./tools/update-ticket.js";
|
|
11
|
-
import { registerAddComment } from "./tools/add-comment.js";
|
|
12
|
-
import { registerUpdateImplementationItem } from "./tools/update-implementation-item.js";
|
|
13
|
-
import { registerSearchTickets } from "./tools/search-tickets.js";
|
|
14
|
-
import { registerTriageList } from "./tools/triage-list.js";
|
|
15
|
-
import { registerTriageAccept } from "./tools/triage-accept.js";
|
|
16
|
-
import { registerTriageReject } from "./tools/triage-reject.js";
|
|
17
|
-
import { registerListLabels } from "./tools/list-labels.js";
|
|
18
|
-
import { registerAddLabel } from "./tools/add-label.js";
|
|
19
|
-
import { registerRemoveLabel } from "./tools/remove-label.js";
|
|
20
|
-
import { registerListCycles } from "./tools/list-cycles.js";
|
|
21
|
-
import { registerAssignCycle } from "./tools/assign-cycle.js";
|
|
22
|
-
import { registerListEpics } from "./tools/list-epics.js";
|
|
23
|
-
import { registerAssignEpic } from "./tools/assign-epic.js";
|
|
24
|
-
import { registerPollDevQueue } from "./tools/poll-dev-queue.js";
|
|
25
|
-
import { registerCompleteDevTask } from "./tools/complete-dev-task.js";
|
|
26
|
-
import { registerWhoami } from "./tools/whoami.js";
|
|
27
|
-
import { registerAddRelation } from "./tools/add-relation.js";
|
|
28
|
-
import { registerRemoveRelation } from "./tools/remove-relation.js";
|
|
29
|
-
// Phase 2 — Skupina A: Workflow & Status Management
|
|
30
|
-
import { registerListStatuses } from "./tools/list-statuses.js";
|
|
31
|
-
import { registerListTransitions } from "./tools/list-transitions.js";
|
|
32
|
-
import { registerCreateStatus } from "./tools/create-status.js";
|
|
33
|
-
import { registerDeleteStatus } from "./tools/delete-status.js";
|
|
34
|
-
import { registerApplyPreset } from "./tools/apply-preset.js";
|
|
35
|
-
// Phase 2 — Skupina B: Project Management
|
|
36
|
-
import { registerListProjects } from "./tools/list-projects.js";
|
|
37
|
-
import { registerGetProject } from "./tools/get-project.js";
|
|
38
|
-
import { registerCreateProject } from "./tools/create-project.js";
|
|
39
|
-
// Phase 2 — Skupina C: Ticket Operations
|
|
40
|
-
import { registerDeleteTicket } from "./tools/delete-ticket.js";
|
|
41
|
-
import { registerGetBoard } from "./tools/get-board.js";
|
|
42
|
-
import { registerGetMyTasks } from "./tools/get-my-tasks.js";
|
|
43
|
-
import { registerListComments } from "./tools/list-comments.js";
|
|
44
|
-
// Phase 2 — Skupina D: Attachments
|
|
45
|
-
import { registerListAttachments } from "./tools/list-attachments.js";
|
|
46
|
-
import { registerDeleteAttachment } from "./tools/delete-attachment.js";
|
|
47
|
-
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
48
|
-
import { registerCreateCycle } from "./tools/create-cycle.js";
|
|
49
|
-
import { registerCreateEpic } from "./tools/create-epic.js";
|
|
50
|
-
// Phase 2 — Skupina F: Implementation Items
|
|
51
|
-
import { registerCreateImplementationItem } from "./tools/create-implementation-item.js";
|
|
52
|
-
import { registerDeleteImplementationItem } from "./tools/delete-implementation-item.js";
|
|
53
|
-
// Phase 3 — Skupina A: Workflow & Status
|
|
54
|
-
import { registerUpdateTransitions } from "./tools/update-transitions.js";
|
|
55
|
-
import { registerUpdateStatus } from "./tools/update-status.js";
|
|
56
|
-
import { registerListWorkflowPresets } from "./tools/list-workflow-presets.js";
|
|
57
|
-
import { registerGetNextStatuses } from "./tools/get-next-statuses.js";
|
|
58
|
-
// Phase 3 — Skupina B: Comments & Activity
|
|
59
|
-
import { registerUpdateComment } from "./tools/update-comment.js";
|
|
60
|
-
import { registerDeleteComment } from "./tools/delete-comment.js";
|
|
61
|
-
// Phase 3 — Skupina C: Relations
|
|
62
|
-
import { registerListRelations } from "./tools/list-relations.js";
|
|
63
|
-
// Phase 3 — Skupina D: Dev Queue
|
|
64
|
-
import { registerFailDevTask } from "./tools/fail-dev-task.js";
|
|
65
|
-
import { registerListDevAssignments } from "./tools/list-dev-assignments.js";
|
|
66
|
-
// Phase 3 — Skupina E: Labels CRUD
|
|
67
|
-
import { registerCreateLabel } from "./tools/create-label.js";
|
|
68
|
-
import { registerUpdateLabel } from "./tools/update-label.js";
|
|
69
|
-
import { registerDeleteLabel } from "./tools/delete-label.js";
|
|
70
|
-
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
71
|
-
import { registerUpdateCycle } from "./tools/update-cycle.js";
|
|
72
|
-
import { registerDeleteCycle } from "./tools/delete-cycle.js";
|
|
73
|
-
import { registerUpdateEpic } from "./tools/update-epic.js";
|
|
74
|
-
import { registerDeleteEpic } from "./tools/delete-epic.js";
|
|
75
|
-
// ADR-0026 Phase 2f: Project Members
|
|
76
|
-
import { registerListProjectMembers } from "./tools/list-project-members.js";
|
|
77
|
-
import { registerAddProjectMember } from "./tools/add-project-member.js";
|
|
78
|
-
import { registerUpdateProjectMemberRole } from "./tools/update-project-member-role.js";
|
|
79
|
-
import { registerRemoveProjectMember } from "./tools/remove-project-member.js";
|
|
80
|
-
// Resources
|
|
81
|
-
import { registerTicketResource } from "./resources/ticket-resource.js";
|
|
82
|
-
import { registerProjectResource } from "./resources/project-resource.js";
|
|
83
|
-
async function main() {
|
|
84
|
-
const config = loadConfig();
|
|
85
|
-
const api = new ApiClient(config);
|
|
86
|
-
const server = new McpServer({
|
|
87
|
-
name: "tickr",
|
|
88
|
-
version: "0.1.5",
|
|
89
|
-
});
|
|
90
|
-
// Registrace tools
|
|
91
|
-
registerCreateTicket(server, api);
|
|
92
|
-
registerListTickets(server, api);
|
|
93
|
-
registerGetTicket(server, api);
|
|
94
|
-
registerUpdateTicket(server, api);
|
|
95
|
-
registerAddComment(server, api);
|
|
96
|
-
registerUpdateImplementationItem(server, api);
|
|
97
|
-
registerSearchTickets(server, api);
|
|
98
|
-
registerTriageList(server, api);
|
|
99
|
-
registerTriageAccept(server, api);
|
|
100
|
-
registerTriageReject(server, api);
|
|
101
|
-
registerListLabels(server, api);
|
|
102
|
-
registerAddLabel(server, api);
|
|
103
|
-
registerRemoveLabel(server, api);
|
|
104
|
-
registerListCycles(server, api);
|
|
105
|
-
registerAssignCycle(server, api);
|
|
106
|
-
registerListEpics(server, api);
|
|
107
|
-
registerAssignEpic(server, api);
|
|
108
|
-
registerPollDevQueue(server, api);
|
|
109
|
-
registerCompleteDevTask(server, api);
|
|
110
|
-
registerWhoami(server, api);
|
|
111
|
-
registerAddRelation(server, api);
|
|
112
|
-
registerRemoveRelation(server, api);
|
|
113
|
-
// Phase 2 — Skupina A: Workflow & Status Management
|
|
114
|
-
registerListStatuses(server, api);
|
|
115
|
-
registerListTransitions(server, api);
|
|
116
|
-
registerCreateStatus(server, api);
|
|
117
|
-
registerDeleteStatus(server, api);
|
|
118
|
-
registerApplyPreset(server, api);
|
|
119
|
-
// Phase 2 — Skupina B: Project Management
|
|
120
|
-
registerListProjects(server, api);
|
|
121
|
-
registerGetProject(server, api);
|
|
122
|
-
registerCreateProject(server, api);
|
|
123
|
-
// Phase 2 — Skupina C: Ticket Operations
|
|
124
|
-
registerDeleteTicket(server, api);
|
|
125
|
-
registerGetBoard(server, api);
|
|
126
|
-
registerGetMyTasks(server, api);
|
|
127
|
-
registerListComments(server, api);
|
|
128
|
-
// Phase 2 — Skupina D: Attachments
|
|
129
|
-
registerListAttachments(server, api);
|
|
130
|
-
registerDeleteAttachment(server, api);
|
|
131
|
-
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
132
|
-
registerCreateCycle(server, api);
|
|
133
|
-
registerCreateEpic(server, api);
|
|
134
|
-
// Phase 2 — Skupina F: Implementation Items
|
|
135
|
-
registerCreateImplementationItem(server, api);
|
|
136
|
-
registerDeleteImplementationItem(server, api);
|
|
137
|
-
// Phase 3 — Skupina A: Workflow & Status
|
|
138
|
-
registerUpdateTransitions(server, api);
|
|
139
|
-
registerUpdateStatus(server, api);
|
|
140
|
-
registerListWorkflowPresets(server, api);
|
|
141
|
-
registerGetNextStatuses(server, api);
|
|
142
|
-
// Phase 3 — Skupina B: Comments & Activity
|
|
143
|
-
registerUpdateComment(server, api);
|
|
144
|
-
registerDeleteComment(server, api);
|
|
145
|
-
// Phase 3 — Skupina C: Relations
|
|
146
|
-
registerListRelations(server, api);
|
|
147
|
-
// Phase 3 — Skupina D: Dev Queue
|
|
148
|
-
registerFailDevTask(server, api);
|
|
149
|
-
registerListDevAssignments(server, api);
|
|
150
|
-
// Phase 3 — Skupina E: Labels CRUD
|
|
151
|
-
registerCreateLabel(server, api);
|
|
152
|
-
registerUpdateLabel(server, api);
|
|
153
|
-
registerDeleteLabel(server, api);
|
|
154
|
-
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
155
|
-
registerUpdateCycle(server, api);
|
|
156
|
-
registerDeleteCycle(server, api);
|
|
157
|
-
registerUpdateEpic(server, api);
|
|
158
|
-
registerDeleteEpic(server, api);
|
|
159
|
-
// ADR-0026 Phase 2f: Project Members
|
|
160
|
-
registerListProjectMembers(server, api);
|
|
161
|
-
registerAddProjectMember(server, api);
|
|
162
|
-
registerUpdateProjectMemberRole(server, api);
|
|
163
|
-
registerRemoveProjectMember(server, api);
|
|
164
|
-
// Registrace resources
|
|
165
|
-
registerTicketResource(server, api);
|
|
166
|
-
registerProjectResource(server, api);
|
|
167
|
-
// Spuštění na stdio transportu
|
|
168
|
-
const transport = new StdioServerTransport();
|
|
169
|
-
await server.connect(transport);
|
|
2
|
+
// CLI setup wizard — spustit místo MCP serveru pokud je argument "setup"
|
|
3
|
+
if (process.argv.includes("setup")) {
|
|
4
|
+
import("./cli/setup.js").then((m) => m.default());
|
|
170
5
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
6
|
+
else {
|
|
7
|
+
// MCP server — standardní mód
|
|
8
|
+
import("./server.js").then((m) => m.startServer());
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
175
11
|
//# sourceMappingURL=index.js.map
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { loadConfig } from "./config.js";
|
|
4
|
+
import { ApiClient } from "./api-client.js";
|
|
5
|
+
// Tools
|
|
6
|
+
import { registerCreateTicket } from "./tools/create-ticket.js";
|
|
7
|
+
import { registerListTickets } from "./tools/list-tickets.js";
|
|
8
|
+
import { registerGetTicket } from "./tools/get-ticket.js";
|
|
9
|
+
import { registerUpdateTicket } from "./tools/update-ticket.js";
|
|
10
|
+
import { registerAddComment } from "./tools/add-comment.js";
|
|
11
|
+
import { registerUpdateImplementationItem } from "./tools/update-implementation-item.js";
|
|
12
|
+
import { registerSearchTickets } from "./tools/search-tickets.js";
|
|
13
|
+
import { registerTriageList } from "./tools/triage-list.js";
|
|
14
|
+
import { registerTriageAccept } from "./tools/triage-accept.js";
|
|
15
|
+
import { registerTriageReject } from "./tools/triage-reject.js";
|
|
16
|
+
import { registerListLabels } from "./tools/list-labels.js";
|
|
17
|
+
import { registerAddLabel } from "./tools/add-label.js";
|
|
18
|
+
import { registerRemoveLabel } from "./tools/remove-label.js";
|
|
19
|
+
import { registerListCycles } from "./tools/list-cycles.js";
|
|
20
|
+
import { registerAssignCycle } from "./tools/assign-cycle.js";
|
|
21
|
+
import { registerListEpics } from "./tools/list-epics.js";
|
|
22
|
+
import { registerAssignEpic } from "./tools/assign-epic.js";
|
|
23
|
+
import { registerPollDevQueue } from "./tools/poll-dev-queue.js";
|
|
24
|
+
import { registerCompleteDevTask } from "./tools/complete-dev-task.js";
|
|
25
|
+
import { registerWhoami } from "./tools/whoami.js";
|
|
26
|
+
import { registerAddRelation } from "./tools/add-relation.js";
|
|
27
|
+
import { registerRemoveRelation } from "./tools/remove-relation.js";
|
|
28
|
+
// Phase 2 — Skupina A: Workflow & Status Management
|
|
29
|
+
import { registerListStatuses } from "./tools/list-statuses.js";
|
|
30
|
+
import { registerListTransitions } from "./tools/list-transitions.js";
|
|
31
|
+
import { registerCreateStatus } from "./tools/create-status.js";
|
|
32
|
+
import { registerDeleteStatus } from "./tools/delete-status.js";
|
|
33
|
+
import { registerApplyPreset } from "./tools/apply-preset.js";
|
|
34
|
+
// Phase 2 — Skupina B: Project Management
|
|
35
|
+
import { registerListProjects } from "./tools/list-projects.js";
|
|
36
|
+
import { registerGetProject } from "./tools/get-project.js";
|
|
37
|
+
import { registerCreateProject } from "./tools/create-project.js";
|
|
38
|
+
// Phase 2 — Skupina C: Ticket Operations
|
|
39
|
+
import { registerDeleteTicket } from "./tools/delete-ticket.js";
|
|
40
|
+
import { registerGetBoard } from "./tools/get-board.js";
|
|
41
|
+
import { registerGetMyTasks } from "./tools/get-my-tasks.js";
|
|
42
|
+
import { registerListComments } from "./tools/list-comments.js";
|
|
43
|
+
// Phase 2 — Skupina D: Attachments
|
|
44
|
+
import { registerListAttachments } from "./tools/list-attachments.js";
|
|
45
|
+
import { registerDeleteAttachment } from "./tools/delete-attachment.js";
|
|
46
|
+
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
47
|
+
import { registerCreateCycle } from "./tools/create-cycle.js";
|
|
48
|
+
import { registerCreateEpic } from "./tools/create-epic.js";
|
|
49
|
+
// Phase 2 — Skupina F: Implementation Items
|
|
50
|
+
import { registerCreateImplementationItem } from "./tools/create-implementation-item.js";
|
|
51
|
+
import { registerDeleteImplementationItem } from "./tools/delete-implementation-item.js";
|
|
52
|
+
// Phase 3 — Skupina A: Workflow & Status
|
|
53
|
+
import { registerUpdateTransitions } from "./tools/update-transitions.js";
|
|
54
|
+
import { registerUpdateStatus } from "./tools/update-status.js";
|
|
55
|
+
import { registerListWorkflowPresets } from "./tools/list-workflow-presets.js";
|
|
56
|
+
import { registerGetNextStatuses } from "./tools/get-next-statuses.js";
|
|
57
|
+
// Phase 3 — Skupina B: Comments & Activity
|
|
58
|
+
import { registerUpdateComment } from "./tools/update-comment.js";
|
|
59
|
+
import { registerDeleteComment } from "./tools/delete-comment.js";
|
|
60
|
+
// Phase 3 — Skupina C: Relations
|
|
61
|
+
import { registerListRelations } from "./tools/list-relations.js";
|
|
62
|
+
// Phase 3 — Skupina D: Dev Queue
|
|
63
|
+
import { registerFailDevTask } from "./tools/fail-dev-task.js";
|
|
64
|
+
import { registerListDevAssignments } from "./tools/list-dev-assignments.js";
|
|
65
|
+
// Phase 3 — Skupina E: Labels CRUD
|
|
66
|
+
import { registerCreateLabel } from "./tools/create-label.js";
|
|
67
|
+
import { registerUpdateLabel } from "./tools/update-label.js";
|
|
68
|
+
import { registerDeleteLabel } from "./tools/delete-label.js";
|
|
69
|
+
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
70
|
+
import { registerUpdateCycle } from "./tools/update-cycle.js";
|
|
71
|
+
import { registerDeleteCycle } from "./tools/delete-cycle.js";
|
|
72
|
+
import { registerUpdateEpic } from "./tools/update-epic.js";
|
|
73
|
+
import { registerDeleteEpic } from "./tools/delete-epic.js";
|
|
74
|
+
// ADR-0026 Phase 2f: Project Members
|
|
75
|
+
import { registerListProjectMembers } from "./tools/list-project-members.js";
|
|
76
|
+
import { registerAddProjectMember } from "./tools/add-project-member.js";
|
|
77
|
+
import { registerUpdateProjectMemberRole } from "./tools/update-project-member-role.js";
|
|
78
|
+
import { registerRemoveProjectMember } from "./tools/remove-project-member.js";
|
|
79
|
+
// ADR-0030: Releases
|
|
80
|
+
import { registerCreateRelease } from "./tools/create-release.js";
|
|
81
|
+
import { registerGetRelease } from "./tools/get-release.js";
|
|
82
|
+
import { registerListReleases } from "./tools/list-releases.js";
|
|
83
|
+
import { registerUpdateRelease } from "./tools/update-release.js";
|
|
84
|
+
import { registerPublishRelease } from "./tools/publish-release.js";
|
|
85
|
+
import { registerAddReleaseTicket } from "./tools/add-release-ticket.js";
|
|
86
|
+
import { registerRemoveReleaseTicket } from "./tools/remove-release-ticket.js";
|
|
87
|
+
import { registerGenerateReleaseNotes } from "./tools/generate-release-notes.js";
|
|
88
|
+
// Resources
|
|
89
|
+
import { registerTicketResource } from "./resources/ticket-resource.js";
|
|
90
|
+
import { registerProjectResource } from "./resources/project-resource.js";
|
|
91
|
+
export async function startServer() {
|
|
92
|
+
const config = loadConfig();
|
|
93
|
+
const api = new ApiClient(config);
|
|
94
|
+
const server = new McpServer({
|
|
95
|
+
name: "tickr",
|
|
96
|
+
version: "0.1.5",
|
|
97
|
+
});
|
|
98
|
+
// Registrace tools
|
|
99
|
+
registerCreateTicket(server, api);
|
|
100
|
+
registerListTickets(server, api);
|
|
101
|
+
registerGetTicket(server, api);
|
|
102
|
+
registerUpdateTicket(server, api);
|
|
103
|
+
registerAddComment(server, api);
|
|
104
|
+
registerUpdateImplementationItem(server, api);
|
|
105
|
+
registerSearchTickets(server, api);
|
|
106
|
+
registerTriageList(server, api);
|
|
107
|
+
registerTriageAccept(server, api);
|
|
108
|
+
registerTriageReject(server, api);
|
|
109
|
+
registerListLabels(server, api);
|
|
110
|
+
registerAddLabel(server, api);
|
|
111
|
+
registerRemoveLabel(server, api);
|
|
112
|
+
registerListCycles(server, api);
|
|
113
|
+
registerAssignCycle(server, api);
|
|
114
|
+
registerListEpics(server, api);
|
|
115
|
+
registerAssignEpic(server, api);
|
|
116
|
+
registerPollDevQueue(server, api);
|
|
117
|
+
registerCompleteDevTask(server, api);
|
|
118
|
+
registerWhoami(server, api);
|
|
119
|
+
registerAddRelation(server, api);
|
|
120
|
+
registerRemoveRelation(server, api);
|
|
121
|
+
// Phase 2 — Skupina A: Workflow & Status Management
|
|
122
|
+
registerListStatuses(server, api);
|
|
123
|
+
registerListTransitions(server, api);
|
|
124
|
+
registerCreateStatus(server, api);
|
|
125
|
+
registerDeleteStatus(server, api);
|
|
126
|
+
registerApplyPreset(server, api);
|
|
127
|
+
// Phase 2 — Skupina B: Project Management
|
|
128
|
+
registerListProjects(server, api);
|
|
129
|
+
registerGetProject(server, api);
|
|
130
|
+
registerCreateProject(server, api);
|
|
131
|
+
// Phase 2 — Skupina C: Ticket Operations
|
|
132
|
+
registerDeleteTicket(server, api);
|
|
133
|
+
registerGetBoard(server, api);
|
|
134
|
+
registerGetMyTasks(server, api);
|
|
135
|
+
registerListComments(server, api);
|
|
136
|
+
// Phase 2 — Skupina D: Attachments
|
|
137
|
+
registerListAttachments(server, api);
|
|
138
|
+
registerDeleteAttachment(server, api);
|
|
139
|
+
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
140
|
+
registerCreateCycle(server, api);
|
|
141
|
+
registerCreateEpic(server, api);
|
|
142
|
+
// Phase 2 — Skupina F: Implementation Items
|
|
143
|
+
registerCreateImplementationItem(server, api);
|
|
144
|
+
registerDeleteImplementationItem(server, api);
|
|
145
|
+
// Phase 3 — Skupina A: Workflow & Status
|
|
146
|
+
registerUpdateTransitions(server, api);
|
|
147
|
+
registerUpdateStatus(server, api);
|
|
148
|
+
registerListWorkflowPresets(server, api);
|
|
149
|
+
registerGetNextStatuses(server, api);
|
|
150
|
+
// Phase 3 — Skupina B: Comments & Activity
|
|
151
|
+
registerUpdateComment(server, api);
|
|
152
|
+
registerDeleteComment(server, api);
|
|
153
|
+
// Phase 3 — Skupina C: Relations
|
|
154
|
+
registerListRelations(server, api);
|
|
155
|
+
// Phase 3 — Skupina D: Dev Queue
|
|
156
|
+
registerFailDevTask(server, api);
|
|
157
|
+
registerListDevAssignments(server, api);
|
|
158
|
+
// Phase 3 — Skupina E: Labels CRUD
|
|
159
|
+
registerCreateLabel(server, api);
|
|
160
|
+
registerUpdateLabel(server, api);
|
|
161
|
+
registerDeleteLabel(server, api);
|
|
162
|
+
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
163
|
+
registerUpdateCycle(server, api);
|
|
164
|
+
registerDeleteCycle(server, api);
|
|
165
|
+
registerUpdateEpic(server, api);
|
|
166
|
+
registerDeleteEpic(server, api);
|
|
167
|
+
// ADR-0026 Phase 2f: Project Members
|
|
168
|
+
registerListProjectMembers(server, api);
|
|
169
|
+
registerAddProjectMember(server, api);
|
|
170
|
+
registerUpdateProjectMemberRole(server, api);
|
|
171
|
+
registerRemoveProjectMember(server, api);
|
|
172
|
+
// ADR-0030: Releases
|
|
173
|
+
registerCreateRelease(server, api);
|
|
174
|
+
registerGetRelease(server, api);
|
|
175
|
+
registerListReleases(server, api);
|
|
176
|
+
registerUpdateRelease(server, api);
|
|
177
|
+
registerPublishRelease(server, api);
|
|
178
|
+
registerAddReleaseTicket(server, api);
|
|
179
|
+
registerRemoveReleaseTicket(server, api);
|
|
180
|
+
registerGenerateReleaseNotes(server, api);
|
|
181
|
+
// Registrace resources
|
|
182
|
+
registerTicketResource(server, api);
|
|
183
|
+
registerProjectResource(server, api);
|
|
184
|
+
// Spuštění na stdio transportu
|
|
185
|
+
const transport = new StdioServerTransport();
|
|
186
|
+
await server.connect(transport);
|
|
187
|
+
}
|
|
188
|
+
startServer().catch((err) => {
|
|
189
|
+
console.error("MCP server failed to start:", err);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerAddReleaseTicket(server, api) {
|
|
3
|
+
server.tool("add_release_ticket", "Link a ticket to a release", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
release_id: z.string().describe("UUID of the release"),
|
|
6
|
+
ticket_number: z.string().describe("Ticket display number, e.g. 'TKR-42' or 'TKR-BUG-0042'"),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
try {
|
|
9
|
+
await api.post(`/api/projects/${params.project}/releases/${params.release_id}/tickets`, { ticketNumber: params.ticket_number });
|
|
10
|
+
return {
|
|
11
|
+
content: [
|
|
12
|
+
{
|
|
13
|
+
type: "text",
|
|
14
|
+
text: `Ticket ${params.ticket_number} added to release ${params.release_id}`,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
22
|
+
isError: true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=add-release-ticket.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerCreateRelease(server, api) {
|
|
3
|
+
server.tool("create_release", "Create a new release in a project", {
|
|
4
|
+
project: z.string().describe("Project slug, e.g. 'tickr'"),
|
|
5
|
+
version: z.string().describe("Semantic version, e.g. '1.6.0'"),
|
|
6
|
+
name: z.string().optional().describe("Human-readable release name"),
|
|
7
|
+
git_tag: z.string().optional().describe("Git tag name, e.g. 'v1.6.0'"),
|
|
8
|
+
cycle_id: z.string().optional().describe("UUID of linked cycle (sprint)"),
|
|
9
|
+
}, async (params) => {
|
|
10
|
+
try {
|
|
11
|
+
const result = await api.post(`/api/projects/${params.project}/releases`, {
|
|
12
|
+
version: params.version,
|
|
13
|
+
name: params.name,
|
|
14
|
+
gitTag: params.git_tag,
|
|
15
|
+
cycleId: params.cycle_id,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: `Created release ${result.version} (id: ${result.id})`,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=create-release.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ApiClient } from "../api-client.js";
|
|
3
|
+
export declare function registerGenerateReleaseNotes(server: McpServer, api: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=generate-release-notes.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerGenerateReleaseNotes(server, api) {
|
|
3
|
+
server.tool("generate_release_notes", "Generate markdown release notes from linked tickets (client-side generation)", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
release_id: z.string().describe("UUID of the release"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
const r = await api.get(`/api/projects/${params.project}/releases/${params.release_id}`);
|
|
9
|
+
const lines = [
|
|
10
|
+
`# Release ${r.version}${r.name ? ` — ${r.name}` : ""}`,
|
|
11
|
+
"",
|
|
12
|
+
];
|
|
13
|
+
if (!r.tickets?.length) {
|
|
14
|
+
lines.push("No tickets linked to this release.");
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Seskupit tickety podle typu
|
|
20
|
+
const grouped = {};
|
|
21
|
+
for (const t of r.tickets) {
|
|
22
|
+
const key = t.type.toLowerCase();
|
|
23
|
+
if (!grouped[key])
|
|
24
|
+
grouped[key] = [];
|
|
25
|
+
grouped[key].push(t);
|
|
26
|
+
}
|
|
27
|
+
// Pořadí sekcí a labely
|
|
28
|
+
const sectionOrder = [
|
|
29
|
+
["feature", "Features"],
|
|
30
|
+
["adr", "Architecture Decisions"],
|
|
31
|
+
["bug", "Bug Fixes"],
|
|
32
|
+
["task", "Tasks"],
|
|
33
|
+
];
|
|
34
|
+
for (const [typeKey, sectionTitle] of sectionOrder) {
|
|
35
|
+
const tickets = grouped[typeKey];
|
|
36
|
+
if (!tickets?.length)
|
|
37
|
+
continue;
|
|
38
|
+
lines.push(`## ${sectionTitle}`, "");
|
|
39
|
+
for (const t of tickets) {
|
|
40
|
+
lines.push(`- **${t.displayNumber}** ${t.title}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push("");
|
|
43
|
+
}
|
|
44
|
+
// Ostatní typy, které nejsou ve standardním pořadí
|
|
45
|
+
for (const [typeKey, tickets] of Object.entries(grouped)) {
|
|
46
|
+
if (sectionOrder.some(([k]) => k === typeKey))
|
|
47
|
+
continue;
|
|
48
|
+
lines.push(`## ${typeKey.charAt(0).toUpperCase() + typeKey.slice(1)}`, "");
|
|
49
|
+
for (const t of tickets) {
|
|
50
|
+
lines.push(`- **${t.displayNumber}** ${t.title}`);
|
|
51
|
+
}
|
|
52
|
+
lines.push("");
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
61
|
+
isError: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=generate-release-notes.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerGetRelease(server, api) {
|
|
3
|
+
server.tool("get_release", "Get full release detail including linked tickets", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
release_id: z.string().describe("UUID of the release"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
const r = await api.get(`/api/projects/${params.project}/releases/${params.release_id}`);
|
|
9
|
+
const lines = [
|
|
10
|
+
`# Release ${r.version}${r.name ? ` — ${r.name}` : ""}`,
|
|
11
|
+
"",
|
|
12
|
+
`| Field | Value |`,
|
|
13
|
+
`|-------|-------|`,
|
|
14
|
+
`| Id | ${r.id} |`,
|
|
15
|
+
`| Status | ${r.status} |`,
|
|
16
|
+
`| Git Tag | ${r.gitTag || "-"} |`,
|
|
17
|
+
`| Published | ${r.publishedAt || "-"} |`,
|
|
18
|
+
`| Created | ${r.createdAt} |`,
|
|
19
|
+
`| Updated | ${r.updatedAt} |`,
|
|
20
|
+
];
|
|
21
|
+
if (r.notes) {
|
|
22
|
+
lines.push("", "## Notes", "", r.notes);
|
|
23
|
+
}
|
|
24
|
+
if (r.tickets?.length > 0) {
|
|
25
|
+
lines.push("", "## Tickets", "", "| Number | Type | Title | Status |", "|--------|------|-------|--------|");
|
|
26
|
+
for (const t of r.tickets) {
|
|
27
|
+
lines.push(`| ${t.displayNumber} | ${t.type} | ${t.title} | ${t.status} |`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
37
|
+
isError: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=get-release.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerListReleases(server, api) {
|
|
3
|
+
server.tool("list_releases", "List releases in a project with optional status filter", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
status: z.string().optional().describe("Filter by status: draft, published, archived"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
const qs = new URLSearchParams();
|
|
9
|
+
if (params.status)
|
|
10
|
+
qs.set("status", params.status);
|
|
11
|
+
const qsStr = qs.toString();
|
|
12
|
+
const path = `/api/projects/${params.project}/releases${qsStr ? `?${qsStr}` : ""}`;
|
|
13
|
+
const releases = await api.get(path);
|
|
14
|
+
if (!releases.length) {
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: "text", text: "No releases found." }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const lines = [
|
|
20
|
+
"| Version | Name | Status | Tag | Tickets | Published | Created |",
|
|
21
|
+
"|---------|------|--------|-----|---------|-----------|---------|",
|
|
22
|
+
];
|
|
23
|
+
for (const r of releases) {
|
|
24
|
+
lines.push(`| ${r.version} | ${r.name || "-"} | ${r.status} | ${r.gitTag || "-"} | ${r.ticketCount} | ${r.publishedAt || "-"} | ${r.createdAt} |`);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
33
|
+
isError: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=list-releases.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerPublishRelease(server, api) {
|
|
3
|
+
server.tool("publish_release", "Publish a draft release — sets status to published and records publishedAt timestamp", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
release_id: z.string().describe("UUID of the release to publish"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
await api.post(`/api/projects/${params.project}/releases/${params.release_id}/publish`);
|
|
9
|
+
return {
|
|
10
|
+
content: [
|
|
11
|
+
{
|
|
12
|
+
type: "text",
|
|
13
|
+
text: `Release ${params.release_id} published in project ${params.project}`,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
21
|
+
isError: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=publish-release.js.map
|