truss-code-review-mcp 1.0.1 → 1.2.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 (52) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/.github/workflows/mcp-registry-publish.yml +21 -0
  3. package/.mcpize/project.json +4 -0
  4. package/README.md +46 -0
  5. package/agent-card.json +89 -0
  6. package/dist/index.js +8 -24
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/billing.d.ts +7 -0
  9. package/dist/lib/billing.d.ts.map +1 -0
  10. package/dist/lib/billing.js +31 -0
  11. package/dist/lib/billing.js.map +1 -0
  12. package/dist/lib/license.d.ts +4 -0
  13. package/dist/lib/license.d.ts.map +1 -1
  14. package/dist/lib/license.js +5 -5
  15. package/dist/lib/license.js.map +1 -1
  16. package/dist/tools/check-complexity.d.ts.map +1 -1
  17. package/dist/tools/check-complexity.js +3 -1
  18. package/dist/tools/check-complexity.js.map +1 -1
  19. package/dist/tools/deep-review.d.ts.map +1 -1
  20. package/dist/tools/deep-review.js +3 -1
  21. package/dist/tools/deep-review.js.map +1 -1
  22. package/dist/tools/detect-antipatterns.d.ts.map +1 -1
  23. package/dist/tools/detect-antipatterns.js +3 -1
  24. package/dist/tools/detect-antipatterns.js.map +1 -1
  25. package/dist/tools/explain-code.d.ts.map +1 -1
  26. package/dist/tools/explain-code.js +3 -1
  27. package/dist/tools/explain-code.js.map +1 -1
  28. package/dist/tools/optimize-code.d.ts.map +1 -1
  29. package/dist/tools/optimize-code.js +3 -1
  30. package/dist/tools/optimize-code.js.map +1 -1
  31. package/dist/tools/review-diff.d.ts.map +1 -1
  32. package/dist/tools/review-diff.js +3 -1
  33. package/dist/tools/review-diff.js.map +1 -1
  34. package/dist/tools/security-review.d.ts.map +1 -1
  35. package/dist/tools/security-review.js +3 -1
  36. package/dist/tools/security-review.js.map +1 -1
  37. package/dist/tools/suggest-tests.d.ts.map +1 -1
  38. package/dist/tools/suggest-tests.js +3 -1
  39. package/dist/tools/suggest-tests.js.map +1 -1
  40. package/package.json +13 -3
  41. package/server.json +20 -0
  42. package/src/index.ts +8 -24
  43. package/src/lib/billing.ts +34 -0
  44. package/src/lib/license.ts +5 -7
  45. package/src/tools/check-complexity.ts +3 -1
  46. package/src/tools/deep-review.ts +3 -1
  47. package/src/tools/detect-antipatterns.ts +3 -1
  48. package/src/tools/explain-code.ts +3 -1
  49. package/src/tools/optimize-code.ts +3 -1
  50. package/src/tools/review-diff.ts +3 -1
  51. package/src/tools/security-review.ts +3 -1
  52. package/src/tools/suggest-tests.ts +3 -1
@@ -0,0 +1 @@
1
+ custom: ["https://claw-factory.github.io/truss-site"]
@@ -0,0 +1,21 @@
1
+ name: Publish to MCP Registry
2
+ on:
3
+ workflow_dispatch:
4
+
5
+ permissions:
6
+ id-token: write
7
+ contents: read
8
+
9
+ jobs:
10
+ publish:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Install mcp-publisher
15
+ run: npm install -g mcp-publisher
16
+ - name: Login via OIDC
17
+ run: mcp-publisher login github-oidc
18
+ - name: Validate
19
+ run: mcp-publisher validate server.json
20
+ - name: Publish
21
+ run: mcp-publisher publish server.json
@@ -0,0 +1,4 @@
1
+ {
2
+ "serverId": "33aa207e-f471-4d90-9316-1e06e0576abb",
3
+ "serverName": "truss-code-review-mcp"
4
+ }
package/README.md CHANGED
@@ -1,9 +1,37 @@
1
1
  # TRUSS Code Review MCP Server
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/truss-code-review-mcp)](https://www.npmjs.com/package/truss-code-review-mcp)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+
3
6
  AI-powered code review tools for Claude Code. Automated complexity analysis, anti-pattern detection, security review, and optimization — directly in your editor.
4
7
 
5
8
  ## Quick Start
6
9
 
10
+ Run with npx (no install needed):
11
+
12
+ ```bash
13
+ npx -y truss-code-review-mcp
14
+ ```
15
+
16
+ ### Claude Desktop / Claude Code
17
+
18
+ Add to your `claude_desktop_config.json` or `.claude/settings.json`:
19
+
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "code-review": {
24
+ "command": "npx",
25
+ "args": ["-y", "truss-code-review-mcp"]
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ ### Cursor
32
+
33
+ Add to your Cursor MCP settings:
34
+
7
35
  ```json
8
36
  {
9
37
  "mcpServers": {
@@ -15,6 +43,8 @@ AI-powered code review tools for Claude Code. Automated complexity analysis, ant
15
43
  }
16
44
  ```
17
45
 
46
+ ---
47
+
18
48
  ## Tools
19
49
 
20
50
  ### Free Tier (no key needed)
@@ -58,3 +88,19 @@ export ANTHROPIC_API_KEY="sk-ant-..." # or OPENAI_API_KEY
58
88
  ## License
59
89
 
60
90
  MIT
91
+
92
+
93
+ ---
94
+
95
+ ## A2A Discovery
96
+
97
+ This server publishes a [Google A2A Protocol](https://a2a-protocol.org) Agent Card, making it discoverable by any A2A-compatible agent framework (LangGraph, CrewAI, Google ADK, AutoGen, and others).
98
+
99
+ **Agent Card:** [`agent-card.json`](./agent-card.json)
100
+
101
+ The agent card describes this server's skills, capabilities, input/output modalities, and authentication requirements in a machine-readable format. A2A clients can use it to discover and invoke tools automatically without manual configuration.
102
+
103
+ ```bash
104
+ # Fetch the agent card
105
+ curl https://raw.githubusercontent.com/claw-factory/truss-code-review-mcp/main/agent-card.json
106
+ ```
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "TRUSS Code Review MCP — Automated Code Analysis",
3
+ "description": "AI-powered code review tools for Claude Code and MCP-compatible agents. Automated complexity analysis, anti-pattern detection, diff review, security scanning, and optimization suggestions — directly in your editor.",
4
+ "version": "1.0.0",
5
+ "documentationUrl": "https://github.com/claw-factory/truss-code-review-mcp#readme",
6
+ "provider": {
7
+ "organization": "TRUSS / claw-factory",
8
+ "url": "https://claw-factory.github.io/truss-site"
9
+ },
10
+ "supportedInterfaces": [
11
+ {
12
+ "url": "https://claw-factory.github.io/truss-site/a2a/v1",
13
+ "protocolBinding": "HTTP+JSON",
14
+ "protocolVersion": "1.0"
15
+ }
16
+ ],
17
+ "capabilities": {
18
+ "streaming": false,
19
+ "pushNotifications": false,
20
+ "stateTransitionHistory": false,
21
+ "extendedAgentCard": false
22
+ },
23
+ "securitySchemes": {
24
+ "bearer": {
25
+ "type": "http",
26
+ "scheme": "bearer",
27
+ "description": "TRUSS license key (optional — basic analysis available without authentication)"
28
+ }
29
+ },
30
+ "security": [],
31
+ "defaultInputModes": ["text/plain", "application/json"],
32
+ "defaultOutputModes": ["application/json"],
33
+ "pricing": {
34
+ "free": true,
35
+ "paid": {
36
+ "amount": 25,
37
+ "currency": "USD",
38
+ "interval": "month",
39
+ "url": "https://claw-factory.github.io/truss-site"
40
+ }
41
+ },
42
+ "skills": [
43
+ {
44
+ "id": "review_diff",
45
+ "name": "Diff Analysis",
46
+ "description": "Analyze a git diff or patch for logic errors, bugs, and code quality issues",
47
+ "tags": ["code-review", "diff", "git", "quality"],
48
+ "examples": ["Review this pull request diff for logic errors and security issues"],
49
+ "inputModes": ["text/plain"],
50
+ "outputModes": ["application/json"]
51
+ },
52
+ {
53
+ "id": "review_complexity",
54
+ "name": "Complexity Metrics",
55
+ "description": "Calculate cyclomatic complexity, cognitive complexity, and maintainability index for code",
56
+ "tags": ["code-review", "complexity", "metrics", "quality"],
57
+ "examples": ["Calculate complexity metrics for this function"],
58
+ "inputModes": ["text/plain"],
59
+ "outputModes": ["application/json"]
60
+ },
61
+ {
62
+ "id": "review_antipatterns",
63
+ "name": "Anti-Pattern Detection",
64
+ "description": "Detect language-specific anti-patterns, code smells, and bad practices across JS/TS, Python, Go, and Rust",
65
+ "tags": ["code-review", "anti-patterns", "best-practices"],
66
+ "examples": ["Scan this Go code for anti-patterns like ignored errors or goroutine leaks"],
67
+ "inputModes": ["text/plain"],
68
+ "outputModes": ["application/json"]
69
+ },
70
+ {
71
+ "id": "review_security",
72
+ "name": "Security Review",
73
+ "description": "Identify security vulnerabilities including injection, XSS, secrets, weak crypto, and SSRF",
74
+ "tags": ["code-review", "security", "vulnerabilities"],
75
+ "examples": ["Perform a security review of this Express.js route handler"],
76
+ "inputModes": ["text/plain"],
77
+ "outputModes": ["application/json"]
78
+ },
79
+ {
80
+ "id": "review_optimize",
81
+ "name": "Optimization Suggestions",
82
+ "description": "Suggest performance improvements, algorithmic optimizations, and resource usage reductions",
83
+ "tags": ["code-review", "performance", "optimization"],
84
+ "examples": ["Suggest optimizations for this database query loop"],
85
+ "inputModes": ["text/plain"],
86
+ "outputModes": ["application/json"]
87
+ }
88
+ ]
89
+ }
package/dist/index.js CHANGED
@@ -1,61 +1,45 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- // Free tier tools
4
+ // Rule-based tools
5
5
  import { registerReviewDiff } from './tools/review-diff.js';
6
6
  import { registerCheckComplexity } from './tools/check-complexity.js';
7
7
  import { registerDetectAntipatterns } from './tools/detect-antipatterns.js';
8
- // Pro tier tools
8
+ // AI-powered tools
9
9
  import { registerDeepReview } from './tools/deep-review.js';
10
10
  import { registerSuggestTests } from './tools/suggest-tests.js';
11
11
  import { registerExplainCode } from './tools/explain-code.js';
12
12
  import { registerSecurityReview } from './tools/security-review.js';
13
13
  import { registerOptimizeCode } from './tools/optimize-code.js';
14
14
  // Helpers
15
- import { getLicenseStatus, hasAiKey } from './lib/license.js';
15
+ import { hasAiKey } from './lib/license.js';
16
16
  const server = new McpServer({
17
17
  name: '@truss-dev/code-review-mcp',
18
18
  version: '1.0.0',
19
19
  });
20
20
  // ── Status Tool ─────────────────────────────────────────────────────
21
- server.tool('check_review_status', 'Check license tier and AI key configuration for code review tools.', {}, async () => {
22
- const license = await getLicenseStatus();
21
+ server.tool('check_review_status', 'Returns current license tier (free/pro), validity, expiration, and whether an AI API key (ANTHROPIC_API_KEY or OPENAI_API_KEY) is configured. Lists all available tools grouped by tier. Use to verify configuration before calling pro or AI-dependent tools.', {}, async () => {
23
22
  const aiKeyPresent = hasAiKey();
24
23
  return {
25
24
  content: [
26
25
  {
27
26
  type: 'text',
28
27
  text: JSON.stringify({
29
- license: {
30
- tier: license.tier,
31
- valid: license.valid,
32
- expires_at: license.expiresAt,
33
- },
28
+ server: 'truss-code-review-mcp',
34
29
  ai_key_configured: aiKeyPresent,
35
- free_tools: [
30
+ tools: [
36
31
  'review_diff — Rule-based diff analysis',
37
32
  'check_complexity — Cyclomatic complexity calculator',
38
33
  'detect_antipatterns — Language-specific anti-pattern detection',
39
- ],
40
- pro_tools: [
41
34
  'deep_review — AI-powered comprehensive review',
42
35
  'suggest_tests — Generate test cases',
43
36
  'explain_code — Generate documentation',
44
37
  'security_review — OWASP security analysis',
45
38
  'optimize_code — Performance optimization',
46
39
  ],
47
- ...(license.tier === 'free'
48
- ? {
49
- upgrade_info: {
50
- url: 'https://truss.dev/pricing',
51
- price: '$25/mo',
52
- note: 'Set TRUSS_LICENSE_KEY + your own ANTHROPIC_API_KEY or OPENAI_API_KEY',
53
- },
54
- }
55
- : {}),
56
- ...(!aiKeyPresent && license.tier === 'pro'
40
+ ...(!aiKeyPresent
57
41
  ? {
58
- warning: 'Pro license active but no AI key configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY to use AI-powered tools.',
42
+ note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI-powered tools (deep_review, suggest_tests, explain_code, security_review, optimize_code).',
59
43
  }
60
44
  : {}),
61
45
  }, null, 2),
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,UAAU;AACV,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,4BAA4B;IAClC,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gQAAgQ,EAChQ,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;IAEhC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,uBAAuB;oBAC/B,iBAAiB,EAAE,YAAY;oBAC/B,KAAK,EAAE;wBACL,wCAAwC;wBACxC,qDAAqD;wBACrD,gEAAgE;wBAChE,+CAA+C;wBAC/C,qCAAqC;wBACrC,uCAAuC;wBACvC,2CAA2C;wBAC3C,0CAA0C;qBAC3C;oBACD,GAAG,CAAC,CAAC,YAAY;wBACf,CAAC,CAAC;4BACE,IAAI,EAAE,gJAAgJ;yBACvJ;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,uEAAuE;AAEvE,YAAY;AACZ,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAEnC,WAAW;AACX,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,uEAAuE;AAEvE,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
3
+ * Non-blocking — failures are logged but do not interrupt the tool call.
4
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
5
+ */
6
+ export declare function recordToolCall(toolName: string): Promise<void>;
7
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
@@ -0,0 +1,31 @@
1
+ import Stripe from 'stripe';
2
+ const stripeKey = process.env.STRIPE_SECRET_KEY;
3
+ const customerId = process.env.STRIPE_CUSTOMER_ID;
4
+ let stripe = null;
5
+ if (stripeKey) {
6
+ stripe = new Stripe(stripeKey);
7
+ }
8
+ /**
9
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
10
+ * Non-blocking — failures are logged but do not interrupt the tool call.
11
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
12
+ */
13
+ export async function recordToolCall(toolName) {
14
+ if (!stripe || !customerId)
15
+ return;
16
+ try {
17
+ await stripe.billing.meterEvents.create({
18
+ event_name: 'mcp_tool_call',
19
+ payload: {
20
+ stripe_customer_id: customerId,
21
+ value: '1',
22
+ },
23
+ identifier: `${customerId}_${toolName}_${Date.now()}`,
24
+ });
25
+ }
26
+ catch (err) {
27
+ // Non-blocking — log and continue
28
+ console.error(`[billing] meter event failed for ${toolName}:`, err.message);
29
+ }
30
+ }
31
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAElD,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,IAAI,SAAS,EAAE,CAAC;IACd,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE;gBACP,kBAAkB,EAAE,UAAU;gBAC9B,KAAK,EAAE,GAAG;aACX;YACD,UAAU,EAAE,GAAG,UAAU,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,OAAO,CAAC,KAAK,CAAC,oCAAoC,QAAQ,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
@@ -9,6 +9,10 @@ export interface LicenseStatus {
9
9
  expiresAt: string | null;
10
10
  }
11
11
  export declare function getLicenseStatus(): Promise<LicenseStatus>;
12
+ /**
13
+ * No-op. All tools are available in the free tier.
14
+ * Retained for API compatibility.
15
+ */
12
16
  export declare function requirePro(): Promise<void>;
13
17
  export declare function hasAiKey(): boolean;
14
18
  export declare function requireAiKey(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAqCD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB/D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAQhD;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAqCD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB/D;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}
@@ -54,12 +54,12 @@ export async function getLicenseStatus() {
54
54
  cachedStatus = { key, status, timestamp: Date.now() };
55
55
  return status;
56
56
  }
57
+ /**
58
+ * No-op. All tools are available in the free tier.
59
+ * Retained for API compatibility.
60
+ */
57
61
  export async function requirePro() {
58
- const status = await getLicenseStatus();
59
- if (status.tier !== 'pro') {
60
- throw new Error('This feature requires a TRUSS Pro license ($25/mo). ' +
61
- 'Get yours at https://truss.dev/pricing and set TRUSS_LICENSE_KEY.');
62
- }
62
+ // All tools are free — no license gate
63
63
  }
64
64
  export function hasAiKey() {
65
65
  return !!(process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY);
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,YAAY,GAAqE,IAAI,CAAC;AAC1F,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE9C,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,aAAa,GAAG,EAAE,EAAE;YAChE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,YAAY,EAAE,6BAA6B;aAC5C;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6C,CAAC;QAC9E,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;SACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACnG,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAkB;QAC5B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,YAAY,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,mEAAmE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,YAAY,GAAqE,IAAI,CAAC;AAC1F,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE9C,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,aAAa,GAAG,EAAE,EAAE;YAChE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,YAAY,EAAE,6BAA6B;aAC5C;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6C,CAAC;QAC9E,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;SACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACnG,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAkB;QAC5B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,YAAY,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,uCAAuC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"check-complexity.d.ts","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkC/D"}
1
+ {"version":3,"file":"check-complexity.d.ts","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmC/D"}
@@ -3,11 +3,13 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import { calculateComplexity } from '../lib/complexity.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
  export function registerCheckComplexity(server) {
7
- server.tool('check_complexity', 'Calculate cyclomatic complexity of functions/methods. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Supports JS/TS, Python, Go. Free tier.', {
8
+ server.tool('check_complexity', 'Calculates cyclomatic complexity for each function/method in source code. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Input: code (string), language (javascript, typescript, python, go). Output: per-function complexity scores with ratings (simple 1-5, moderate 6-10, complex 11-20, very complex 21+), overall score, and average. Rule-based static analysis. Free tier.', {
8
9
  code: z.string().describe('Source code to analyze'),
9
10
  language: z.string().describe('Programming language (javascript, typescript, python, go)'),
10
11
  }, async ({ code, language }) => {
12
+ recordToolCall('check_complexity').catch(() => { });
11
13
  const result = calculateComplexity(code, language);
12
14
  const output = {
13
15
  functions: result.functions.map(f => ({
@@ -1 +1 @@
1
- {"version":3,"file":"check-complexity.js","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,oLAAoL,EACpL;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE;gBACpC,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,oBAAoB,EAAE,MAAM,CAAC,kBAAkB;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,OAAO;gBAChB,YAAY,EAAE,KAAK;aACpB;SACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"check-complexity.js","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2ZAA2Z,EAC3Z;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE;gBACpC,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,oBAAoB,EAAE,MAAM,CAAC,kBAAkB;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,OAAO;gBAChB,YAAY,EAAE,KAAK;aACpB;SACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD1D"}
1
+ {"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0D1D"}
@@ -4,12 +4,14 @@
4
4
  import { z } from 'zod';
5
5
  import { requirePro, requireAiKey } from '../lib/license.js';
6
6
  import { aiReview, DEEP_REVIEW_SYSTEM } from '../lib/ai-review.js';
7
+ import { recordToolCall } from '../lib/billing.js';
7
8
  export function registerDeepReview(server) {
8
- server.tool('deep_review', 'AI-powered comprehensive code review covering architecture, security, performance, error handling, and maintainability. Returns scored findings with remediation. Pro tier requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY.', {
9
+ server.tool('deep_review', 'Sends source code to an LLM for comprehensive review covering architecture, security, performance, error handling, and maintainability. Input: code (string), language (string), optional context about the code role. Output: structured JSON review with scored findings, severity levels, and remediation suggestions. Requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY (customer-provided). Pro tier.', {
9
10
  code: z.string().describe('Source code to review'),
10
11
  language: z.string().describe('Programming language'),
11
12
  context: z.string().optional().describe('Additional context (e.g., "this is a REST API handler", "performance-critical path")'),
12
13
  }, async ({ code, language, context }) => {
14
+ recordToolCall('deep_review').catch(() => { });
13
15
  await requirePro();
14
16
  requireAiKey();
15
17
  const userPrompt = [
@@ -1 +1 @@
1
- {"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gPAAgP,EAChP;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;KAChI,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YACpC,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAE9D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,MAAM;4BACd,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2ZAA2Z,EAC3Z;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;KAChI,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YACpC,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAE9D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,MAAM;4BACd,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"detect-antipatterns.d.ts","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6ClE"}
1
+ {"version":3,"file":"detect-antipatterns.d.ts","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ClE"}
@@ -3,11 +3,13 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import { detectAntiPatterns, getSupportedLanguages, isLanguageSupported } from '../lib/patterns.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
  export function registerDetectAntipatterns(server) {
7
- server.tool('detect_antipatterns', 'Detect common anti-patterns per language. Includes: JS/TS (var, ==, any, eval, innerHTML, sync I/O), Python (bare except, mutable defaults, wildcard imports), Go (ignored errors, goroutine leaks, mutex without defer). Free tier.', {
8
+ server.tool('detect_antipatterns', 'Scans source code for language-specific anti-patterns using regex rules. JS/TS: var usage, ==, any type, eval, innerHTML, synchronous I/O. Python: bare except, mutable default arguments, wildcard imports. Go: ignored error returns, goroutine leaks, mutex without defer. Input: code (string), language (javascript, typescript, python, go). Output: findings array with pattern name, description, location, severity, and suggested fix. Rule-based, no AI API key needed. Free tier.', {
8
9
  code: z.string().describe('Source code to analyze'),
9
10
  language: z.string().describe('Programming language (javascript, typescript, python, go)'),
10
11
  }, async ({ code, language }) => {
12
+ recordToolCall('detect_antipatterns').catch(() => { });
11
13
  if (!isLanguageSupported(language)) {
12
14
  return {
13
15
  content: [{
@@ -1 +1 @@
1
- {"version":3,"file":"detect-antipatterns.js","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEpG,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,sOAAsO,EACtO;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,aAAa,QAAQ,qBAAqB;4BACjD,SAAS,EAAE,qBAAqB,EAAE;yBACnC,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,QAAQ;YACR,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,WAAW,EAAE;gBACX,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;gBACzD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;gBAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;aACxD;YACD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"detect-antipatterns.js","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,+dAA+d,EAC/d;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,aAAa,QAAQ,qBAAqB;4BACjD,SAAS,EAAE,qBAAqB,EAAE;yBACnC,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,QAAQ;YACR,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,WAAW,EAAE;gBACX,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;gBACzD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;gBAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;aACxD;YACD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"explain-code.d.ts","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuD3D"}
1
+ {"version":3,"file":"explain-code.d.ts","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwD3D"}
@@ -4,11 +4,13 @@
4
4
  import { z } from 'zod';
5
5
  import { requirePro, requireAiKey } from '../lib/license.js';
6
6
  import { aiReview, EXPLAIN_CODE_SYSTEM } from '../lib/ai-review.js';
7
+ import { recordToolCall } from '../lib/billing.js';
7
8
  export function registerExplainCode(server) {
8
- server.tool('explain_code', 'Generate documentation for complex code. Produces high-level explanation, function docstrings, data flow analysis, and design notes. Pro tier.', {
9
+ server.tool('explain_code', 'Sends source code to an LLM to generate documentation. Input: code (string), language (string). Output: high-level explanation, per-function docstrings, data flow analysis, and design notes as structured JSON. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
9
10
  code: z.string().describe('Source code to explain'),
10
11
  language: z.string().describe('Programming language'),
11
12
  }, async ({ code, language }) => {
13
+ recordToolCall('explain_code').catch(() => { });
12
14
  await requirePro();
13
15
  requireAiKey();
14
16
  const userPrompt = [
@@ -1 +1 @@
1
- {"version":3,"file":"explain-code.js","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,gJAAgJ,EAChJ;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAE/D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"explain-code.js","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,2QAA2Q,EAC3Q;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAE/D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"optimize-code.d.ts","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwD5D"}
1
+ {"version":3,"file":"optimize-code.d.ts","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD5D"}
@@ -4,11 +4,13 @@
4
4
  import { z } from 'zod';
5
5
  import { requirePro, requireAiKey } from '../lib/license.js';
6
6
  import { aiReview, OPTIMIZE_CODE_SYSTEM } from '../lib/ai-review.js';
7
+ import { recordToolCall } from '../lib/billing.js';
7
8
  export function registerOptimizeCode(server) {
8
- server.tool('optimize_code', 'Performance optimization suggestions with before/after code and expected impact. Covers algorithmic complexity, memory usage, I/O efficiency, caching, and language-specific optimizations. Pro tier.', {
9
+ server.tool('optimize_code', 'Sends source code to an LLM for performance analysis. Input: code (string), language (string). Output: optimization suggestions with before/after code snippets, expected impact, and categories (algorithmic complexity, memory, I/O, caching). Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
9
10
  code: z.string().describe('Source code to optimize'),
10
11
  language: z.string().describe('Programming language'),
11
12
  }, async ({ code, language }) => {
13
+ recordToolCall('optimize_code').catch(() => { });
12
14
  await requirePro();
13
15
  requireAiKey();
14
16
  const userPrompt = [
@@ -1 +1 @@
1
- {"version":3,"file":"optimize-code.js","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,uMAAuM,EACvM;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,+DAA+D;YAC/D,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAEhE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"optimize-code.js","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0SAA0S,EAC1S;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,+DAA+D;YAC/D,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAEhE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"review-diff.d.ts","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyUpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsC1D"}
1
+ {"version":3,"file":"review-diff.d.ts","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0UpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuC1D"}
@@ -6,6 +6,7 @@
6
6
  import { z } from 'zod';
7
7
  import { readFileSync } from 'node:fs';
8
8
  import { execSync } from 'node:child_process';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
  // ── Rule checks ─────────────────────────────────────────────────────
10
11
  function checkLargeFile(lines, filename) {
11
12
  const addedLines = lines.filter(l => l.startsWith('+')).length;
@@ -300,10 +301,11 @@ function getDiffContent(input) {
300
301
  }
301
302
  // ── Tool registration ───────────────────────────────────────────────
302
303
  export function registerReviewDiff(server) {
303
- server.tool('review_diff', 'Analyze a git diff for common issues: large files, debug statements, TODO without tickets, commented-out code, import ordering, sensitive data. Free tier no API key needed.', {
304
+ server.tool('review_diff', 'Analyzes a git diff or file for common code review issues using rule-based pattern matching. Checks: oversized changes (>500 lines added), leftover debug statements (console.log, print, debugger, pdb), TODO/FIXME without ticket references, commented-out code blocks, and potential secret leaks. Input: either raw diff text or a file_path to diff. Output: array of findings with file, line number, severity (error/warning/info), message, and suggested fix. No AI API key needed. Free tier.', {
304
305
  diff: z.string().optional().describe('Raw git diff content'),
305
306
  file_path: z.string().optional().describe('Path to file (will run git diff on it)'),
306
307
  }, async (input) => {
308
+ recordToolCall('review_diff').catch(() => { });
307
309
  const diffContent = getDiffContent(input);
308
310
  const files = parseDiff(diffContent);
309
311
  const allComments = [];
@@ -1 +1 @@
1
- {"version":3,"file":"review-diff.js","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAU9C,uEAAuE;AAEvE,SAAS,cAAc,CAAC,KAAe,EAAE,QAAgB;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,iBAAiB,UAAU,mDAAmD;YACvF,UAAU,EAAE,2DAA2D;SACxE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAe,EAAE,QAAgB;IAC7D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG;QACpB,EAAE,OAAO,EAAE,2CAA2C,EAAE,OAAO,EAAE,0BAA0B,EAAE;QAC7F,EAAE,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACtF,EAAE,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE,iCAAiC,EAAE;QACnF,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE;QAC1D,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC5D,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,EAAE;QAClE,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,qBAAqB,EAAE;KACtE,CAAC;IAEF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,EAAE,CAAC,OAAO;wBACnB,UAAU,EAAE,iEAAiE;qBAC9E,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAe,EAAE,QAAgB;IAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,kEAAkE,CAAC;IAEvF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,wCAAwC;oBACjD,UAAU,EAAE,0EAA0E;iBACvF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAe,EAAE,QAAgB;IAC9D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,uFAAuF;IACvF,MAAM,YAAY,GAAG;QACnB,wEAAwE;QACxE,uDAAuD;QACvD,2BAA2B;QAC3B,wBAAwB;KACzB,CAAC;IAEF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,wBAAwB,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAEhE,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,wBAAwB,KAAK,CAAC;oBAAE,UAAU,GAAG,OAAO,CAAC;gBACzD,wBAAwB,EAAE,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,wBAAwB,IAAI,CAAC,EAAE,CAAC;oBAClC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,GAAG,wBAAwB,+BAA+B;wBACnE,UAAU,EAAE,+EAA+E;qBAC5F,CAAC,CAAC;gBACL,CAAC;gBACD,wBAAwB,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;YACV,IAAI,wBAAwB,IAAI,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,GAAG,wBAAwB,+BAA+B;oBACnE,UAAU,EAAE,+EAA+E;iBAC5F,CAAC,CAAC;YACL,CAAC;YACD,wBAAwB,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,wBAAwB,IAAI,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,GAAG,wBAAwB,+BAA+B;YACnE,UAAU,EAAE,+EAA+E;SAC5F,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe,EAAE,QAAgB;IAC3D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAG;QACxB,EAAE,OAAO,EAAE,+EAA+E,EAAE,OAAO,EAAE,+BAA+B,EAAE;QACtI,EAAE,OAAO,EAAE,+CAA+C,EAAE,OAAO,EAAE,qBAAqB,EAAE;QAC5F,EAAE,OAAO,EAAE,uCAAuC,EAAE,OAAO,EAAE,qDAAqD,EAAE;QACpH,EAAE,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,4BAA4B,EAAE;QACtF,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,uCAAuC,EAAE;QAC/E,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,4BAA4B,EAAE;KACrE,CAAC;IAEF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;gBACnC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,EAAE,CAAC,OAAO;wBACnB,UAAU,EAAE,uFAAuF;qBACpG,CAAC,CAAC;oBACH,MAAM,CAAC,iCAAiC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAe,EAAE,QAAgB;IAC5D,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAsF,EAAE,CAAC;IAC1G,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAErC,gBAAgB;YAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACzE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBAC1D,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,iBAAiB,GAAmB,IAAI,CAAC;QAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,iBAAiB,KAAK,IAAI,IAAI,GAAG,CAAC,YAAY,KAAK,iBAAiB,EAAE,CAAC;gBACzE,WAAW,EAAE,CAAC;YAChB,CAAC;YACD,iBAAiB,GAAG,GAAG,CAAC,YAAY,CAAC;QACvC,CAAC;QACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;gBACzB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,mEAAmE;gBAC5E,UAAU,EAAE,2HAA2H;aACxI,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,wEAAwE;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAA4C;IAClE,IAAI,KAAK,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAClC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,KAAK,CAAC,SAAS,GAAG,EAAE;gBAC7D,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,IAAI,CAAC;YAE7B,yBAAyB;YACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,KAAK,CAAC,SAAS,GAAG,EAAE;gBACnE,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE;gBAAE,OAAO,MAAM,CAAC;YAEjC,8DAA8D;YAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,gBAAgB,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,WAAW,KAAK,CAAC,SAAS,WAAW,KAAK,CAAC,SAAS,gBAAgB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtN,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gLAAgL,EAChL;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACpF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,WAAW,GAAoB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/D,WAAW,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrE,WAAW,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvE,WAAW,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,WAAW,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG;YACd,cAAc,EAAE,KAAK,CAAC,MAAM;YAC5B,YAAY,EAAE,WAAW,CAAC,MAAM;YAChC,WAAW,EAAE;gBACX,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;gBAC7D,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;gBACjE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;aAC5D;YACD,QAAQ,EAAE,WAAW;SACtB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"review-diff.js","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"security-review.d.ts","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwD9D"}
1
+ {"version":3,"file":"security-review.d.ts","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD9D"}
@@ -4,11 +4,13 @@
4
4
  import { z } from 'zod';
5
5
  import { requirePro, requireAiKey } from '../lib/license.js';
6
6
  import { aiReview, SECURITY_REVIEW_SYSTEM } from '../lib/ai-review.js';
7
+ import { recordToolCall } from '../lib/billing.js';
7
8
  export function registerSecurityReview(server) {
8
- server.tool('security_review', 'Focused security analysis using OWASP Top 10 patterns + AI. Identifies vulnerabilities with CWE references, attack scenarios, and specific remediation. Pro tier.', {
9
+ server.tool('security_review', 'Sends source code to an LLM for security-focused analysis against OWASP Top 10 categories. Input: code (string), language (string). Output: vulnerabilities with CWE references, attack scenarios, severity ratings, and specific remediation steps. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
9
10
  code: z.string().describe('Source code to review for security issues'),
10
11
  language: z.string().describe('Programming language'),
11
12
  }, async ({ code, language }) => {
13
+ recordToolCall('security_review').catch(() => { });
12
14
  await requirePro();
13
15
  requireAiKey();
14
16
  const userPrompt = [
@@ -1 +1 @@
1
- {"version":3,"file":"security-review.js","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,mKAAmK,EACnK;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,gDAAgD;YAChD,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAElE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,eAAe,EAAE,MAAM;4BACvB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"security-review.js","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,8SAA8S,EAC9S;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClD,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,gDAAgD;YAChD,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAElE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,eAAe,EAAE,MAAM;4BACvB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-tests.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgE5D"}
1
+ {"version":3,"file":"suggest-tests.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiE5D"}
@@ -4,6 +4,7 @@
4
4
  import { z } from 'zod';
5
5
  import { requirePro, requireAiKey } from '../lib/license.js';
6
6
  import { aiReview, SUGGEST_TESTS_SYSTEM } from '../lib/ai-review.js';
7
+ import { recordToolCall } from '../lib/billing.js';
7
8
  const FRAMEWORK_DEFAULTS = {
8
9
  javascript: 'jest',
9
10
  typescript: 'jest with @types/jest',
@@ -20,11 +21,12 @@ const FRAMEWORK_DEFAULTS = {
20
21
  swift: 'XCTest',
21
22
  };
22
23
  export function registerSuggestTests(server) {
23
- server.tool('suggest_tests', 'Generate comprehensive test cases for code. Produces complete, runnable test files covering happy paths, edge cases, error conditions, and boundary values. Pro tier.', {
24
+ server.tool('suggest_tests', 'Sends source code to an LLM to generate a complete test file. Input: code (string), language (string), optional framework (auto-detected: jest for JS/TS, pytest for Python, testing for Go, etc.). Output: runnable test file covering happy paths, edge cases, error conditions, and boundary values. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
24
25
  code: z.string().describe('Source code to generate tests for'),
25
26
  language: z.string().describe('Programming language'),
26
27
  framework: z.string().optional().describe('Test framework (e.g., jest, pytest, go testing). Auto-detected if omitted.'),
27
28
  }, async ({ code, language, framework }) => {
29
+ recordToolCall('suggest_tests').catch(() => { });
28
30
  await requirePro();
29
31
  requireAiKey();
30
32
  const testFramework = framework || FRAMEWORK_DEFAULTS[language.toLowerCase()] || 'appropriate testing framework';
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-tests.js","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,kBAAkB,GAA2B;IACjD,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,uBAAuB;IACnC,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,uBAAuB;IAC3B,MAAM,EAAE,QAAQ;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,4BAA4B;IAChC,MAAM,EAAE,4BAA4B;IACpC,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,uKAAuK,EACvK;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC9D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4EAA4E,CAAC;KACxH,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QACtC,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,aAAa,GAAG,SAAS,IAAI,kBAAkB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,+BAA+B,CAAC;QAEjH,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,mBAAmB,aAAa,EAAE;YAClC,EAAE;YACF,sBAAsB;YACtB,KAAK;YACL,IAAI;YACJ,KAAK;YACL,EAAE;YACF,yEAAyE;SAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAEhE,mDAAmD;YACnD,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;YAC9B,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACjE,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,SAAS,EAAE,QAAQ;4BACnB,SAAS,EAAE,aAAa;4BACxB,QAAQ;4BACR,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"suggest-tests.js","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,15 @@
1
1
  {
2
2
  "name": "truss-code-review-mcp",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "description": "AI-powered code review tools for Claude Code — complexity analysis, anti-pattern detection, security review, and optimization",
5
+ "homepage": "https://claw-factory.github.io/truss-site",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/claw-factory/truss-code-review-mcp.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/claw-factory/truss-code-review-mcp/issues"
12
+ },
5
13
  "type": "module",
6
14
  "bin": {
7
15
  "truss-code-review": "./dist/index.js"
@@ -34,11 +42,13 @@
34
42
  "author": "TRUSS",
35
43
  "license": "MIT",
36
44
  "dependencies": {
37
- "@modelcontextprotocol/sdk": "^1.12.0"
45
+ "@modelcontextprotocol/sdk": "^1.12.0",
46
+ "stripe": "^21.0.1"
38
47
  },
39
48
  "devDependencies": {
40
49
  "typescript": "^5.5.0",
41
50
  "tsx": "^4.19.0",
42
51
  "@types/node": "^22.0.0"
43
- }
52
+ },
53
+ "mcpName": "io.github.claw-factory/truss-code-review-mcp"
44
54
  }
package/server.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.claw-factory/truss-code-review-mcp",
4
+ "title": "TRUSS Code Review MCP",
5
+ "description": "AI-powered code review MCP server",
6
+ "version": "1.0.1",
7
+ "packages": [
8
+ {
9
+ "registryType": "npm",
10
+ "identifier": "truss-code-review-mcp",
11
+ "version": "1.0.1",
12
+ "runtimeHint": "node",
13
+ "transport": {
14
+ "type": "stdio"
15
+ }
16
+ }
17
+ ],
18
+ "sourceUrl": "https://github.com/claw-factory/truss-code-review-mcp",
19
+ "license": "MIT"
20
+ }
package/src/index.ts CHANGED
@@ -4,12 +4,12 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
5
  import { z } from 'zod';
6
6
 
7
- // Free tier tools
7
+ // Rule-based tools
8
8
  import { registerReviewDiff } from './tools/review-diff.js';
9
9
  import { registerCheckComplexity } from './tools/check-complexity.js';
10
10
  import { registerDetectAntipatterns } from './tools/detect-antipatterns.js';
11
11
 
12
- // Pro tier tools
12
+ // AI-powered tools
13
13
  import { registerDeepReview } from './tools/deep-review.js';
14
14
  import { registerSuggestTests } from './tools/suggest-tests.js';
15
15
  import { registerExplainCode } from './tools/explain-code.js';
@@ -17,7 +17,7 @@ import { registerSecurityReview } from './tools/security-review.js';
17
17
  import { registerOptimizeCode } from './tools/optimize-code.js';
18
18
 
19
19
  // Helpers
20
- import { getLicenseStatus, hasAiKey } from './lib/license.js';
20
+ import { hasAiKey } from './lib/license.js';
21
21
 
22
22
  const server = new McpServer({
23
23
  name: '@truss-dev/code-review-mcp',
@@ -28,10 +28,9 @@ const server = new McpServer({
28
28
 
29
29
  server.tool(
30
30
  'check_review_status',
31
- 'Check license tier and AI key configuration for code review tools.',
31
+ 'Returns current license tier (free/pro), validity, expiration, and whether an AI API key (ANTHROPIC_API_KEY or OPENAI_API_KEY) is configured. Lists all available tools grouped by tier. Use to verify configuration before calling pro or AI-dependent tools.',
32
32
  {},
33
33
  async () => {
34
- const license = await getLicenseStatus();
35
34
  const aiKeyPresent = hasAiKey();
36
35
 
37
36
  return {
@@ -39,36 +38,21 @@ server.tool(
39
38
  {
40
39
  type: 'text' as const,
41
40
  text: JSON.stringify({
42
- license: {
43
- tier: license.tier,
44
- valid: license.valid,
45
- expires_at: license.expiresAt,
46
- },
41
+ server: 'truss-code-review-mcp',
47
42
  ai_key_configured: aiKeyPresent,
48
- free_tools: [
43
+ tools: [
49
44
  'review_diff — Rule-based diff analysis',
50
45
  'check_complexity — Cyclomatic complexity calculator',
51
46
  'detect_antipatterns — Language-specific anti-pattern detection',
52
- ],
53
- pro_tools: [
54
47
  'deep_review — AI-powered comprehensive review',
55
48
  'suggest_tests — Generate test cases',
56
49
  'explain_code — Generate documentation',
57
50
  'security_review — OWASP security analysis',
58
51
  'optimize_code — Performance optimization',
59
52
  ],
60
- ...(license.tier === 'free'
61
- ? {
62
- upgrade_info: {
63
- url: 'https://truss.dev/pricing',
64
- price: '$25/mo',
65
- note: 'Set TRUSS_LICENSE_KEY + your own ANTHROPIC_API_KEY or OPENAI_API_KEY',
66
- },
67
- }
68
- : {}),
69
- ...(!aiKeyPresent && license.tier === 'pro'
53
+ ...(!aiKeyPresent
70
54
  ? {
71
- warning: 'Pro license active but no AI key configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY to use AI-powered tools.',
55
+ note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI-powered tools (deep_review, suggest_tests, explain_code, security_review, optimize_code).',
72
56
  }
73
57
  : {}),
74
58
  }, null, 2),
@@ -0,0 +1,34 @@
1
+ import Stripe from 'stripe';
2
+
3
+ const stripeKey = process.env.STRIPE_SECRET_KEY;
4
+ const customerId = process.env.STRIPE_CUSTOMER_ID;
5
+
6
+ let stripe: Stripe | null = null;
7
+
8
+ if (stripeKey) {
9
+ stripe = new Stripe(stripeKey);
10
+ }
11
+
12
+ /**
13
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
14
+ * Non-blocking — failures are logged but do not interrupt the tool call.
15
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
16
+ */
17
+ export async function recordToolCall(toolName: string): Promise<void> {
18
+ if (!stripe || !customerId) return;
19
+
20
+ try {
21
+ await stripe.billing.meterEvents.create({
22
+ event_name: 'mcp_tool_call',
23
+ payload: {
24
+ stripe_customer_id: customerId,
25
+ value: '1',
26
+ },
27
+ identifier: `${customerId}_${toolName}_${Date.now()}`,
28
+ });
29
+ } catch (err) {
30
+ // Non-blocking — log and continue
31
+ console.error(`[billing] meter event failed for ${toolName}:`, (err as Error).message);
32
+ }
33
+ }
34
+
@@ -72,14 +72,12 @@ export async function getLicenseStatus(): Promise<LicenseStatus> {
72
72
  return status;
73
73
  }
74
74
 
75
+ /**
76
+ * No-op. All tools are available in the free tier.
77
+ * Retained for API compatibility.
78
+ */
75
79
  export async function requirePro(): Promise<void> {
76
- const status = await getLicenseStatus();
77
- if (status.tier !== 'pro') {
78
- throw new Error(
79
- 'This feature requires a TRUSS Pro license ($25/mo). ' +
80
- 'Get yours at https://truss.dev/pricing and set TRUSS_LICENSE_KEY.'
81
- );
82
- }
80
+ // All tools are free — no license gate
83
81
  }
84
82
 
85
83
  export function hasAiKey(): boolean {
@@ -5,16 +5,18 @@
5
5
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { calculateComplexity } from '../lib/complexity.js';
8
+ import { recordToolCall } from '../lib/billing.js';
8
9
 
9
10
  export function registerCheckComplexity(server: McpServer): void {
10
11
  server.tool(
11
12
  'check_complexity',
12
- 'Calculate cyclomatic complexity of functions/methods. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Supports JS/TS, Python, Go. Free tier.',
13
+ 'Calculates cyclomatic complexity for each function/method in source code. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Input: code (string), language (javascript, typescript, python, go). Output: per-function complexity scores with ratings (simple 1-5, moderate 6-10, complex 11-20, very complex 21+), overall score, and average. Rule-based static analysis. Free tier.',
13
14
  {
14
15
  code: z.string().describe('Source code to analyze'),
15
16
  language: z.string().describe('Programming language (javascript, typescript, python, go)'),
16
17
  },
17
18
  async ({ code, language }) => {
19
+ recordToolCall('check_complexity').catch(() => {});
18
20
  const result = calculateComplexity(code, language);
19
21
 
20
22
  const output = {
@@ -6,17 +6,19 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { requirePro, requireAiKey } from '../lib/license.js';
8
8
  import { aiReview, DEEP_REVIEW_SYSTEM } from '../lib/ai-review.js';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
 
10
11
  export function registerDeepReview(server: McpServer): void {
11
12
  server.tool(
12
13
  'deep_review',
13
- 'AI-powered comprehensive code review covering architecture, security, performance, error handling, and maintainability. Returns scored findings with remediation. Pro tier requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY.',
14
+ 'Sends source code to an LLM for comprehensive review covering architecture, security, performance, error handling, and maintainability. Input: code (string), language (string), optional context about the code role. Output: structured JSON review with scored findings, severity levels, and remediation suggestions. Requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY (customer-provided). Pro tier.',
14
15
  {
15
16
  code: z.string().describe('Source code to review'),
16
17
  language: z.string().describe('Programming language'),
17
18
  context: z.string().optional().describe('Additional context (e.g., "this is a REST API handler", "performance-critical path")'),
18
19
  },
19
20
  async ({ code, language, context }) => {
21
+ recordToolCall('deep_review').catch(() => {});
20
22
  await requirePro();
21
23
  requireAiKey();
22
24
 
@@ -5,16 +5,18 @@
5
5
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { detectAntiPatterns, getSupportedLanguages, isLanguageSupported } from '../lib/patterns.js';
8
+ import { recordToolCall } from '../lib/billing.js';
8
9
 
9
10
  export function registerDetectAntipatterns(server: McpServer): void {
10
11
  server.tool(
11
12
  'detect_antipatterns',
12
- 'Detect common anti-patterns per language. Includes: JS/TS (var, ==, any, eval, innerHTML, sync I/O), Python (bare except, mutable defaults, wildcard imports), Go (ignored errors, goroutine leaks, mutex without defer). Free tier.',
13
+ 'Scans source code for language-specific anti-patterns using regex rules. JS/TS: var usage, ==, any type, eval, innerHTML, synchronous I/O. Python: bare except, mutable default arguments, wildcard imports. Go: ignored error returns, goroutine leaks, mutex without defer. Input: code (string), language (javascript, typescript, python, go). Output: findings array with pattern name, description, location, severity, and suggested fix. Rule-based, no AI API key needed. Free tier.',
13
14
  {
14
15
  code: z.string().describe('Source code to analyze'),
15
16
  language: z.string().describe('Programming language (javascript, typescript, python, go)'),
16
17
  },
17
18
  async ({ code, language }) => {
19
+ recordToolCall('detect_antipatterns').catch(() => {});
18
20
  if (!isLanguageSupported(language)) {
19
21
  return {
20
22
  content: [{
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { requirePro, requireAiKey } from '../lib/license.js';
8
8
  import { aiReview, EXPLAIN_CODE_SYSTEM } from '../lib/ai-review.js';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
 
10
11
  export function registerExplainCode(server: McpServer): void {
11
12
  server.tool(
12
13
  'explain_code',
13
- 'Generate documentation for complex code. Produces high-level explanation, function docstrings, data flow analysis, and design notes. Pro tier.',
14
+ 'Sends source code to an LLM to generate documentation. Input: code (string), language (string). Output: high-level explanation, per-function docstrings, data flow analysis, and design notes as structured JSON. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
14
15
  {
15
16
  code: z.string().describe('Source code to explain'),
16
17
  language: z.string().describe('Programming language'),
17
18
  },
18
19
  async ({ code, language }) => {
20
+ recordToolCall('explain_code').catch(() => {});
19
21
  await requirePro();
20
22
  requireAiKey();
21
23
 
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { requirePro, requireAiKey } from '../lib/license.js';
8
8
  import { aiReview, OPTIMIZE_CODE_SYSTEM } from '../lib/ai-review.js';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
 
10
11
  export function registerOptimizeCode(server: McpServer): void {
11
12
  server.tool(
12
13
  'optimize_code',
13
- 'Performance optimization suggestions with before/after code and expected impact. Covers algorithmic complexity, memory usage, I/O efficiency, caching, and language-specific optimizations. Pro tier.',
14
+ 'Sends source code to an LLM for performance analysis. Input: code (string), language (string). Output: optimization suggestions with before/after code snippets, expected impact, and categories (algorithmic complexity, memory, I/O, caching). Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
14
15
  {
15
16
  code: z.string().describe('Source code to optimize'),
16
17
  language: z.string().describe('Programming language'),
17
18
  },
18
19
  async ({ code, language }) => {
20
+ recordToolCall('optimize_code').catch(() => {});
19
21
  await requirePro();
20
22
  requireAiKey();
21
23
 
@@ -8,6 +8,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
8
  import { z } from 'zod';
9
9
  import { readFileSync } from 'node:fs';
10
10
  import { execSync } from 'node:child_process';
11
+ import { recordToolCall } from '../lib/billing.js';
11
12
 
12
13
  interface ReviewComment {
13
14
  file: string;
@@ -336,12 +337,13 @@ function getDiffContent(input: { diff?: string; file_path?: string }): string {
336
337
  export function registerReviewDiff(server: McpServer): void {
337
338
  server.tool(
338
339
  'review_diff',
339
- 'Analyze a git diff for common issues: large files, debug statements, TODO without tickets, commented-out code, import ordering, sensitive data. Free tier no API key needed.',
340
+ 'Analyzes a git diff or file for common code review issues using rule-based pattern matching. Checks: oversized changes (>500 lines added), leftover debug statements (console.log, print, debugger, pdb), TODO/FIXME without ticket references, commented-out code blocks, and potential secret leaks. Input: either raw diff text or a file_path to diff. Output: array of findings with file, line number, severity (error/warning/info), message, and suggested fix. No AI API key needed. Free tier.',
340
341
  {
341
342
  diff: z.string().optional().describe('Raw git diff content'),
342
343
  file_path: z.string().optional().describe('Path to file (will run git diff on it)'),
343
344
  },
344
345
  async (input) => {
346
+ recordToolCall('review_diff').catch(() => {});
345
347
  const diffContent = getDiffContent(input);
346
348
  const files = parseDiff(diffContent);
347
349
  const allComments: ReviewComment[] = [];
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { requirePro, requireAiKey } from '../lib/license.js';
8
8
  import { aiReview, SECURITY_REVIEW_SYSTEM } from '../lib/ai-review.js';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
 
10
11
  export function registerSecurityReview(server: McpServer): void {
11
12
  server.tool(
12
13
  'security_review',
13
- 'Focused security analysis using OWASP Top 10 patterns + AI. Identifies vulnerabilities with CWE references, attack scenarios, and specific remediation. Pro tier.',
14
+ 'Sends source code to an LLM for security-focused analysis against OWASP Top 10 categories. Input: code (string), language (string). Output: vulnerabilities with CWE references, attack scenarios, severity ratings, and specific remediation steps. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
14
15
  {
15
16
  code: z.string().describe('Source code to review for security issues'),
16
17
  language: z.string().describe('Programming language'),
17
18
  },
18
19
  async ({ code, language }) => {
20
+ recordToolCall('security_review').catch(() => {});
19
21
  await requirePro();
20
22
  requireAiKey();
21
23
 
@@ -6,6 +6,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { z } from 'zod';
7
7
  import { requirePro, requireAiKey } from '../lib/license.js';
8
8
  import { aiReview, SUGGEST_TESTS_SYSTEM } from '../lib/ai-review.js';
9
+ import { recordToolCall } from '../lib/billing.js';
9
10
 
10
11
  const FRAMEWORK_DEFAULTS: Record<string, string> = {
11
12
  javascript: 'jest',
@@ -26,13 +27,14 @@ const FRAMEWORK_DEFAULTS: Record<string, string> = {
26
27
  export function registerSuggestTests(server: McpServer): void {
27
28
  server.tool(
28
29
  'suggest_tests',
29
- 'Generate comprehensive test cases for code. Produces complete, runnable test files covering happy paths, edge cases, error conditions, and boundary values. Pro tier.',
30
+ 'Sends source code to an LLM to generate a complete test file. Input: code (string), language (string), optional framework (auto-detected: jest for JS/TS, pytest for Python, testing for Go, etc.). Output: runnable test file covering happy paths, edge cases, error conditions, and boundary values. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
30
31
  {
31
32
  code: z.string().describe('Source code to generate tests for'),
32
33
  language: z.string().describe('Programming language'),
33
34
  framework: z.string().optional().describe('Test framework (e.g., jest, pytest, go testing). Auto-detected if omitted.'),
34
35
  },
35
36
  async ({ code, language, framework }) => {
37
+ recordToolCall('suggest_tests').catch(() => {});
36
38
  await requirePro();
37
39
  requireAiKey();
38
40