@corbat-tech/coding-standards-mcp 1.0.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +233 -337
  2. package/dist/agent.d.ts +5 -6
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +95 -217
  5. package/dist/agent.js.map +1 -1
  6. package/dist/analysis/code-analyzer.d.ts +44 -0
  7. package/dist/analysis/code-analyzer.d.ts.map +1 -0
  8. package/dist/analysis/code-analyzer.js +528 -0
  9. package/dist/analysis/code-analyzer.js.map +1 -0
  10. package/dist/errors.d.ts +58 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +112 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/guardrails.d.ts +35 -0
  15. package/dist/guardrails.d.ts.map +1 -0
  16. package/dist/guardrails.js +303 -0
  17. package/dist/guardrails.js.map +1 -0
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/logger.d.ts +36 -0
  21. package/dist/logger.d.ts.map +1 -0
  22. package/dist/logger.js +63 -0
  23. package/dist/logger.js.map +1 -0
  24. package/dist/metrics.d.ts +40 -0
  25. package/dist/metrics.d.ts.map +1 -0
  26. package/dist/metrics.js +97 -0
  27. package/dist/metrics.js.map +1 -0
  28. package/dist/profiles.d.ts +1 -1
  29. package/dist/profiles.d.ts.map +1 -1
  30. package/dist/profiles.js +239 -108
  31. package/dist/profiles.js.map +1 -1
  32. package/dist/prompts.js +1 -1
  33. package/dist/prompts.js.map +1 -1
  34. package/dist/tools/definitions.d.ts +143 -0
  35. package/dist/tools/definitions.d.ts.map +1 -0
  36. package/dist/tools/definitions.js +229 -0
  37. package/dist/tools/definitions.js.map +1 -0
  38. package/dist/tools/handlers/get-context.d.ts +12 -0
  39. package/dist/tools/handlers/get-context.d.ts.map +1 -0
  40. package/dist/tools/handlers/get-context.js +233 -0
  41. package/dist/tools/handlers/get-context.js.map +1 -0
  42. package/dist/tools/handlers/health.d.ts +11 -0
  43. package/dist/tools/handlers/health.d.ts.map +1 -0
  44. package/dist/tools/handlers/health.js +57 -0
  45. package/dist/tools/handlers/health.js.map +1 -0
  46. package/dist/tools/handlers/index.d.ts +12 -0
  47. package/dist/tools/handlers/index.d.ts.map +1 -0
  48. package/dist/tools/handlers/index.js +12 -0
  49. package/dist/tools/handlers/index.js.map +1 -0
  50. package/dist/tools/handlers/init.d.ts +12 -0
  51. package/dist/tools/handlers/init.d.ts.map +1 -0
  52. package/dist/tools/handlers/init.js +102 -0
  53. package/dist/tools/handlers/init.js.map +1 -0
  54. package/dist/tools/handlers/profiles.d.ts +11 -0
  55. package/dist/tools/handlers/profiles.d.ts.map +1 -0
  56. package/dist/tools/handlers/profiles.js +25 -0
  57. package/dist/tools/handlers/profiles.js.map +1 -0
  58. package/dist/tools/handlers/search.d.ts +12 -0
  59. package/dist/tools/handlers/search.d.ts.map +1 -0
  60. package/dist/tools/handlers/search.js +58 -0
  61. package/dist/tools/handlers/search.js.map +1 -0
  62. package/dist/tools/handlers/validate.d.ts +15 -0
  63. package/dist/tools/handlers/validate.d.ts.map +1 -0
  64. package/dist/tools/handlers/validate.js +71 -0
  65. package/dist/tools/handlers/validate.js.map +1 -0
  66. package/dist/tools/handlers/verify.d.ts +38 -0
  67. package/dist/tools/handlers/verify.d.ts.map +1 -0
  68. package/dist/tools/handlers/verify.js +172 -0
  69. package/dist/tools/handlers/verify.js.map +1 -0
  70. package/dist/tools/index.d.ts +22 -0
  71. package/dist/tools/index.d.ts.map +1 -0
  72. package/dist/tools/index.js +75 -0
  73. package/dist/tools/index.js.map +1 -0
  74. package/dist/tools/schemas.d.ts +29 -0
  75. package/dist/tools/schemas.d.ts.map +1 -0
  76. package/dist/tools/schemas.js +20 -0
  77. package/dist/tools/schemas.js.map +1 -0
  78. package/dist/tools.js +2 -2
  79. package/dist/tools.js.map +1 -1
  80. package/dist/types.d.ts +141 -71
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +92 -40
  83. package/dist/types.js.map +1 -1
  84. package/package.json +2 -2
  85. package/profiles/examples/microservice-kafka.yaml +122 -0
  86. package/profiles/examples/startup-fast.yaml +67 -0
  87. package/profiles/examples/strict-enterprise.yaml +62 -0
  88. package/profiles/templates/angular.yaml +614 -0
  89. package/profiles/templates/csharp-dotnet.yaml +529 -0
  90. package/profiles/templates/flutter.yaml +547 -0
  91. package/profiles/templates/go.yaml +1276 -0
  92. package/profiles/templates/java-spring-backend.yaml +326 -0
  93. package/profiles/templates/kotlin-spring.yaml +417 -0
  94. package/profiles/templates/nextjs.yaml +536 -0
  95. package/profiles/templates/nodejs.yaml +594 -0
  96. package/profiles/templates/python.yaml +546 -0
  97. package/profiles/templates/react.yaml +456 -0
  98. package/profiles/templates/rust.yaml +508 -0
  99. package/profiles/templates/vue.yaml +483 -0
package/dist/errors.js ADDED
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Base error class for Corbat MCP errors.
3
+ * All custom errors should extend this class.
4
+ */
5
+ export class CorbatError extends Error {
6
+ code;
7
+ details;
8
+ constructor(message, code, details) {
9
+ super(message);
10
+ this.code = code;
11
+ this.details = details;
12
+ this.name = 'CorbatError';
13
+ // Maintains proper stack trace for V8
14
+ if (Error.captureStackTrace) {
15
+ Error.captureStackTrace(this, this.constructor);
16
+ }
17
+ }
18
+ /**
19
+ * Convert to a plain object for serialization.
20
+ */
21
+ toJSON() {
22
+ return {
23
+ name: this.name,
24
+ code: this.code,
25
+ message: this.message,
26
+ details: this.details,
27
+ };
28
+ }
29
+ }
30
+ /**
31
+ * Error when a profile is not found.
32
+ */
33
+ export class ProfileNotFoundError extends CorbatError {
34
+ constructor(profileId, availableProfiles = []) {
35
+ super(`Profile "${profileId}" not found`, 'PROFILE_NOT_FOUND', { profileId, availableProfiles });
36
+ this.name = 'ProfileNotFoundError';
37
+ }
38
+ }
39
+ /**
40
+ * Error when configuration is invalid.
41
+ */
42
+ export class InvalidConfigError extends CorbatError {
43
+ constructor(path, validationErrors) {
44
+ super(`Invalid configuration at ${path}`, 'INVALID_CONFIG', { path, validationErrors });
45
+ this.name = 'InvalidConfigError';
46
+ }
47
+ }
48
+ /**
49
+ * Error when project stack detection fails.
50
+ */
51
+ export class StackDetectionError extends CorbatError {
52
+ constructor(projectDir, reason) {
53
+ super(`Could not detect stack in ${projectDir}: ${reason}`, 'STACK_DETECTION_FAILED', { projectDir, reason });
54
+ this.name = 'StackDetectionError';
55
+ }
56
+ }
57
+ /**
58
+ * Error when a guardrail file is invalid.
59
+ */
60
+ export class InvalidGuardrailError extends CorbatError {
61
+ constructor(taskType, reason) {
62
+ super(`Invalid guardrail for task type "${taskType}": ${reason}`, 'INVALID_GUARDRAIL', { taskType, reason });
63
+ this.name = 'InvalidGuardrailError';
64
+ }
65
+ }
66
+ /**
67
+ * Error when a tool receives invalid input.
68
+ */
69
+ export class ToolInputError extends CorbatError {
70
+ constructor(toolName, reason, input) {
71
+ super(`Invalid input for tool "${toolName}": ${reason}`, 'TOOL_INPUT_ERROR', { toolName, reason, input });
72
+ this.name = 'ToolInputError';
73
+ }
74
+ }
75
+ /**
76
+ * Error when a resource is not found.
77
+ */
78
+ export class ResourceNotFoundError extends CorbatError {
79
+ constructor(resourceUri) {
80
+ super(`Resource not found: ${resourceUri}`, 'RESOURCE_NOT_FOUND', { resourceUri });
81
+ this.name = 'ResourceNotFoundError';
82
+ }
83
+ }
84
+ /**
85
+ * Check if an error is a CorbatError.
86
+ */
87
+ export function isCorbatError(error) {
88
+ return error instanceof CorbatError;
89
+ }
90
+ /**
91
+ * Format an error for MCP response.
92
+ */
93
+ export function formatErrorForResponse(error) {
94
+ if (isCorbatError(error)) {
95
+ let message = `[${error.code}] ${error.message}`;
96
+ if (error.details) {
97
+ const detailsStr = Object.entries(error.details)
98
+ .filter(([key]) => key !== 'input') // Don't include potentially large input
99
+ .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
100
+ .join(', ');
101
+ if (detailsStr) {
102
+ message += `\n\nDetails: ${detailsStr}`;
103
+ }
104
+ }
105
+ return message;
106
+ }
107
+ if (error instanceof Error) {
108
+ return error.message;
109
+ }
110
+ return String(error);
111
+ }
112
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Guardrails, TaskType } from './types.js';
2
+ /**
3
+ * Extended guardrails with workflow guidance.
4
+ */
5
+ export interface ExtendedGuardrails extends Guardrails {
6
+ workflow?: {
7
+ steps: Array<{
8
+ name: string;
9
+ description: string;
10
+ actions: string[];
11
+ }>;
12
+ };
13
+ patterns?: Record<string, unknown>;
14
+ antiPatterns?: Record<string, unknown>;
15
+ commonPatterns?: Record<string, unknown>;
16
+ codeSmells?: Record<string, unknown>;
17
+ }
18
+ /**
19
+ * Loads all guardrails from the guardrails directory.
20
+ * Uses caching to avoid repeated file system reads.
21
+ */
22
+ export declare function loadGuardrails(guardrailsDir?: string): Promise<Record<TaskType, ExtendedGuardrails>>;
23
+ /**
24
+ * Gets guardrails for a specific task type.
25
+ */
26
+ export declare function getGuardrails(taskType: TaskType, guardrailsDir?: string): Promise<ExtendedGuardrails>;
27
+ /**
28
+ * Clears the guardrails cache.
29
+ */
30
+ export declare function clearGuardrailsCache(): void;
31
+ /**
32
+ * Formats guardrails as markdown with workflow guidance.
33
+ */
34
+ export declare function formatGuardrailsAsMarkdown(guardrails: ExtendedGuardrails): string;
35
+ //# sourceMappingURL=guardrails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../src/guardrails.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKvD;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAyBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,aAAa,GAAE,MAA+B,GAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CA4C/C;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG3G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAwLD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAqCjF"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Guardrails loader module.
3
+ * Loads guardrails from YAML files for better maintainability and customization.
4
+ */
5
+ import { readdir, readFile } from 'node:fs/promises';
6
+ import { dirname, join } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { parse as parseYaml } from 'yaml';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ // Cache for loaded guardrails
12
+ let guardrailsCache = null;
13
+ let cacheTimestamp = 0;
14
+ const CACHE_TTL = 60000; // 1 minute
15
+ /**
16
+ * Default guardrails directory path.
17
+ */
18
+ const DEFAULT_GUARDRAILS_DIR = join(__dirname, '..', 'guardrails');
19
+ /**
20
+ * Loads a single guardrail file.
21
+ */
22
+ async function loadGuardrailFile(filePath) {
23
+ try {
24
+ const content = await readFile(filePath, 'utf-8');
25
+ const parsed = parseYaml(content);
26
+ return parsed;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Loads all guardrails from the guardrails directory.
34
+ * Uses caching to avoid repeated file system reads.
35
+ */
36
+ export async function loadGuardrails(guardrailsDir = DEFAULT_GUARDRAILS_DIR) {
37
+ const now = Date.now();
38
+ // Return cached if valid
39
+ if (guardrailsCache && now - cacheTimestamp < CACHE_TTL) {
40
+ return guardrailsCache;
41
+ }
42
+ const guardrails = {};
43
+ try {
44
+ const files = await readdir(guardrailsDir);
45
+ const yamlFiles = files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));
46
+ // Load all guardrail files in parallel
47
+ const loadPromises = yamlFiles.map(async (file) => {
48
+ const filePath = join(guardrailsDir, file);
49
+ const guardrail = await loadGuardrailFile(filePath);
50
+ if (guardrail?.taskType) {
51
+ return { taskType: guardrail.taskType, guardrail };
52
+ }
53
+ return null;
54
+ });
55
+ const results = await Promise.all(loadPromises);
56
+ for (const result of results) {
57
+ if (result) {
58
+ guardrails[result.taskType] = result.guardrail;
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // If guardrails directory doesn't exist, return fallback
64
+ return getFallbackGuardrails();
65
+ }
66
+ // Ensure all task types have guardrails (merge with fallback)
67
+ const fallback = getFallbackGuardrails();
68
+ const merged = { ...fallback, ...guardrails };
69
+ guardrailsCache = merged;
70
+ cacheTimestamp = now;
71
+ return merged;
72
+ }
73
+ /**
74
+ * Gets guardrails for a specific task type.
75
+ */
76
+ export async function getGuardrails(taskType, guardrailsDir) {
77
+ const allGuardrails = await loadGuardrails(guardrailsDir);
78
+ return allGuardrails[taskType] || getFallbackGuardrails()[taskType];
79
+ }
80
+ /**
81
+ * Clears the guardrails cache.
82
+ */
83
+ export function clearGuardrailsCache() {
84
+ guardrailsCache = null;
85
+ cacheTimestamp = 0;
86
+ }
87
+ /**
88
+ * Fallback guardrails when files are not available.
89
+ */
90
+ function getFallbackGuardrails() {
91
+ return {
92
+ feature: {
93
+ taskType: 'feature',
94
+ mandatory: [
95
+ 'Follow TDD: write tests before implementation',
96
+ 'Ensure 80%+ unit test coverage for new code',
97
+ 'Apply SOLID principles',
98
+ 'Follow project naming conventions',
99
+ 'Document public APIs',
100
+ 'Validate inputs at boundaries',
101
+ ],
102
+ recommended: [
103
+ 'Keep methods under 20 lines',
104
+ 'Keep classes under 200 lines',
105
+ 'Use dependency injection',
106
+ 'Apply single responsibility principle',
107
+ 'Write integration tests for critical paths',
108
+ ],
109
+ avoid: [
110
+ 'God classes or methods',
111
+ 'Hard-coded configuration',
112
+ 'Mixing business logic with infrastructure',
113
+ 'Circular dependencies',
114
+ 'Over-engineering for hypothetical futures',
115
+ ],
116
+ },
117
+ bugfix: {
118
+ taskType: 'bugfix',
119
+ mandatory: [
120
+ 'First write a failing test that reproduces the bug',
121
+ 'Make the minimum change necessary to fix',
122
+ 'Verify fix does not break existing tests',
123
+ 'Document root cause in commit message',
124
+ ],
125
+ recommended: [
126
+ 'Add regression test if not already covered',
127
+ 'Consider if bug exists elsewhere (same pattern)',
128
+ 'Update documentation if behavior changed',
129
+ ],
130
+ avoid: [
131
+ 'Refactoring unrelated code',
132
+ 'Adding features while fixing bugs',
133
+ 'Changing APIs without necessity',
134
+ 'Fixing symptoms instead of root cause',
135
+ ],
136
+ },
137
+ refactor: {
138
+ taskType: 'refactor',
139
+ mandatory: [
140
+ 'All existing tests must pass before AND after',
141
+ 'No behavior changes (only structure)',
142
+ 'Commit in small, reviewable increments',
143
+ 'Extract one concept at a time',
144
+ ],
145
+ recommended: [
146
+ 'Increase test coverage if below threshold',
147
+ 'Apply design patterns where appropriate',
148
+ 'Improve naming and readability',
149
+ 'Remove dead code',
150
+ ],
151
+ avoid: [
152
+ 'Changing behavior during refactor',
153
+ 'Big bang refactoring',
154
+ 'Refactoring without tests',
155
+ 'Premature abstraction',
156
+ ],
157
+ },
158
+ test: {
159
+ taskType: 'test',
160
+ mandatory: [
161
+ 'Follow Arrange-Act-Assert pattern',
162
+ 'One logical assertion per test',
163
+ 'Test names describe behavior (should_X_when_Y)',
164
+ 'Tests must be independent and repeatable',
165
+ ],
166
+ recommended: [
167
+ 'Use test fixtures for complex setup',
168
+ 'Mock external dependencies',
169
+ 'Test edge cases and error conditions',
170
+ 'Use parameterized tests for variations',
171
+ ],
172
+ avoid: [
173
+ 'Testing implementation details',
174
+ 'Flaky tests',
175
+ 'Tests that depend on order',
176
+ 'Assertions without clear purpose',
177
+ ],
178
+ },
179
+ documentation: {
180
+ taskType: 'documentation',
181
+ mandatory: [
182
+ 'Use clear, concise language',
183
+ 'Include code examples where applicable',
184
+ 'Keep documentation close to code',
185
+ 'Document the WHY, not just the WHAT',
186
+ ],
187
+ recommended: [
188
+ 'Use consistent formatting',
189
+ 'Include diagrams for complex flows',
190
+ 'Document assumptions and constraints',
191
+ 'Keep README updated',
192
+ ],
193
+ avoid: [
194
+ 'Outdated documentation',
195
+ 'Duplicating code in comments',
196
+ 'Over-documenting obvious code',
197
+ 'Documentation without context',
198
+ ],
199
+ },
200
+ performance: {
201
+ taskType: 'performance',
202
+ mandatory: [
203
+ 'Measure before optimizing (baseline metrics)',
204
+ 'Profile to identify actual bottlenecks',
205
+ 'Document performance requirements',
206
+ 'Add performance tests/benchmarks',
207
+ ],
208
+ recommended: [
209
+ 'Consider caching strategies',
210
+ 'Optimize database queries',
211
+ 'Use async/non-blocking where appropriate',
212
+ 'Consider lazy loading',
213
+ ],
214
+ avoid: [
215
+ 'Premature optimization',
216
+ 'Optimizing without measurements',
217
+ 'Sacrificing readability without significant gain',
218
+ 'Micro-optimizations in non-critical paths',
219
+ ],
220
+ },
221
+ security: {
222
+ taskType: 'security',
223
+ mandatory: [
224
+ 'Validate ALL user inputs',
225
+ 'Use parameterized queries (prevent SQL injection)',
226
+ 'Escape output (prevent XSS)',
227
+ 'Apply principle of least privilege',
228
+ 'Never log sensitive data',
229
+ ],
230
+ recommended: [
231
+ 'Use established security libraries',
232
+ 'Implement rate limiting',
233
+ 'Add security headers',
234
+ 'Use HTTPS everywhere',
235
+ 'Implement proper authentication/authorization',
236
+ ],
237
+ avoid: [
238
+ 'Rolling your own crypto',
239
+ 'Hardcoded secrets',
240
+ 'Trusting client-side validation alone',
241
+ 'Exposing stack traces to users',
242
+ 'Using deprecated crypto algorithms',
243
+ ],
244
+ },
245
+ infrastructure: {
246
+ taskType: 'infrastructure',
247
+ mandatory: [
248
+ 'Infrastructure as Code (no manual changes)',
249
+ 'Version control all configurations',
250
+ 'Test in staging before production',
251
+ 'Document deployment procedures',
252
+ ],
253
+ recommended: [
254
+ 'Use immutable infrastructure',
255
+ 'Implement health checks',
256
+ 'Set up proper monitoring/alerting',
257
+ 'Plan for rollback',
258
+ ],
259
+ avoid: [
260
+ 'Manual server configuration',
261
+ 'Snowflake servers',
262
+ 'Deploying directly to production',
263
+ 'Ignoring resource limits',
264
+ ],
265
+ },
266
+ };
267
+ }
268
+ /**
269
+ * Formats guardrails as markdown with workflow guidance.
270
+ */
271
+ export function formatGuardrailsAsMarkdown(guardrails) {
272
+ const lines = [];
273
+ lines.push(`## Guardrails for ${guardrails.taskType.toUpperCase()} Tasks`, '');
274
+ lines.push('### Mandatory', '');
275
+ for (const item of guardrails.mandatory) {
276
+ lines.push(`- ✅ ${item}`);
277
+ }
278
+ lines.push('');
279
+ lines.push('### Recommended', '');
280
+ for (const item of guardrails.recommended) {
281
+ lines.push(`- 💡 ${item}`);
282
+ }
283
+ lines.push('');
284
+ lines.push('### Avoid', '');
285
+ for (const item of guardrails.avoid) {
286
+ lines.push(`- ❌ ${item}`);
287
+ }
288
+ lines.push('');
289
+ // Add workflow if present
290
+ if (guardrails.workflow?.steps) {
291
+ lines.push('### Workflow', '');
292
+ for (let i = 0; i < guardrails.workflow.steps.length; i++) {
293
+ const step = guardrails.workflow.steps[i];
294
+ lines.push(`**${i + 1}. ${step.name}**: ${step.description}`);
295
+ for (const action of step.actions) {
296
+ lines.push(` - ${action}`);
297
+ }
298
+ lines.push('');
299
+ }
300
+ }
301
+ return lines.join('\n');
302
+ }
303
+ //# sourceMappingURL=guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../src/guardrails.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { CallToolRequestSchema, ErrorCode, GetPromptRequestSchema, ListPromptsRe
5
5
  import { config } from './config.js';
6
6
  import { handleGetPrompt, prompts } from './prompts.js';
7
7
  import { listResources, readResource } from './resources.js';
8
- import { handleToolCall, tools } from './tools.js';
8
+ import { handleToolCall, tools } from './tools/index.js';
9
9
  /**
10
10
  * Create and configure the MCP server.
11
11
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Log levels in order of severity.
3
+ */
4
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
5
+ /**
6
+ * Structured log entry.
7
+ */
8
+ interface LogEntry {
9
+ timestamp: string;
10
+ level: LogLevel;
11
+ message: string;
12
+ context?: Record<string, unknown>;
13
+ }
14
+ /**
15
+ * Logger interface with level-specific methods.
16
+ */
17
+ export declare const logger: {
18
+ /**
19
+ * Debug level - detailed information for debugging.
20
+ */
21
+ debug: (message: string, context?: Record<string, unknown>) => void;
22
+ /**
23
+ * Info level - general operational information.
24
+ */
25
+ info: (message: string, context?: Record<string, unknown>) => void;
26
+ /**
27
+ * Warn level - something unexpected but not critical.
28
+ */
29
+ warn: (message: string, context?: Record<string, unknown>) => void;
30
+ /**
31
+ * Error level - something went wrong.
32
+ */
33
+ error: (message: string, context?: Record<string, unknown>) => void;
34
+ };
35
+ export type { LogLevel, LogEntry };
36
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD;;GAEG;AACH,UAAU,QAAQ;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAsCD;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;qBACc,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;IAIjE;;OAEG;oBACa,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;IAIhE;;OAEG;oBACa,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;IAIhE;;OAEG;qBACc,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;CAGlE,CAAC;AAEF,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,63 @@
1
+ import { config } from './config.js';
2
+ /**
3
+ * Log level priorities for filtering.
4
+ */
5
+ const LOG_LEVEL_PRIORITY = {
6
+ debug: 0,
7
+ info: 1,
8
+ warn: 2,
9
+ error: 3,
10
+ };
11
+ /**
12
+ * Check if a log level should be output based on configured level.
13
+ */
14
+ function shouldLog(level) {
15
+ const configuredLevel = config.logLevel;
16
+ return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[configuredLevel];
17
+ }
18
+ /**
19
+ * Format and output a log entry.
20
+ * Always outputs to stderr to avoid interfering with MCP stdio transport.
21
+ */
22
+ function log(level, message, context) {
23
+ if (!shouldLog(level))
24
+ return;
25
+ const entry = {
26
+ timestamp: new Date().toISOString(),
27
+ level,
28
+ message,
29
+ ...(context && Object.keys(context).length > 0 ? { context } : {}),
30
+ };
31
+ // Output as JSON for structured logging
32
+ console.error(JSON.stringify(entry));
33
+ }
34
+ /**
35
+ * Logger interface with level-specific methods.
36
+ */
37
+ export const logger = {
38
+ /**
39
+ * Debug level - detailed information for debugging.
40
+ */
41
+ debug: (message, context) => {
42
+ log('debug', message, context);
43
+ },
44
+ /**
45
+ * Info level - general operational information.
46
+ */
47
+ info: (message, context) => {
48
+ log('info', message, context);
49
+ },
50
+ /**
51
+ * Warn level - something unexpected but not critical.
52
+ */
53
+ warn: (message, context) => {
54
+ log('warn', message, context);
55
+ },
56
+ /**
57
+ * Error level - something went wrong.
58
+ */
59
+ error: (message, context) => {
60
+ log('error', message, context);
61
+ },
62
+ };
63
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC;;GAEG;AACH,MAAM,kBAAkB,GAA6B;IACnD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;GAEG;AACH,SAAS,SAAS,CAAC,KAAe;IAChC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAoB,CAAC;IACpD,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiC;IAC9E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,KAAK,GAAa;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,OAAO;QACP,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;IAEF,wCAAwC;IACxC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;OAEG;IACH,KAAK,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QAClE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QACjE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QACjE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QAClE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Simple in-memory metrics for Corbat MCP.
3
+ * Tracks tool calls, profiles used, and errors.
4
+ */
5
+ /**
6
+ * Record a tool call.
7
+ */
8
+ export declare function recordToolCall(toolName: string): void;
9
+ /**
10
+ * Record a profile being used.
11
+ */
12
+ export declare function recordProfileUsed(profileId: string): void;
13
+ /**
14
+ * Record a task type being processed.
15
+ */
16
+ export declare function recordTaskType(taskType: string): void;
17
+ /**
18
+ * Record an error.
19
+ */
20
+ export declare function recordError(): void;
21
+ /**
22
+ * Get current metrics with computed values.
23
+ */
24
+ export declare function getMetrics(): {
25
+ toolCalls: Record<string, number>;
26
+ profilesUsed: Record<string, number>;
27
+ taskTypes: Record<string, number>;
28
+ errors: number;
29
+ uptimeMs: number;
30
+ uptimeFormatted: string;
31
+ totalToolCalls: number;
32
+ mostUsedTool: string | null;
33
+ mostUsedProfile: string | null;
34
+ mostCommonTaskType: string | null;
35
+ };
36
+ /**
37
+ * Reset all metrics (useful for testing).
38
+ */
39
+ export declare function resetMetrics(): void;
40
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAoCD;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAgBA;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}