@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,77 @@
1
+ /**
2
+ * create_project tool - Create a project in a group
3
+ */
4
+ import { createProject, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'create_project',
8
+ description: 'Create a new project in a Clink group. Projects organize milestones and help track related work. Each project has a unique slug within the group.',
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
+ title: {
17
+ type: 'string',
18
+ description: 'Project title (required)',
19
+ },
20
+ description: {
21
+ type: 'string',
22
+ description: 'Project description (optional)',
23
+ },
24
+ slug: {
25
+ type: 'string',
26
+ description: 'URL-friendly identifier (optional, auto-generated from title if not provided)',
27
+ },
28
+ color: {
29
+ type: 'string',
30
+ description: 'Hex color for the project (optional, e.g., "#3B82F6")',
31
+ },
32
+ },
33
+ required: ['group', 'title'],
34
+ },
35
+ };
36
+ export async function handler(args) {
37
+ try {
38
+ const { group, title, description, slug, color } = args;
39
+ if (!group) {
40
+ const groups = await listGroups();
41
+ if (groups.length > 0) {
42
+ const groupList = groups.map((g) => `• ${g.slug} - "${g.name}"`).join('\n');
43
+ return `Please provide a group slug. Your groups:\n\n${groupList}`;
44
+ }
45
+ return 'Please provide a group slug. You are not a member of any groups.';
46
+ }
47
+ if (!title) {
48
+ return 'Please provide a project title.';
49
+ }
50
+ // Resolve slug or ID to group ID
51
+ const groupId = await resolveGroup(group);
52
+ const project = await createProject(groupId, {
53
+ title,
54
+ description,
55
+ slug,
56
+ color,
57
+ });
58
+ let output = `Project created successfully!\n\n`;
59
+ output += `Title: ${project.title}\n`;
60
+ output += `ID: ${project.project_id}\n`;
61
+ output += `Slug: ${project.slug}\n`;
62
+ output += `Color: ${project.color}\n`;
63
+ output += `Status: ${project.status}\n`;
64
+ if (project.description) {
65
+ output += `Description: ${project.description}\n`;
66
+ }
67
+ output += `\nYou can now create milestones in this project using create_milestone with project parameter.`;
68
+ return output;
69
+ }
70
+ catch (error) {
71
+ if (error instanceof ClinkApiError) {
72
+ return `Error: ${error.message}`;
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ //# sourceMappingURL=create_project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_project.js","sourceRoot":"","sources":["../../src/tools/create_project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,mJAAmJ;IAChK,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0BAA0B;aACxC;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAC9C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+EAA+E;aAC7F;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uDAAuD;aACrE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;KAC7B;CACF,CAAC;AAUF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAuB;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAExD,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,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,iCAAiC,CAAC;QAC3C,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE;YAC3C,KAAK;YACL,WAAW;YACX,IAAI;YACJ,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,mCAAmC,CAAC;QACjD,MAAM,IAAI,UAAU,OAAO,CAAC,KAAK,IAAI,CAAC;QACtC,MAAM,IAAI,OAAO,OAAO,CAAC,UAAU,IAAI,CAAC;QACxC,MAAM,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,CAAC;QACpC,MAAM,IAAI,UAAU,OAAO,CAAC,KAAK,IAAI,CAAC;QACtC,MAAM,IAAI,WAAW,OAAO,CAAC,MAAM,IAAI,CAAC;QACxC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,OAAO,CAAC,WAAW,IAAI,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,gGAAgG,CAAC;QAE3G,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,58 @@
1
+ /**
2
+ * create_proposal tool - Create a voting proposal
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
+ title: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ description: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ voting_type: {
23
+ type: string;
24
+ enum: string[];
25
+ description: string;
26
+ };
27
+ threshold_type: {
28
+ type: string;
29
+ enum: string[];
30
+ description: string;
31
+ };
32
+ options: {
33
+ type: string;
34
+ items: {
35
+ type: string;
36
+ };
37
+ description: string;
38
+ };
39
+ deadline_hours: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ };
44
+ required: string[];
45
+ };
46
+ };
47
+ interface CreateProposalArgs {
48
+ group: string;
49
+ title: string;
50
+ description?: string;
51
+ voting_type?: 'yes_no' | 'single' | 'ranked';
52
+ threshold_type?: 'majority' | 'two_thirds' | 'unanimous' | 'quorum';
53
+ options?: string[];
54
+ deadline_hours?: number;
55
+ }
56
+ export declare function handler(args: CreateProposalArgs): Promise<string>;
57
+ export {};
58
+ //# sourceMappingURL=create_proposal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_proposal.d.ts","sourceRoot":"","sources":["../../src/tools/create_proposal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCtB,CAAC;AAEF,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,cAAc,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DvE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * create_proposal tool - Create a voting proposal
3
+ */
4
+ import { createProposal, listGroups, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'create_proposal',
8
+ description: 'Create a voting proposal for group decision-making. Supports different voting types (yes/no, single choice, ranked) and threshold requirements.',
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
+ title: {
17
+ type: 'string',
18
+ description: 'Proposal title',
19
+ },
20
+ description: {
21
+ type: 'string',
22
+ description: 'Proposal description (optional)',
23
+ },
24
+ voting_type: {
25
+ type: 'string',
26
+ enum: ['yes_no', 'single', 'ranked'],
27
+ description: 'Type of voting: yes_no (approve/reject), single (choose one option), ranked (preference order). Default: yes_no',
28
+ },
29
+ threshold_type: {
30
+ type: 'string',
31
+ enum: ['majority', 'two_thirds', 'unanimous', 'quorum'],
32
+ description: 'Required threshold: majority (>50%), two_thirds (>=66%), unanimous (100%), quorum (>50% participation + majority). Default: majority',
33
+ },
34
+ options: {
35
+ type: 'array',
36
+ items: { type: 'string' },
37
+ description: 'Options for single/ranked voting (required for those types, ignored for yes_no)',
38
+ },
39
+ deadline_hours: {
40
+ type: 'number',
41
+ description: 'Optional deadline in hours from now',
42
+ },
43
+ },
44
+ required: ['group', 'title'],
45
+ },
46
+ };
47
+ export async function handler(args) {
48
+ try {
49
+ const { group, title, description, voting_type, threshold_type, options, deadline_hours } = 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
+ if (!title) {
59
+ return 'Please provide a proposal title.';
60
+ }
61
+ // Validate options for single/ranked voting
62
+ if (voting_type && voting_type !== 'yes_no') {
63
+ if (!options || options.length < 2) {
64
+ return `For ${voting_type} voting, you need at least 2 options.`;
65
+ }
66
+ }
67
+ // Resolve slug or ID to group ID
68
+ const groupId = await resolveGroup(group);
69
+ const proposal = await createProposal(groupId, {
70
+ title,
71
+ description,
72
+ voting_type,
73
+ threshold_type,
74
+ options,
75
+ deadline_hours,
76
+ });
77
+ let output = `Proposal created successfully!\n\n`;
78
+ output += `Title: ${proposal.title}\n`;
79
+ output += `ID: ${proposal.proposal_id}\n`;
80
+ output += `Status: ${proposal.status}\n`;
81
+ output += `Voting type: ${proposal.voting_type}\n`;
82
+ output += `Threshold: ${proposal.threshold_type}\n`;
83
+ if (proposal.options && proposal.options.length > 0) {
84
+ output += `\nOptions:\n`;
85
+ for (const opt of proposal.options) {
86
+ output += ` • ${opt}\n`;
87
+ }
88
+ }
89
+ if (proposal.deadline) {
90
+ output += `\nDeadline: ${new Date(proposal.deadline).toLocaleString()}`;
91
+ }
92
+ output += '\n\nGroup members can now vote using cast_vote.';
93
+ return output;
94
+ }
95
+ catch (error) {
96
+ if (error instanceof ClinkApiError) {
97
+ return `Error: ${error.message}`;
98
+ }
99
+ throw error;
100
+ }
101
+ }
102
+ //# sourceMappingURL=create_proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_proposal.js","sourceRoot":"","sources":["../../src/tools/create_proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * delete_checkpoint tool - Delete a checkpoint from a milestone
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ milestone_id: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ order: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ };
19
+ required: string[];
20
+ };
21
+ };
22
+ interface DeleteCheckpointArgs {
23
+ milestone_id: string;
24
+ order: number;
25
+ }
26
+ export declare function handler(args: DeleteCheckpointArgs): Promise<string>;
27
+ export {};
28
+ //# sourceMappingURL=delete_checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_checkpoint.d.ts","sourceRoot":"","sources":["../../src/tools/delete_checkpoint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;CAiBtB,CAAC;AAEF,UAAU,oBAAoB;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CzE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * delete_checkpoint tool - Delete a checkpoint from a milestone
3
+ */
4
+ import { deleteCheckpoint } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'delete_checkpoint',
8
+ description: 'Delete a checkpoint from a milestone. Cannot delete completed checkpoints or checkpoints that others depend on.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ milestone_id: {
13
+ type: 'string',
14
+ description: 'The milestone ID',
15
+ },
16
+ order: {
17
+ type: 'number',
18
+ description: 'The checkpoint order number (1-based) to delete',
19
+ },
20
+ },
21
+ required: ['milestone_id', 'order'],
22
+ },
23
+ };
24
+ export async function handler(args) {
25
+ try {
26
+ const { milestone_id, order } = args;
27
+ if (!milestone_id) {
28
+ return 'Please provide a milestone_id.';
29
+ }
30
+ if (!order || order < 1) {
31
+ return 'Please provide a valid checkpoint order (1 or greater).';
32
+ }
33
+ const milestone = await deleteCheckpoint(milestone_id, order);
34
+ let output = `Checkpoint ${order} deleted!\n\n`;
35
+ output += `Milestone: ${milestone.title}\n`;
36
+ output += `Progress: ${milestone.progress}\n`;
37
+ output += `Total checkpoints: ${milestone.total_checkpoints}\n\n`;
38
+ if (milestone.checkpoints && milestone.checkpoints.length > 0) {
39
+ output += `Remaining checkpoints:\n`;
40
+ for (const cp of milestone.checkpoints) {
41
+ const statusIcon = cp.status === 'completed' ? '[done]' : '[pending]';
42
+ output += ` ${cp.order}. ${cp.title} ${statusIcon}\n`;
43
+ }
44
+ }
45
+ else {
46
+ output += 'No checkpoints remaining.\n';
47
+ }
48
+ return output;
49
+ }
50
+ catch (error) {
51
+ if (error instanceof ClinkApiError) {
52
+ if (error.message.includes('depend on it')) {
53
+ return `Error: Cannot delete this checkpoint because other checkpoints depend on it. Remove the dependencies first.`;
54
+ }
55
+ if (error.message.includes('completed')) {
56
+ return `Error: Cannot delete a completed checkpoint.`;
57
+ }
58
+ if (error.message.includes('active proposal')) {
59
+ return `Error: Cannot delete a checkpoint with an active consensus proposal.`;
60
+ }
61
+ return `Error: ${error.message}`;
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ //# sourceMappingURL=delete_checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_checkpoint.js","sourceRoot":"","sources":["../../src/tools/delete_checkpoint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,iHAAiH;IAC9H,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kBAAkB;aAChC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iDAAiD;aAC/D;SACF;QACD,QAAQ,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC;KACpC;CACF,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA0B;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAErC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,gCAAgC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,yDAAyD,CAAC;QACnE,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAE9D,IAAI,MAAM,GAAG,cAAc,KAAK,eAAe,CAAC;QAChD,MAAM,IAAI,cAAc,SAAS,CAAC,KAAK,IAAI,CAAC;QAC5C,MAAM,IAAI,aAAa,SAAS,CAAC,QAAQ,IAAI,CAAC;QAC9C,MAAM,IAAI,sBAAsB,SAAS,CAAC,iBAAiB,MAAM,CAAC;QAElE,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,0BAA0B,CAAC;YACrC,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;gBACtE,MAAM,IAAI,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,IAAI,UAAU,IAAI,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,6BAA6B,CAAC;QAC1C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3C,OAAO,6GAA6G,CAAC;YACvH,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,OAAO,8CAA8C,CAAC;YACxD,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC9C,OAAO,sEAAsE,CAAC;YAChF,CAAC;YACD,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * finalize_proposal tool - Close voting and compute result
3
+ */
4
+ export declare const definition: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ proposal_id: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ total_eligible_voters: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ };
19
+ required: string[];
20
+ };
21
+ };
22
+ interface FinalizeProposalArgs {
23
+ proposal_id: string;
24
+ total_eligible_voters?: number;
25
+ }
26
+ export declare function handler(args: FinalizeProposalArgs): Promise<string>;
27
+ export {};
28
+ //# sourceMappingURL=finalize_proposal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize_proposal.d.ts","sourceRoot":"","sources":["../../src/tools/finalize_proposal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;CAiBtB,CAAC;AAEF,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmEzE"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * finalize_proposal tool - Close voting and compute result
3
+ */
4
+ import { finalizeProposal } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'finalize_proposal',
8
+ description: 'Close voting on a proposal and compute the final result. The result depends on the threshold type (majority, two-thirds, unanimous, quorum).',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ proposal_id: {
13
+ type: 'string',
14
+ description: 'The proposal ID',
15
+ },
16
+ total_eligible_voters: {
17
+ type: 'number',
18
+ description: 'Optional: total eligible voters for quorum calculation. If not provided, quorum is calculated based on votes cast.',
19
+ },
20
+ },
21
+ required: ['proposal_id'],
22
+ },
23
+ };
24
+ export async function handler(args) {
25
+ try {
26
+ const { proposal_id, total_eligible_voters } = args;
27
+ if (!proposal_id) {
28
+ return 'Please provide a proposal_id.';
29
+ }
30
+ const proposal = await finalizeProposal(proposal_id, { total_eligible_voters });
31
+ const resultEmoji = proposal.threshold_met ? '✅' : '❌';
32
+ let output = `${resultEmoji} Proposal Finalized\n`;
33
+ output += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
34
+ output += `Title: ${proposal.title}\n`;
35
+ output += `Result: ${proposal.result}\n`;
36
+ output += `Threshold met: ${proposal.threshold_met ? 'Yes' : 'No'}\n`;
37
+ output += `Total votes: ${proposal.vote_count}\n`;
38
+ // Show tally
39
+ if (proposal.tally) {
40
+ output += `\nFinal tally:\n`;
41
+ for (const [option, count] of Object.entries(proposal.tally)) {
42
+ const pct = proposal.vote_count ? Math.round(count / proposal.vote_count * 100) : 0;
43
+ output += ` ${option}: ${count} (${pct}%)\n`;
44
+ }
45
+ }
46
+ output += `\nThreshold type: ${proposal.threshold_type}`;
47
+ // Explain threshold result
48
+ if (proposal.voting_type === 'yes_no') {
49
+ const yesCount = proposal.tally?.yes || 0;
50
+ const totalVotes = proposal.vote_count || 0;
51
+ if (proposal.threshold_type === 'majority') {
52
+ output += `\n(Required: >50%, Got: ${Math.round(yesCount / totalVotes * 100)}%)`;
53
+ }
54
+ else if (proposal.threshold_type === 'two_thirds') {
55
+ output += `\n(Required: >=66.7%, Got: ${Math.round(yesCount / totalVotes * 100)}%)`;
56
+ }
57
+ else if (proposal.threshold_type === 'unanimous') {
58
+ output += `\n(Required: 100%, Got: ${Math.round(yesCount / totalVotes * 100)}%)`;
59
+ }
60
+ }
61
+ // If linked to milestone checkpoint
62
+ if (proposal.linked_milestone_id) {
63
+ output += `\n\nLinked milestone: ${proposal.linked_milestone_id}`;
64
+ if (proposal.linked_checkpoint_order) {
65
+ output += ` (checkpoint ${proposal.linked_checkpoint_order})`;
66
+ if (proposal.threshold_met) {
67
+ output += '\nCheckpoint can now be completed!';
68
+ }
69
+ else {
70
+ output += '\nCheckpoint remains blocked.';
71
+ }
72
+ }
73
+ }
74
+ return output;
75
+ }
76
+ catch (error) {
77
+ if (error instanceof ClinkApiError) {
78
+ if (error.message.includes('already been finalized')) {
79
+ return 'Error: This proposal has already been finalized.';
80
+ }
81
+ return `Error: ${error.message}`;
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ //# sourceMappingURL=finalize_proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize_proposal.js","sourceRoot":"","sources":["../../src/tools/finalize_proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * get_clinks tool - Retrieve clinks from groups
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
+ since: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ limit: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ unread_only: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ mark_read: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: never[];
32
+ };
33
+ };
34
+ interface GetClinksArgs {
35
+ group?: string;
36
+ since?: string;
37
+ limit?: number;
38
+ unread_only?: boolean;
39
+ mark_read?: boolean;
40
+ }
41
+ export declare function handler(args: GetClinksArgs): Promise<string>;
42
+ export {};
43
+ //# sourceMappingURL=get_clinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_clinks.d.ts","sourceRoot":"","sources":["../../src/tools/get_clinks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BtB,CAAC;AAEF,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAqBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DlE"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * get_clinks tool - Retrieve clinks from groups
3
+ */
4
+ import { getClinks, resolveGroup } from '../client.js';
5
+ import { ClinkApiError } from '../types.js';
6
+ export const definition = {
7
+ name: 'get_clinks',
8
+ description: 'Get clinks from Clink groups. Can filter by group, time range, and limit. Use check_inbox for a quick unread check.',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ group: {
13
+ type: 'string',
14
+ description: 'Filter clinks to a specific group by slug (e.g., "backend-team") or ID. If not provided, returns clinks from all your groups.',
15
+ },
16
+ since: {
17
+ type: 'string',
18
+ description: 'ISO timestamp. Only return clinks after this time. Example: 2024-01-15T10:00:00Z',
19
+ },
20
+ limit: {
21
+ type: 'number',
22
+ description: 'Maximum number of clinks to return. Default 50, max 100.',
23
+ },
24
+ unread_only: {
25
+ type: 'boolean',
26
+ description: 'If true, only return unread clinks. Default: false.',
27
+ },
28
+ mark_read: {
29
+ type: 'boolean',
30
+ description: 'If true, mark returned clinks as read. Default: false.',
31
+ },
32
+ },
33
+ required: [],
34
+ },
35
+ };
36
+ function formatClink(clink) {
37
+ const time = new Date(clink.created_at).toLocaleTimeString([], {
38
+ hour: '2-digit',
39
+ minute: '2-digit',
40
+ });
41
+ const groupInfo = clink.group_slug || clink.group_name || clink.group_id;
42
+ const preview = clink.content.substring(0, 100);
43
+ const truncated = clink.content.length > 100 ? '...' : '';
44
+ let output = `[${time}] ${clink.sender_name} in ${groupInfo}:\n${preview}${truncated}`;
45
+ output += `\nStatus: ${clink.status}`;
46
+ if (clink.for) {
47
+ output += ` | For: ${clink.for}`;
48
+ }
49
+ return output;
50
+ }
51
+ export async function handler(args) {
52
+ try {
53
+ // Resolve group slug to ID if provided
54
+ let groupId;
55
+ if (args.group) {
56
+ groupId = await resolveGroup(args.group);
57
+ }
58
+ const clinks = await getClinks({
59
+ groupId,
60
+ since: args.since,
61
+ limit: args.limit,
62
+ unreadOnly: args.unread_only,
63
+ markRead: args.mark_read,
64
+ });
65
+ if (clinks.length === 0) {
66
+ let msg = 'No clinks found';
67
+ if (args.group) {
68
+ msg += ` in group "${args.group}"`;
69
+ }
70
+ if (args.since) {
71
+ msg += ` since ${args.since}`;
72
+ }
73
+ if (args.unread_only) {
74
+ msg += ' (unread only)';
75
+ }
76
+ return msg + '.';
77
+ }
78
+ // Group clinks by group for display
79
+ const byGroup = new Map();
80
+ for (const clink of clinks) {
81
+ const key = clink.group_slug || clink.group_name || clink.group_id;
82
+ if (!byGroup.has(key)) {
83
+ byGroup.set(key, []);
84
+ }
85
+ byGroup.get(key).push(clink);
86
+ }
87
+ let output = `${clinks.length} clink(s) found`;
88
+ if (args.mark_read) {
89
+ output += ' (marked as read)';
90
+ }
91
+ output += ':\n\n';
92
+ for (const [group, groupClinks] of byGroup) {
93
+ output += `--- ${group} (${groupClinks.length}) ---\n\n`;
94
+ for (const clink of groupClinks) {
95
+ output += formatClink(clink) + '\n\n';
96
+ }
97
+ }
98
+ return output.trim();
99
+ }
100
+ catch (error) {
101
+ if (error instanceof ClinkApiError) {
102
+ if (error.statusCode === 404) {
103
+ return `Group not found: "${args.group}". Use list_groups to see available groups.`;
104
+ }
105
+ return `Error: ${error.message}`;
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ //# sourceMappingURL=get_clinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_clinks.js","sourceRoot":"","sources":["../../src/tools/get_clinks.ts"],"names":[],"mappings":"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"}