@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/index.js CHANGED
@@ -1,175 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { loadConfig } from "./config.js";
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
- main().catch((err) => {
172
- console.error("MCP server failed to start:", err);
173
- process.exit(1);
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
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
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,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerAddReleaseTicket(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=add-release-ticket.d.ts.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,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateRelease(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-release.d.ts.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,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerGetRelease(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=get-release.d.ts.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,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerListReleases(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=list-releases.d.ts.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,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerPublishRelease(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=publish-release.d.ts.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