@voxos-ai/clink-mcp-server 0.4.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +382 -0
  3. package/dist/client.d.ts +285 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +414 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +95 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/add_checkpoint.d.ts +68 -0
  12. package/dist/tools/add_checkpoint.d.ts.map +1 -0
  13. package/dist/tools/add_checkpoint.js +108 -0
  14. package/dist/tools/add_checkpoint.js.map +1 -0
  15. package/dist/tools/archive_project.d.ts +23 -0
  16. package/dist/tools/archive_project.d.ts.map +1 -0
  17. package/dist/tools/archive_project.js +44 -0
  18. package/dist/tools/archive_project.js.map +1 -0
  19. package/dist/tools/cast_vote.d.ts +38 -0
  20. package/dist/tools/cast_vote.d.ts.map +1 -0
  21. package/dist/tools/cast_vote.js +148 -0
  22. package/dist/tools/cast_vote.js.map +1 -0
  23. package/dist/tools/check_inbox.d.ts +39 -0
  24. package/dist/tools/check_inbox.d.ts.map +1 -0
  25. package/dist/tools/check_inbox.js +99 -0
  26. package/dist/tools/check_inbox.js.map +1 -0
  27. package/dist/tools/claim_clink.d.ts +28 -0
  28. package/dist/tools/claim_clink.d.ts.map +1 -0
  29. package/dist/tools/claim_clink.js +51 -0
  30. package/dist/tools/claim_clink.js.map +1 -0
  31. package/dist/tools/complete_checkpoint.d.ts +33 -0
  32. package/dist/tools/complete_checkpoint.d.ts.map +1 -0
  33. package/dist/tools/complete_checkpoint.js +143 -0
  34. package/dist/tools/complete_checkpoint.js.map +1 -0
  35. package/dist/tools/complete_clink.d.ts +28 -0
  36. package/dist/tools/complete_clink.d.ts.map +1 -0
  37. package/dist/tools/complete_clink.js +50 -0
  38. package/dist/tools/complete_clink.js.map +1 -0
  39. package/dist/tools/complete_project.d.ts +23 -0
  40. package/dist/tools/complete_project.d.ts.map +1 -0
  41. package/dist/tools/complete_project.js +44 -0
  42. package/dist/tools/complete_project.js.map +1 -0
  43. package/dist/tools/create_milestone.d.ts +91 -0
  44. package/dist/tools/create_milestone.d.ts.map +1 -0
  45. package/dist/tools/create_milestone.js +114 -0
  46. package/dist/tools/create_milestone.js.map +1 -0
  47. package/dist/tools/create_project.d.ts +43 -0
  48. package/dist/tools/create_project.d.ts.map +1 -0
  49. package/dist/tools/create_project.js +77 -0
  50. package/dist/tools/create_project.js.map +1 -0
  51. package/dist/tools/create_proposal.d.ts +58 -0
  52. package/dist/tools/create_proposal.d.ts.map +1 -0
  53. package/dist/tools/create_proposal.js +102 -0
  54. package/dist/tools/create_proposal.js.map +1 -0
  55. package/dist/tools/delete_checkpoint.d.ts +28 -0
  56. package/dist/tools/delete_checkpoint.d.ts.map +1 -0
  57. package/dist/tools/delete_checkpoint.js +66 -0
  58. package/dist/tools/delete_checkpoint.js.map +1 -0
  59. package/dist/tools/finalize_proposal.d.ts +28 -0
  60. package/dist/tools/finalize_proposal.d.ts.map +1 -0
  61. package/dist/tools/finalize_proposal.js +86 -0
  62. package/dist/tools/finalize_proposal.js.map +1 -0
  63. package/dist/tools/get_clinks.d.ts +43 -0
  64. package/dist/tools/get_clinks.d.ts.map +1 -0
  65. package/dist/tools/get_clinks.js +110 -0
  66. package/dist/tools/get_clinks.js.map +1 -0
  67. package/dist/tools/get_milestone.d.ts +23 -0
  68. package/dist/tools/get_milestone.d.ts.map +1 -0
  69. package/dist/tools/get_milestone.js +77 -0
  70. package/dist/tools/get_milestone.js.map +1 -0
  71. package/dist/tools/get_my_permissions.d.ts +14 -0
  72. package/dist/tools/get_my_permissions.d.ts.map +1 -0
  73. package/dist/tools/get_my_permissions.js +80 -0
  74. package/dist/tools/get_my_permissions.js.map +1 -0
  75. package/dist/tools/get_project.d.ts +23 -0
  76. package/dist/tools/get_project.d.ts.map +1 -0
  77. package/dist/tools/get_project.js +88 -0
  78. package/dist/tools/get_project.js.map +1 -0
  79. package/dist/tools/get_proposal.d.ts +23 -0
  80. package/dist/tools/get_proposal.d.ts.map +1 -0
  81. package/dist/tools/get_proposal.js +102 -0
  82. package/dist/tools/get_proposal.js.map +1 -0
  83. package/dist/tools/index.d.ts +17 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +89 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/list_groups.d.ts +14 -0
  88. package/dist/tools/list_groups.d.ts.map +1 -0
  89. package/dist/tools/list_groups.js +35 -0
  90. package/dist/tools/list_groups.js.map +1 -0
  91. package/dist/tools/list_members.d.ts +23 -0
  92. package/dist/tools/list_members.d.ts.map +1 -0
  93. package/dist/tools/list_members.js +52 -0
  94. package/dist/tools/list_members.js.map +1 -0
  95. package/dist/tools/list_milestones.d.ts +34 -0
  96. package/dist/tools/list_milestones.d.ts.map +1 -0
  97. package/dist/tools/list_milestones.js +78 -0
  98. package/dist/tools/list_milestones.js.map +1 -0
  99. package/dist/tools/list_pending_verifications.d.ts +28 -0
  100. package/dist/tools/list_pending_verifications.d.ts.map +1 -0
  101. package/dist/tools/list_pending_verifications.js +83 -0
  102. package/dist/tools/list_pending_verifications.js.map +1 -0
  103. package/dist/tools/list_projects.d.ts +34 -0
  104. package/dist/tools/list_projects.d.ts.map +1 -0
  105. package/dist/tools/list_projects.js +92 -0
  106. package/dist/tools/list_projects.js.map +1 -0
  107. package/dist/tools/list_proposals.d.ts +34 -0
  108. package/dist/tools/list_proposals.d.ts.map +1 -0
  109. package/dist/tools/list_proposals.js +86 -0
  110. package/dist/tools/list_proposals.js.map +1 -0
  111. package/dist/tools/release_clink.d.ts +23 -0
  112. package/dist/tools/release_clink.d.ts.map +1 -0
  113. package/dist/tools/release_clink.js +42 -0
  114. package/dist/tools/release_clink.js.map +1 -0
  115. package/dist/tools/reopen_milestone.d.ts +23 -0
  116. package/dist/tools/reopen_milestone.d.ts.map +1 -0
  117. package/dist/tools/reopen_milestone.js +54 -0
  118. package/dist/tools/reopen_milestone.js.map +1 -0
  119. package/dist/tools/reopen_project.d.ts +23 -0
  120. package/dist/tools/reopen_project.d.ts.map +1 -0
  121. package/dist/tools/reopen_project.js +44 -0
  122. package/dist/tools/reopen_project.js.map +1 -0
  123. package/dist/tools/send_clink.d.ts +33 -0
  124. package/dist/tools/send_clink.d.ts.map +1 -0
  125. package/dist/tools/send_clink.js +64 -0
  126. package/dist/tools/send_clink.js.map +1 -0
  127. package/dist/tools/submit_feedback.d.ts +38 -0
  128. package/dist/tools/submit_feedback.d.ts.map +1 -0
  129. package/dist/tools/submit_feedback.js +93 -0
  130. package/dist/tools/submit_feedback.js.map +1 -0
  131. package/dist/tools/update_checkpoint.d.ts +63 -0
  132. package/dist/tools/update_checkpoint.d.ts.map +1 -0
  133. package/dist/tools/update_checkpoint.js +105 -0
  134. package/dist/tools/update_checkpoint.js.map +1 -0
  135. package/dist/tools/update_milestone.d.ts +33 -0
  136. package/dist/tools/update_milestone.d.ts.map +1 -0
  137. package/dist/tools/update_milestone.js +62 -0
  138. package/dist/tools/update_milestone.js.map +1 -0
  139. package/dist/tools/update_project.d.ts +43 -0
  140. package/dist/tools/update_project.d.ts.map +1 -0
  141. package/dist/tools/update_project.js +74 -0
  142. package/dist/tools/update_project.js.map +1 -0
  143. package/dist/types.d.ts +236 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +24 -0
  146. package/dist/types.js.map +1 -0
  147. package/package.json +49 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * list_groups tool - List all groups the user belongs to
3
+ */
4
+ import { listGroups } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_groups',
8
+ description: 'List all Clink groups you belong to. Returns group slugs, names, descriptions, and your role in each.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {},
12
+ required: [],
13
+ },
14
+ };
15
+ export async function handler() {
16
+ try {
17
+ const groups = await listGroups();
18
+ if (groups.length === 0) {
19
+ return 'You are not a member of any groups yet. Create a group at https://app.clink.voxos.ai or ask someone to invite you.';
20
+ }
21
+ const lines = groups.map((g) => {
22
+ const role = g.role ? ` (${g.role})` : '';
23
+ const desc = g.description ? ` - ${g.description}` : '';
24
+ return `• ${g.slug}${role}${desc}\n Name: "${g.name}"`;
25
+ });
26
+ return `Your groups (${groups.length}):\n\n${lines.join('\n\n')}`;
27
+ }
28
+ catch (error) {
29
+ if (error instanceof ClinkApiError) {
30
+ return `Error: ${error.message}`;
31
+ }
32
+ throw error;
33
+ }
34
+ }
35
+ //# sourceMappingURL=list_groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_groups.js","sourceRoot":"","sources":["../../src/tools/list_groups.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uGAAuG;IACpH,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,oHAAoH,CAAC;QAC9H,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,cAAc,CAAC,CAAC,IAAI,GAAG,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,OAAO,gBAAgB,MAAM,CAAC,MAAM,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * list_members tool - List members of a specific group
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ group: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ };
15
+ required: string[];
16
+ };
17
+ };
18
+ interface ListMembersArgs {
19
+ group: string;
20
+ }
21
+ export declare function handler(args: ListMembersArgs): Promise<string>;
22
+ export {};
23
+ //# sourceMappingURL=list_members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_members.d.ts","sourceRoot":"","sources":["../../src/tools/list_members.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;CAatB,CAAC;AAEF,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCpE"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * list_members tool - List members of a specific group
3
+ */
4
+ import { listMembers, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_members',
8
+ description: 'List all members of a Clink group. Shows member names, roles, and when they joined.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'The group slug (e.g., "backend-team") or group ID',
15
+ },
16
+ },
17
+ required: ['group'],
18
+ },
19
+ };
20
+ export async function handler(args) {
21
+ try {
22
+ const { group } = args;
23
+ if (!group) {
24
+ // Try to help by listing available groups
25
+ const groups = await listGroups();
26
+ if (groups.length > 0) {
27
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
28
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
29
+ }
30
+ return 'Please provide a group slug. You are not a member of any groups.';
31
+ }
32
+ // Resolve slug or ID to group ID
33
+ const groupId = await resolveGroup(group);
34
+ const members = await listMembers(groupId);
35
+ if (members.length === 0) {
36
+ return 'This group has no members.';
37
+ }
38
+ const lines = members.map((m) => {
39
+ const role = m.role === 'admin' ? ' (admin)' : '';
40
+ const joined = new Date(m.joined_at).toLocaleDateString();
41
+ return `• ${m.name || m.email || m.user_id}${role}\n Joined: ${joined}`;
42
+ });
43
+ return `Group members (${members.length}):\n\n${lines.join('\n\n')}`;
44
+ }
45
+ catch (error) {
46
+ if (error instanceof ClinkApiError) {
47
+ return `Error: ${error.message}`;
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ //# sourceMappingURL=list_members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_members.js","sourceRoot":"","sources":["../../src/tools/list_members.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,qFAAqF;IAClG,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAqB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,0CAA0C;YAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5E,OAAO,gDAAgD,SAAS,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,kEAAkE,CAAC;QAC5E,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,4BAA4B,CAAC;QACtC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,eAAe,MAAM,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,OAAO,kBAAkB,OAAO,CAAC,MAAM,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * list_milestones tool - List milestones for a group
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ group: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ status: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ limit: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: string[];
25
+ };
26
+ };
27
+ interface ListMilestonesArgs {
28
+ group: string;
29
+ status?: 'active' | 'closed';
30
+ limit?: number;
31
+ }
32
+ export declare function handler(args: ListMilestonesArgs): Promise<string>;
33
+ export {};
34
+ //# sourceMappingURL=list_milestones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_milestones.d.ts","sourceRoot":"","sources":["../../src/tools/list_milestones.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;AAEF,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD,wBAAsB,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CvE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * list_milestones tool - List milestones for a group
3
+ */
4
+ import { listMilestones, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_milestones',
8
+ description: 'List milestones for a Clink group. Shows progress and status of each milestone.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'The group slug (e.g., "backend-team") or group ID',
15
+ },
16
+ status: {
17
+ type: 'string',
18
+ enum: ['active', 'closed'],
19
+ description: 'Filter by status: active (in progress) or closed (completed). Default: all.',
20
+ },
21
+ limit: {
22
+ type: 'number',
23
+ description: 'Maximum milestones to return (default: 20)',
24
+ },
25
+ },
26
+ required: ['group'],
27
+ },
28
+ };
29
+ function formatMilestone(m) {
30
+ const statusEmoji = m.status === 'active' ? '🔄' : '✅';
31
+ let line = `${statusEmoji} ${m.title} [${m.progress}]`;
32
+ line += `\n ID: ${m.milestone_id}`;
33
+ line += `\n Created: ${new Date(m.created_at).toLocaleDateString()}`;
34
+ if (m.closed_at) {
35
+ line += `\n Closed: ${new Date(m.closed_at).toLocaleDateString()}`;
36
+ }
37
+ return line;
38
+ }
39
+ export async function handler(args) {
40
+ try {
41
+ const { group, status, limit } = args;
42
+ if (!group) {
43
+ const groups = await listGroups();
44
+ if (groups.length > 0) {
45
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
46
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
47
+ }
48
+ return 'Please provide a group slug. You are not a member of any groups.';
49
+ }
50
+ // Resolve slug or ID to group ID
51
+ const groupId = await resolveGroup(group);
52
+ const milestones = await listMilestones(groupId, {
53
+ status,
54
+ limit: limit || 20,
55
+ });
56
+ if (milestones.length === 0) {
57
+ const statusText = status ? ` ${status}` : '';
58
+ return `No${statusText} milestones found in this group.`;
59
+ }
60
+ const activeCount = milestones.filter(m => m.status === 'active').length;
61
+ const closedCount = milestones.filter(m => m.status === 'closed').length;
62
+ let output = `${milestones.length} milestone(s) found`;
63
+ if (activeCount > 0 || closedCount > 0) {
64
+ output += ` (${activeCount} active, ${closedCount} closed)`;
65
+ }
66
+ output += '\n\n';
67
+ output += milestones.map(formatMilestone).join('\n\n');
68
+ output += '\n\nUse get_milestone with the ID to see checkpoint details.';
69
+ return output;
70
+ }
71
+ catch (error) {
72
+ if (error instanceof ClinkApiError) {
73
+ return `Error: ${error.message}`;
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ //# sourceMappingURL=list_milestones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_milestones.js","sourceRoot":"","sources":["../../src/tools/list_milestones.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iFAAiF;IAC9F,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAC1B,WAAW,EAAE,6EAA6E;aAC3F;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAQF,SAAS,eAAe,CAAC,CAAY;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,IAAI,IAAI,GAAG,GAAG,WAAW,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;IACvD,IAAI,IAAI,YAAY,CAAC,CAAC,YAAY,EAAE,CAAC;IACrC,IAAI,IAAI,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACvE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,IAAI,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAwB;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5E,OAAO,gDAAgD,SAAS,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,kEAAkE,CAAC;QAC5E,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;YAC/C,MAAM;YACN,KAAK,EAAE,KAAK,IAAI,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,UAAU,kCAAkC,CAAC;QAC3D,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAEzE,IAAI,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,qBAAqB,CAAC;QACvD,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,WAAW,YAAY,WAAW,UAAU,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,MAAM,CAAC;QAEjB,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,IAAI,8DAA8D,CAAC;QAEzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * list_pending_verifications tool - List pending HIL verifications for a group
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ group: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ limit: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ };
19
+ required: string[];
20
+ };
21
+ };
22
+ interface ListPendingVerificationsArgs {
23
+ group: string;
24
+ limit?: number;
25
+ }
26
+ export declare function handler(args: ListPendingVerificationsArgs): Promise<string>;
27
+ export {};
28
+ //# sourceMappingURL=list_pending_verifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_pending_verifications.d.ts","sourceRoot":"","sources":["../../src/tools/list_pending_verifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;CAiBtB,CAAC;AAEF,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CjF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * list_pending_verifications tool - List pending HIL verifications for a group
3
+ */
4
+ import { listPendingVerifications, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_pending_verifications',
8
+ description: 'List pending Human-in-the-Loop (HIL) verifications for a group. Shows checkpoints and votes awaiting human approval.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'The group slug (e.g., "backend-team") or group ID',
15
+ },
16
+ limit: {
17
+ type: 'number',
18
+ description: 'Maximum verifications to return (default: 50)',
19
+ },
20
+ },
21
+ required: ['group'],
22
+ },
23
+ };
24
+ function formatVerification(v) {
25
+ const typeEmoji = v.target_type === 'checkpoint' ? '✓' : '🗳️';
26
+ let line = `${typeEmoji} ${v.target_type === 'checkpoint' ? v.checkpoint_title : v.proposal_title}`;
27
+ line += `\n Verification ID: ${v.verification_id}`;
28
+ if (v.target_type === 'checkpoint') {
29
+ line += `\n Milestone: ${v.milestone_title}`;
30
+ line += `\n Checkpoint: #${v.checkpoint_order}`;
31
+ }
32
+ else {
33
+ line += `\n Proposal ID: ${v.proposal_id}`;
34
+ if (v.voting_type) {
35
+ line += `\n Voting type: ${v.voting_type}`;
36
+ }
37
+ }
38
+ line += `\n Requested by: ${v.requester_name || v.requested_by}`;
39
+ line += `\n Requested at: ${new Date(v.requested_at).toLocaleString()}`;
40
+ line += `\n Expires at: ${new Date(v.expires_at).toLocaleString()}`;
41
+ return line;
42
+ }
43
+ export async function handler(args) {
44
+ try {
45
+ const { group, limit } = args;
46
+ if (!group) {
47
+ const groups = await listGroups();
48
+ if (groups.length > 0) {
49
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
50
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
51
+ }
52
+ return 'Please provide a group slug. You are not a member of any groups.';
53
+ }
54
+ // Resolve slug or ID to group ID
55
+ const groupId = await resolveGroup(group);
56
+ const verifications = await listPendingVerifications(groupId, limit || 50);
57
+ if (verifications.length === 0) {
58
+ return 'No pending HIL verifications found in this group. All actions are either completed or awaiting agent action.';
59
+ }
60
+ const checkpointCount = verifications.filter(v => v.target_type === 'checkpoint').length;
61
+ const voteCount = verifications.filter(v => v.target_type === 'vote').length;
62
+ let output = `${verifications.length} pending verification(s) awaiting human approval`;
63
+ if (checkpointCount > 0 || voteCount > 0) {
64
+ const parts = [];
65
+ if (checkpointCount > 0)
66
+ parts.push(`${checkpointCount} checkpoint(s)`);
67
+ if (voteCount > 0)
68
+ parts.push(`${voteCount} vote(s)`);
69
+ output += ` (${parts.join(', ')})`;
70
+ }
71
+ output += '\n\n';
72
+ output += verifications.map(formatVerification).join('\n\n');
73
+ output += '\n\nThese items require a human to click the verification link sent via email.';
74
+ return output;
75
+ }
76
+ catch (error) {
77
+ if (error instanceof ClinkApiError) {
78
+ return `Error: ${error.message}`;
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+ //# sourceMappingURL=list_pending_verifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_pending_verifications.js","sourceRoot":"","sources":["../../src/tools/list_pending_verifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * list_projects tool - List projects for a group
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ group: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ status: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ limit: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: string[];
25
+ };
26
+ };
27
+ interface ListProjectsArgs {
28
+ group: string;
29
+ status?: 'active' | 'completed' | 'archived';
30
+ limit?: number;
31
+ }
32
+ export declare function handler(args: ListProjectsArgs): Promise<string>;
33
+ export {};
34
+ //# sourceMappingURL=list_projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_projects.d.ts","sourceRoot":"","sources":["../../src/tools/list_projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;AAEF,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDrE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * list_projects tool - List projects for a group
3
+ */
4
+ import { listProjects, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_projects',
8
+ description: 'List projects for a Clink group. Shows status and milestone organization.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'The group slug (e.g., "backend-team") or group ID',
15
+ },
16
+ status: {
17
+ type: 'string',
18
+ enum: ['active', 'completed', 'archived'],
19
+ description: 'Filter by status. Default: all.',
20
+ },
21
+ limit: {
22
+ type: 'number',
23
+ description: 'Maximum projects to return (default: 50)',
24
+ },
25
+ },
26
+ required: ['group'],
27
+ },
28
+ };
29
+ function formatProject(p) {
30
+ const statusEmoji = p.status === 'active' ? '🟢' : p.status === 'completed' ? '✅' : '📦';
31
+ const defaultBadge = p.is_default ? ' [default]' : '';
32
+ let line = `${statusEmoji} ${p.title}${defaultBadge}`;
33
+ line += `\n ID: ${p.project_id}`;
34
+ line += `\n Slug: ${p.slug}`;
35
+ line += `\n Color: ${p.color}`;
36
+ line += `\n Created: ${new Date(p.created_at).toLocaleDateString()}`;
37
+ if (p.completed_at) {
38
+ line += `\n Completed: ${new Date(p.completed_at).toLocaleDateString()}`;
39
+ }
40
+ if (p.archived_at) {
41
+ line += `\n Archived: ${new Date(p.archived_at).toLocaleDateString()}`;
42
+ }
43
+ return line;
44
+ }
45
+ export async function handler(args) {
46
+ try {
47
+ const { group, status, limit } = args;
48
+ if (!group) {
49
+ const groups = await listGroups();
50
+ if (groups.length > 0) {
51
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
52
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
53
+ }
54
+ return 'Please provide a group slug. You are not a member of any groups.';
55
+ }
56
+ // Resolve slug or ID to group ID
57
+ const groupId = await resolveGroup(group);
58
+ const projects = await listProjects(groupId, {
59
+ status,
60
+ limit: limit || 50,
61
+ });
62
+ if (projects.length === 0) {
63
+ const statusText = status ? ` ${status}` : '';
64
+ return `No${statusText} projects found in this group.`;
65
+ }
66
+ const activeCount = projects.filter(p => p.status === 'active').length;
67
+ const completedCount = projects.filter(p => p.status === 'completed').length;
68
+ const archivedCount = projects.filter(p => p.status === 'archived').length;
69
+ let output = `${projects.length} project(s) found`;
70
+ const counts = [];
71
+ if (activeCount > 0)
72
+ counts.push(`${activeCount} active`);
73
+ if (completedCount > 0)
74
+ counts.push(`${completedCount} completed`);
75
+ if (archivedCount > 0)
76
+ counts.push(`${archivedCount} archived`);
77
+ if (counts.length > 0) {
78
+ output += ` (${counts.join(', ')})`;
79
+ }
80
+ output += '\n\n';
81
+ output += projects.map(formatProject).join('\n\n');
82
+ output += '\n\nUse get_project with the ID to see project details, or list_milestones with the group to see milestones.';
83
+ return output;
84
+ }
85
+ catch (error) {
86
+ if (error instanceof ClinkApiError) {
87
+ return `Error: ${error.message}`;
88
+ }
89
+ throw error;
90
+ }
91
+ }
92
+ //# sourceMappingURL=list_projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_projects.js","sourceRoot":"","sources":["../../src/tools/list_projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * list_proposals tool - List proposals for a group
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ group: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ status: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ limit: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: string[];
25
+ };
26
+ };
27
+ interface ListProposalsArgs {
28
+ group: string;
29
+ status?: 'open' | 'finalized';
30
+ limit?: number;
31
+ }
32
+ export declare function handler(args: ListProposalsArgs): Promise<string>;
33
+ export {};
34
+ //# sourceMappingURL=list_proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_proposals.d.ts","sourceRoot":"","sources":["../../src/tools/list_proposals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;AAEF,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CtE"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * list_proposals tool - List proposals for a group
3
+ */
4
+ import { listProposals, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'list_proposals',
8
+ description: 'List voting proposals for a Clink group. Shows status and vote counts.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'The group slug (e.g., "backend-team") or group ID',
15
+ },
16
+ status: {
17
+ type: 'string',
18
+ enum: ['open', 'finalized'],
19
+ description: 'Filter by status: open (voting in progress) or finalized (voting closed). Default: all.',
20
+ },
21
+ limit: {
22
+ type: 'number',
23
+ description: 'Maximum proposals to return (default: 20)',
24
+ },
25
+ },
26
+ required: ['group'],
27
+ },
28
+ };
29
+ function formatProposal(p) {
30
+ const statusEmoji = p.status === 'open' ? '🗳️' : (p.threshold_met ? '✅' : '❌');
31
+ let line = `${statusEmoji} ${p.title}`;
32
+ if (p.status === 'finalized') {
33
+ line += ` [${p.result}${p.threshold_met ? ' - passed' : ' - not passed'}]`;
34
+ }
35
+ else {
36
+ line += ` [${p.vote_count || 0} votes]`;
37
+ }
38
+ line += `\n ID: ${p.proposal_id}`;
39
+ line += `\n Type: ${p.voting_type}, Threshold: ${p.threshold_type}`;
40
+ if (p.deadline) {
41
+ const deadline = new Date(p.deadline);
42
+ const isPast = deadline < new Date();
43
+ line += `\n Deadline: ${deadline.toLocaleString()}${isPast ? ' (passed)' : ''}`;
44
+ }
45
+ return line;
46
+ }
47
+ export async function handler(args) {
48
+ try {
49
+ const { group, status, limit } = args;
50
+ if (!group) {
51
+ const groups = await listGroups();
52
+ if (groups.length > 0) {
53
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
54
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
55
+ }
56
+ return 'Please provide a group slug. You are not a member of any groups.';
57
+ }
58
+ // Resolve slug or ID to group ID
59
+ const groupId = await resolveGroup(group);
60
+ const proposals = await listProposals(groupId, {
61
+ status,
62
+ limit: limit || 20,
63
+ });
64
+ if (proposals.length === 0) {
65
+ const statusText = status ? ` ${status}` : '';
66
+ return `No${statusText} proposals found in this group.`;
67
+ }
68
+ const openCount = proposals.filter(p => p.status === 'open').length;
69
+ const finalizedCount = proposals.filter(p => p.status === 'finalized').length;
70
+ let output = `${proposals.length} proposal(s) found`;
71
+ if (openCount > 0 || finalizedCount > 0) {
72
+ output += ` (${openCount} open, ${finalizedCount} finalized)`;
73
+ }
74
+ output += '\n\n';
75
+ output += proposals.map(formatProposal).join('\n\n');
76
+ output += '\n\nUse get_proposal with the ID to see vote details.';
77
+ return output;
78
+ }
79
+ catch (error) {
80
+ if (error instanceof ClinkApiError) {
81
+ return `Error: ${error.message}`;
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ //# sourceMappingURL=list_proposals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_proposals.js","sourceRoot":"","sources":["../../src/tools/list_proposals.ts"],"names":[],"mappings":"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"}