@vibescope/mcp-server 0.0.1 → 0.1.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 (170) hide show
  1. package/README.md +113 -98
  2. package/dist/api-client.d.ts +1114 -0
  3. package/dist/api-client.js +698 -0
  4. package/dist/cli.d.ts +1 -6
  5. package/dist/cli.js +39 -240
  6. package/dist/config/tool-categories.d.ts +31 -0
  7. package/dist/config/tool-categories.js +253 -0
  8. package/dist/handlers/blockers.js +57 -58
  9. package/dist/handlers/bodies-of-work.d.ts +2 -0
  10. package/dist/handlers/bodies-of-work.js +106 -476
  11. package/dist/handlers/cost.d.ts +1 -0
  12. package/dist/handlers/cost.js +35 -113
  13. package/dist/handlers/decisions.d.ts +2 -0
  14. package/dist/handlers/decisions.js +28 -27
  15. package/dist/handlers/deployment.js +112 -828
  16. package/dist/handlers/discovery.js +31 -0
  17. package/dist/handlers/fallback.d.ts +2 -0
  18. package/dist/handlers/fallback.js +39 -134
  19. package/dist/handlers/findings.js +43 -67
  20. package/dist/handlers/git-issues.d.ts +9 -13
  21. package/dist/handlers/git-issues.js +80 -225
  22. package/dist/handlers/ideas.d.ts +3 -0
  23. package/dist/handlers/ideas.js +53 -134
  24. package/dist/handlers/index.d.ts +2 -0
  25. package/dist/handlers/index.js +6 -0
  26. package/dist/handlers/milestones.d.ts +2 -0
  27. package/dist/handlers/milestones.js +51 -98
  28. package/dist/handlers/organizations.js +79 -275
  29. package/dist/handlers/progress.d.ts +2 -0
  30. package/dist/handlers/progress.js +25 -123
  31. package/dist/handlers/project.js +42 -221
  32. package/dist/handlers/requests.d.ts +2 -0
  33. package/dist/handlers/requests.js +23 -83
  34. package/dist/handlers/session.js +99 -585
  35. package/dist/handlers/sprints.d.ts +32 -0
  36. package/dist/handlers/sprints.js +274 -0
  37. package/dist/handlers/tasks.d.ts +7 -10
  38. package/dist/handlers/tasks.js +230 -900
  39. package/dist/handlers/tool-docs.d.ts +8 -0
  40. package/dist/handlers/tool-docs.js +657 -0
  41. package/dist/handlers/types.d.ts +11 -3
  42. package/dist/handlers/validation.d.ts +1 -1
  43. package/dist/handlers/validation.js +26 -153
  44. package/dist/index.js +473 -160
  45. package/dist/knowledge.js +106 -9
  46. package/dist/tools.js +4 -0
  47. package/dist/validators.d.ts +21 -0
  48. package/dist/validators.js +91 -0
  49. package/package.json +2 -3
  50. package/src/api-client.ts +1752 -0
  51. package/src/cli.test.ts +128 -302
  52. package/src/cli.ts +41 -285
  53. package/src/handlers/__test-setup__.ts +210 -0
  54. package/src/handlers/__test-utils__.ts +4 -134
  55. package/src/handlers/blockers.test.ts +114 -124
  56. package/src/handlers/blockers.ts +68 -70
  57. package/src/handlers/bodies-of-work.test.ts +236 -831
  58. package/src/handlers/bodies-of-work.ts +194 -525
  59. package/src/handlers/cost.test.ts +149 -113
  60. package/src/handlers/cost.ts +44 -132
  61. package/src/handlers/decisions.test.ts +111 -209
  62. package/src/handlers/decisions.ts +35 -27
  63. package/src/handlers/deployment.test.ts +193 -239
  64. package/src/handlers/deployment.ts +140 -895
  65. package/src/handlers/discovery.test.ts +20 -67
  66. package/src/handlers/discovery.ts +32 -0
  67. package/src/handlers/fallback.test.ts +128 -361
  68. package/src/handlers/fallback.ts +62 -148
  69. package/src/handlers/findings.test.ts +127 -345
  70. package/src/handlers/findings.ts +49 -66
  71. package/src/handlers/git-issues.test.ts +623 -0
  72. package/src/handlers/git-issues.ts +174 -0
  73. package/src/handlers/ideas.test.ts +229 -343
  74. package/src/handlers/ideas.ts +69 -143
  75. package/src/handlers/index.ts +6 -0
  76. package/src/handlers/milestones.test.ts +167 -281
  77. package/src/handlers/milestones.ts +54 -93
  78. package/src/handlers/organizations.test.ts +275 -467
  79. package/src/handlers/organizations.ts +84 -294
  80. package/src/handlers/progress.test.ts +112 -218
  81. package/src/handlers/progress.ts +29 -142
  82. package/src/handlers/project.test.ts +203 -226
  83. package/src/handlers/project.ts +48 -238
  84. package/src/handlers/requests.test.ts +74 -342
  85. package/src/handlers/requests.ts +25 -83
  86. package/src/handlers/session.test.ts +241 -206
  87. package/src/handlers/session.ts +110 -657
  88. package/src/handlers/sprints.test.ts +711 -0
  89. package/src/handlers/sprints.ts +497 -0
  90. package/src/handlers/tasks.test.ts +608 -353
  91. package/src/handlers/tasks.ts +248 -1025
  92. package/src/handlers/types.ts +12 -4
  93. package/src/handlers/validation.test.ts +189 -572
  94. package/src/handlers/validation.ts +29 -166
  95. package/src/index.ts +473 -184
  96. package/src/knowledge.ts +107 -9
  97. package/src/tools.ts +2506 -0
  98. package/src/validators.test.ts +223 -223
  99. package/src/validators.ts +127 -0
  100. package/tsconfig.json +1 -1
  101. package/vitest.config.ts +14 -13
  102. package/dist/cli.test.d.ts +0 -1
  103. package/dist/cli.test.js +0 -367
  104. package/dist/handlers/__test-utils__.d.ts +0 -72
  105. package/dist/handlers/__test-utils__.js +0 -176
  106. package/dist/handlers/checkouts.d.ts +0 -37
  107. package/dist/handlers/checkouts.js +0 -377
  108. package/dist/handlers/knowledge-query.d.ts +0 -22
  109. package/dist/handlers/knowledge-query.js +0 -253
  110. package/dist/handlers/knowledge.d.ts +0 -12
  111. package/dist/handlers/knowledge.js +0 -108
  112. package/dist/handlers/roles.d.ts +0 -30
  113. package/dist/handlers/roles.js +0 -281
  114. package/dist/handlers/tasks.test.d.ts +0 -1
  115. package/dist/handlers/tasks.test.js +0 -431
  116. package/dist/utils.test.d.ts +0 -1
  117. package/dist/utils.test.js +0 -532
  118. package/dist/validators.test.d.ts +0 -1
  119. package/dist/validators.test.js +0 -176
  120. package/src/tmpclaude-0078-cwd +0 -1
  121. package/src/tmpclaude-0ee1-cwd +0 -1
  122. package/src/tmpclaude-2dd5-cwd +0 -1
  123. package/src/tmpclaude-344c-cwd +0 -1
  124. package/src/tmpclaude-3860-cwd +0 -1
  125. package/src/tmpclaude-4b63-cwd +0 -1
  126. package/src/tmpclaude-5c73-cwd +0 -1
  127. package/src/tmpclaude-5ee3-cwd +0 -1
  128. package/src/tmpclaude-6795-cwd +0 -1
  129. package/src/tmpclaude-709e-cwd +0 -1
  130. package/src/tmpclaude-9839-cwd +0 -1
  131. package/src/tmpclaude-d829-cwd +0 -1
  132. package/src/tmpclaude-e072-cwd +0 -1
  133. package/src/tmpclaude-f6ee-cwd +0 -1
  134. package/tmpclaude-0439-cwd +0 -1
  135. package/tmpclaude-132f-cwd +0 -1
  136. package/tmpclaude-15bb-cwd +0 -1
  137. package/tmpclaude-165a-cwd +0 -1
  138. package/tmpclaude-1ba9-cwd +0 -1
  139. package/tmpclaude-21a3-cwd +0 -1
  140. package/tmpclaude-2a38-cwd +0 -1
  141. package/tmpclaude-2adf-cwd +0 -1
  142. package/tmpclaude-2f56-cwd +0 -1
  143. package/tmpclaude-3626-cwd +0 -1
  144. package/tmpclaude-3727-cwd +0 -1
  145. package/tmpclaude-40bc-cwd +0 -1
  146. package/tmpclaude-436f-cwd +0 -1
  147. package/tmpclaude-4783-cwd +0 -1
  148. package/tmpclaude-4b6d-cwd +0 -1
  149. package/tmpclaude-4ba4-cwd +0 -1
  150. package/tmpclaude-51e6-cwd +0 -1
  151. package/tmpclaude-5ecf-cwd +0 -1
  152. package/tmpclaude-6f97-cwd +0 -1
  153. package/tmpclaude-7fb2-cwd +0 -1
  154. package/tmpclaude-825c-cwd +0 -1
  155. package/tmpclaude-8baf-cwd +0 -1
  156. package/tmpclaude-8d9f-cwd +0 -1
  157. package/tmpclaude-975c-cwd +0 -1
  158. package/tmpclaude-9983-cwd +0 -1
  159. package/tmpclaude-a045-cwd +0 -1
  160. package/tmpclaude-ac4a-cwd +0 -1
  161. package/tmpclaude-b593-cwd +0 -1
  162. package/tmpclaude-b891-cwd +0 -1
  163. package/tmpclaude-c032-cwd +0 -1
  164. package/tmpclaude-cf43-cwd +0 -1
  165. package/tmpclaude-d040-cwd +0 -1
  166. package/tmpclaude-dcdd-cwd +0 -1
  167. package/tmpclaude-dcee-cwd +0 -1
  168. package/tmpclaude-e16b-cwd +0 -1
  169. package/tmpclaude-ecd2-cwd +0 -1
  170. package/tmpclaude-f48d-cwd +0 -1
@@ -1,35 +1,6 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import type { SupabaseClient } from '@supabase/supabase-js';
3
- import type { HandlerContext, TokenUsage } from './types.js';
1
+ import { describe, it, expect } from 'vitest';
4
2
  import { discoverTools, getToolInfo } from './discovery.js';
5
-
6
- // ============================================================================
7
- // Test Utilities
8
- // ============================================================================
9
-
10
- function createMockSupabase() {
11
- return {} as unknown as SupabaseClient;
12
- }
13
-
14
- function createMockContext(supabase: SupabaseClient): HandlerContext {
15
- const defaultTokenUsage: TokenUsage = {
16
- callCount: 5,
17
- totalTokens: 2500,
18
- byTool: {},
19
- };
20
-
21
- return {
22
- supabase,
23
- auth: { userId: 'user-123', apiKeyId: 'api-key-123' },
24
- session: {
25
- instanceId: 'instance-abc',
26
- currentSessionId: 'session-123',
27
- currentPersona: 'Wave',
28
- tokenUsage: defaultTokenUsage,
29
- },
30
- updateSession: vi.fn(),
31
- };
32
- }
3
+ import { createMockContext } from './__test-utils__.js';
33
4
 
34
5
  // ============================================================================
35
6
  // discoverTools Tests
@@ -37,8 +8,7 @@ function createMockContext(supabase: SupabaseClient): HandlerContext {
37
8
 
38
9
  describe('discoverTools', () => {
39
10
  it('should return all categories when no category specified', async () => {
40
- const supabase = createMockSupabase();
41
- const ctx = createMockContext(supabase);
11
+ const ctx = createMockContext();
42
12
 
43
13
  const result = await discoverTools({}, ctx);
44
14
  const res = result.result as { categories: unknown[]; total_tools: number };
@@ -50,8 +20,7 @@ describe('discoverTools', () => {
50
20
  });
51
21
 
52
22
  it('should return category info with tool counts', async () => {
53
- const supabase = createMockSupabase();
54
- const ctx = createMockContext(supabase);
23
+ const ctx = createMockContext();
55
24
 
56
25
  const result = await discoverTools({}, ctx);
57
26
  const res = result.result as { categories: { name: string; description: string; tool_count: number }[] };
@@ -63,8 +32,7 @@ describe('discoverTools', () => {
63
32
  });
64
33
 
65
34
  it('should return tools for specific category', async () => {
66
- const supabase = createMockSupabase();
67
- const ctx = createMockContext(supabase);
35
+ const ctx = createMockContext();
68
36
 
69
37
  const result = await discoverTools({ category: 'session' }, ctx);
70
38
  const res = result.result as { category: string; description: string; tools: unknown[] };
@@ -76,8 +44,7 @@ describe('discoverTools', () => {
76
44
  });
77
45
 
78
46
  it('should return tools with name and brief for specific category', async () => {
79
- const supabase = createMockSupabase();
80
- const ctx = createMockContext(supabase);
47
+ const ctx = createMockContext();
81
48
 
82
49
  const result = await discoverTools({ category: 'tasks' }, ctx);
83
50
  const res = result.result as { tools: { name: string; brief: string }[] };
@@ -89,8 +56,7 @@ describe('discoverTools', () => {
89
56
  });
90
57
 
91
58
  it('should return error for unknown category', async () => {
92
- const supabase = createMockSupabase();
93
- const ctx = createMockContext(supabase);
59
+ const ctx = createMockContext();
94
60
 
95
61
  const result = await discoverTools({ category: 'nonexistent' }, ctx);
96
62
  const res = result.result as { error: string; available: string[] };
@@ -101,8 +67,7 @@ describe('discoverTools', () => {
101
67
  });
102
68
 
103
69
  it('should include session category', async () => {
104
- const supabase = createMockSupabase();
105
- const ctx = createMockContext(supabase);
70
+ const ctx = createMockContext();
106
71
 
107
72
  const result = await discoverTools({}, ctx);
108
73
  const res = result.result as { categories: { name: string }[] };
@@ -112,8 +77,7 @@ describe('discoverTools', () => {
112
77
  });
113
78
 
114
79
  it('should include tasks category', async () => {
115
- const supabase = createMockSupabase();
116
- const ctx = createMockContext(supabase);
80
+ const ctx = createMockContext();
117
81
 
118
82
  const result = await discoverTools({}, ctx);
119
83
  const res = result.result as { categories: { name: string }[] };
@@ -123,8 +87,7 @@ describe('discoverTools', () => {
123
87
  });
124
88
 
125
89
  it('should include deployment category', async () => {
126
- const supabase = createMockSupabase();
127
- const ctx = createMockContext(supabase);
90
+ const ctx = createMockContext();
128
91
 
129
92
  const result = await discoverTools({}, ctx);
130
93
  const res = result.result as { categories: { name: string }[] };
@@ -134,8 +97,7 @@ describe('discoverTools', () => {
134
97
  });
135
98
 
136
99
  it('should include usage hint in response', async () => {
137
- const supabase = createMockSupabase();
138
- const ctx = createMockContext(supabase);
100
+ const ctx = createMockContext();
139
101
 
140
102
  const result = await discoverTools({}, ctx);
141
103
  const res = result.result as { usage: string };
@@ -152,8 +114,7 @@ describe('discoverTools', () => {
152
114
 
153
115
  describe('getToolInfo', () => {
154
116
  it('should return error for missing tool_name', async () => {
155
- const supabase = createMockSupabase();
156
- const ctx = createMockContext(supabase);
117
+ const ctx = createMockContext();
157
118
 
158
119
  const result = await getToolInfo({}, ctx);
159
120
  const res = result.result as { error: string };
@@ -162,8 +123,7 @@ describe('getToolInfo', () => {
162
123
  });
163
124
 
164
125
  it('should return error for unknown tool', async () => {
165
- const supabase = createMockSupabase();
166
- const ctx = createMockContext(supabase);
126
+ const ctx = createMockContext();
167
127
 
168
128
  const result = await getToolInfo({ tool_name: 'nonexistent_tool' }, ctx);
169
129
  const res = result.result as { error: string; hint: string };
@@ -173,8 +133,7 @@ describe('getToolInfo', () => {
173
133
  });
174
134
 
175
135
  it('should return info for start_work_session', async () => {
176
- const supabase = createMockSupabase();
177
- const ctx = createMockContext(supabase);
136
+ const ctx = createMockContext();
178
137
 
179
138
  const result = await getToolInfo({ tool_name: 'start_work_session' }, ctx);
180
139
  const res = result.result as { tool: string; info: string };
@@ -185,8 +144,7 @@ describe('getToolInfo', () => {
185
144
  });
186
145
 
187
146
  it('should return info for add_task', async () => {
188
- const supabase = createMockSupabase();
189
- const ctx = createMockContext(supabase);
147
+ const ctx = createMockContext();
190
148
 
191
149
  const result = await getToolInfo({ tool_name: 'add_task' }, ctx);
192
150
  const res = result.result as { tool: string; info: string };
@@ -197,8 +155,7 @@ describe('getToolInfo', () => {
197
155
  });
198
156
 
199
157
  it('should return info for complete_task', async () => {
200
- const supabase = createMockSupabase();
201
- const ctx = createMockContext(supabase);
158
+ const ctx = createMockContext();
202
159
 
203
160
  const result = await getToolInfo({ tool_name: 'complete_task' }, ctx);
204
161
  const res = result.result as { tool: string; info: string };
@@ -208,8 +165,7 @@ describe('getToolInfo', () => {
208
165
  });
209
166
 
210
167
  it('should return info for request_deployment', async () => {
211
- const supabase = createMockSupabase();
212
- const ctx = createMockContext(supabase);
168
+ const ctx = createMockContext();
213
169
 
214
170
  const result = await getToolInfo({ tool_name: 'request_deployment' }, ctx);
215
171
  const res = result.result as { tool: string; info: string };
@@ -220,8 +176,7 @@ describe('getToolInfo', () => {
220
176
  });
221
177
 
222
178
  it('should return info with parameters section', async () => {
223
- const supabase = createMockSupabase();
224
- const ctx = createMockContext(supabase);
179
+ const ctx = createMockContext();
225
180
 
226
181
  const result = await getToolInfo({ tool_name: 'add_task' }, ctx);
227
182
  const res = result.result as { info: string };
@@ -230,8 +185,7 @@ describe('getToolInfo', () => {
230
185
  });
231
186
 
232
187
  it('should return info for get_help', async () => {
233
- const supabase = createMockSupabase();
234
- const ctx = createMockContext(supabase);
188
+ const ctx = createMockContext();
235
189
 
236
190
  const result = await getToolInfo({ tool_name: 'get_help' }, ctx);
237
191
  const res = result.result as { tool: string; info: string };
@@ -242,8 +196,7 @@ describe('getToolInfo', () => {
242
196
  });
243
197
 
244
198
  it('should return info for discover_tools', async () => {
245
- const supabase = createMockSupabase();
246
- const ctx = createMockContext(supabase);
199
+ const ctx = createMockContext();
247
200
 
248
201
  const result = await getToolInfo({ tool_name: 'discover_tools' }, ctx);
249
202
  const res = result.result as { tool: string; info: string };
@@ -186,6 +186,12 @@ const TOOL_CATEGORIES: Record<string, { description: string; tools: Array<{ name
186
186
  { name: 'get_task_costs', brief: 'Cost per task' },
187
187
  ],
188
188
  },
189
+ knowledge: {
190
+ description: 'Queryable knowledge base from project data',
191
+ tools: [
192
+ { name: 'query_knowledge_base', brief: 'Aggregated project knowledge in one call' },
193
+ ],
194
+ },
189
195
  };
190
196
 
191
197
  // Detailed tool info (fetched on-demand)
@@ -899,6 +905,32 @@ Get cost breakdown by task for a project.
899
905
  - limit: Max tasks to return (default: 20)
900
906
 
901
907
  **Returns:** Tasks sorted by estimated cost with model breakdown`,
908
+
909
+ // Knowledge base tools
910
+ query_knowledge_base: `# query_knowledge_base
911
+ Query aggregated project knowledge in a single call. Reduces token usage by combining multiple data sources.
912
+
913
+ **Parameters:**
914
+ - project_id (required): Project UUID
915
+ - scope: 'summary' (default) or 'detailed' (includes rationales, descriptions)
916
+ - categories: Array of categories to include (default: all)
917
+ - findings: Audit findings (security, performance, code quality)
918
+ - qa: Questions and answers
919
+ - decisions: Architectural decisions
920
+ - completed_tasks: Tasks with completion summaries
921
+ - blockers: Resolved blockers with resolution notes
922
+ - progress: Recent progress logs
923
+ - limit: Max items per category (default: 5, max: 20)
924
+ - search_query: Optional text search across all knowledge
925
+
926
+ **Returns:**
927
+ - project: name, goal, tech_stack
928
+ - stats: counts for each category, findings by severity
929
+ - Category data based on selection
930
+
931
+ **Token savings:** Replaces up to 6 separate tool calls (get_findings, get_decisions, get_tasks, get_blockers, etc.) with one call.
932
+
933
+ **Example:** query_knowledge_base(project_id, categories: ["findings", "decisions"], limit: 10)`,
902
934
  };
903
935
 
904
936
  export const discoverTools: Handler = async (args) => {