@vibescope/mcp-server 0.2.5 → 0.2.6

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 (82) hide show
  1. package/CHANGELOG.md +84 -84
  2. package/README.md +194 -194
  3. package/dist/cli.js +26 -26
  4. package/dist/handlers/tool-docs.js +828 -828
  5. package/dist/index.js +73 -73
  6. package/dist/templates/agent-guidelines.js +185 -185
  7. package/dist/token-tracking.js +4 -2
  8. package/dist/tools.js +65 -65
  9. package/dist/utils.js +11 -11
  10. package/docs/TOOLS.md +2053 -2053
  11. package/package.json +1 -1
  12. package/scripts/generate-docs.ts +212 -212
  13. package/scripts/version-bump.ts +203 -203
  14. package/src/api-client.test.ts +723 -723
  15. package/src/api-client.ts +2499 -2499
  16. package/src/cli.ts +212 -212
  17. package/src/handlers/__test-setup__.ts +236 -236
  18. package/src/handlers/__test-utils__.ts +87 -87
  19. package/src/handlers/blockers.test.ts +468 -468
  20. package/src/handlers/blockers.ts +163 -163
  21. package/src/handlers/bodies-of-work.test.ts +704 -704
  22. package/src/handlers/bodies-of-work.ts +526 -526
  23. package/src/handlers/connectors.test.ts +834 -834
  24. package/src/handlers/connectors.ts +229 -229
  25. package/src/handlers/cost.test.ts +462 -462
  26. package/src/handlers/cost.ts +285 -285
  27. package/src/handlers/decisions.test.ts +382 -382
  28. package/src/handlers/decisions.ts +153 -153
  29. package/src/handlers/deployment.test.ts +551 -551
  30. package/src/handlers/deployment.ts +541 -541
  31. package/src/handlers/discovery.test.ts +206 -206
  32. package/src/handlers/discovery.ts +390 -390
  33. package/src/handlers/fallback.test.ts +537 -537
  34. package/src/handlers/fallback.ts +194 -194
  35. package/src/handlers/file-checkouts.test.ts +750 -750
  36. package/src/handlers/file-checkouts.ts +185 -185
  37. package/src/handlers/findings.test.ts +633 -633
  38. package/src/handlers/findings.ts +239 -239
  39. package/src/handlers/git-issues.test.ts +631 -631
  40. package/src/handlers/git-issues.ts +136 -136
  41. package/src/handlers/ideas.test.ts +644 -644
  42. package/src/handlers/ideas.ts +207 -207
  43. package/src/handlers/index.ts +84 -84
  44. package/src/handlers/milestones.test.ts +475 -475
  45. package/src/handlers/milestones.ts +180 -180
  46. package/src/handlers/organizations.test.ts +826 -826
  47. package/src/handlers/organizations.ts +315 -315
  48. package/src/handlers/progress.test.ts +269 -269
  49. package/src/handlers/progress.ts +77 -77
  50. package/src/handlers/project.test.ts +546 -546
  51. package/src/handlers/project.ts +239 -239
  52. package/src/handlers/requests.test.ts +303 -303
  53. package/src/handlers/requests.ts +99 -99
  54. package/src/handlers/roles.test.ts +303 -303
  55. package/src/handlers/roles.ts +226 -226
  56. package/src/handlers/session.test.ts +875 -875
  57. package/src/handlers/session.ts +738 -738
  58. package/src/handlers/sprints.test.ts +732 -732
  59. package/src/handlers/sprints.ts +537 -537
  60. package/src/handlers/tasks.test.ts +907 -907
  61. package/src/handlers/tasks.ts +945 -945
  62. package/src/handlers/tool-categories.test.ts +66 -66
  63. package/src/handlers/tool-docs.ts +1096 -1096
  64. package/src/handlers/types.test.ts +259 -259
  65. package/src/handlers/types.ts +175 -175
  66. package/src/handlers/validation.test.ts +582 -582
  67. package/src/handlers/validation.ts +97 -97
  68. package/src/index.ts +792 -792
  69. package/src/setup.test.ts +233 -231
  70. package/src/setup.ts +370 -370
  71. package/src/templates/agent-guidelines.ts +210 -210
  72. package/src/token-tracking.test.ts +463 -453
  73. package/src/token-tracking.ts +166 -164
  74. package/src/tools.ts +3562 -3562
  75. package/src/utils.test.ts +683 -683
  76. package/src/utils.ts +436 -436
  77. package/src/validators.test.ts +223 -223
  78. package/src/validators.ts +249 -249
  79. package/tsconfig.json +16 -16
  80. package/vitest.config.ts +14 -14
  81. package/dist/knowledge.d.ts +0 -6
  82. package/dist/knowledge.js +0 -218
@@ -1,164 +1,166 @@
1
- /**
2
- * Token Tracking Utilities
3
- *
4
- * Functions for estimating and tracking token usage across MCP tool calls.
5
- * Extracted from index.ts to enable unit testing.
6
- */
7
-
8
- // ============================================================================
9
- // Types
10
- // ============================================================================
11
-
12
- export interface ModelTokens {
13
- input: number;
14
- output: number;
15
- }
16
-
17
- export interface TokenUsage {
18
- callCount: number;
19
- totalTokens: number;
20
- byTool: Record<string, { calls: number; tokens: number }>;
21
- byModel: Record<string, ModelTokens>;
22
- currentModel: string | null;
23
- }
24
-
25
- // ============================================================================
26
- // Token Estimation
27
- // ============================================================================
28
-
29
- /**
30
- * Estimate tokens from a JSON-serializable object.
31
- * Uses a rough heuristic of ~4 characters per token.
32
- *
33
- * @param obj - Any JSON-serializable object
34
- * @returns Estimated token count (always >= 1)
35
- */
36
- export function estimateTokens(obj: unknown): number {
37
- try {
38
- const json = JSON.stringify(obj);
39
- return Math.max(1, Math.ceil(json.length / 4));
40
- } catch {
41
- // If JSON serialization fails, return a minimal estimate
42
- return 1;
43
- }
44
- }
45
-
46
- // ============================================================================
47
- // Token Usage Tracking
48
- // ============================================================================
49
-
50
- /**
51
- * Create a fresh token usage tracker.
52
- */
53
- export function createTokenUsage(): TokenUsage {
54
- return {
55
- callCount: 0,
56
- totalTokens: 0,
57
- byTool: {},
58
- byModel: {},
59
- currentModel: null,
60
- };
61
- }
62
-
63
- /**
64
- * Track token usage for a tool call.
65
- * Updates the usage object in-place with input/output token estimates.
66
- *
67
- * @param usage - The token usage object to update
68
- * @param toolName - Name of the tool being called
69
- * @param args - Input arguments to the tool
70
- * @param response - Response from the tool
71
- */
72
- export function trackTokenUsage(
73
- usage: TokenUsage,
74
- toolName: string,
75
- args: unknown,
76
- response: unknown
77
- ): void {
78
- const inputTokens = estimateTokens(args);
79
- const outputTokens = estimateTokens(response);
80
- const totalTokens = inputTokens + outputTokens;
81
-
82
- usage.callCount++;
83
- usage.totalTokens += totalTokens;
84
-
85
- if (!usage.byTool[toolName]) {
86
- usage.byTool[toolName] = { calls: 0, tokens: 0 };
87
- }
88
- usage.byTool[toolName].calls++;
89
- usage.byTool[toolName].tokens += totalTokens;
90
-
91
- // Track by model if a model is set
92
- const model = usage.currentModel;
93
- if (model) {
94
- if (!usage.byModel[model]) {
95
- usage.byModel[model] = { input: 0, output: 0 };
96
- }
97
- usage.byModel[model].input += inputTokens;
98
- usage.byModel[model].output += outputTokens;
99
- }
100
- }
101
-
102
- /**
103
- * Set the current model for token tracking.
104
- * Subsequent calls to trackTokenUsage will be attributed to this model.
105
- *
106
- * @param usage - The token usage object to update
107
- * @param model - Model name (e.g., "opus", "sonnet", "haiku")
108
- */
109
- export function setCurrentModel(usage: TokenUsage, model: string | null): void {
110
- usage.currentModel = model;
111
- }
112
-
113
- /**
114
- * Reset token usage tracking to initial state.
115
- *
116
- * @param usage - The token usage object to reset
117
- */
118
- export function resetTokenUsage(usage: TokenUsage): void {
119
- usage.callCount = 0;
120
- usage.totalTokens = 0;
121
- usage.byTool = {};
122
- usage.byModel = {};
123
- usage.currentModel = null;
124
- }
125
-
126
- /**
127
- * Get a summary of token usage for reporting.
128
- *
129
- * @param usage - The token usage object
130
- * @returns Summary object with stats
131
- */
132
- export function getTokenUsageSummary(usage: TokenUsage): {
133
- total_calls: number;
134
- total_tokens: number;
135
- average_tokens_per_call: number;
136
- by_tool: Record<string, { calls: number; tokens: number; avg: number }>;
137
- by_model: Record<string, ModelTokens>;
138
- current_model: string | null;
139
- } {
140
- const byTool: Record<string, { calls: number; tokens: number; avg: number }> = {};
141
-
142
- for (const [tool, stats] of Object.entries(usage.byTool)) {
143
- byTool[tool] = {
144
- calls: stats.calls,
145
- tokens: stats.tokens,
146
- avg: stats.calls > 0 ? Math.round(stats.tokens / stats.calls) : 0,
147
- };
148
- }
149
-
150
- // Deep copy byModel to prevent mutation
151
- const byModel: Record<string, ModelTokens> = {};
152
- for (const [model, tokens] of Object.entries(usage.byModel)) {
153
- byModel[model] = { input: tokens.input, output: tokens.output };
154
- }
155
-
156
- return {
157
- total_calls: usage.callCount,
158
- total_tokens: usage.totalTokens,
159
- average_tokens_per_call: usage.callCount > 0 ? Math.round(usage.totalTokens / usage.callCount) : 0,
160
- by_tool: byTool,
161
- by_model: byModel,
162
- current_model: usage.currentModel,
163
- };
164
- }
1
+ /**
2
+ * Token Tracking Utilities
3
+ *
4
+ * Functions for estimating and tracking token usage across MCP tool calls.
5
+ * Extracted from index.ts to enable unit testing.
6
+ */
7
+
8
+ // ============================================================================
9
+ // Types
10
+ // ============================================================================
11
+
12
+ export interface ModelTokens {
13
+ input: number;
14
+ output: number;
15
+ }
16
+
17
+ export interface TokenUsage {
18
+ callCount: number;
19
+ totalTokens: number;
20
+ byTool: Record<string, { calls: number; tokens: number }>;
21
+ byModel: Record<string, ModelTokens>;
22
+ currentModel: string | null;
23
+ }
24
+
25
+ // ============================================================================
26
+ // Token Estimation
27
+ // ============================================================================
28
+
29
+ /**
30
+ * Estimate tokens from a JSON-serializable object.
31
+ * Uses a rough heuristic of ~4 characters per token.
32
+ *
33
+ * @param obj - Any JSON-serializable object
34
+ * @returns Estimated token count (always >= 1)
35
+ */
36
+ export function estimateTokens(obj: unknown): number {
37
+ try {
38
+ const json = JSON.stringify(obj);
39
+ return Math.max(1, Math.ceil(json.length / 4));
40
+ } catch (error) {
41
+ // Log warning when serialization fails (e.g., circular references, BigInt)
42
+ const errorMessage = error instanceof Error ? error.message : String(error);
43
+ console.warn(`[Vibescope] Token estimation failed: ${errorMessage}. Returning minimal estimate of 1 token.`);
44
+ return 1;
45
+ }
46
+ }
47
+
48
+ // ============================================================================
49
+ // Token Usage Tracking
50
+ // ============================================================================
51
+
52
+ /**
53
+ * Create a fresh token usage tracker.
54
+ */
55
+ export function createTokenUsage(): TokenUsage {
56
+ return {
57
+ callCount: 0,
58
+ totalTokens: 0,
59
+ byTool: {},
60
+ byModel: {},
61
+ currentModel: null,
62
+ };
63
+ }
64
+
65
+ /**
66
+ * Track token usage for a tool call.
67
+ * Updates the usage object in-place with input/output token estimates.
68
+ *
69
+ * @param usage - The token usage object to update
70
+ * @param toolName - Name of the tool being called
71
+ * @param args - Input arguments to the tool
72
+ * @param response - Response from the tool
73
+ */
74
+ export function trackTokenUsage(
75
+ usage: TokenUsage,
76
+ toolName: string,
77
+ args: unknown,
78
+ response: unknown
79
+ ): void {
80
+ const inputTokens = estimateTokens(args);
81
+ const outputTokens = estimateTokens(response);
82
+ const totalTokens = inputTokens + outputTokens;
83
+
84
+ usage.callCount++;
85
+ usage.totalTokens += totalTokens;
86
+
87
+ if (!usage.byTool[toolName]) {
88
+ usage.byTool[toolName] = { calls: 0, tokens: 0 };
89
+ }
90
+ usage.byTool[toolName].calls++;
91
+ usage.byTool[toolName].tokens += totalTokens;
92
+
93
+ // Track by model if a model is set
94
+ const model = usage.currentModel;
95
+ if (model) {
96
+ if (!usage.byModel[model]) {
97
+ usage.byModel[model] = { input: 0, output: 0 };
98
+ }
99
+ usage.byModel[model].input += inputTokens;
100
+ usage.byModel[model].output += outputTokens;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Set the current model for token tracking.
106
+ * Subsequent calls to trackTokenUsage will be attributed to this model.
107
+ *
108
+ * @param usage - The token usage object to update
109
+ * @param model - Model name (e.g., "opus", "sonnet", "haiku")
110
+ */
111
+ export function setCurrentModel(usage: TokenUsage, model: string | null): void {
112
+ usage.currentModel = model;
113
+ }
114
+
115
+ /**
116
+ * Reset token usage tracking to initial state.
117
+ *
118
+ * @param usage - The token usage object to reset
119
+ */
120
+ export function resetTokenUsage(usage: TokenUsage): void {
121
+ usage.callCount = 0;
122
+ usage.totalTokens = 0;
123
+ usage.byTool = {};
124
+ usage.byModel = {};
125
+ usage.currentModel = null;
126
+ }
127
+
128
+ /**
129
+ * Get a summary of token usage for reporting.
130
+ *
131
+ * @param usage - The token usage object
132
+ * @returns Summary object with stats
133
+ */
134
+ export function getTokenUsageSummary(usage: TokenUsage): {
135
+ total_calls: number;
136
+ total_tokens: number;
137
+ average_tokens_per_call: number;
138
+ by_tool: Record<string, { calls: number; tokens: number; avg: number }>;
139
+ by_model: Record<string, ModelTokens>;
140
+ current_model: string | null;
141
+ } {
142
+ const byTool: Record<string, { calls: number; tokens: number; avg: number }> = {};
143
+
144
+ for (const [tool, stats] of Object.entries(usage.byTool)) {
145
+ byTool[tool] = {
146
+ calls: stats.calls,
147
+ tokens: stats.tokens,
148
+ avg: stats.calls > 0 ? Math.round(stats.tokens / stats.calls) : 0,
149
+ };
150
+ }
151
+
152
+ // Deep copy byModel to prevent mutation
153
+ const byModel: Record<string, ModelTokens> = {};
154
+ for (const [model, tokens] of Object.entries(usage.byModel)) {
155
+ byModel[model] = { input: tokens.input, output: tokens.output };
156
+ }
157
+
158
+ return {
159
+ total_calls: usage.callCount,
160
+ total_tokens: usage.totalTokens,
161
+ average_tokens_per_call: usage.callCount > 0 ? Math.round(usage.totalTokens / usage.callCount) : 0,
162
+ by_tool: byTool,
163
+ by_model: byModel,
164
+ current_model: usage.currentModel,
165
+ };
166
+ }