paperclip-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +703 -0
  2. package/dist/auth.d.ts +9 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +17 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/client.d.ts +17 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +94 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/errors.d.ts +7 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +13 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +23 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/tools/activity.d.ts +3 -0
  19. package/dist/tools/activity.d.ts.map +1 -0
  20. package/dist/tools/activity.js +106 -0
  21. package/dist/tools/activity.js.map +1 -0
  22. package/dist/tools/agents.d.ts +3 -0
  23. package/dist/tools/agents.d.ts.map +1 -0
  24. package/dist/tools/agents.js +373 -0
  25. package/dist/tools/agents.js.map +1 -0
  26. package/dist/tools/approvals.d.ts +3 -0
  27. package/dist/tools/approvals.d.ts.map +1 -0
  28. package/dist/tools/approvals.js +306 -0
  29. package/dist/tools/approvals.js.map +1 -0
  30. package/dist/tools/attachments.d.ts +3 -0
  31. package/dist/tools/attachments.d.ts.map +1 -0
  32. package/dist/tools/attachments.js +125 -0
  33. package/dist/tools/attachments.js.map +1 -0
  34. package/dist/tools/comments.d.ts +3 -0
  35. package/dist/tools/comments.d.ts.map +1 -0
  36. package/dist/tools/comments.js +75 -0
  37. package/dist/tools/comments.js.map +1 -0
  38. package/dist/tools/dashboard.d.ts +3 -0
  39. package/dist/tools/dashboard.d.ts.map +1 -0
  40. package/dist/tools/dashboard.js +24 -0
  41. package/dist/tools/dashboard.js.map +1 -0
  42. package/dist/tools/documents.d.ts +3 -0
  43. package/dist/tools/documents.d.ts.map +1 -0
  44. package/dist/tools/documents.js +150 -0
  45. package/dist/tools/documents.js.map +1 -0
  46. package/dist/tools/goals.d.ts +3 -0
  47. package/dist/tools/goals.d.ts.map +1 -0
  48. package/dist/tools/goals.js +128 -0
  49. package/dist/tools/goals.js.map +1 -0
  50. package/dist/tools/identity.d.ts +3 -0
  51. package/dist/tools/identity.d.ts.map +1 -0
  52. package/dist/tools/identity.js +44 -0
  53. package/dist/tools/identity.js.map +1 -0
  54. package/dist/tools/index.d.ts +25 -0
  55. package/dist/tools/index.d.ts.map +1 -0
  56. package/dist/tools/index.js +49 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/issues.d.ts +3 -0
  59. package/dist/tools/issues.d.ts.map +1 -0
  60. package/dist/tools/issues.js +297 -0
  61. package/dist/tools/issues.js.map +1 -0
  62. package/dist/tools/projects.d.ts +3 -0
  63. package/dist/tools/projects.d.ts.map +1 -0
  64. package/dist/tools/projects.js +233 -0
  65. package/dist/tools/projects.js.map +1 -0
  66. package/dist/tools/routines.d.ts +3 -0
  67. package/dist/tools/routines.d.ts.map +1 -0
  68. package/dist/tools/routines.js +305 -0
  69. package/dist/tools/routines.js.map +1 -0
  70. package/dist/tools/validation.d.ts +24 -0
  71. package/dist/tools/validation.d.ts.map +1 -0
  72. package/dist/tools/validation.js +33 -0
  73. package/dist/tools/validation.js.map +1 -0
  74. package/dist/types.d.ts +36 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +3 -0
  77. package/dist/types.js.map +1 -0
  78. package/package.json +61 -0
@@ -0,0 +1,297 @@
1
+ import { z } from "zod";
2
+ import { validate, IssueIdSchema, handleApiError } from "./validation.js";
3
+ const ListIssuesInput = z.object({
4
+ status: z.string().optional(),
5
+ assigneeAgentId: z.string().optional(),
6
+ projectId: z.string().optional(),
7
+ goalId: z.string().optional(),
8
+ labelId: z.string().optional(),
9
+ q: z.string().optional(),
10
+ });
11
+ const IssueIdInput = IssueIdSchema;
12
+ const CheckoutIssueInput = z.object({
13
+ issueId: z.string().min(1),
14
+ expectedStatuses: z.array(z.string()).optional(),
15
+ });
16
+ const UpdateIssueInput = z.object({
17
+ issueId: z.string().min(1),
18
+ status: z.string().optional(),
19
+ comment: z.string().optional(),
20
+ priority: z.string().optional(),
21
+ title: z.string().optional(),
22
+ description: z.string().optional(),
23
+ assigneeAgentId: z.string().nullable().optional(),
24
+ assigneeUserId: z.string().nullable().optional(),
25
+ goalId: z.string().nullable().optional(),
26
+ projectId: z.string().nullable().optional(),
27
+ parentId: z.string().nullable().optional(),
28
+ billingCode: z.string().nullable().optional(),
29
+ });
30
+ const CreateIssueInput = z.object({
31
+ title: z.string().min(1),
32
+ description: z.string().optional(),
33
+ status: z.string().optional(),
34
+ priority: z.string().optional(),
35
+ parentId: z.string().optional(),
36
+ goalId: z.string().optional(),
37
+ projectId: z.string().optional(),
38
+ assigneeAgentId: z.string().optional(),
39
+ billingCode: z.string().optional(),
40
+ inheritExecutionWorkspaceFromIssueId: z
41
+ .string()
42
+ .optional()
43
+ .describe("Link to an existing execution workspace (for follow-up tasks on same checkout)"),
44
+ });
45
+ export const issueTools = [
46
+ {
47
+ name: "paperclip_list_issues",
48
+ description: "List issues for the current company. Optionally filter by status (comma-separated), assigneeAgentId, projectId, goalId, labelId, or full-text search query.",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: {
52
+ status: {
53
+ type: "string",
54
+ description: "Comma-separated status values (e.g. 'todo,in_progress')",
55
+ },
56
+ assigneeAgentId: { type: "string", description: "Filter by assignee agent ID" },
57
+ projectId: { type: "string", description: "Filter by project ID" },
58
+ goalId: { type: "string", description: "Filter by goal ID" },
59
+ labelId: { type: "string", description: "Filter by label ID" },
60
+ q: { type: "string", description: "Full-text search query" },
61
+ },
62
+ required: [],
63
+ },
64
+ annotations: { readOnlyHint: true, openWorldHint: false },
65
+ async handler(args, client) {
66
+ try {
67
+ const input = validate(ListIssuesInput, args);
68
+ const params = new URLSearchParams();
69
+ if (input.status)
70
+ params.set("status", input.status);
71
+ if (input.assigneeAgentId)
72
+ params.set("assigneeAgentId", input.assigneeAgentId);
73
+ if (input.projectId)
74
+ params.set("projectId", input.projectId);
75
+ if (input.goalId)
76
+ params.set("goalId", input.goalId);
77
+ if (input.labelId)
78
+ params.set("labelId", input.labelId);
79
+ if (input.q)
80
+ params.set("q", input.q);
81
+ const qs = params.toString();
82
+ const path = `/api/companies/${client.companyId}/issues${qs ? `?${qs}` : ""}`;
83
+ const data = await client.get(path);
84
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
85
+ }
86
+ catch (err) {
87
+ return handleApiError(err);
88
+ }
89
+ },
90
+ },
91
+ {
92
+ name: "paperclip_get_issue",
93
+ description: "Get a single issue by ID, including its full details and ancestors.",
94
+ inputSchema: {
95
+ type: "object",
96
+ properties: {
97
+ issueId: { type: "string", description: "Issue ID or identifier (e.g. PAP-20)" },
98
+ },
99
+ required: ["issueId"],
100
+ },
101
+ annotations: { readOnlyHint: true, openWorldHint: false },
102
+ async handler(args, client) {
103
+ try {
104
+ const { issueId } = validate(IssueIdInput, args);
105
+ const data = await client.get(`/api/issues/${issueId}`);
106
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
107
+ }
108
+ catch (err) {
109
+ return handleApiError(err);
110
+ }
111
+ },
112
+ },
113
+ {
114
+ name: "paperclip_get_heartbeat_context",
115
+ description: "Get compact heartbeat context for an issue: state, ancestor summaries, goal/project info, and comment cursor metadata.",
116
+ inputSchema: {
117
+ type: "object",
118
+ properties: {
119
+ issueId: { type: "string", description: "Issue ID or identifier" },
120
+ },
121
+ required: ["issueId"],
122
+ },
123
+ annotations: { readOnlyHint: true, openWorldHint: false },
124
+ async handler(args, client) {
125
+ try {
126
+ const { issueId } = validate(IssueIdInput, args);
127
+ const data = await client.get(`/api/issues/${issueId}/heartbeat-context`);
128
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
129
+ }
130
+ catch (err) {
131
+ return handleApiError(err);
132
+ }
133
+ },
134
+ },
135
+ {
136
+ name: "paperclip_checkout_issue",
137
+ description: "Checkout an issue to claim it for work. Returns 409 if owned by another agent — do not retry.",
138
+ inputSchema: {
139
+ type: "object",
140
+ properties: {
141
+ issueId: { type: "string", description: "Issue ID to check out" },
142
+ expectedStatuses: {
143
+ type: "array",
144
+ items: { type: "string" },
145
+ description: "Expected current statuses (e.g. ['todo', 'backlog'])",
146
+ },
147
+ },
148
+ required: ["issueId"],
149
+ },
150
+ annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: false },
151
+ async handler(args, client) {
152
+ try {
153
+ const { issueId, expectedStatuses } = validate(CheckoutIssueInput, args);
154
+ const body = {};
155
+ if (expectedStatuses)
156
+ body["expectedStatuses"] = expectedStatuses;
157
+ const data = await client.post(`/api/issues/${issueId}/checkout`, body);
158
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
159
+ }
160
+ catch (err) {
161
+ return handleApiError(err);
162
+ }
163
+ },
164
+ },
165
+ {
166
+ name: "paperclip_release_issue",
167
+ description: "Release a checked-out issue without marking it done.",
168
+ inputSchema: {
169
+ type: "object",
170
+ properties: {
171
+ issueId: { type: "string", description: "Issue ID to release" },
172
+ },
173
+ required: ["issueId"],
174
+ },
175
+ annotations: { idempotentHint: true, openWorldHint: false },
176
+ async handler(args, client) {
177
+ try {
178
+ const { issueId } = validate(IssueIdInput, args);
179
+ const data = await client.post(`/api/issues/${issueId}/release`);
180
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
181
+ }
182
+ catch (err) {
183
+ return handleApiError(err);
184
+ }
185
+ },
186
+ },
187
+ {
188
+ name: "paperclip_update_issue",
189
+ description: "Update an issue's status, priority, title, description, assignee, goal, project, parent, billing code, or add a comment. Run ID header is injected automatically.",
190
+ inputSchema: {
191
+ type: "object",
192
+ properties: {
193
+ issueId: { type: "string", description: "Issue ID to update" },
194
+ status: { type: "string", description: "New status value" },
195
+ comment: { type: "string", description: "Comment to post alongside the update" },
196
+ priority: { type: "string", description: "New priority value" },
197
+ title: { type: "string", description: "New title" },
198
+ description: { type: "string", description: "New description (markdown)" },
199
+ assigneeAgentId: {
200
+ type: ["string", "null"],
201
+ description: "Reassign to agent ID, or null to unassign",
202
+ },
203
+ assigneeUserId: {
204
+ type: ["string", "null"],
205
+ description: "Reassign to board/human user ID, or null to unassign",
206
+ },
207
+ goalId: {
208
+ type: ["string", "null"],
209
+ description: "Move issue to a different goal, or null to unlink",
210
+ },
211
+ projectId: {
212
+ type: ["string", "null"],
213
+ description: "Move issue to a different project, or null to unlink",
214
+ },
215
+ parentId: {
216
+ type: ["string", "null"],
217
+ description: "Reparent issue (make sub-task of another), or null to unparent",
218
+ },
219
+ billingCode: {
220
+ type: ["string", "null"],
221
+ description: "Cross-team billing attribution, or null to clear",
222
+ },
223
+ },
224
+ required: ["issueId"],
225
+ },
226
+ annotations: { destructiveHint: true, openWorldHint: false },
227
+ async handler(args, client) {
228
+ try {
229
+ const { issueId, ...rest } = validate(UpdateIssueInput, args);
230
+ const body = {};
231
+ for (const [k, v] of Object.entries(rest)) {
232
+ if (v !== undefined)
233
+ body[k] = v;
234
+ }
235
+ const data = await client.patch(`/api/issues/${issueId}`, body);
236
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
237
+ }
238
+ catch (err) {
239
+ return handleApiError(err);
240
+ }
241
+ },
242
+ },
243
+ {
244
+ name: "paperclip_create_issue",
245
+ description: "Create a new issue. companyId is injected from auth config. Run ID header is injected automatically.",
246
+ inputSchema: {
247
+ type: "object",
248
+ properties: {
249
+ title: { type: "string", description: "Issue title (required)" },
250
+ description: { type: "string", description: "Issue description (markdown)" },
251
+ status: { type: "string", description: "Initial status (default: todo)" },
252
+ priority: { type: "string", description: "Priority level" },
253
+ parentId: { type: "string", description: "Parent issue ID (required for subtasks)" },
254
+ goalId: { type: "string", description: "Goal ID to link the issue to" },
255
+ projectId: { type: "string", description: "Project ID to assign to" },
256
+ assigneeAgentId: { type: "string", description: "Agent ID to assign to" },
257
+ billingCode: { type: "string", description: "Cross-team billing attribution code" },
258
+ inheritExecutionWorkspaceFromIssueId: {
259
+ type: "string",
260
+ description: "Link to an existing execution workspace (for follow-up tasks on same checkout/worktree)",
261
+ },
262
+ },
263
+ required: ["title"],
264
+ },
265
+ annotations: { destructiveHint: false, openWorldHint: false },
266
+ async handler(args, client) {
267
+ try {
268
+ const input = validate(CreateIssueInput, args);
269
+ const body = { title: input.title };
270
+ if (input.description !== undefined)
271
+ body["description"] = input.description;
272
+ if (input.status !== undefined)
273
+ body["status"] = input.status;
274
+ if (input.priority !== undefined)
275
+ body["priority"] = input.priority;
276
+ if (input.parentId !== undefined)
277
+ body["parentId"] = input.parentId;
278
+ if (input.goalId !== undefined)
279
+ body["goalId"] = input.goalId;
280
+ if (input.projectId !== undefined)
281
+ body["projectId"] = input.projectId;
282
+ if (input.assigneeAgentId !== undefined)
283
+ body["assigneeAgentId"] = input.assigneeAgentId;
284
+ if (input.billingCode !== undefined)
285
+ body["billingCode"] = input.billingCode;
286
+ if (input.inheritExecutionWorkspaceFromIssueId !== undefined)
287
+ body["inheritExecutionWorkspaceFromIssueId"] = input.inheritExecutionWorkspaceFromIssueId;
288
+ const data = await client.post(`/api/companies/${client.companyId}/issues`, body);
289
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
290
+ }
291
+ catch (err) {
292
+ return handleApiError(err);
293
+ }
294
+ },
295
+ },
296
+ ];
297
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "./index.js";
2
+ export declare const projectTools: ToolDefinition[];
3
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyCjD,eAAO,MAAM,YAAY,EAAE,cAAc,EA6LxC,CAAC"}
@@ -0,0 +1,233 @@
1
+ import { z } from "zod";
2
+ import { validate, handleApiError, NoInput } from "./validation.js";
3
+ const ProjectIdInput = z.object({
4
+ projectId: z.string().min(1).describe("Project UUID"),
5
+ });
6
+ const CreateProjectInput = z.object({
7
+ name: z.string().min(1).describe("Project name"),
8
+ description: z.string().optional().describe("Project description (markdown)"),
9
+ status: z.string().optional().describe("Initial status (default: active)"),
10
+ goalId: z.string().optional().describe("Goal UUID to link the project to"),
11
+ workspace: z
12
+ .object({
13
+ cwd: z.string().optional().describe("Local working directory path"),
14
+ repoUrl: z.string().optional().describe("Remote repository URL"),
15
+ })
16
+ .optional()
17
+ .describe("Optional workspace config to create alongside the project"),
18
+ });
19
+ const UpdateProjectInput = z.object({
20
+ projectId: z.string().min(1).describe("Project UUID"),
21
+ name: z.string().optional().describe("New name"),
22
+ description: z.string().optional().describe("New description (markdown)"),
23
+ status: z.string().optional().describe("New status"),
24
+ });
25
+ const CreateWorkspaceInput = z.object({
26
+ projectId: z.string().min(1).describe("Project UUID"),
27
+ cwd: z.string().optional().describe("Local working directory path"),
28
+ repoUrl: z.string().optional().describe("Remote repository URL"),
29
+ });
30
+ const UpdateWorkspaceInput = z.object({
31
+ projectId: z.string().min(1).describe("Project UUID"),
32
+ workspaceId: z.string().min(1).describe("Workspace UUID"),
33
+ cwd: z.string().optional().describe("New local working directory path"),
34
+ repoUrl: z.string().optional().describe("New remote repository URL"),
35
+ });
36
+ export const projectTools = [
37
+ {
38
+ name: "paperclip_list_projects",
39
+ description: "List projects for the current company.",
40
+ inputSchema: {
41
+ type: "object",
42
+ properties: {},
43
+ required: [],
44
+ },
45
+ annotations: { readOnlyHint: true, openWorldHint: false },
46
+ async handler(args, client) {
47
+ try {
48
+ validate(NoInput, args);
49
+ const data = await client.get(`/api/companies/${client.companyId}/projects`);
50
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
51
+ }
52
+ catch (err) {
53
+ return handleApiError(err);
54
+ }
55
+ },
56
+ },
57
+ {
58
+ name: "paperclip_get_project",
59
+ description: "Get a single project by ID, including its workspaces.",
60
+ inputSchema: {
61
+ type: "object",
62
+ properties: {
63
+ projectId: { type: "string", description: "Project UUID" },
64
+ },
65
+ required: ["projectId"],
66
+ },
67
+ annotations: { readOnlyHint: true, openWorldHint: false },
68
+ async handler(args, client) {
69
+ try {
70
+ const { projectId } = validate(ProjectIdInput, args);
71
+ const data = await client.get(`/api/projects/${projectId}`);
72
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
73
+ }
74
+ catch (err) {
75
+ return handleApiError(err);
76
+ }
77
+ },
78
+ },
79
+ {
80
+ name: "paperclip_create_project",
81
+ description: "Create a new project. Optionally include a workspace config. companyId is injected from auth config. Run ID header is injected automatically.",
82
+ inputSchema: {
83
+ type: "object",
84
+ properties: {
85
+ name: { type: "string", description: "Project name" },
86
+ description: { type: "string", description: "Project description (markdown)" },
87
+ status: { type: "string", description: "Initial status (default: active)" },
88
+ goalId: { type: "string", description: "Goal UUID to link the project to" },
89
+ workspace: {
90
+ type: "object",
91
+ description: "Optional workspace to create alongside the project",
92
+ properties: {
93
+ cwd: { type: "string", description: "Local working directory path" },
94
+ repoUrl: { type: "string", description: "Remote repository URL" },
95
+ },
96
+ },
97
+ },
98
+ required: ["name"],
99
+ },
100
+ annotations: { destructiveHint: false, openWorldHint: false },
101
+ async handler(args, client) {
102
+ try {
103
+ const input = validate(CreateProjectInput, args);
104
+ const body = { name: input.name };
105
+ if (input.description !== undefined)
106
+ body.description = input.description;
107
+ if (input.status !== undefined)
108
+ body.status = input.status;
109
+ if (input.goalId !== undefined)
110
+ body.goalId = input.goalId;
111
+ if (input.workspace !== undefined)
112
+ body.workspace = input.workspace;
113
+ const data = await client.post(`/api/companies/${client.companyId}/projects`, body);
114
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
115
+ }
116
+ catch (err) {
117
+ return handleApiError(err);
118
+ }
119
+ },
120
+ },
121
+ {
122
+ name: "paperclip_update_project",
123
+ description: "Update a project's name, description, or status. Run ID header is injected automatically.",
124
+ inputSchema: {
125
+ type: "object",
126
+ properties: {
127
+ projectId: { type: "string", description: "Project UUID" },
128
+ name: { type: "string", description: "New name" },
129
+ description: { type: "string", description: "New description (markdown)" },
130
+ status: { type: "string", description: "New status" },
131
+ },
132
+ required: ["projectId"],
133
+ },
134
+ annotations: { destructiveHint: true, openWorldHint: false },
135
+ async handler(args, client) {
136
+ try {
137
+ const { projectId, ...rest } = validate(UpdateProjectInput, args);
138
+ const body = {};
139
+ for (const [k, v] of Object.entries(rest)) {
140
+ if (v !== undefined)
141
+ body[k] = v;
142
+ }
143
+ const data = await client.patch(`/api/projects/${projectId}`, body);
144
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
145
+ }
146
+ catch (err) {
147
+ return handleApiError(err);
148
+ }
149
+ },
150
+ },
151
+ {
152
+ name: "paperclip_list_workspaces",
153
+ description: "List workspaces for a project.",
154
+ inputSchema: {
155
+ type: "object",
156
+ properties: {
157
+ projectId: { type: "string", description: "Project UUID" },
158
+ },
159
+ required: ["projectId"],
160
+ },
161
+ annotations: { readOnlyHint: true, openWorldHint: false },
162
+ async handler(args, client) {
163
+ try {
164
+ const { projectId } = validate(ProjectIdInput, args);
165
+ const data = await client.get(`/api/projects/${projectId}/workspaces`);
166
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
167
+ }
168
+ catch (err) {
169
+ return handleApiError(err);
170
+ }
171
+ },
172
+ },
173
+ {
174
+ name: "paperclip_create_workspace",
175
+ description: "Create a new workspace for a project. Provide at least one of cwd or repoUrl. Run ID header is injected automatically.",
176
+ inputSchema: {
177
+ type: "object",
178
+ properties: {
179
+ projectId: { type: "string", description: "Project UUID" },
180
+ cwd: { type: "string", description: "Local working directory path" },
181
+ repoUrl: { type: "string", description: "Remote repository URL" },
182
+ },
183
+ required: ["projectId"],
184
+ },
185
+ annotations: { destructiveHint: false, openWorldHint: false },
186
+ async handler(args, client) {
187
+ try {
188
+ const { projectId, cwd, repoUrl } = validate(CreateWorkspaceInput, args);
189
+ const body = {};
190
+ if (cwd !== undefined)
191
+ body.cwd = cwd;
192
+ if (repoUrl !== undefined)
193
+ body.repoUrl = repoUrl;
194
+ const data = await client.post(`/api/projects/${projectId}/workspaces`, body);
195
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
196
+ }
197
+ catch (err) {
198
+ return handleApiError(err);
199
+ }
200
+ },
201
+ },
202
+ {
203
+ name: "paperclip_update_workspace",
204
+ description: "Update a workspace's cwd or repoUrl. Run ID header is injected automatically.",
205
+ inputSchema: {
206
+ type: "object",
207
+ properties: {
208
+ projectId: { type: "string", description: "Project UUID" },
209
+ workspaceId: { type: "string", description: "Workspace UUID" },
210
+ cwd: { type: "string", description: "New local working directory path" },
211
+ repoUrl: { type: "string", description: "New remote repository URL" },
212
+ },
213
+ required: ["projectId", "workspaceId"],
214
+ },
215
+ annotations: { destructiveHint: true, openWorldHint: false },
216
+ async handler(args, client) {
217
+ try {
218
+ const { projectId, workspaceId, cwd, repoUrl } = validate(UpdateWorkspaceInput, args);
219
+ const body = {};
220
+ if (cwd !== undefined)
221
+ body.cwd = cwd;
222
+ if (repoUrl !== undefined)
223
+ body.repoUrl = repoUrl;
224
+ const data = await client.patch(`/api/projects/${projectId}/workspaces/${workspaceId}`, body);
225
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
226
+ }
227
+ catch (err) {
228
+ return handleApiError(err);
229
+ }
230
+ },
231
+ },
232
+ ];
233
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "./index.js";
2
+ export declare const routineTools: ToolDefinition[];
3
+ //# sourceMappingURL=routines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routines.d.ts","sourceRoot":"","sources":["../../src/tools/routines.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuDjD,eAAO,MAAM,YAAY,EAAE,cAAc,EAwPxC,CAAC"}